赞
踩
语言模型(language model)是用来计算一个句子的概率的模型,或者预测下一个词出现的概率。通俗地讲,就是用来评估一个句子有多大的可能性是有意义的(是人话而不是一堆杂乱无章的词语组合)。
一段自然语言文本可以看做是一个离散时间序列
s
=
ω
1
,
ω
2
,
⋯
,
ω
T
s=\omega_1,\omega_2,\cdots,\omega_T
s=ω1,ω2,⋯,ωT,而一个语言模型的作用是构建这个时间序列的概率分布
P
(
s
)
P(s)
P(s)。概率计算公式可以表示为:
P
(
s
)
=
P
(
ω
1
,
ω
2
,
⋯
,
ω
T
)
=
P
(
ω
1
)
P
(
ω
2
∣
ω
1
)
P
(
ω
3
∣
ω
1
,
ω
2
)
⋯
P
(
ω
T
∣
ω
1
,
ω
2
,
⋯
,
ω
T
−
1
)
=
∏
t
=
1
T
P
(
ω
t
∣
ω
1
,
ω
2
,
⋯
,
ω
t
−
1
)
(1-1)
对于
P
(
ω
t
∣
ω
1
,
ω
2
,
⋯
,
ω
t
−
1
)
P(\omega_t|\omega_1,\omega_2,\cdots,\omega_{t-1})
P(ωt∣ω1,ω2,⋯,ωt−1),可以在大量娱乐库中采用频率统计的方式来近似估计:
P
(
ω
t
∣
ω
1
,
ω
2
,
⋯
,
ω
t
−
1
)
=
C
(
ω
1
,
ω
2
,
⋯
,
ω
t
)
∑
ω
C
(
ω
1
,
ω
2
,
⋯
,
ω
t
−
1
,
ω
)
=
C
(
ω
1
,
ω
2
,
⋯
,
ω
t
)
C
(
ω
1
,
ω
2
,
⋯
,
ω
t
−
1
)
(1-2)
直接计算上式是不现实的。假设词汇表大小为
V
V
V,由上式可以看到,产生第
i
i
i个词
ω
i
\omega_i
ωi的概率是由已经产生的
i
−
1
i-1
i−1个词
ω
1
,
ω
2
,
⋯
,
ω
i
−
1
\omega_1,\omega_2,\cdots,\omega_{i-1}
ω1,ω2,⋯,ωi−1决定的,那么我们必须考虑所有
V
i
−
1
V^{i-1}
Vi−1种不同历史情况下,产生第
i
i
i个词的概率。这样模型中就会有
V
i
V^i
Vi个自由参数(每个条件概率看成一个参数)。这在实际中几乎是无法从训练数据中估计出这些参数的。并且,很多词的组合可能在语料库中根本不存在,这样会导致最后估计出的概率为零(数据稀疏问题)。
因此需要引入语言模型来降低参数个数。语言模型有基于统计模型的,比如n元语法(n-gram),也有基于神经网络的。
n元语法(n-grams)是基于n-1阶马尔科夫链的概率语言模型,也即在n-gram模型中,一个词的出现概率只与前面n-1个词有关:
P
(
ω
1
,
ω
2
,
⋯
,
ω
T
)
=
∏
t
=
1
T
P
(
ω
t
∣
ω
t
−
(
n
−
1
)
,
ω
2
,
⋯
,
ω
t
−
1
)
(2-1)
P(\omega_1,\omega_2,\cdots,\omega_T)=\prod_{t=1}^{T}P(\omega_t|\omega_{t-(n-1)},\omega_2,\cdots,\omega_{t-1})\\\tag{2-1}
P(ω1,ω2,⋯,ωT)=t=1∏TP(ωt∣ωt−(n−1),ω2,⋯,ωt−1)(2-1)
每个条件概率需要实现在大量语料库中根据频率近似求得。
n元语法模型可能的缺陷:
一元模型假设每句子中的每个每个词都是独立的,也即:
p
(
s
)
=
p
(
ω
1
)
p
(
ω
2
)
⋯
p
(
ω
T
)
(2-2)
p(s)=p(\omega_1)p(\omega_2)\cdots p(\omega_T)\\\tag{2-2}
p(s)=p(ω1)p(ω2)⋯p(ωT)(2-2)
需要实现在语料库中统计每个字的频率。
p ( s ) = p ( ω 1 ∣ s t a r t ) p ( ω 2 ∣ ω 1 ) ⋯ p ( ω T ∣ e n d ) (2-3) p(s)=p(\omega_1|start)p(\omega_2|\omega_1)\cdots p(\omega_T|end)\\\tag{2-3} p(s)=p(ω1∣start)p(ω2∣ω1)⋯p(ωT∣end)(2-3)
注意需要有句子开头和结尾标识符。实践中,需要先统计语料库中词语的两两组合情况的各自频率,再统计每个词的频率,以便得到条件概率。
假设类别有两类:
Y
1
,
Y
2
Y_1,Y_2
Y1,Y2,原始文本为
X
X
X。由贝叶斯公司可知:
P
(
Y
i
∣
X
)
∝
P
(
X
∣
Y
i
)
P
(
Y
i
)
,
i
=
1
,
2
(2-4)
P(Y_i|X)\propto P(X|Y_i)P(Y_i),i=1,2\tag{2-4}
P(Yi∣X)∝P(X∣Yi)P(Yi),i=1,2(2-4)
P ( Y i ) P(Y_i) P(Yi)就是类别 Y i Y_i Yi的文本比例; P ( X ∣ Y i ) P(X|Y_i) P(X∣Yi)就是在类别 Y i Y_i Yi下句子 X X X的概率,可以由n-gram算得
在上述贝叶斯假设条件下,可以简化过程,直接将训练样本的n-gram特征作为输入去训练一个分类器,得到分类模型。
Bengio在2003的论文A Neural Probabilistic Language Model。
先给每个词在连续空间中赋予一个向量(词向量),再通过神经网络去学习这种分布式表征。利用神经网络去建模当前词出现的概率与其前 n-1 个词之间的约束关系。很显然这种方式相比 n-gram 具有更好的泛化能力,只要词表征足够好。从而很大程度地降低了数据稀疏带来的问题。但是这个结构的明显缺点是仅包含了有限的前文信息。
该模型利用前n-1个词去预测下一个词,输入层是n-1个词的one-hot向量(每个向量是
1
×
V
1\times V
1×V),再乘以一个
1
×
D
1\times D
1×D的权重矩阵,得到
V
×
D
V\times D
V×D的中间向量,将n-1个中间向量拼接成隐藏层(长度为
D
(
n
−
1
)
D(n-1)
D(n−1))。隐藏层的激活函数为tanh,输出层为一个全连接层再接一个softmax函数生成概率分布。该模型的副产物就是词向量(输入层到隐藏层的权重矩阵)
这篇论文是词向量的鼻祖,后面的cbow和skip-gram都是由这里启发而来。
为了解决定长信息(只能利用前面n-1个词的信息)的问题,Mikolov在2010的论文 Recurrent neural network based language model。
网络的输入层是"s我想你",输出层可以看作是分别计算条件概率 P(w|s)、P(w|s我)、P(w|s我想)、P(w|s我想你) 在整个词表V中的值。而我们的目标就是使期望词对应的条件概率尽可能大。
相比单纯的前馈神经网络,隐状态的传递性使得RNN语言模型原则上可以捕捉前向序列的所有信息(虽然可能比较弱)。通过在整个训练集上优化交叉熵来训练模型,使得网络能够尽可能建模出自然语言序列与后续词之间的内在联系。
为了解决依赖的信息过长的问题,后续又有LSTM、attention等改进方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。