赞
踩
所谓的语言模型,就是为了判断某个句子是不是人话,句子S是由多个词语wi构成的
式子展开后,每一个因数P(条件概率)都是这个模型的参数,那么怎么求解这个参数呢?通常参数的求解用方法是 N-gram 模型,最大熵模型,HMM,CRF,RNNLM 以及本文正在学习的 NNLM。
一:N-Gram模型的缺陷
我们最开始接触到的语言模型就是N-Gram模型,这个模型是基于统计计算的,理解和学习起来也很简单。基于马尔科夫假设,当前词语出现的概率只跟前N-1个词语有关。
但是这个模型具有一定的缺陷
1:参数空间大且稀疏,模型定义每个词语只跟之前的N-1个词语有关,这个N取多少呢?取小一些吧,容易计算,计算量和存储量不会很大,但是无法获得较长的依赖信息;取大一点吧,虽然能获得更长一些的依赖,但是参数的增长是指数级别的增长,在实际运用中是绝对不可取的,一般情况下下N=2或者N=3。这个很明显是不能完全很好的表达自然语言的上下文依赖关系,但是此时参数空间已经很大了,而且大量词语是不存在的,因此概率是等于0的,所以还是存在数据的稀疏性。
2:泛化能力不强,没有表示词语之间的相似性的能力,每个词语都是单独的毫无联系的类别,单纯基于统计,且需要完全匹配,对于一些相似的内容,按道理,一个好的语言模型是应该能够识别出后面这句话与前面那句无论从语法还是语义上都是非常近似,应该有近似的概率分布,比如:
句子A:我喜欢吃香蕉
句子B:我喜欢吃榴莲
这俩句子是相似的,且都是正常的人话,理论上应该存在相似的概率分布才行,如果词汇里面对于榴莲的描述特别少,那么句子B的模型概率就会特别低,甚至是0,这显然是不合理的。
3:没有长期依赖,有的时候,当前词语还需要跟后面的上下文词语有关系,甚至还跟前后很长距离的词语有关系,都会纳入考虑的,但是N-Gram模型只考虑前N-1个词语有关。N-Gram对这种情况就捉襟见肘了,是无法解决的,归根结底就是,马尔科夫假设与语言习惯是不相符合的,该假设就是一个近似求解的没有办法的办法。
二:NNLM介绍
其实NNLM也是一个N-Gram模型,只是基于神经网络实现的而已,而不再是单纯的基于统计的方法。
也就是通过神经网络来构造这个函数F,然后根据预料库大量进行学习训练,上下文词语context是输入数据,wi是目标标签,然后来训练模型自带的参数θ。
模型训练好之后,以后想要得到得到某个句子的概率,只需要进行模型的计算即可得出,而不再是基于统计去查询。
现在我们来看看NNLM的图示:
这个图示很明显,就把上述的过程通过神经网络的图示展示了出来。假设我们的词汇量是V。也就是整个one-hot词汇矩阵的大小是V x V。建立一个N-Gram模型,当前词语只与前N-1个词语有关。
1:词向量部分
注意一下,在输入的时候,输入的还是one-hot向量,或者是一个词语对应的编号索引,但是紧接着的有个矩阵C,这个是嵌入空间的词向量矩阵,是之前讲过的低维度,稠密,且具有相似性的矩阵,通过one-hot向量或者编号索引去在C中去look up,得到对应词语表示的嵌入空间的向量,用这个低维度的嵌入向量去做神经网络运算。
一个one-hot向量(1V维度)和嵌入空间的词汇矩阵C(Vm维度)相乘就可以得到对应的嵌入向量,这个就是简单的look up查询操作,但是C的每个元素是多少呢?这个C,哈哈,就是当做参数了,也是需要随机初始化的啦,既然也是该网络的参数,那就得通过训练得到咯。
由于矩阵C是全局一样的,因此参数对于每个输出都是共享的。
这一步过后得到前n-1个词的词向量:C(wt-n+1),C(wt-n+2),C(wt-n+3)…C(wt-1)
2:将嵌入词向量输入到隐藏层
得到上面单个词向量之后,我们要将n-1个词向量做一个全连接,即把这n-1个词向量首尾相接地拼起来得到最终的输入x:
首尾相接的做法,再输入到全连接,在卷积神经网络中是很常见的咯。
3:隐藏层的计算
我们得到了x,经过普通的全连接,运算到隐藏层,只是激活函数是tanh函数了。这一个全连接层的参数是H和偏置d
4:输出层
到最终输出之前,数据是来源于两个地方,一个是来自于隐藏层,进行全连接得到,这部分称为y1,这一部分依然是个线性变换,参数是U和偏置b1。
另外一个是直接来源于嵌入词向量,通过线性运算得到,这部分称为y2。这部分的参数是W和偏置b2.
得到这两个数据源之后,就可以进行计算了。
再将y经过一个softmax函数做概率归一化,便能得到一个维度为V的概率向量,我们期望当然是那个词语的one-hot向量了,这就是我们的输出了。(找到最大的概率所在位置的索引,结合词表我们就能得到我们的预测值了)。
5:最后代价函数
最会由于是softmax输出,也就可以看成是分类问题,只不过分类种类是V个,one-hot向量,我们期望预测的那个词语的概率是接近于1,其他的词语接近于0。
这个代价函数就是极大似然函数的相反数,使用logistic的代价函数即可,再用梯度下降进行训练学习。
最后得到的参数C,那个嵌入空间矩阵,就是我们得到的词向量矩阵。这个很管用。
===========================
NNLM的特点:
==========优点:
1:使用NNLM模型可以产生副产物词向量,这个正式之前所说的怎么得到词向量的方法,而且生成的词向量是可以自定义维度的,维度并不会因为新扩展词而发生改变,这里生成的词向量能够很好的根据特征距离度量词与词之间的相似性。
2:解决了数据稀疏的问题,实现了词汇表示的降维,由于可以采用更长一些的N(起码会比N-Gram要大很多的N),一定程度提升泛化能力。
==========缺点:
1:计算复杂度过大,参数较多(word2vec是一种改进的办法)。
2:仍然限制于N的大小,最好的就是不限制N的数量,且跟前后任意词汇都可能产生依赖,那么基于循环神经网络的RNNLM就是解决办法,因为RNN天生的结构就是针对序列前后任意长度的依赖的。
3:神经网络就不方便解释和理解运算过程了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。