2.3 n-gram 语言模型 59
2.3 n-gram 语言模型
在骰子游戏中,可以通过一种统计的方式,估计出在文本中词和句子出现的概
率。但是在计算句子概率时往往会因为句子的样本过少而无法正确估计出句子出现
的概率。为了解决这个问题,这里引入了计算整个单词序列概率 P (w
1
w
2
...w
m
)
方法
——
统计语言模型。下面将重点介 n-gram 语言模型。它是一种经典的统
语言模型,而且在机器翻译及其他自然语言处理任务中有非常广泛的应用。
2.3.1 建模
语言模型Language Model)的目的是描述文字序列出现的规律,其对问题建模
的过程被称作语言建模Language Modeling如果使用统计建模的方式,语言模型
可以被定义为计算 P (w
1
w
2
...w
m
) 的问题,也就是计算整个词序列 w
1
w
2
...w
m
出现
的可能性大小。具体定义如下,
定义 2.3.1 汇表 V 上的语言模型是一个函 P (w
1
w
2
...w
m
),它表 V
+
上的
一个概率分布。其中,对于任何词串 w
1
w
2
...w
m
V
+
,有 P (w
1
w
2
...w
m
) 0
而且对于所有的词串,函数满足归一化条件
P
w
1
w
2
...w
m
V
+
P (w
1
w
2
...w
m
) = 1
直接求 P (w
1
w
2
...w
m
) 并不简单,因为如果把整个词串 w
1
w
2
...w
m
作为一个变
量,模型的参数量会非常大。w
1
w
2
...w
m
|V |
m
种可能性,这里 |V | 表示词汇表大
小。显然, m 增大时,模型的复杂度会急剧增加,甚至都无法进行存储和计算。
然把 w
1
w
2
...w
m
作为一个变量不好处理,就可以考虑对这个序列的生成过程进行分
解。使用链式法则(见2.1.3 节),很容易得到:
P (w
1
w
2
...w
m
) = P (w
1
)P (w
2
|w
1
)P (w
3
|w
1
w
2
)...P (w
m
|w
1
w
2
...w
m1
) (2.21)
这样,w
1
w
2
...w
m
的生成可以被看作是逐个生成每个单词的过程,即首先生成
w
1
,然后根据 w
1
再生成 w
2
,然后根据 w
1
w
2
再生成 w
3
,以此类推,直到根据所有
m1 个词生成序列的最后一个单词 w
m
这个模型把联合概率 P (w
1
w
2
...w
m
)
解为多个条件概率的乘积,虽然对生成序列的过程进行了分解,但是模型的复杂度
和以前是一样的,比如,P (w
m
|w
1
w
2
...w
m1
) 仍然不好计算。
换一个角度看,P (w
m
|w
1
w
2
...w
m1
) 体现了一种基于“历史”的单词生成模型,
也就是把前面生成的所有单词作为“历史”并参考这个“历史”生成当前单词。
是这个“历史”的长度和整个序列长度是相关的,也是一种长度变化的历史序列。
了化简问题,一种简单的想法是使用定长历史,比如,每次只考虑前面 n 1 个历史
单词来生成当前单词。这就是 n-gram 语言模型,其 n-gram 表示 n 连续单词构
成的单元,也被称作n 元语法单元。这个模型的数学描述如下:
P (w
m
|w
1
w
2
...w
m1
) = P (w
m
|w
mn+1
...w
m1
) (2.22)
60 Chapter 2. 统计语言建模基础 肖桐 朱靖波
如表2.2所示,整个序列 w
1
w
2
...w
m
的生成概率可以被重新定义为:
2.2 基于 n-gram 的序列生成概率
链式法则 1-gram 2-gram ... n-gram
P (w
1
w
2
.. .w
m
) = P (w
1
w
2
.. .w
m
) = P ( w
1
w
2
.. .w
m
) = . .. P ( w
1
w
2
.. .w
m
) =
P (w
1
)× P (w
1
)× P (w
1
)× .. . P (w
1
)×
P (w
2
|w
1
)× P (w
2
)× P (w
2
|w
1
)× .. . P (w
2
|w
1
)×
P (w
3
|w
1
w
2
)× P (w
3
)× P (w
3
|w
2
)× .. . P (w
3
|w
1
w
2
)×
P (w
4
|w
1
w
2
w
3
)× P (w
4
)× P (w
4
|w
3
)× .. . P (w
4
|w
1
w
2
w
3
)×
.. . .. . .. . .. . .. .
P (w
m
|w
1
.. .w
m1
) P (w
m
) P (w
m
|w
m1
) .. . P (w
m
|w
mn+1
.. .w
m1
)
可以看到,1-gram 语言模型只是 n-gram 语言模型的一种特殊形式。基于独立性
假设,1-gram 假定当前单词出现与否与任何历史都无关,这种方法大大化简了求解句
子概率的复杂度。比如,上一节中公式(2.20)就是一个 1-gram 语言模型。但是,句子
中的单词并非完全相互独立的,这种独立性假设并不能完美地描述客观世界的问题。
如果需要更精确地获取句子的概率,就需要使用更长的“历史”信息,比如,2-gram
3-gram、甚至更高阶的语言模型。
n-gram 的优点在于,它所使用的历史信息是有限的, n1 个单词。这种性质
也反了经马尔夫链
[37, 38]
,有也被马尔夫假者马可夫
属性。因此 n-gram 也可以被看作是变长序列上的一种马尔可夫模型,比如,2-gram
语言模型对应着 1 阶马尔可夫模型,3-gram 语言模型对应 2 马尔可夫模型,以
此类推。
那么,如何计算 P (w
m
|w
mn+1
...w
m1
) 呢?有很多种选择,比如:
基于频次的方法直接利用词序列在训练数据中出现的频次计算出 P(w
m
|w
mn+1
...w
m1
)
P (w
m
|w
mn+1
...w
m1
) =
c(w
mn+1
...w
m
)
c(w
mn+1
...w
m1
)
(2.23)
其中,c(·) 是在训练数据中统计频次的函数。
工神经网络方。构建一个人工神经网络估计 P (w
m
|w
mn+1
...w
m1
) 值,
比如,可以构建一个前馈神经网络来对 n-gram 进行建模。
极大似然估计方法(基于频次的方法)和掷骰子游戏中介绍的统计单词概率的方
法是一致的,它的核心是使用 n-gram 出现的频次进行参数估计。基于人工神经网络的
方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入 w
mn+1
...w
m1
和输 P (w
m
|w
mn+1
...w
m1
) 行建模,而型的参数通过网络中神经元之间
接的权重进行体现。严格来说,基于人工神经网络的方法并不算基于 n-gram 的方法,
或者说它并没有显性记录 n-gram 的生成概率,也不依赖 n-gram 频次进行参数估
2.3 n-gram 语言模型 61
计。为了保证内容的连贯性,接下来仍以传统 n-gram 语言模型为基础进行讨论,
于人工神经网络的方法将会在第九章进行详细介绍。
n-gram 语言模型的使用非常简单。可以直接用它来对词序列出现的概率进行计
算。比如,可以使用一个 2-gram 语言模型计算一个句子出现的概率,其中单词之间
用斜杠分隔,如下:
P
2-gram
(确实/现在/数据//)
= P (确实) ×P (现在|确实) ×P (数据|现在) ×
P (|数据) ×P (|) (2.24)
n-gram 语言模型为代表的统计语言模型的应用非常广泛。除了将要在第三章
中介绍的全概率分词方法,在文本生成、信息检索、摘要等自然语言处理任务中,
言模型都有举足轻重的地位。包括近些年非常受关注的预训练模型,本质上也是统
计语言模型。这些技术都会在后续章节进行介绍。值得注意的是,统计语言模型为
解决自然语言处理问题提供了一个非常好的建模思路,即:把整个序列生成的问题
转化为逐个生成单词的问题。实际上,这种建模方式会被广泛地用于机器翻译建模,
在统计机器翻译和神经机器翻译中都会有具体的体现。
2.3.2 参数估计和平滑算法
n-gram 模型, P (w
m
|w
m
n
+1
...w
m
1
)
Parameter n-gram 值,
参数估计。通常,参数估计可以通过在数据上的统计得到。一种简单的方法是:给
定一定数的句子,统计 n-gram 出现的频次,并利用公(2.23)到每参数
P (w
m
|w
mn+1
...w
m1
) 的值。这个过程也被称作模型的训练Training对于自然
语言处理任务来说,统计模型的训练是至关重要的。在本书后面的内容中也会看到,
不同的问题可能需要不同的模型以及不同的模型训练方法,并且很多研究工作也都
集中在优化模型训练的效果上。
回到 n-gram 语言模型上。前面所使用的参数估计方法并不完美,因为它无法很
好地处理低频或者未见现象。比如,在式(2.24)所示的例子中,如果语料中从没有“确
实”和“现在”两个词连续出现的情况,即 c(确实/现在) = 0那么使 2-gram
算句子“确实/现在/数据//多”的概率时,会出现如下情况:
P (现在|确实) =
c(确实/现在)
c(确实)
=
0
c(确实)
= 0 (2.25)
62 Chapter 2. 统计语言建模基础 肖桐 朱靖波
显然,这个结果是不合理的。因为即使语料中没有“确实”“现在”两个词连
续出现,这种搭配也是客观存在的。这时简单地用极大似然估计得到概率却是 0
致整个句子出现的概率为 0更常见的问题是那些根本没有出现在词表中的词,称为
未登录Out-of-vocabulary WordOOV Word),比如一些生僻词,可能模型训练
阶段从来没有看到过,这时模型仍然会给出 0 概率。2.10展示了一个真实语料库中
词语出现频次的分布,可以看到绝大多数词都是低频词。
0 10 20 30 40 50 60 70 80 90 100
0
1
2
3
4
5
6
·10
6
WikiText-103 上的词表
词汇出现总次数
(次)
2.10 单词出现频次的分布
为了解决未登录词引起的零概率问题,常用的做法是对模型进行Smooth-
ing就是给可能出零概率的情况一个零的概率,使得型不会对整个
给出零概率。平滑可以用“劫富济贫”这一思想理解,在保证所有情况的概率和为 1
的前提下,使极低概率的部分可以从高概率的部分分配到一部分概率,从而达到平
滑的目的。
语言模型使用的平滑算法有很多。在本节中,要介绍三种平滑方法:加法平
滑法、古德-图灵估计法和 Kneser-Ney 平滑。这些方法也可以被应用到其他任务的概
率平滑操作中。
1. 加法平滑方法
加法平滑Additive Smoothing是一种简单的平滑技术。通常情况下,系统研发
者会利用采集到的语料库来模拟真实的全部语料库。当然,没有一个语料库能覆盖
所有的语言现象。假设有一个语料库 C其中从未出现“确实 现在”这样的 2-gram
现在要计算一个句 S =“确/现在/物价//高”的概率。当计算“确实/在”的
概率时,P (S) = 0,导致整个句子的概率为 0
加法平滑法假设每 n-gram 出现的次数比际统计次 θ 次,0 < θ 1
2.3 n-gram 语言模型 63
这样,计算概率的时候分子部分不会为 0。重新计算 P (现在|确实),可以得到:
P (现在|确实) =
θ +c(确实/现在)
P
|V |
w
(θ +c(确实/w))
=
θ +c(确实/现在)
θ|V |+ c(确实)
(2.26)
其中,V 表示词表,|V | 为词表中单词的个数,w 为词表中的一个词,c 表示统计单
词或短语出现的次数。有时候,加法平滑方法会将 θ 1这时称之为加一平滑或是
拉普拉斯平滑。这种方法比较容易理解,也比较简单,因此常被用于对系统的快速
实现上。
举一个例子。假设在一个英语文档中随机采样一些单词(词表大小 |V |= 20
个单词出现的次数为:look出现 4 次,people出现 3 次,am出现 2 次,what
出现 1 次,want出现 1 次,do出现 1 次。2.11 给出了在平滑之前和平滑之后
的概率分布。
未抽取词 do want what am people look
0
0.05
0.1
0.15
0.2
0.25
低概率词汇
词汇概率
未平滑
平滑后
2.11 无平滑和有平滑的概率分布
2. 古德-图灵估计方法
古德-图灵估计Good-Turing Estimate Alan Turing 和他的助手 Irving John Good
开发的,作为他们在二战期间破解德国密码机 Enigma 所使用方法的一部分, 1953
Irving John Good 发表。一方法也很多滑算的核心,其本思是:
把非零的 n 语法单元的概率降低,匀给一些低概率 n 元语法单元,以减小最大似
然估计与真实概率之间的偏离
[39, 40]
假定在语料库中出现 r 次的 n-gram n
r
个,特别的,出现 0 n-gram(即
未登录词及词串)有 n
0
个。语料库中全部单词的总个数为 N,显然:
N =
X
r=1
r n
r
(2.27)
这时,出现 r 次的 n-gram 的相对频率为 r/N也就是不做平滑处理时的概率估
64 Chapter 2. 统计语言建模基础 肖桐 朱靖波
计。为了解决零概率问题,对于任何一个出现 r 次的 n-gram古德-图灵估计法利用
出现 r + 1 次的 n-gram 统计量重新假设它出现 r
次:
r
= (r + 1)
n
r+1
n
r
(2.28)
基于这个公式,就可以估计所有 0 n-gram 的频次 n
0
r
= (r +1)n
1
= n
1
要把
这个重新估计的统计数转化为概率,需要进行归一化处理。对于每个统计数为 r
事件,其概率为:
P
r
=
r
N
(2.29)
其中:
N =
X
r=0
r
n
r
=
X
r=0
(r + 1)n
r+1
=
X
r=1
r n
r
(2.30)
也就是说,公式(2.30)中使用的 N 仍然为这个整个样本分布最初的计数。所有出
现事件(即 r > 0)的概率之和为:
P (r > 0) =
X
r>0
P
r
= 1
n
1
N
< 1 (2.31)
其中 n
1
/N 就是分配给所有出现 0 事件的概率。古德-图灵方法最终通过出现 1
次的 n-gram 估计了出现为 0 次的事件概率,达到了平滑的效果。
下面通过一个例子来说明这个方法是如何对事件出现的可能性进行平滑的。仍
然考虑在加法平滑法中统计单词的例子,根据古德-图灵方法进行修正如表2.3所示。
但是在 r 很大的时候经常会出现 n
r+1
= 0 的情况。通常,古德-图灵方法可能无
法很好的处理这种复杂的情况,不过该方法仍然是其他一些平滑方法的基础。
3. Kneser-Ney 平滑方法
Kneser-Ney 滑方法是 Reinhard Kneser Hermann Ney 1995 提出的用
于计 n 语法概率分布的方
[41, 42]
,并被广泛认为是最有效的平滑法之一。这
2.3 n-gram 语言模型 65
2.3 单词出现频次及古德-图灵平滑结果
r n
r
r
P
r
0 14 0.21 0.018
1 3 0.67 0.056
2 1 3 0.25
3 1 4 0.333
4 1 - -
种平滑方法改进了 Absolute Discounting
[43, 44]
中与高阶分布相结合的低阶分布的计
方法,使不同阶分布得到充分的利用。这种算法也综合利用了其他多种平滑算法的
思想。
首先介绍一下 Absolute Discounting 平滑算法,公式如下所示:
P
AbsDiscount
(w
i
|w
i1
) =
c(w
i1
w
i
) d
c(w
i1
)
+ λ(w
i1
)P (w
i
) (2.32)
其中 d 表示被裁剪的值,λ 是一个正则化常数。可以看到第一项是经过减值调整后的
2-gram 的概率值,第二项则相当于一个带权重 λ 1-gram 的插值项。然而这种插值
模型极易受到原始 1-gram 模型 P (w
i
) 的干扰。
假设这里使用 2-gram 1-gram 的插值模型预测下面句子中下划线处的词
I cannot see without my reading
直觉上应该会猜测这个地方的词应该是glasses但是在训练语料库中Francisco
出现的频率非常高。如果在预测时仍然使用的是标准的 1-gram 模型,那么系统会高
概率择“Francisco下划线处,这个果显不合的。当使混合
值模型时,如果reading Francisco”这种二元语法并没有出现在语料中,就会导
1-gram 对结果的影响变大,仍然会做出与标准 1-gram 模型相同的结果,犯下相同的
错误。
观察语料中的 2-gram 发现,Francisco的前一个词仅可能是San不会出现
reading。这个分析证实了,考虑前一个词的影响是有帮助的,比如仅在前一个
是“San”时,才给“Francisco”赋予一个较高的概率值。基于这种想法,改进原有
1-gram 模型,创造一个新的 1-gram 模型 P
continuation
简写为 P
cont
这个模型可以
通过考虑前一个词的影响评估当前词作为第二个词出现的可能性。
为了评估 P
cont
统计使用当前词作为第二个词所出现 2-gram 的种类,2-gram
类越多,这个词作为第二个词出现的可能性越高:
P
cont
(w
i
) |{w
i1
: c(w
i1
w
i
) > 0}| (2.33)
66 Chapter 2. 统计语言建模基础 肖桐 朱靖波
其中,公式(2.33)右端表示求出在 w
i
之前出现过的 w
i1
的数量。接下来通过对
全部的二元语法单元的种类做归一化可得到评估公式:
P
cont
(w
i
) =
|{w
i1
: c(w
i1
w
i
) > 0}|
|{(w
j1
,w
j
) : c(w
j1
w
j
) > 0}|
(2.34)
分母中对二元语法单元种类的统计还可以写为另一种形式:
P
cont
(w
i
) =
|{w
i1
: c(w
i1
w
i
) > 0}|
P
w
i
|{w
i1
: c(w
i1
w
i
) > 0}|
(2.35)
结合基础的 Absolute discounting 算公式,可以得到 Kneser-Ney 平滑方法的公
式:
P
KN
(w
i
|w
i1
) =
max(c(w
i1
w
i
) d,0)
c(w
i1
)
+ λ(w
i1
)P
cont
(w
i
) (2.36)
其中:
λ(w
i1
) =
d
c(w
i1
)
|{w
i
: c(w
i1
w
i
) > 0}| (2.37)
这里 max(·) 保证了子部分为不小 0 的数,原 1-gram 新成 P
cont
概率分布,λ
是正则化项。
为了更具普适性,不局限于 2-gram 1-gram 的插值模型,利用递归的方式可以
得到更通用的 Kneser-Ney 平滑公式:
P
KN
(w
i
|w
in+1
...w
i1
) =
max(c
KN
(w
in+1
...w
i
) d,0)
c
KN
(w
in+1
...w
i1
)
+
λ(w
in+1
...w
i1
)P
KN
(w
i
|w
in+2
...w
i1
) (2.38)
λ(w
in+1
...w
i1
) =
d
c
KN
(w
i1
in+1
)
|{w
i
: c
KN
(w
in+1
...w
i1
w
i
) > 0}| (2.39)
c
KN
(·) =
(
c(·) 当计算最高阶模型时
catcount(·) 当计算低阶模型时
(2.40)
其中 catcount(·) 表示的是单 w
i
作为 n-gram 中第 n 个词时 w
in+1
...w
i
的种类
目。
Kneser-Ney 滑是语言工具
[45, 46]
。还很多为基生出
来的算法,感兴趣的读者可以通过参考文献自行了解
[17, 42, 44]
2.3 n-gram 语言模型 67
2.3.3 语言模型的评价
在使用语言模型时,往往需要知道模型的质量。困惑度PerplexityPPL是一
种衡量语言模型的好坏的指标。对于一个真实的词序列 w
1
...w
m
,困惑度被定义为:
PPL = P (w
1
...w
m
)
1
m
(2.41)
本质上,PPL 反映了语言模型对序列可能性预测能力的一种评估。如果 w
1
...w
m
是真实的自然语言,“完美”的模型会得 P (w
1
...w
m
) = 1它对应了最低的困
PPL=1,这说明模型可以完美地对词序列出现的可能性进行预测。当然,真实
语言模型是无法达到 PPL=1 的,比如,在著名的 Penn TreebankPTB)数据上最好
的语言模型的 PPL 值也只能到达 35 左右。可见自然语言处理任务的困难程度。