前面学习了CNN卷积神经网络,本文主要介绍RNN循环神经网络及相关升级版。

RNN循环神经网络:

RNN(Recurrent Neural Network)是一类用于处理序列数据的神经网络。简单来看,把序列按时间展开结构如下:

github上的神经网络 gru神经网络代码_反向传播

  • 结构中:
    ①Xt是时间t处的输入;
    ②St是时间t处的“记忆”,St=f(UXt+WSt−1),f可以是tanh等;
    ③Ot是时间t出的输出,比如是预测下个词的话,可能是softmax输出的属于每个候选词的概率,Ot = softmax(VSt)。
  • 结构细节
    ①可以把隐状态St视作“记忆体”,捕捉了之前时间点上的信息;
    ②输出Ot由当前时间及之前所有的“记忆”共同计算得到;
    ③很可惜,实际应用中,St并不能捕捉和保留之前所有信息(记忆有限?) 
    ④不同于CNN,这里的RNN其实整个神经网络都共享一组参数(U,V,W),极大减小了需要训练和预估的参数量 ;
    ⑤图中的Ot在有些任务下是不存在的,比如文本情感分析,其实只需要最后的output结果就行 。
  • 梯度计算:DNN和CNN都是用BP算法求偏导,RNN是用BPTT(back-propagation through time)其实本质还是BP算法,只不过RNN处理时间序列数据,所以要基于时间反向传播,故叫随时间反向传播。BPTT的中心思想和BP算法相同,沿着需要优化的参数的负梯度方向不断寻找更优的点直至收敛。
    ①先按照BP链式求导,可以看到它依赖于前一时刻的sj-1:

github上的神经网络 gru神经网络代码_github上的神经网络_02

  • ②我们总结规律得到:

github上的神经网络 gru神经网络代码_循环神经网络_03

  • ③我们会发现累乘会导致激活函数导数的累乘,进而会导致“梯度消失“和“梯度爆炸“现象的发生。具体参考(参考一)
  • 双向RNN:
    ①有些情况下,当前的输出不只依赖于之前的序列元素,还可能依赖之后的序列元素 ;
    ②比如从一段话踢掉部分词,让你补全 ;
    ③直观理解:双向RNN叠加 ,具体结构如下图:
  • 深层双向RNN:和双向RNN的区别是每一步/每个时间点我们设定多层结构 :

LSTM(long short-term memory)长短期记忆网络:

长短期记忆网络是RNN的一种变体,RNN由于梯度消失的原因只能有短期记忆,LSTM网络通过精妙的门控制将短期记忆与长期记忆结合起来,并且一定程度上解决了梯度消失的问题;

  • 与RNN的区别是:
    ① 它的“记忆细胞”改造过:
    ②该记的信息会一直传递,不该记的会被“门”截断。

github上的神经网络 gru神经网络代码_github上的神经网络_04

  • LSTM关键:“细胞状态”
    ①细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
    ②LSTM怎么控制“细胞状态”?(1)通过“门”让信息选择性通过,来去除或者增加信息到细胞状态;(2)包含一个sigmoid神经网络层 和 一个pointwise乘法操作;(3)Sigmoid 层输出0到1之间的概率值,描述每个部分有多少量可以通过。0代表“不许任何量通过”,1就指“允许任意量通过”。

github上的神经网络 gru神经网络代码_神经网络_05

  • LSTM的几个关键“门”与操作:
    (1)决定从“细胞状态”中丢弃什么信息  =>  “忘记门”:
    (2)决定放什么新信息到“细胞状态”中:①Sigmoid层决定什么值需要更新 ;②Tanh层创建一个新的候选值向量 ;③上述2步是为状态更新做准备。

github上的神经网络 gru神经网络代码_反向传播_06

  • (3)更新“细胞状态”:①更新Ct-1为Ct ;②把旧状态与ft相乘,丢弃掉我们确定需要丢弃的信息;③加上it*  。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。 

github上的神经网络 gru神经网络代码_循环神经网络_07

  • (4)基于“细胞状态”得到输出 :① 首先运行一个sigmoid 层来确定细胞状态的哪个部分将输出;②接着用tanh处理细胞状态(得到一个在-1到1之间的值),再将它和sigmoid门的输出相乘,输出我们确定输出的那部分。 ③比如我们可能需要单复数信息来确定输出“他”还是“他们”:

github上的神经网络 gru神经网络代码_神经网络_08

  • 一些变种:
    ①增加“peephole connection”,让 门层 也会接受细胞状态的输入。
    ②通过使用 coupled 忘记和输入门 ,之前是分开确定需要忘记和添加的信息,这里是一同做出决定。

github上的神经网络 gru神经网络代码_反向传播_09

GRU(Gated Recurrent Unit)神经网络:

它是2014年提出,将忘记门和输入门合成了一个单一的 更新门 ,同样还混合了细胞状态和隐藏状态,和其他一些改动,比标准LSTM简单:

github上的神经网络 gru神经网络代码_反向传播_10

其他推倒具体参考:参考一

案例代码:欢迎关注我的github