您的位置:首页 > 理论基础 > 计算机网络

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

2017-09-04 20:54 1051 查看
这个只是自己的学习笔记,文章内容是从很多地方总结的。只是方便自己的查阅之余能对你有所帮助。

前一个章节的CNN主要处理图片的问题,主要是空间角度的转换,这个章节的RNN主要是时间角度。主要处理前面的输入对未来的影响,或者未来的输入对 前面的影响。

举例1 NLP

前面对后面的影响

选择:

1)小红是中国人,我在上海见到了()  

    A: 小红,B:小丽 

填空:

后面对前面的影响

2)()在努力地向妈妈学习,但是小鸟一直没有学会

举例2

下面的例子体会共享特性对于数据量的影响。

实例:捏陶瓷:不同角度相当于不同的时刻



若用前馈网络:网络训练过程相当于不用转盘,而是徒手将各个角度捏成想要的形状。不仅工作量大,效果也难以保证。

若用递归网络:网络训练过程相当于在不断旋转的转盘上,以一种手势捏造所有角度。工作量降低,效果也可保证。
结构图单向:





结构图双向




 

多层网络:

上面的都是单层网络,多层网络如下:



训练结果:



RNN的梯度爆炸和消失问题

不幸的是,实践中前面介绍的几种RNNs并不能很好的处理较长的序列。一个主要的原因是,RNN在训练中很容易发生梯度爆炸和梯度消失,这导致训练时梯度不能在较长序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。
为什么RNN会产生梯度爆炸和消失问题呢?我们接下来将详细分析一下原因。我们根据式3可得:



 上式的 定义为矩阵的模的上界。因为上式是一个指数函数,如果t-k很大的话(也就是向前看很远的时候),会导致对应的误差项的值增长或缩小的非常快,这样就会导致相应的梯度爆炸和梯度消失问题(取决于大于1还是小于1)。
通常来说,梯度爆炸更容易处理一些。因为梯度爆炸的时候,我们的程序会收到NaN错误。我们也可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。
梯度消失更难检测,而且也更难处理一些。总的来说,我们有三种方法应对梯度消失问题:
合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
使用relu代替sigmoid和tanh作为激活函数。
使用其他结构的RNNs,比如长短时记忆网络(LTSM)和Gated Recurrent Unit(GRU),这是最流行的做法。我们将在以后的文章中介绍这两种网络。

参考:

http://proceedings.mlr.press/v28/pascanu13.pdf

https://zhuanlan.zhihu.com/p/24720659

http://blog.csdn.net/heyongluoyao8/article/details/48636251

http://www.sohu.com/a/118587343_487514

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深度学习 RNN