[TOC]
首先我们是想,做这么一件事:根据前文出现的3个词,预测第四个词是什么?
试想,如果已经给我们一组参数,把这组参数和已经出现的三个词做运算,求出来的的最大概率就可以认为是预测的第四个词。那么问题来了,这组参数怎么求呢?经典的机器学习模型,逻辑回归中可以找到一些类似的思想。
逻辑回归的流程
已经有样本集合 D={(x1,y1),(x2,y2),..,(xm,ym)} D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . , ( x m , y m ) } ,沿用从吴恩达老师课堂上学到的的记号,这里的上角标表示第几个样本,为什么不用下角标表示呢,因为每个样本 (xi,yi) ( x i , y i ) 可能,并且事实上确实就会许多个属性 x11,x12,x13,... x 1 1 , x 2 1 , x 3 1 , . . . ,上角标表示第几个样本,下角标表示该样本的第几个属性, x11 x 1 1 就是第一个样本的第一个属性。现在的问题就是,根据已经有的数据和标签,根模型据训练出来一组参数 θ θ ,使得再给我一个新的样本的属性,我能预测出来标签是什么,即 y y 是多少,在二分类中就是或者 y=1 y = 1 。因为我们可以根据得到的概率值和阀值来预测属于哪类,但是属性和参数的线性运算结果并不一样是在0~1之间,使用sigmoid函数做一个值域的映射。重点来了,极大似然。样本有了,思路也有了,但是怎么用数学符号表示我们已有的信息呢?回想一下,我们就是通过已有的属性和标签,计算出一组参数 θ θ 来预测新的数据。极大似然思想出现:根据极大似然的思想,样本属性的不确定数值确定了,导致它被分为某个类别,那么就有一组参数使得出现的这标签的概率最大。 L(θ)=∏ni=1P{Xi=xi}=∏ni=1P{xi;θ} L ( θ ) = ∏ i = 1 n P { X i = x i } = ∏ i = 1 n P { x i ; θ } ,那么,哪一组参数 θ θ 可以让我们求函数取最大值?因为 xi x i 已经知道,所以就是关于 θ θ 的一元函数,求导是一种选择,另一种是常用的梯度上升法,这里为了后面的NNLM,使用梯度下降法。梯度的几何意义就是曲线上升最快的方向。由于我们最优化的一般都是损失函数,所以自然引出逻辑回归的损失函数定义: L(θ)=−∏ni=1P{Xi=xi}=−∏ni=1P{xi;θ} L ( θ ) = − ∏ i = 1 n P { X i = x i } = − ∏ i = 1 n P { x i ; θ } ,这个函数求最小值就是使用梯度下降法。具体做法就是初始化一组参数 θ θ ,每次沿着梯度下降最快的方向走一小步,然后迭代直到最小值。求出来一组参数 θ θ 后,再来新的数据就可以带入求解,然后预测
NNLM
同样是上面那种,只不过换了一个场景:一个10w个词语的语料库,我们现在想通过前3个词,预测第四个词是啥东西,也就是那个词的概率最大?如果现在给我们一堆参数,前三个词语的词向量,计算输出一个10w维度的向量,最大的概率位置对应的就是那个词喽。在上述逻辑回归中,0.9就预测为1,是因为预测为0类别的概率为0.1<0.9。。一样的道理。那么这前三个词的向量是什么?一堆参数又是什么?类别逻辑回归中的
θ
θ
,只不过这里的参数很多很多。通过模型+原始数据训练得到,模型就是NNLM,原始数据就是一堆文本,这一堆文本根据长度为4的窗口,从头开始滑动,切成许许多多个长度为4的文本。ok,现在训练集出来了,求参数吧。
最开始拿过来的前三个词语使用one-hot编码,10w纬度的~注意,此时我们并不知道这三个词的300纬向量是什么,这毕竟也是我们通过模型训练能得到一些有用信息之一。
NNLM输入是3个10w维度的one-hot表示的编码,经过C矩阵,(C也就是我们最后可以得到的10w个词语的300维词向量),300*10w的矩阵C分别乘以3个10w的行向量,得到的就是那三个词对应的300维词向量,输入到hidden层,一顿操作后得到500个单元的隐藏层,然后经过一个softmax得到10w的概率向量,然后根据我们已经实际的样本第四个词的词向量是啥,反向传播优化迭代。这是一个样本的,也就是前4个词语做的事情,后续还有很多这样的长度为4的样本。然后最终可求的10w词语的词向量和神经网络中的参数。模型求出来再来新的样本,即前三个词语,通过这个模型,就可以预测第四个是什么。