自然语言语言模型
1. 背景
语言模型,其中最重要的是能够表达一个语言序列,而在验证序列是否是“自然的”。对应一个句子序列 $P(E)=P(w_1, w_2, \cdots, w_n)$ 的联合概率表示的是序列中从第一个单词到最后一个单词到序列,使用这种形式直接创建这个分布概率模型的难度较大,因此采用另一种形式——以单词组合的方式作为第二方案。

以 “she went home” 为例子,改用条件概率的模式——表达计算单词随着单词变化的概率,这样间接实现序列概率计算。在这个例子中,明确使用 表示句子结尾,这样可以用于最终判断在 “she went home” 之后是否结束。因此对应的概率表达式为:
$P(E)=P(w_1)P(w_1|w_2)P(w_3|(w_1,w_2))=\prod_{(t=1)}^{(T=1)}P(w_t|w_1^{t-1}), w_{T+1} \text{是}$
1.1 基于计数的 N-Gram 语言模型
基于计数的语言模型,是以最大似然数估计的方式来构建模型(Maximum Likelihood Estimation):
$P_{ML}{(w_t|w_1^{t-1})}=\frac{C(w_1^{t})}{C(w_1^{(t-1)})^*}$
上面的意思中表示的是以出现第一个单词 $w_1$ 到 $w_{(t-1)}$ 的前序(prefix)情况下,下一个单词为 $w_t$。
需要注意这样创建的语言模型是基于已经遇到过的数据,因此存在“过拟合”的问题。

