这是本人的第一篇博客,主要以记录自己的学习内容为主,由于水平有限,如果内容有误还请各位看官多多包涵,及时指正。本篇博客也多参考了各篇博客、书籍及视频,在此感谢各位前辈的指导。
这一篇博客将要介绍早期NLP发展阶段使用到的模型,随后引出至今为止依然在使用的词向量。
贝叶斯公式是英国数学家贝叶斯( Thomas Bayes)提出来的,用来描述两个条件概率之间的关系。若记P(A),P(B)分别表示事件A和事件B发生的概率,P(A|B)表示事件B发生的情况下事件A发生的概率,P(A,B)表示事件A,B同时发生的概率,则有
P ( A ∣ B ) = P ( A , B ) P ( B ) , P ( B ∣ A ) = P ( A , B ) P ( A ) P ( A | B ) = \frac { P ( A , B ) } { P ( B ) } , \quad P ( B | A ) = \frac { P ( A , B ) } { P ( A ) } P(A∣B)=P(B)P(A,B),P(B∣A)=P(A)P(A,B)
根据上面的公式进一步推出
P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P ( A | B ) = P ( A ) \frac { P ( B | A ) } { P ( B ) } P(A∣B)=P(A)P(B)P(B∣A)
以上便是贝叶斯公式。
简单说来,统计语言模型简单来讲就是计算一个句子出现概率的概率模型。
假设一个句子W 由T个词 w 1 , w 2 , ⋯ , w T w _ { 1 } , w _ { 2 } , \cdots , w _ { T } w1,w2,⋯,wT按顺序组成,记作
W = w 1 T : = ( w 1 , w 2 , ⋯ , w T ) W = w _ { 1 } ^ { T } : = \left( w _ { 1 } , w _ { 2 } , \cdots , w _ { T } \right) W=w1T:=(w1,w2,⋯,wT)
则一个句子的概率就是词 w 1 , w 2 , ⋯ , w T w _ { 1 } , w _ { 2 } , \cdots , w _ { T } w1,w2,⋯,wT的联合概率
p ( W ) = p ( w 1 T ) = p ( w 1 , w 2 , ⋯ , w T ) p ( W ) = p \left( w _ { 1 } ^ { T } \right) = p \left( w _ { 1 } , w _ { 2 } , \cdots , w _ { T } \right) p(W)=p(w1T)=p(w1,w2,⋯,wT)
根据贝叶斯公式,上式分解为
p ( w 1 T ) = p ( w 1 ) ⋅ p ( w 2 ∣ w 1 ) ⋅ p ( w 3 ∣ w 1 2 ) ⋯ p ( w T ∣ w 1 T − 1 ) p \left( w _ { 1 } ^ { T } \right) = p \left( w _ { 1 } \right) \cdot p \left( w _ { 2 } | w _ { 1 } \right) \cdot p \left( w _ { 3 } | w _ { 1 } ^ { 2 } \right) \cdots p \left( w _ { T } | w _ { 1 } ^ { T - 1 } \right) p(w1T)=p(w1)⋅p(w2∣w1)⋅p(w3∣w12)⋯p(wT∣w1T−1)
这里等式右边的式子中各项条件概率便是该语言模型(LM)的参数了。如果计算得到了这些参数,那么就可以通过上面的式子计算得到句子出现的概率。
接下来介绍计算这些参数的方法。计算参数的方法有很多,这里只介绍n-gram和神经网络两种。
现在考虑计算上面式子中的一个参数 p ( w k ∣ w 1 k − 1 ) ( k > 1 ) p \left( w _ { k } | w _ { 1 } ^ { k - 1 } \right)(k>1) p(wk∣w1k−1)(k>1)。根据贝叶斯公式,有
p ( w k ∣ w 1 k − 1 ) = p ( w 1 k ) p ( w 1 k − 1 ) p \left( w _ { k } | w _ { 1 } ^ { k - 1 } \right) = \frac { p \left( w _ { 1 } ^ { k } \right) } { p \left( w _ { 1 } ^ { k - 1 } \right) } p(wk∣w1k−1)=p(w1k−1)p(w1k)
根据大数定理,当语料库足够大时,上式近似表示为
p ( w k ∣ w 1 k − 1 ) ≈ c o u n t ( w 1 k ) c o u n t ( w 1 k − 1 ) p \left( w _ { k } | w _ { 1 } ^ { k - 1 } \right) \approx \frac { \ { count } \left( w _ { 1 } ^ { k } \right) } { \ { count } \left( w _ { 1 } ^ { k - 1 } \right) } p(wk∣w1k−1)≈ count(w1k−1) count(w1k)
其中 c o u n t ( w 1 k ) \ { count } \left( w _ { 1 } ^ { k } \right) count(w1k)和 c o u n t ( w 1 k − 1 ) \ { count } \left( w _ { 1 } ^ { k-1 } \right) count(w1k−1)分别表示词串 w 1 k w _ { 1 } ^ { k } w1k和 w 1 k − 1 w _ { 1 } ^ { k-1 } w1k−1在语料中出现的次数,即对语料中出现次数进行统计,这也是为什么该模型被称为统计语言模型的原因。
如果 k k k很大的时候, c o u n t ( w 1 k ) \ { count } \left( w _ { 1 } ^ { k } \right) count(w1k)和 c o u n t ( w 1 k − 1 ) \ { count } \left( w _ { 1 } ^ { k-1 } \right) count(w1k−1)的统计非常耗时。
n-gram的基本思想是:一个词的出现概率只和其之前n-1个词有关,从而大大降低计算复杂度。即
p ( w k ∣ w 1 k − 1 ) ≈ p ( w k ∣ w k − n + 1 k − 1 ) p \left( w _ { k } | w _ { 1 } ^ { k - 1 } \right) \approx p \left( w _ { k } | w _ { k - n + 1 } ^ { k - 1 } \right) p(wk∣w1k−1)≈p(wk∣wk−n+1k−1)
根据贝叶斯公式和大数定理,上式转化成
p ( w k ∣ w 1 k − 1 ) ≈ c o u n t ( w k − n + 1 k ) c o u n t ( w k − n + 1 k − 1 ) p \left( w _ { k } | w _ { 1 } ^ { k - 1 } \right) \approx \frac { \ { count } \left( w _ { k - n + 1 } ^ { k } \right) } { \ { count } \left( w _ { k - n + 1 } ^ { k - 1 } \right) } p(wk∣w1k−1)≈ count(wk−n+1k−1) count(wk−n+1k)
n的取值是一个值得考究的问题,如果n过小,那么模型的效果肯定不行;但是如果n的取值过大,需要计算的参数会指数级增长,计算将非常耗时。实际应用中n=3是常用取值。
在机器学习领域通常的做法是:对所考虑的问题建模后先为其构造一个目标函数,然后对这个目标函数进行优化,从而求得一组最优的参数,最后利用这组最优参数对应的模型来进行预测。
对于统计语言模型,构造目标函数为极大似然,即
∏ w ∈ C p ( w ∣ C o n t e x t ( w ) ) \prod _ { w \in \mathcal { C } } p ( w | {Context} ( w ) ) w∈C∏p(w∣Context(w))
其中 C \mathcal{C} C表示语料(Corpus), C o n t e x t ( w ) Context(w) Context(w)表示词的上下文,即 w w w周边的词的集合。
实际应用中,目标函数也会常采用极大对数似然
L = ∑ w ∈ C log p ( w ∣ C o n t e x t ( w ) ) \mathcal { L } = \sum _ { w \in \mathcal { C } } \log p ( w | { Context } ( w ) ) L=w∈C∑logp(w∣Context(w))
接下来将进一步介绍使用神经网络的模型。
NNLM具有三层网络结构,分别为输入(投影)层、隐含层和输出层,如下图所示。
这里首次出现了词向量的输入处理,关于词向量的介绍放在下一节,在此我们专注于介绍网络结构。
最后,训练过程便是使得正确词的类条件概率能够最大化的参数调整过程。
在这个模型里面,词向量更像是一个副产物,不过这个副产物却带来了巨大的影响,下一节我们将深入理解。
最后我们讨论一下n-gram与NNLM的关系:n-gram是计算前n-1个词语条件下出现某个词语的概率,NNLM的话以这个概率公式为原型构造的目标函数,是n-gram演化而来的。
在上一节中我们提到了one-hot representation,他属于词袋模型。one-hot representation用一个很长的向量来表示一个词,向量的长度为词典 D \mathcal{D} D的大小N,向量的分量只有一个1,其它全为0,1的位置对应该词在词典中的索引。
这种表示有一些缺点:
将one-hot representation转换成词向量的操作称作Word Embedding,词向量针对上面提到的缺点进行了改进。
Word Embedding是由机器阅读大量文章之后得到的,是一个无监督的过程。要使无监督过程起效果,实现的思路是词汇的含义可以由上下文来判断得到,或者更明白地说类似含义的词替换之后句子意思不会有问题。
介绍完词向量的优势之后,接下来就要考虑如何能够得到词向量的问题。这里有两种方法实现上述的思路:Count based和Prediction based。
简单介绍一下Count based:统计在相同文档中两个词出现的次数,与两个词的点积(相似度)成正相关,即使用出现频次来代表词向量间的距离。
我们将着重介绍Prediction based:训练一个网络,在给定上一个词的情况下得到输出下一个词的概率分布,在词语概率分布正确的情况下,其隐含层的输入即为所需要的词向量。
解释一下为什么隐含层输入就满足词向量的需求:Prediction based只有在隐含层学习到了较好的词向量特征才能够输出正确的概率分布,因此隐含层的输入确实是我们所需要的。
在网络训练过程中,我们只需要收集大量文本,将上下文输入到文本,最小化与正确词语概率分布之间的交叉熵即可。这里最小化交叉熵是等价于最大化极大似然的,具体的证明 可以参考知乎的文章。
单输入一个词汇的效果可能并不好,因此我们输入多个上文词汇,并且共享权重。共享权重目的是:可以减少参数数量,同时,避免上下文词语输入位置不一样而得到不同的结果。
接下来介绍广为人知的Word2Vec模型,也是基于上一小节提到的Prediction based方法。主要分为CBOW和Skip-gram两种模型。
它们都只有一层隐含层,同样,训练后取出隐含层的输入即为需要的词向量。
CBOW和feedforward NNLM非常相似。CBOW是输入前后文来预测中间词,而NNLM是只是输入前文,没有后文。Skip-gram则与之相反,输入中间词预测上下文。
最后欢迎各位看官指正错误,如果有不清楚的也欢迎留言,本人才疏学浅,会尽力回答。