推送第二日,量化投资与机器学习公众号将为大家带来一个系列的 Deep Learning 原创研究。本次深度学习系列的撰稿人为 张泽旺 ,DM-Master,目前在研究自动语音识别系统。希望大家有所收获,共同进步!
漫谈RNN之训练方法
RNN的训练因其递归性而变得复杂,现在深度学习大多系统中通常采用的是Back-propagation Through Time算法,本文不打算运用公式来讲解,而是将公式转化成易懂的文字来描述这些算法。
历史文章:(点击阅读)
RNN是一个循环递归网络,因此在t时刻,网络的输出误差不仅与t时刻的隐含状态有关,也与t时刻之前的所有时刻的隐含状态有关。这一特点,正表明RNN相比传统的隐马尔科夫模型的优势是它充分考虑了历史所有时刻的状态。
当我们构建好了一个RNN模型之后,最大的难点就在于训练这个模型,这里说的训练实际上就是数学上的优化过程。在训练神经网络的时候,后向传播算法是最流行的训练算法,而BPTT则是基于它的一个变形。那么什么是后向传播算法呢?
考虑一个多层感知器(MLP),假设它有K个隐含层,考虑输入层和输出层的话一共有K+2个隐含层,输入层的神经元个数为M,输出层的神经元个数为N,并且每一个隐含层的神经元个数为H_k。后向传播算法的步骤通常如下:
以上说的是用于训练MLP的后向传播算法,由于权重的更新是通过不断减去它的一阶偏导慢慢实现的,因此我们称这种算法为梯度下降法。虽然梯度下降算法在误差平面上只能找到局部最优值,但是这个缺点可以被一些错误得以很好避免,例如在训练的时候可以增加一些噪声、可以按照Epoch的增大而动态改变学习率的大小、采取不同的初始化方法、采取预训练的权重等等。
对于RNN来说,传统的后向算法已经无法适用了,这个时候我们需要把RNN网络在时间维度上展开,这个时候我们采用的是基于时间的后向传播算法(BPTT)。
BPTT算法的计算步骤如下:
BPTT算法的计算复杂度相比于传统的BP算法要复杂N倍,N是整个网络的连接个数。而BPTT另外一个计算上的缺点则是它考虑了所有的历史信息,于是有人提出了使用truncated-BPP,即只考虑固定长度的历史,超过此时间的历史信息不用纳入BPTT中计算。这在一定程度上会影响RNN的记忆性,不过就算运用完整的BPTT算法,RNN的记忆性也无法长期保留,一个研究观点表明RNN最多只能记忆10~20个时间点。
通常训练一个RNN需要很多个Epoch,花费几个小时甚至几天都有可能,并且,训练RNN也没有训练MLP那么稳定,通常可以采取的措施有使用Dropout、使用批归一化等技巧,而对于网络超参的设置需要因数据规模而定,甚至有时候需要在实践中得出经验甚至是要靠直觉来判断。
近期文章预告:
《漫谈RNN之梯度消失及梯度爆炸》
《漫谈RNN之长短期记忆模型LSTM》
《漫谈RNN之序列建模(机器翻译篇)》