这个只是自己的学习笔记,文章内容是从很多地方总结的。只是方便自己的查阅之余能对你有所帮助。
前一个章节的CNN主要处理图片的问题,主要是空间角度的转换,这个章节的RNN主要是时间角度。主要处理前面的输入对未来的影响,或者未来的输入对 前面的影响。
举例1 NLP
前面对后面的影响
选择:
1)小红是中国人,我在上海见到了()  
    A: 小红,B:小丽 
填空:
后面对前面的影响
2)()在努力地向妈妈学习,但是小鸟一直没有学会
举例2
下面的例子体会共享特性对于数据量的影响。
  • 实例:捏陶瓷:不同角度相当于不同的时刻

深度学习笔记(七) RNN循环神经网络

  • 若用前馈网络:网络训练过程相当于不用转盘,而是徒手将各个角度捏成想要的形状。不仅工作量大,效果也难以保证。
  • 若用递归网络:网络训练过程相当于在不断旋转的转盘上,以一种手势捏造所有角度。工作量降低,效果也可保证。
结构图单向:
深度学习笔记(七) RNN循环神经网络
深度学习笔记(七) RNN循环神经网络

结构图双向
深度学习笔记(七) RNN循环神经网络
深度学习笔记(七) RNN循环神经网络 
多层网络:
上面的都是单层网络,多层网络如下:
深度学习笔记(七) RNN循环神经网络
训练结果:
深度学习笔记(七) RNN循环神经网络

RNN的梯度爆炸和消失问题

不幸的是,实践中前面介绍的几种RNNs并不能很好的处理较长的序列。一个主要的原因是,RNN在训练中很容易发生梯度爆炸和梯度消失,这导致训练时梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。

为什么RNN会产生梯度爆炸和消失问题呢?我们接下来将详细分析一下原因。我们根据式3可得:

深度学习笔记(七) RNN循环神经网络

 上式的 定义为矩阵的模的上界。因为上式是一个指数函数,如果t-k很大的话(也就是向前看很远的时候),会导致对应的误差项的值增长或缩小的非常快,这样就会导致相应的梯度爆炸和梯度消失问题(取决于大于1还是小于1)。

通常来说,梯度爆炸更容易处理一些。因为梯度爆炸的时候,我们的程序会收到NaN错误。我们也可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。

梯度消失更难检测,而且也更难处理一些。总的来说,我们有三种方法应对梯度消失问题:

  1. 合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
  2. 使用relu代替sigmoid和tanh作为**函数。
  3. 使用其他结构的RNNs,比如长短时记忆网络(LTSM)和Gated Recurrent Unit(GRU),这是最流行的做法。我们将在以后的文章中介绍这两种网络。
参考: