语言模型(language model, LM)在自然语言处理中占有重要的地位,尤其在基于统计模型的语音识别、机器翻译、汉语自动分词和句法分析等相关研究中得到了广泛应用。本文介绍两种语言模型n-gram 语言模型和神经网络语言模型。**将 n-gram 语言模型看作是基于词与词共现频次的统计,而神经网络语言模型则是给每个词分别赋予分布式向量表征,探索它们在高维连续空间中的依赖关系。**实验证明,神经网络的分布式表征以及非线性映射更加适合对自然语言进行建模。
基本知识
一个语言模型通常构建为字符串s的概率分布
p
(
s
)
p(s)
p(s),这里
p
(
s
)
p(s)
p(s)反映的是字符串s在一个句子出现的频率。如一个人所说的话语中每100个句子里大约有一句是
Okay,则可以认为
p
(
O
k
a
y
)
≈
0.01
p(Okay)≈0.01
p(Okay)≈0.01。
设句子
s
=
w
1
w
2
…
w
l
s=w_1w_2…w_l
s=w1w2…wl(
w
i
w_i
wi表示组成句子的基元,字,词或短语),其概率为:
p
(
s
)
=
p
(
w
1
)
p
(
w
2
∣
w
1
)
p
(
w
3
∣
w
2
w
1
)
…
p
(
w
l
∣
w
1
…
w
l
−
1
)
=
∏
i
=
1
l
p
(
w
i
∣
w
1
…
w
i
−
1
)
\begin{aligned}p(s) &= p(w_1)p(w_2|w_1)p(w_3|w_2w_1)\ldots p(w_l|w_1\ldots w_{l-1})\\&=\prod_{i=1}^l p(w_i|w_1\ldots w_{i-1})\end{aligned}
p(s)=p(w1)p(w2∣w1)p(w3∣w2w1)…p(wl∣w1…wl−1)=i=1∏lp(wi∣w1…wi−1)
对于一些句子,直接计算$ p(w_i|w_1\ldots w_{i-1})
是
不
现
实
的
,
由
此
引
入
马
尔
可
夫
假
设
,
即
假
设
当
前
词
出
现
的
概
率
只
依
赖
于
前
是不现实的,由此引入马尔可夫假设,即假设当前词出现的概率只依赖于前
是不现实的,由此引入马尔可夫假设,即假设当前词出现的概率只依赖于前n-1$个词。即:
p
(
w
i
∣
w
1
…
w
i
−
1
)
=
p
(
w
i
∣
w
i
−
n
+
1
…
w
i
−
1
)
p(w_i|w_1\ldots w_{i-1}) = p(w_i|w_{i-n+1}\ldots w_{i-1})
p(wi∣w1…wi−1)=p(wi∣wi−n+1…wi−1)
这是语言模型的基本思想。
统计语言模型
当前词出现的概率只依赖于前
n
−
1
n-1
n−1个词。即:
p
(
w
i
∣
w
1
…
w
i
−
1
)
=
p
(
w
i
∣
w
i
−
n
+
1
…
w
i
−
1
)
p(w_i|w_1\ldots w_{i-1}) = p(w_i|w_{i-n+1}\ldots w_{i-1})
p(wi∣w1…wi−1)=p(wi∣wi−n+1…wi−1)
n取不同的值得到不同的n-gram语言模型。
n-gram语言模型
(1)当n=1时,即出现在第i位上的词
w
i
w_i
wi不依赖于过去的任何词。即:
p
(
w
1
w
2
…
w
l
)
=
∏
1
n
p
(
w
i
)
p(w_1w_2…w_l) = \prod_1^n p(w_i)
p(w1w2…wl)=1∏np(wi)
(2)当n=2时,即出现在第i位上的词
w
i
w_i
wi仅依赖于前面的一个词
w
i
−
1
w_{i-1}
wi−1 有关。即:
p
(
w
1
w
2
…
w
l
)
=
∏
1
n
p
(
w
i
∣
w
i
−
1
)
p(w_1w_2…w_l) = \prod_1^n p(w_i|w_{i-1})
p(w1w2…wl)=1∏np(wi∣wi−1)
(3)当n=3时,即出现在第i位上的词
w
i
w_i
wi仅依赖于前面的两个个词
w
i
−
2
w
i
−
1
w_{i-2}w_{i-1}
wi−2wi−1 有关。即:
p
(
w
1
w
2
…
w
l
)
=
∏
1
n
p
(
w
i
∣
w
i
−
2
,
w
i
−
1
)
p(w_1w_2…w_l) = \prod_1^n p(w_i|w_{i-2},w_{i-1})
p(w1w2…wl)=1∏np(wi∣wi−2,wi−1)
接下来以
n
=
2
n=2
n=2讲述n-gram语言模型。即一个词的概率只依赖于它前面的一个词,那么:
p
(
s
)
=
p
(
w
1
w
2
…
w
l
)
=
∏
1
n
p
(
w
i
∣
w
i
−
1
)
p(s)=p(w_1w_2…w_l) = \prod_1^n p(w_i|w_{i-1})
p(s)=p(w1w2…wl)=1∏np(wi∣wi−1)
当
i
=
1
i=1
i=1时,为了使上式有意义,在句子的开头加上
<
B
O
S
>
<BOS>
<BOS>,即对于所有的句子
w
0
=
<
B
O
S
>
w_0 = <BOS>
w0=<BOS>。同时,给每个句子加上一个结束符
<
E
O
S
>
<EOS>
<EOS>,加上结束符的目的是使得所有的字符串的概率之和
∑
s
p
(
s
)
=
1
\sum_sp(s)=1
∑sp(s)=1。
举例:假设要计算概率
p
(
M
a
r
k
w
r
o
t
e
a
b
o
o
k
)
p(Mark \quad wrote \quad a \quad book)
p(Markwroteabook):
p
(
M
a
r
k
w
r
o
t
e
a
b
o
o
k
)
=
p
(
M
a
r
k
∣
<
B
O
S
>
)
×
p
(
w
r
o
t
e
∣
M
a
r
k
)
×
p
(
a
∣
w
r
o
t
e
)
×
p
(
b
o
o
k
∣
a
)
×
p
(
<
E
O
S
>
∣
b
o
o
k
)
\begin{aligned} p(Mark \quad wrote \quad a \quad book) = &p(Mark|<BOS>)\times p(wrote|Mark) \times p(a|wrote) \\&\times p(book|a) \times p(<EOS>|book) \end{aligned}
p(Markwroteabook)=p(Mark∣<BOS>)×p(wrote∣Mark)×p(a∣wrote)×p(book∣a)×p(<EOS>∣book)
那么
p
(
w
i
∣
w
i
−
1
)
p(w_i|w_{i-1})
p(wi∣wi−1)如何计算?我们采用极大似然估计进行计算:
p
(
w
i
∣
w
i
−
1
)
=
c
(
w
i
−
1
w
i
)
∑
w
i
c
(
w
i
−
1
w
i
)
p(w_i|w_{i-1}) = \frac{c(w_{i-1}w_i)}{\sum_{w_i}c(w_{i-1}w_i)}
p(wi∣wi−1)=∑wic(wi−1wi)c(wi−1wi)
用于构建语言模型的文本称为训练语料(training corpus)。对于n元语法模型,使用的训练语料的规模一般要有几百万个词。
例如:假设训练语料S由下面3个句子构成:
用计算最大似然估计的方法计算概率
p
(
B
R
O
W
R
E
A
D
A
B
O
O
K
)
p(BROW \quad \quad READ \quad A \quad BOOK)
p(BROWREADABOOK),具体过程如下:
P
(
B
R
O
W
∣
<
B
O
S
>
)
=
c
(
<
B
O
S
>
B
R
O
W
)
∑
w
c
(
<
B
O
S
>
w
)
=
1
3
P
(
R
E
A
D
∣
B
R
O
W
)
=
c
(
B
R
O
W
R
E
A
D
)
∑
w
c
(
B
R
O
W
w
)
=
1
1
P
(
A
∣
R
E
A
D
)
=
c
(
R
E
A
D
A
)
∑
w
c
(
R
E
A
D
w
)
=
2
3
P
(
B
O
O
K
∣
A
)
=
c
(
A
B
O
O
K
)
∑
w
c
(
A
w
)
=
1
2
P
(
<
E
O
S
>
∣
B
O
O
K
)
=
c
(
B
O
O
K
<
E
O
S
>
)
∑
w
c
(
B
O
O
K
w
)
=
1
2
\begin{aligned} &P(BROW |<BOS>) = \frac{c(<BOS>\quad BROW )}{\sum_{w}c(<BOS> \quad w)} = \frac{1}{3} \\ & P(READ |BROW) = \frac{c(BROW \quad READ )}{\sum_{w}c(BROW \quad w)} = \frac{1}{1} \\ & P(A |READ) = \frac{c(READ \quad A )}{\sum_{w}c(READ \quad w)} = \frac{2}{3} \\ & P(BOOK |A) = \frac{c( A \quad BOOK )}{\sum_{w}c(A \quad w)} = \frac{1}{2} \\ & P(<EOS>|BOOK ) = \frac{c( BOOK \quad <EOS> )}{\sum_{w}c(BOOK \quad w)} = \frac{1}{2} \end{aligned}
P(BROW∣<BOS>)=∑wc(<BOS>w)c(<BOS>BROW)=31P(READ∣BROW)=∑wc(BROWw)c(BROWREAD)=11P(A∣READ)=∑wc(READw)c(READA)=32P(BOOK∣A)=∑wc(Aw)c(ABOOK)=21P(<EOS>∣BOOK)=∑wc(BOOKw)c(BOOK<EOS>)=21
所以:
p
(
B
R
O
W
R
E
A
D
A
B
O
O
K
)
=
P
(
B
R
O
W
∣
<
B
O
S
>
)
×
P
(
R
E
A
D
∣
B
R
O
W
)
×
P
(
A
∣
R
E
A
D
)
×
P
(
B
O
O
K
∣
A
)
×
P
(
<
E
O
S
>
∣
B
O
O
K
)
=
1
3
×
1
×
2
3
×
1
2
×
1
2
≈
0.06
\begin{aligned} p(BROW \quad \quad READ \quad A\quad BOOK)= &P(BROW |<BOS>)\times P(READ |BROW)\\& \times P(A |READ)\times P(BOOK |A)\times P(<EOS>|BOOK ) \\ =&\frac{1}{3} \times 1 \times\frac{2}{3}\times\frac{1}{2}\times\frac{1}{2} \approx 0.06 \end{aligned}
p(BROWREADABOOK)==P(BROW∣<BOS>)×P(READ∣BROW)×P(A∣READ)×P(BOOK∣A)×P(<EOS>∣BOOK)31×1×32×21×21≈0.06
n-gram语言模型中的平滑技术
一方面,我们知道自然语言处理中的一大痛点就是出现未登录词(OOV)的问题,即测试集中出现了训练集中未出现过的词,导致语言模型计算出的概率为零。另一方面,可能某个子序列未在训练集中出现,也会导致概率为零。而这显然不是我们乐意看到的,平滑的出现就是为了缓解这类问题。
常见的平滑方法有:
加法平滑方法
古德-图灵(Good-Turing)估计法
Katz平滑方法
Jelinek-Mercer平滑方法
Witten-Bell平滑方法
绝对减值法
具体内容参考统计自然语言处理第二版_ 宗成庆
n-gram 语言模型小结
优点:(1) 采用极大似然估计,参数易训练;(2) 完全包含了前 n-1 个词的全部信息;(3) 可解释性强,直观易理解。
缺点:(1) 缺乏长期依赖,只能建模到前 n-1 个词;(2) 随着 n 的增大,参数空间呈指数增长;(3) 数据稀疏,难免会出现OOV的问题;(4) 单纯的基于统计频次,泛化能力差。
n-grams存在的问题:1.泛化时常常有训练语料中没有出现过的词序列;2.没有考虑词之间的相似性。
神经网络语言模型(NNLM)
NNLM基本原理
和统计语言模型相似,当前词出现的概率只依赖于前
n
−
1
n-1
n−1个词。即:
p
(
w
t
∣
w
1
…
w
t
−
1
)
=
p
(
w
t
∣
w
t
−
n
+
1
…
w
t
−
1
)
p(w_t|w_1\ldots w_{t-1}) = p(w_t|w_{t-n+1}\ldots w_{t-1})
p(wt∣w1…wt−1)=p(wt∣wt−n+1…wt−1)
假设
w
t
∈
V
w_t \in V
wt∈V,存在一个
∣
V
∣
×
m
|V|\times m
∣V∣×m参数矩阵C,矩阵的每一行代表每一个词的特征向量,一个|V|个词,m代表每个特征向量由m个维度。
C
(
w
t
)
C(w_t)
C(wt)表示第词
w
t
w_t
wt的特征向量。
神经网络语言模型的数学形式如下:
f
(
i
,
w
t
−
n
+
1
…
w
t
−
1
)
=
g
(
i
,
C
(
w
t
−
n
+
1
)
…
C
(
w
t
−
1
)
)
=
p
^
(
w
t
=
i
∣
w
1
t
−
1
)
f(i,w_{t-n+1}\ldots w_{t-1}) = g(i,C(w_{t-n+1})\ldots C(w_{t-1}) ) = \hat p(w_t=i|w_1^{t-1})
f(i,wt−n+1…wt−1)=g(i,C(wt−n+1)…C(wt−1))=p^(wt=i∣w1t−1)
具体细节如图所示:
如图所示:将句子的第
t
−
n
+
1
t-n+1
t−n+1到
t
−
1
t-1
t−1个词特征向量
C
(
w
t
−
n
+
1
)
…
C
(
w
t
−
1
)
C(w_{t-n+1})\ldots C(w_{t-1})
C(wt−n+1)…C(wt−1)作为神经网络的输入,输出第
i
i
i个词是
w
t
w_t
wt的概率。计算过程如下:
y
=
W
x
+
U
t
a
n
h
(
d
+
H
x
)
+
b
y = W x + U tanh(d+Hx) + b
y=Wx+Utanh(d+Hx)+b
其中:
x
=
(
C
(
w
t
−
1
)
,
C
(
w
t
−
2
)
,
…
,
C
(
w
t
−
n
+
1
)
)
x = (C(w_{t-1}),C(w_{t-2}),\ldots ,C(w_{t-n+1}))
x=(C(wt−1),C(wt−2),…,C(wt−n+1))
经过上式得到
y
w
=
(
y
w
,
1
,
y
w
,
2
,
…
,
y
w
,
N
)
T
y_w = (y_{w,1},y_{w,2},\ldots,y_{w,N})^T
yw=(yw,1,yw,2,…,yw,N)T ,其中,将
y
w
y_w
yw进行softmax后,
y
w
,
i
y_{w,i}
yw,i 表示当上下文为
c
o
n
t
e
x
t
(
w
)
context(w)
context(w)时,下一个词恰好是词典中第
i
i
i个词的概率,即:
P
(
w
∣
c
o
n
t
e
x
t
(
w
)
)
=
e
y
w
,
i
w
∑
i
=
1
N
e
y
w
,
i
P(w|context(w)) = \frac{e^{y_{w,i_w}}}{\sum_{i=1}^N e^{y_{w,i}}}
P(w∣context(w))=∑i=1Neyw,ieyw,iw
其中,
i
w
i_w
iw表示词
w
w
w在词典中的索引。
大部分计算集中在隐藏层和输出层之间的矩阵向量运算,以及输出层上的softmax归一化运算
该模型的参数是:
θ
=
(
b
,
d
,
W
,
U
,
C
)
\theta = (b,d,W,U,C)
θ=(b,d,W,U,C)
损失函数是:
L
=
−
1
T
∑
t
log
p
^
(
w
t
=
i
∣
w
t
−
n
+
1
…
w
t
−
1
)
+
R
(
θ
)
L = -\frac{1}{T} \sum_t \log \hat p(w_t=i|w_{t-n+1}\ldots w_{t-1}) + R(\theta)
L=−T1t∑logp^(wt=i∣wt−n+1…wt−1)+R(θ)
R
(
θ
)
R(\theta)
R(θ)是正则化项,用于控制过拟合。
有了损失函数,我们可以用梯度下降法,在给定学习了
η
\eta
η的条件下,进行参数更新:
θ
←
θ
−
η
∂
L
∂
θ
\theta \leftarrow \theta - \eta \frac{\partial L}{\partial \theta}
θ←θ−η∂θ∂L
直至收敛,得到一组最优参数。
NNLM总结
先给每个词在连续空间中赋予一个向量(词向量),再通过神经网络去学习这种分布式表征。利用神经网络去建模当前词出现的概率与其前 n-1 个词之间的约束关系。很显然这种方式相比 n-gram 具有更好的泛化能力,只要词表征足够好。从而很大程度地降低了数据稀疏带来的问题。但是这个结构的明显缺点是仅包含了有限的前文信息
优点:(1) 长距离依赖,具有更强的约束性;(2) 避免了数据稀疏所带来的OOV问题;(3) 好的词表征能够提高模型泛化能力。
缺点:(1) 模型训练时间长;(2) 神经网络黑盒子,可解释性较差。
注意他和n-gram区别:
1.词语之间的相似性可以通过词向量来体现.
举例来说,如果某个(英语)语料中S1=“A dog is running in the room”出现了10000次,而S2=“A cat is running in the room”只出现了1次.按照n-gram模型的做法,p(S1)肯定会远大于p(S2)。注意,S1和S2的唯一区别在于dog和cat,而这两个词无论是句法还是语义上都扮演了相同的角色,因此,p(S1)和p(S2)应该很相近才对.
然而,由神经概率语言模型算得的p(S1)和p(S2)是大致相等的.原因在于: (1)在.神经慨率语言模型中假定了“相似的”的词对应的词向量也是相似的;(2)概率函数关于词向量是光滑的,即词向量中的一一个小变化对概率的影响也只是一一个小变化. 这样一来,对于下面这些句子
只要在语料库中出现一个,其他句子的概率也会相应增大。
2.基于词向量的模型自带平滑化功能(由 p ( w ∣ C o n t e x t ( w ) ) ∈ ( 0 , 1 ) p(w|Context(w))∈(0,1) p(w∣Context(w))∈(0,1)不会为零),不再需要像n-gram那样进行额外处理了.
语言模型评价指标—困惑度
通常将困惑度作为语言模型的评价指标,设存在语言序列
W
=
(
w
1
,
w
2
,
…
,
w
N
)
W=(w_1,w_2,\ldots,w_N)
W=(w1,w2,…,wN),则每个词的平均交叉熵为:
H
(
W
)
=
−
1
N
log
P
(
w
1
,
w
2
,
…
,
w
N
)
H(W) = -\frac{1}{N}\log P(w_1,w_2,\ldots,w_N)
H(W)=−N1logP(w1,w2,…,wN)
显然,交叉熵越小,得到的概率模型越接近真实分布,进一步我们定义困惑度为:
P
r
e
p
l
e
x
i
t
y
(
W
)
=
2
H
(
W
)
=
1
P
(
w
1
,
w
2
,
…
,
w
N
)
N
Preplexity(W) = 2^{H(W)} = \sqrt[N]{\frac{1}{ P(w_1,w_2,\ldots,w_N)}}
Preplexity(W)=2H(W)=NP(w1,w2,…,wN)1
由公式可知:困惑度越小,说明所建模的语言模型越精确
参考文章