标签:nnlm rnnlm 语言模型 nlp 深度学习
参考文献:
1. Statistical Language Models Based on Neural Networks
2. A guide to recurrent neural networks and backpropagation
前一篇文章介绍了nnlm,用神经网络来对语言进行建模,nnlm一个很大的优点就是将历史映射到一个低维的空间而并不像普通n-gram,这就降低了模型的参数,并且使相似的历史进行聚类,映射后的低维向量也就是前篇文章所称的词向量,并且从结果来看nnlm的效果非常不错,但仍然有缺点,一方面是隐层到输出层的计算量非常大,另一方面是nnlm是一类典型的前馈神经网络,它的历史长度预先必须设置并固定,与循环神经网络(rnnlm)来比不能捕获更长的历史信息。
rnnlm与nnlm主要的不同就在对历史的捕捉上面,nnlm的历史长度也只有数个词,而rnnlm的历史是前面所有的词,这样使得rnnlm可以捕获更长的历史信息。
简单的循环神经网络结构
该图是简单循环神经网络的结构,其中t代表时间,w(t)表示第t个时刻的当前输入单词,该单词的编码方式为1-of-V,即w(t)的维度为V,V是词典大小,w(t)的分量只有一个为1, 表示当前单词,其余分量为0。s(t-1)代表隐层的前一次输出,y(t)表示P(wt | wt, s(t-1))。即之所以称为循环神经网络,就是t个时刻,s(t)会留下一个副本,在t+1时刻,s(t)会送到输出层,相当于一个循环,把上面的循环网络表示的更形象一点如下,就更容易明白为什么叫循环神经网络了:
以第一个图为准,U、W是输入到隐层的矩阵,V是隐层到输出层的矩阵,下面看一下各层的输出的计算,这里用下标i表示对w(t)的遍历,j表示对隐层s(t)的遍历,l表示对s(t-1)的遍历,k表示对输出层的遍历。隐层的输出计算如下:
输出层的计算如下:
其中
把上面的表示写成向量的形式如下:
反传学习算法
我们的目标是最大化下面的似然函数:
其中t表示训练样本数,这里T就等于语料中的词数,下标lt表示第t个样本训练时对应的正确预测单词,定义输出层的误差向量如下:
下面利用梯度上升推导学习算法,我是用最大化logyt来推导的,如下:
所以网络的参数更新公式总结如下(矩阵表示):
这样,一次训练的学习算法步骤可以描述如下:
- 初始化时间计算器 t = 0, 将隐层的输出向量s(t)初始化为1
- t = t + 1
- 将当前词wt使用1-of-V编码为向量w(t)
- 将s(t-1)复制到输入层
- 按照上面前向计算公式,计算s(t), y(t)
- 计算在输出层的误差梯度向量e(t)
- 反传误差梯度向量,并按照梯度上升法更新矩阵
BPTT(Backpropagation Through Time)
上面的反传方法和前馈网络的反传差不多,但这样的训练方式得到的结果并不是最优的,它对历史信息的保存效果没有理论那么好,它的一个扩展形式是把误差反传得更远,它将原来的网络像是折叠开了一样,这种训练方法叫做BPTT,如下图:
这个图对应的τ = 3,这里表示将当前时刻t往以前展开到了t -3时刻,这里展开后的U,W都是一样的,其中的反传误差可以如下递归的计算:
这里的τ 一般不会取很大,BPTT算法对应的调整更新如下:
rnnlm 原理及推导
标签:nnlm rnnlm 语言模型 nlp 深度学习
原文地址:http://blog.csdn.net/a635661820/article/details/44462315