概率语言模型
基于统计概率的方法来进行语言建模:
$$
P(the | water \ is \ so \ tranparent \ that) = \frac{Count(its \ water \ is \ so \ transparent \ that \ the)}{Count(its \ water \ is so \ transparent \ that)}
$$
马尔科夫假设:
序列概率的近似计算:
- 原始的序列联合概率 $P(w_1 w_2 \dots w_n)$ 根据概率的链式法则可以分解为一系列条件概率的乘积,但计算时每个词 $w_i$ 理论上依赖于全部先前的词 $w_1$ 到 $w_{i-1}$。
- 马尔可夫假设通过近似,使得序列的联合概率 $P(w_1 w_2 \dots w_n)$ 被分解为一系列更容易计算的条件概率的乘积:
- 公式:$P(w_1 w_2 \dots w_n) \approx \prod_i P(w_i | w_{i-k} \dots w_{i-1})$
- 这意味着计算当前词 $w_i$ 的概率时,只考虑它前面有限的 $k$ 个词 ($w_{i-k}$ 到 $w_{i-1}$),而忽略更早的词。
乘积分量的具体近似:
- 真正的条件概率(依赖于全部历史)被近似为(只依赖于 $k$ 长度历史)的条件概率:
- 公式:$P(w_i | w_1 w_2 \dots w_{i-1}) \approx P(w_i | w_{i-k} \dots w_{i-1})$
- 这是N-gram 模型(当 $k=N-1$ 时)的基础,它极大地简化了语言模型的训练和应用。
- 真正的条件概率(依赖于全部历史)被近似为(只依赖于 $k$ 长度历史)的条件概率:
N-grams
Unigram model
一元语言模型 (Unigram model),这是N-gram 模型中最简单的一种情况。
一元模型的定义公式:
- 一元模型假设每个词的出现是完全独立于其前面所有词的。
- 它将一个词语序列的联合概率近似为序列中所有单个词的边际概率的乘积:
- 公式:$P(w_1 w_2 \dots w_n) \approx \prod_i P(w_i)$
- 在马尔可夫假设的框架下,这相当于马尔可夫阶数 $k=0$ (即零阶马尔可夫链)。
一元模型自动生成的句子示例:
- 示例中可以看到,生成的词语序列缺乏语法和语义的连贯性,因为模型只考虑了每个词语的独立频率,而没有考虑词语之间的顺序或上下文关系。
- 示例(仅是词语的随机堆叠):
fifth, an, of, futures, the, an, incorporated, a, a, the, inflation, most, dollars, quarter, in, is, massthrift, did, eighty, said, hard, 'm, july, bullishthat, or, limited, the
Bigram
二元语言模型 (Bigram model),它是N-gram模型中应用最广泛和最基础的之一。
核心内容包括:
二元模型中的条件依赖 (Condition on the previous word):
- 二元模型是基于一阶马尔可夫假设的。它假设当前词 $w_i$ 的概率只依赖于它前面紧邻的一个词 $w_{i-1}$,而忽略更早的历史词语。
- 公式表达为:
- $P(w_i | w_1 w_2 \dots w_{i-1}) \approx P(w_i | w_{i-1})$
二元模型自动生成的句子示例:
- 与一元模型相比,二元模型生成的文本开始展现出一定的局部连贯性(即相邻词对是合理的),因为模型捕获了词语对之间的转换概率,但从整体上看,长距离的语义和主题连贯性仍然较差。
- 示例文本:
texaco, rose, one, in, **this, issue**, is, pursuing, growth, in, a, boiler, house, said, mr., gurria, mexico, 's, motion, control, proposal, **without, permission**, from, five, hundred, fifty, five, yenoutside, new, car, parking, lot, of, the, agreement, reachedthis, would, be, a, record, november
- (加粗的词对如 “this issue” 和 “without permission” 显示出二元模型捕获了合理的双词组合。)
Estimating N-gram Probabilities
二元最大似然估计:
$$
P(w_i | w_{i-1} = \frac{c(w_i,w_{i-1})}{c(w_i)}
$$
示例:
<s> I am Sam </s>
<s> Sam I am </s>
<s> I do not like green eggs and ham
$P(I|<s>) = 0.67$ ,
$P(Sam | <s>) = 0.33$ ,
$P(am|I) = 0.67$ ,
$P(<s>|Sam) = 0.5$ ,
$P(Sam| am) = 0.5$ ,
$P(do|I)=0.33$
Evaluation and Perplexity
Extrinsic evaluation:例如我们再A数据集训练的模型在B数据集上进行测试,但是这样的耗费的时间多。
Intrinsic evaluation: perplexity(困惑度),不能直接衡量模型在实际任务的表现,往往并不可靠。
困惑度 (Perplexity) 这的定义和计算公式
本质目标: 最好的语言模型是那个能最好地预测一个未见过的测试集的模型。这意味着该模型应该能对测试集中的句子给出最高的概率 $P(\text{sentence})$。
困惑度的定义: 困惑度是测试集逆概率的度量,并按词语数量进行了归一化。
基本计算公式:
- 设 $W = w_1 w_2 \dots w_N$ 是一个由 $N$ 个词构成的测试序列。
- $PP(W) = P(w_1 w_2 \dots w_N)^{-\frac{1}{N}}$
- 这等价于:$PP(W) = \sqrt[N]{\frac{1}{P(w_1 w_2 \dots w_N)}}$
- (直观上,困惑度可以理解为在每个决策点(词语预测)上,模型平均面临多少个等可能的选择。数值越低越好。)
基于链式法则的分解:
- 根据概率的链式法则,句子概率 $P(W)$ 可以分解为一系列条件概率的乘积。将此代入困惑度公式,得到:
- $PP(W) = \sqrt[N]{\prod_{i=1}^{N} \frac{1}{P(w_i | w_1 w_2 \dots w_{i-1})}}$
- 根据概率的链式法则,句子概率 $P(W)$ 可以分解为一系列条件概率的乘积。将此代入困惑度公式,得到:
二元模型 (Bigram) 的困惑度:
- 对于遵循一阶马尔可夫假设的二元模型,条件概率 $P(w_i | w_1 w_2 \dots w_{i-1})$ 被近似为 $P(w_i | w_{i-1})$。代入公式得到:
- $PP(W) = \sqrt[N]{\prod_{i=1}^{N} \frac{1}{P(w_i | w_{i-1})}}$
- 对于遵循一阶马尔可夫假设的二元模型,条件概率 $P(w_i | w_1 w_2 \dots w_{i-1})$ 被近似为 $P(w_i | w_{i-1})$。代入公式得到:
Exercise:
Generalization and zeros
- 数据集稀疏性:
以莎士比亚全集作为语料库 (Shakespeare as corpus) 为例,阐述了 N-gram 语言模型在实际数据中面临的数据稀疏性 (data sparsity) 问题。
基本规模:
- 总词数 ($N$): 884,647 个词例 (tokens)。
- 词汇量 ($V$): 29,066 个不同的词类 (types)。
二元模型 (Bigram) 的稀疏性:
- 所有可能的二元组 (bigram): 词汇量 $V$ 为 29,066,因此理论上所有可能的不同二元组数量为 $V^2 \approx 844$ 百万 (million)。
- 实际观察到的二元组 (bigram types): 莎士比亚的文本中实际只出现了 300,000 个不同的二元组。
- 稀疏程度: 这意味着99.96% 的所有可能二元组从未在语料库中出现过(在模型概率表中对应零计数)。
- 过度拟合的危险 (The perils of overfitting)
零概率问题 (Zeros!):- 泛化的一种重要形式就是解决零计数 (Zeros) 问题。
- 零计数指的是在训练集中从未出现过,但却出现在测试集中的词语序列(N-grams)。
- 当 N-gram 模型遇到零计数的序列时,它会错误地将该序列的概率估计为零,导致整个句子的概率为零,这严重影响了模型的实际应用性能。
数据稀疏性and零概率
“数据稀疏性”和“零概率”是紧密相关但略有不同的概念,特别是在 N-gram 语言模型中:
| 概念 | 解释 (What it is) | 影响 (What it causes) | 解决目标 (What to fix) |
|---|---|---|---|
| 数据稀疏性 (Data Sparsity) | 描述的是训练数据不足以覆盖所有可能语言现象的现象或状态。 | 导致模型在训练集上能很好地工作,但在测试集上表现不佳,从而产生大量的零概率事件。 | 需要更大量的语料或使用平滑技术来更有效地利用现有数据。 |
| 零概率 (Zero Probability / Zero Count) | 指的是在计算模型参数时,发现某个特定的词语序列(N-gram)在训练语料中出现的次数为零(即零计数)。 | 根据最大似然估计,模型会错误地将该序列的概率估计为零。在实际应用中,这会导致模型无法处理任何包含这些未见过序列的句子。 | 需要使用平滑 (Smoothing) 技术,将一部分概率质量从出现过的 N-gram 转移给零计数的 N-gram,给它们一个非零的概率。 |
核心区别:
本质:
- 数据稀疏性是一种数据问题或语料库的特征(即样本不足)。
- 零概率是一种模型问题或估计结果(即由于数据稀疏导致模型对某些事件的概率估计为 0)。
因果关系:
- 数据稀疏性是原因。
- 零概率是结果。
解决方式:
- 解决数据稀疏性的根本方法是增加训练数据。
- 解决零概率(模型估计结果)的方法是使用平滑 (Smoothing) 技术。
Smoothing
解决 N-gram 模型中零概率问题的简单平滑方法:加一平滑 (Add-one estimation),也被称为拉普拉斯平滑 (Laplace smoothing)。但是实际上我们很少使用,因为在N-gram中的零计数是巨大的,导致模型从高频词挪用的概率过的
核心思想:
- “假装我们比实际多看到了每个词一次。”
- 通过简单地给所有的计数加一来实现。
最大似然估计 (MLE) 公式回顾:
- 在没有平滑的情况下,条件概率(以二元模型为例)通过最大似然估计 (MLE) 计算:
- $P_{MLE}(w_i | w_{i-1}) = \frac{C(w_{i-1}, w_i)}{C(w_{i-1})}$
- $C(\cdot)$ 表示在训练语料中的计数。
- 在没有平滑的情况下,条件概率(以二元模型为例)通过最大似然估计 (MLE) 计算:
加一平滑的公式:
- 应用加一平滑后,新的条件概率估计为:
- $P_{Add-1}(w_i | w_{i-1}) = \frac{C(w_{i-1}, w_i) + 1}{C(w_{i-1}) + V}$
- 分子: 对二元组计数 $C(w_{i-1}, w_i)$ 加 1。
- 分母: 对前一个词 $w_{i-1}$ 的计数 $C(w_{i-1})$ 加 $V$。其中 $V$ 是词汇表的大小。
- 应用加一平滑后,新的条件概率估计为:
原理解释:
- 解决零概率: 对于训练集中从未出现过的二元组(即 $C(w_{i-1}, w_i) = 0$),分子变为 $0+1=1$,从而保证其概率为非零,解决了零概率问题。
- 归一化: 由于我们对词汇表中的所有可能的下一个词 $w_i$ 都进行了“加 1”的操作,相当于总共加了 $1 \times V$ 次(即 $V$)。为了保证概率之和仍为 1,分母必须加上总共增加的计数 $V$,确保新的概率分布仍然是合法的。
这段内容展示了通过加一平滑 (Add-one smoothing) 重新计算得到的重构计数 (Reconstituted counts) 的公式。
重构计数 $C^*(w_{n-1}w_n)$ 是指在应用了平滑技术后,反推得到的、用于计算平滑概率的等效计数。
公式推导:
- 加一平滑的概率公式:
$$P_{Add-1}(w_n | w_{n-1}) = \frac{C(w_{n-1}, w_n) + 1}{C(w_{n-1}) + V}$$
(其中 $C(\cdot)$ 是原始计数,$V$ 是词汇表大小。) - 重构计数 $C^*$ 的定义:
- 在传统的最大似然估计 (MLE) 中,概率 $P(w_n | w_{n-1})$ 是通过 $\frac{C(w_{n-1}, w_n)}{C(w_{n-1})}$ 计算的。
- 为了保持形式一致,我们定义一个重构计数 $C^*(w_{n-1}w_n)$,使得平滑后的概率可以写成 $\frac{C^*(w_{n-1}w_n)}{C(w_{n-1})}$。
- 但在加一平滑中,分母也被修改了,所以我们定义 $C^*(w_{n-1}w_n)$ 为:
$$P_{Add-1}(w_n | w_{n-1}) = \frac{C^*(w_{n-1}w_n)}{C(w_{n-1})}$$
(这里的 $C(w_{n-1})$ 是原始的前缀计数,而不是 $C(w_{n-1})+V$。)
- 最终的重构计数公式:
- 将平滑概率 $P_{Add-1}$ 乘以原始的前缀计数 $C(w_{n-1})$,即可得到重构计数 $C^*(w_{n-1}w_n)$:
$$\mathbf{C^*(w_{n-1}w_n) = \frac{[C(w_{n-1}w_n) + 1] \times C(w_{n-1})}{C(w_{n-1}) + V}}$$
- 将平滑概率 $P_{Add-1}$ 乘以原始的前缀计数 $C(w_{n-1})$,即可得到重构计数 $C^*(w_{n-1}w_n)$:
作用:
这个公式显示了加一平滑对原始计数的修改。对于所有出现过的 N-gram,其重构计数 $C^*$ 会小于原始计数 $C$;而对于零计数的 N-gram,其重构计数 $C^*$ 会是一个大于零的小数。这个差额($C - C^*$)正是被“平滑”出去,分配给了零计数事件的概率质量。
Interpolation
回退 (Backoff) 和插值 (Interpolation)。
- 核心理念: 有时,使用较少的上下文(即较低阶的 N-gram)反而有助于提高预测的可靠性,特别是对于那些在训练中没有足够数据来学习其概率的上下文。
- 回退 (Backoff):
- 回退是一种阶梯式的平滑策略。
- 规则: 优先使用最高阶的 N-gram(如三元模型 trigram),前提是你有充分的证据(即该 N-gram 的计数足够高)。
- 回退逻辑:
- 如果没有充分的最高阶 N-gram 证据,则回退到次一阶的 N-gram(如二元模型 bigram)。
- 如果二元模型证据也不足,则进一步回退到最低阶的 N-gram(如一元模型 unigram)。
- (回退是非混合的,它在每个时刻只选择一个模型。)
- 插值 (Interpolation):
- 插值是一种混合式的平滑策略。
- 规则: 混合不同阶数的 N-gram 模型(如一元模型、二元模型和三元模型)的概率估计。
- 原理: 最终的概率是各个模型的概率的加权平均。
- 例如:$P(w_i | w_{i-2}w_{i-1}) = \lambda_3 P_{trigram}(\cdot) + \lambda_2 P_{bigram}(\cdot) + \lambda_1 P_{unigram}(\cdot)$
- ($\lambda$ 是权重,且 $\sum \lambda = 1$)。
- 效果比较:
- 插值通常比回退效果更好 (Interpolation works better)。这是因为它能够同时利用所有上下文长度提供的信息,而不是强制只选择一个。
Linear Interpolation
在插值平滑 (Interpolation) 中如何设置 $\lambda$ 权重?
- 核心方法: 使用一个保留语料 (held-out corpus),也称为开发集 (Development Set) 或验证集 (Validation Set)。
- 在模型训练中,数据通常被划分为:训练数据 (Training Data)、保留数据 (Held-Out Data) 和测试数据 (Test Data)。
- 目标: 选择 $\lambda$ 使得保留数据 (held-out data) 的概率最大化。
- 具体步骤:
- 首先,使用训练数据固定各个 N-gram 模型(如 Unigram, Bigram, Trigram)的原始概率。
- 然后,在一个独立的保留数据集上,搜索(或优化)一组 $\lambda$ 权重,使得插值模型对该保留集的概率(或对数概率 $\log P(\dots)$)最大。
- (最大化对数概率 $\log P(W)$ 等价于最小化困惑度。)
线性插值是一种简单的插值方法,它将不同阶 N-gram 模型的概率进行加权平均。
简单插值(非条件 $\lambda$):
- 插值概率 $\hat{P}$ 是最高阶 N-gram (Trigram)、次高阶 (Bigram) 和最低阶 (Unigram) 概率的加权和:
$$\mathbf{\hat{P}(w_n | w_{n-1}w_{n-2}) = \lambda_1 P(w_n | w_{n-1}w_{n-2}) + \lambda_2 P(w_n | w_{n-1}) + \lambda_3 P(w_n)}$$ - 其中,所有的 $\lambda_i$(权重)是固定的常数,且满足 $\sum \lambda_i = 1$。
- 插值概率 $\hat{P}$ 是最高阶 N-gram (Trigram)、次高阶 (Bigram) 和最低阶 (Unigram) 概率的加权和:
上下文条件 $\lambda$ (Lambdas conditional on context):
- 更高级的方法是让权重 $\lambda$ 取决于当前的上下文 (Context $w_{n-2}w_{n-1}$)。
- 要求: 对于任何上下文,所有权重的总和仍为 1 ($\sum \lambda_i = 1$)。
- 公式(以 Trigram 为例):
$$\mathbf{\hat{P}(w_n | w_{n-2}w_{n-1}) = \lambda_1(w_{n-2}w_{n-1})P(w_n | w_{n-2}w_{n-1}) + \lambda_2(w_{n-2}w_{n-1})P(w_n | w_{n-1}) + \lambda_3(w_{n-2}w_{n-1})P(w_n)}$$ - 解释: 如果某个上下文 $w_{n-2}w_{n-1}$ 在训练集中出现得很多,模型将给 $\lambda_1$(三元模型)分配更高的权重;如果上下文很少见,模型将给 $\lambda_2$ 或 $\lambda_3$(较低阶模型)分配更高的权重,从而提高了模型的鲁棒性。
Zeors VS. Unknown words
这段内容旨在区分零计数问题 (Zeros) 和未知词问题 (Unknown words),这是语言模型处理数据稀疏性时需要面对的两种不同挑战。
| 训练集 (Training set) | 测试集 (Test set) |
|---|---|
| $\dots$ denied the allegations | $\dots$ denied the offer |
| $\dots$ denied the reports | $\dots$ denied the loan |
| $\dots$ denied the claims | $\dots$ denied the affair |
| $\dots$ denied the request | $\dots$ denied the incident |
| $\dots$ admitted the offer | |
| $\dots$ admitted the loan |
- 零计数问题(Zeros):
- 关注的 N-gram: $P(\text{“offer”} | \text{denied the})$ 和 $P(\text{“loan”} | \text{denied the})$。
- 分析:
- 词语本身 (“offer”, “loan”) 在训练集中出现过(它们跟在 “admitted the” 后面)。
- 但特定序列 (“denied the offer” 和 “denied the loan”) 在训练集中从未出现(即零计数)。
- 挑战: 这是一个典型的N-gram 零计数问题。平滑技术(如加一平滑、插值等)的目的正是给这些已知的词语在未见过的上下文中分配一个非零概率。
- 未知词问题(Unknown Words):
- 关注的 N-gram: $P(\text{“affair”} | \text{denied the})$ 和 $P(\text{“incident”} | \text{denied the})$。
- 分析:
- 词语 “affair” 和 “incident” 在整个训练集(包括任何上下文)中都从未出现过(绿字表示它们是全新的词)。
- 挑战: 这是一个更严重的未知词 (Out-of-Vocabulary, OOV) 问题。
- 平滑方法只能解决 N-gram 零计数,无法直接处理测试集中的未知词。
- 解决未知词问题通常需要在模型构建前,通过将低频词替换为特殊的 UNK (Unknown) 标记来处理。
在语言模型中处理未知词 (Unknown words) 的问题,区分封闭词汇任务和开放词汇任务。
未知词:开放词汇 vs. 封闭词汇任务
封闭词汇任务 (Closed vocabulary task):
- 定义: 提前知道所有可能出现的词语。
- 特点: 词汇量 $V$ 是固定的。
开放词汇任务 (Open vocabulary task):
- 定义: 无法事先知道所有词语。
- 特点: 在测试集中会出现词汇表外 (Out-Of-Vocabulary, OOV) 的词语。现实中的大多数自然语言任务都是开放词汇任务。
解决未知词的方法:使用 <UNK> 标记
由于在开放词汇任务中测试集不可避免地会出现未知词,一种标准的处理方法是创建一个未知词标记 <UNK> (Unknown word token),并在模型中训练它的概率。<UNK> 概率的训练过程:
- 创建固定词典: 创建一个固定大小 $V$ 的词典 $L$。通常将训练语料中出现频率最高的词语放入 $L$,将所有低频词排除在词典外。
- 文本归一化: 在文本预处理阶段,将训练语料中不在词典 $L$ 内的任何词语都替换成特殊的
<UNK>标记。 - 模型训练: 此时,模型会将
<UNK>标记视为一个普通的词语来训练其概率,包括 $P(\text{})$ 和所有涉及 <UNK>的 N-gram 概率。
解码(使用模型)时:
- 如果在测试输入文本中遇到训练集中未出现过的任何词语,模型将使用
<UNK>的概率来进行处理。
作用: 这种方法将原本无法处理的未知词问题,转换成了模型可以处理的已知<UNK>词语的概率估计问题。