假设用上面构建的模型去预测”i am from utah”,其结果会是 0,因为根据上面的例子 $P(w_4=\text{utah}|(w_1=\text{i}, w_2=\text{am}, w_3=\text{from})$ 是 0,导致整个结果是 0。因此这种模式直接就失去了语言模型评估语言的“自然性”的意义。为了解决这种问题,目前有两种解决方案:1)马尔可夫假设类似的原理,当前单词的出现仅由最近出现的单词决定——采用 N-gram。N-gram 模型参数由给定的 N - 1 个单词确定下一个单词,例如 unigram,的参数仅由自身确定,bigram 是由上一个单词确定,而 trigram 是由上两个单词确定。根据这个假设更新公式 $P(w_t|w_1^{t-1})\approx P_{ML}(w_t|w_{t-n+1}^{t-1})=\theta_{w_{t-n+1}^t}$,其中 $n$ 即表示是 Gram 是几元,而 $\theta$ 即是对应于 N-Gram 下给定的前 $n-1$ 个词条件下的下一个单词的概率。
不论是上面提到的那种方法,都可能存在从训练语料中得到组合存在限制,测试时可能出现某些组合不存在的问题。为了避免和出现 概率值情况时,导致整个句子序列的概率为 ,因此引入了 平滑(Smoothing)的方式来修正该问题。例如其中最简洁的方式——插值法(Interpolation),直接将 Unigram 和 Bigram 合并考虑以达到平滑的效果:$P(w_t|w_{t-1})=(1-\alpha)P_{ML}(w_t|w_{t-1})+\alpha P_{ML}(W_t)$。这种方式是相对来说更稳健地构建低频词概率模型之一。对于需要更复杂的上下文语言模型,例如 N 为 3,4 等的条件的概率需要使用递归的方式来构建
$$
\rm{对应于 TriGram 语法概率} \
P(w_t|w_{t-2}w_{t-1})=\alpha_1 P(w_t|w_{t-2}w_{t-1}) +\alpha_2 P(w_t|w_{t-1}) +\alpha_3 P(w_t) \
\displaystyle \sum_{i}\alpha_i = 1
$$
其中 $\alpha$ 是作为超参数,在训练过程中是使用保留语料库(Held-out corpus)中学习,是附加的训练语料库——但并没有用于设置 N Gram 语法的计数,是用于设置其他的参数。因此在处理数据上通过训练语料嫁给你 N Gram 语法的概率固定下来,在通过保留语料库训练 $\alpha$
1.1.1 Bigram 模型示例
<s> I am sam </s>
<s> Sam I am </s>
<s> I do not like green eggs and ham </s>
根据 NGram 公式 $P(w_t|w_1^{t-1})\approx P_{ML}(w_t|w_{t-n+1}^{t-1})=\frac{C(w_{t-n+1}^{t-1}w_t)}{C(w_{t-n+1}^{t-1})}$ ,右侧为实际统计计算方式 $C(w_{t-n+1}^{n-1}w_t)$ 表示 从 $t-n+1$ 到 $t-1$ 的单词序列 $w_{(t-n+1)}$ 计数和 单词 $w_t$ 的联合事件。
NGram 训练语料重要性
从两个语料训练的结果来看,不同语料训练出来的“英语句子‘模型存在差异。因此在训练时使用大语料库,多来源语料库是有必要的。毕竟N-gram 的统计模型不能在简单语料库中模拟出各种不同 风格
2. 平滑
在有限的训练数据集中,通过最大似然数估计来训练 N Gram 语言模型,得到的结果中必然会有稀疏性的问题。导致训练预料库存在着大量零概率 N 元语法,但实际上也会存在某些非零的概率,这种非零计数比较小的时候,最大似然数估计会产生非常糟糕的结果。因此引入的平滑的方式来解决小数据集的可变形造成的糟糕的估计结果。其内核是削减高计数的概率,用以弥补零计数的概率,从而使得概率分布不至于过于参差不齐
2.1 Laplace 平滑——加一平滑
这是一个简单的平滑方法,是在归一化为概率之前,将所有的计数加一。一般的加一方式为 $P_{Laplace}(w_i)=\frac{c_i+1}{N+V}$,其中 表示的是词汇表中单词个数。但在使用中计算概率的方式可以只调整分子不增加分母,也可以不同时地调整分子与分母。对于平滑之后对于分子的影响,可以通过调整计数 (Adjusted Count)$c^\star$ 来量化。同 MLE 用单词总数量 $N$ 来进行归一化,计算调整计数为概率的话,需要添加一个归一化因子 $\frac{N}{N+V}$,最终表达式为:
$$
c_i^\star=(c_i+1)\frac{N}{N+V} \
P_i^\star=(c_i+1)\frac{1}{N+V} \
\text{即同 MLE 一样,使用 N 进行归一化处理,得到概率}P_i^\star
$$
另一种通过相对比较的方法来解释平滑——打折(Discounting),通过吧非零的计数调低分派给哪些为零的计数。因此前面 $c^\star$ 是被计作打折的计数,而用相对折扣(Discount) 的方式来描述平滑 $d_c=\frac{c^\star}{c}$,其中 $c$ 是原始计数。
2.1.1 Smoothing 示例
示例来源于 SALP 中的 Berkeley Restaurant Project 例子,其中包括了单词数量 $V$ 为 $1446$,
i | want | to | eat | chinese | food | lunch | spend | |
---|---|---|---|---|---|---|---|---|
i | 5 | 827 | 0 | 9 | 0 | 0 | 0 | 2 |
want | 2 | 0 | 608 | 1 | 6 | 6 | 5 | 1 |
to | 2 | 0 | 4 | 686 | 2 | 0 | 6 | 211 |
eat | 0 | 0 | 2 | 0 | 16 | 2 | 42 | 0 |
chinese | 1 | 0 | 0 | 0 | 0 | 82 | 1 | 0 |
food | 15 | 0 | 15 | 0 | 1 | 4 | 0 | 0 |
lunch | 2 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
spend | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
以 Bigram 的方式计算出相应的概率值 $\P(w_n|w_{n-1})=\frac{C(w_{n-1}w_n}{C(w_{n-1})}$ 如下:
i | want | to | eat | chinese | food | lunch | spend | |
---|---|---|---|---|---|---|---|---|
i | 0.002 | 0.330 | 0.0036 | 0 | 0 | 0 | 0.00079 | |
want | 0.00220 | 0.66 | 0.0011 | 0.00650.0065 | 0.0054 | 0.0011 | ||
to | 0.00083 | 0 | 0.0017 | 0.28 | 0.00083 | 0 | 0.0025 | 0.087 |
eat | 0 | 0 | 0.0027 | 0 | 0.021 | 0.0027 | 0.0560 | |
chinese | 0.00630 | 0 | 0 | 0 | 0.52 | 0.0063 | 0 | |
food | 0.014 | 0 | 0.0140 | 0.00092 | 0.0037 | 0 | 0 | |
lunch | 0.00590 | 0 | 0 | 0 | 0.0029 | 0 | 0 | |
spend | 0.00360 | 0.0036 | 0 | 0 | 0 | 0 | 0 |
采用 Add-one smoothing 方式,调整计数:
i | want | to | eat | chinese | food | lunch | spend | |
---|---|---|---|---|---|---|---|---|
i | 6 | 828 | 1 | 10 | 1 | 1 | 1 | 3 |
want | 3 | 1 | 609 | 2 | 7 | 7 | 6 | 2 |
to | 3 | 1 | 5 | 687 | 3 | 1 | 7 | 212 |
eat | 1 | 1 | 3 | 1 | 17 | 3 | 43 | 1 |
chinese | 2 | 1 | 1 | 1 | 1 | 83 | 2 | 1 |
food | 16 | 1 | 16 | 1 | 2 | 5 | 1 | 1 |
lunch | 3 | 1 | 1 | 1 | 1 | 2 | 1 | 1 |
spend | 2 | 1 | 2 | 1 | 1 | 1 | 1 | 1 |
调整之后的 Bigram 概率值 $P_{Laplace}(w_i)=\frac{c_i+1}{N+V}$ :
| | i | want | to | eat | chinese | food | lunch | spend |
| ——- | ——- | ——- | ——- | ——- | ——- | ——- | ——- | ——- |
| i | 0.0015 | 0.21 | 0.00025 | 0.0025 | 0.00025 | 0.00025 | 0.00025 | 0.00075 |
| want | 0.0013 | 0.00042 | 0.26 | 0.00084 | 0.0029 | 0.0029 | 0.0025 | 0.00084 |
| to | 0.00078 | 0.00026 | 0.0013 | 0.18 | 0.00078 | 0.00026 | 0.0018 | 0.055 |
| eat | 0.00046 | 0.00046 | 0.0014 | 0.00046 | 0.0078 | 0.0014 | 0.02 | 0.00046 |
| chinese | 0.0012 | 0.00062 | 0.00062 | 0.00062 | 0.00062 | 0.052 | 0.0012 | 0.00062 |
| food | 0.0063 | 0.00039 | 0.0063 | 0.00039 | 0.00079 | 0.002 | 0.00039 | 0.00039 |
| lunch | 0.0017 | 0.00056 | 0.00056 | 0.00056 | 0.00056 | 0.0011 | 0.00056 | 0.00056 |
| spend | 0.0012 | 0.00058 | 0.0012 | 0.00058 | 0.00058 | 0.00058 | 0.00058 | 0.00058 |
如果对平滑方法对影响进行分析,即平滑之后调整的计数情况 $c^\star(w_{n-1}w_n)=\frac{[C(w_{n-1}w_n)+1]\times C(w_{n-1})}{C(w_{n-1}+V)}$:
| | i | want | to | eat | chinese | food | lunch | spend |
| ——- | —- | —– | —– | —– | ——- | —- | —– | —– |
| i | 3.8 | 527 | 0.64 | 6.4 | 0.64 | 0.64 | 0.64 | 1.9 |
| want | 1.2 | 0.39 | 238 | 0.78 | 2.7 | 2.7 | 2.3 | 0.78 |
| to | 1.9 | 0.63 | 3.1 | 430 | 1.9 | 0.63 | 4.4 | 133 |
| eat | 0.34 | 0.34 | 1 | 0.34 | 5.8 | 1 | 15 | 0.34 |
| chinese | 0.2 | 0.098 | 0.098 | 0.098 | 0.098 | 8.2 | 0.2 | 0.098 |
| food | 6.9 | 0.43 | 6.9 | 0.43 | 0.86 | 2.2 | 0.43 | 0.43 |
| lunch | 0.57 | 0.19 | 0.19 | 0.19 | 0.19 | 0.38 | 0.19 | 0.19 |
| spend | 0.32 | 0.16 | 0.32 | 0.16 | 0.16 | 0.16 | 0.16 | 0.16 |
可以看出调整之后对原来的计数数量影响较大,前缀词例如 $C(want\ to)$ 的数量从 $609$ 变为了 $238$,体现在 $P(to|want)$ 的概率降到 $0.26$,而后缀词则在增加 $
3. 评估指标
外在评测:在语言模型中评估模型的最佳方式是,将语言模型嵌入到具体的应用任务测试应用的总体性能的方式,即端到端的外在评测(Extrinsic Evaluation),也称为现实评测(in vivo evaluation)。
内在评测(Intrinsic Evaluation),是与应用任务无关的模型质量评测。
前者能显性评估两个模型的性能,但是评测消耗的代价很高,应该常采用内在评测。困惑度(Perplexity) 是对于 N 元语法模型常见的内在评测度量指标,虽然这个指标不能保证任务模型性能得到真实改进,但是应用任务的性能改进是和困惑度改进具有相关关系。而且它是一个快速的检验算法。
困惑度(Perplexity, PP) 是语言模型指派给测试集的概率函数。对一个句子序列来说,就是一个语言模型下的序列概率函数。困惑度可以理解为,如果每个时间步都根据语言模型计算的概率分布随机挑词,那么平均情况下,挑多少个词才能挑到正确的那个。其公式如下:
$$
PP(W)=P(w_1w_2\cdots w_n)^{-\frac{1}{N}} \
=\sqrt[N]{\frac{1}{P(w_1w_2\cdots w_n)}} \
=\sqrt[N]{\frac{1}{\displaystyle{\prod_{i=1}^N}P(w_i|(w_1\cdots w_{i-1}))}} \
\text{第三个等式是使用链式展开}
$$
另一种研究困惑度的方式,是通过加权平均转移因子(Weighted Average Branching Factor),它的表示基础是转移因子(Branching Factor)——任何一个单词后面可能连续的单词数量。举个以数字字符串例子来说,每个数字字符出现概率为 $\frac{1}{10}$,以这种方式得到的困惑去为 $PP(W)=(\frac{1}{10}^N)^{\frac{-1}{N}}=10$。但是实际情况下 0 发生的概率比较高,例如训练数据集中 0 发生了 91 次,而其他数字数据发生了 1 次。那么在测试数据中 0003000
,测试集中的预测掉一个数字为 0 的困惑度比较小,也就是有较高的概率为 0。在这个例子中,虽然转移因子依然是 10,但是困惑度或者使用加权平均转移因子更小。