RNN(Recurrent Neural Network)

RNN

结构说明

RNN(Recurrent Neural Network)

RNN网络的计算过程,也就是前向传播算法,在t时刻的状态:
s(t)=tanh(Ux(t)+Ws(t1)+b) s^{(t)} = tanh(Ux^{(t)}+ Ws ^{(t-1)}+b)
这个公式是最重要的,体现了状态间的依赖关系,其中tanh(.)tanh(.)为**函数,U,WU,W为参数矩阵,s(t1)s^{(t-1)}t1t-1时刻的状态,bb为偏置,则tt时刻的输出为:
o(t)=Vs(t)+c o^{(t)} = V s^{(t)} +c
这里的输出其实可以不用考虑,如果需要用到输出时候,我们再进行输出。其中VV为参数矩阵,cc为偏置。

注: 以上公式中的U,W,VU,W,V是三个矩阵在各个时刻的使用,并不是每一个时刻初始化一个新的矩阵。

通过以上公式的解释,结合上图,我们可以这样进行理解,每一个时刻tt的状态的计算,依赖于当前的输入x(t)x^{(t)}与上一时刻的状态s(t1)s^{(t-1)}

上图中描绘的RNN结构,左边的部分是模型原型,将时间步重叠的结果;右边部分是将模型按照时间顺序展开后得到的结构。因为按照时间展开后的结构都是由基本结构串联而成,而且都是同样的结构,所以可以进行复合得到左边的一个整体表示图。从结构上来说,是同一个结构重复进行运算,所以叫做循环神经网络。但是它每一个时刻的计算内容不重复,因为每一个时刻的输入和上一时刻的状态都是不一样的,称为循环神经网络有点不完全正确。我们实验室很多人,可能是因为实验室老师的讲解,更喜欢称它为回复式神经网络,感觉更契合一点。

3. 反向传播(BP,back-propagation)

BPTT(back-propagation through time)算法是常用的训练RNN的方法(优化模型,更新参数),其实本质还是BP算法,只不过RNN处理时间序列数据,所以要基于时间反向传播,故叫随时间反向传播。BPTT的中心思想和BP算法相同,沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。当然这里的BPTT和DNN中的BP算法也有很大的不同点,即这里所有的 U,W,VU, W, V 在序列的各个位置是共享的,反向传播时我们更新的是相同的参数。

4. 优缺点

优点

  • 记忆功能:上一时刻的状态能保存之前的信息,能处理和预测时间序列数据。

缺点

  • 不能获得长期依赖:模型中下一时刻只是受到了上一时刻输出的影响,而实际上下一时刻的结果在处理自然语言的时候往往需要结合上文中很多时刻值的影响,这就是RNNs最大的不足。换句话说,就是理论上可以处理长期依赖,但是在实践中并不能完全做到,记忆还不够强。
  • 梯度消失:利用BPTT算法训练RNN网络时容易出现梯度消失的问题,当序列很长的时候问题尤其严。随着时间序列的不断深入(序列长度越长),小数梯度的累乘就会导致梯度越来越小直到接近于 0,这就会出现梯度消失现象。梯度消失就意味着那一层的参数再也不更新了,这也就导致了RNN网络结构不易优化的问题。Relu 函数一定程度上可以解决梯度消失的问题,但是因为梯度连乘容易引起梯度爆炸的问题。此外 tanh 函数的收敛速度要快于 sigmoid 函数,而且梯度消失的速度要慢于 sigmoid 函数(因为它的梯度更大一些,sigmoid 函数的导数范围是(0,0.25](0, 0.25], tanh 函数的导数范围是(0,1](0, 1])。