(二)浅谈语言模型与词向量——原理
最开始接触语言模型是在语音识别中,当时用的一种混合语言模型,为了知识的完整性,我先简单的讲述一下语言模型的原理,本人对语言模型的了解程度仅仅在应用层面以及embedding,对于最新的技术并没有怎么follow。
1 n-gram语言模型[1]
假设S表示某个有意义的句子,由一串特定顺序排列的词w1,w2,..,wn组成,n是句子的长度。目的:计算S在文本中(语料库)出现的可能性P(S):
如上图,语言模型就是用来判断一个句子的合理性的置信度,最经典的就是n-gram语言模型和NNLM(Nerual Network Language Model)。在这里举一个应用的例子,例如在语音识别中我们通过声学模型对每一帧做出音素的分类(可以简单理解成汉语拼音吧,当然一个音素跨越好几帧,这里不详细展开),至于这些音素对应的哪些文字,这就要靠语音模型来找出最合理的句子了。
n-gram语音模型主要基于马尔科夫假设,主要解决一下问题:
(1)参数空间过大:条件概率P(wn|w1,w2,..,wn-1)的可能性太多,无法估算。
(2)数据稀疏严重:对于非常多词对组合,在语料库中都没有出现,依据极大似然估计得到概率将会是0。最后结果是句子0概率
因此就会有unigram,bigram,trigram等等,如下图:
理论上,n越大越好。但实践中常用unigram、bigram和trigram,n越大训练越慢,但精度会更高。
2.神经语言模型
下面开始进入正题,先来看一下2003年的一篇关于NNLM的文章
Paper: A Neural Probabilistic Language Model.2003这张图对如今的一些DP的论文再简单不过了,我们还是简单看下原理,大体思路就是通过前N-1个词预测第N个词,输入的是one-hot向量,C就是通过查找矩阵C(词典中词语个数*向量维度)这样一个大小的矩阵将One hot的向量进行编码,注意这个C一开始是随机初始化的,中间的tanh层是包含K个上下文词语的embedding向量的拼接,经过激活函数激活,输出层就是这里简单理解为一个全连接层+softmax进行分类,类别的个数就是词典中词的个数,结果就是概率大的那个词。
接着又过了10年,大概是2013年,也就是Deep Learning(DP)在语音和图像上大火的那个阶段,DP也开始在NLP上崭露头角,Word2vec的诞生可以说是NLP中的一个里程碑吧,Word2vec就是利用一个简化版的语言模型来得到刚才提到的矩阵C,其训练方式有如下两种:
左边这个CBOW就是利用一个词的上下文来预测改词,右边的skip是反过来利用一个词来预测上下文,之所以说是简化版是因为图中的Hidden layer都是线性层,拿左图举例就是将One-hot向量进行embedding后进行加权(平均)得到hi,再利用hi接一个全连接层进行分类。最后的图中的W就是我们说的embedding.
上述的原理性的介绍进行的差不多了,接下来就是一些实战内容