参考文献:
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可以捕获更长的历史信息。




简单的循环神经网络结构


Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

该图是简单循环神经网络的结构,其中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)会送到输出层,相当于一个循环,把上面的循环网络表示的更形象一点如下,就更容易明白为什么叫循环神经网络了:
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

以第一个图为准,U、W是输入到隐层的矩阵,V是隐层到输出层的矩阵,下面看一下各层的输出的计算,这里用下标i表示对w(t)的遍历,j表示对隐层s(t)的遍历,l表示对s(t-1)的遍历,k表示对输出层的遍历。隐层的输出计算如下:
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数
输出层的计算如下:
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数
其中
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

把上面的表示写成向量的形式如下:
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数



反传学习算法



我们的目标是最大化下面的似然函数:
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

其中t表示训练样本数,这里T就等于语料中的词数,下标lt表示第t个样本训练时对应的正确预测单词,定义输出层的误差向量如下:
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

下面利用梯度上升推导学习算法,我是用最大化logyt来推导的,如下:

Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

所以网络的参数更新公式总结如下(矩阵表示):
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

这样,一次训练的学习算法步骤可以描述如下:

  1. 初始化时间计算器 t = 0, 将隐层的输出向量s(t)初始化为1
  2. t = t + 1
  3. 将当前词wt使用1-of-V编码为向量w(t)
  4. 将s(t-1)复制到输入层
  5. 按照上面前向计算公式,计算s(t), y(t)
  6. 计算在输出层的误差梯度向量e(t)
  7. 反传误差梯度向量,并按照梯度上升法更新矩阵




BPTT(Backpropagation Through Time)


上面的反传方法和前馈网络的反传差不多,但这样的训练方式得到的结果并不是最优的,它对历史信息的保存效果没有理论那么好,它的一个扩展形式是把误差反传得更远,它将原来的网络像是折叠开了一样,这种训练方法叫做BPTT,如下图:
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

这个图对应的τ = 3,这里表示将当前时刻t往以前展开到了t -3时刻,这里展开后的U,W都是一样的,其中的反传误差可以如下递归的计算:
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数
这里的τ 一般不会取很大,BPTT算法对应的调整更新如下:
Recurrent Neural Network Based Language Model RNNLM 原理及BPTT数

           

相关文章: