一、普通RNN

最简单的RNN网络可以看成,在全连接网络的基础上,在每一层网络中增加一个将自己层的输出连接到在自己层的输入,如下图:

                                              循环神经网络:RNN(Recurrent Neural Network)

                                         循环神经网络:RNN(Recurrent Neural Network)

对整个网络的计算方式与传统的神经网络略有不同。损失函数公式如下:就是在每个时间步计算网络输出和真实输出的损失值。所有样本、所有的时间步加起来作为征提的损失,最终的目标是使整体的损失值最小。

                                                                     循环神经网络:RNN(Recurrent Neural Network)

普通RNN的不足:

虽然普通的RNN结构可以得到前面时间步的信息,乐园处理序列化的数据,但目前在实际应用上,很少见到只使用基本的RNN结构,原因是普通RNN存在梯度消失和梯度爆炸的问题。

关于梯度消失和梯度爆炸,这又回到了求导链式法则上了。神经网络的在进行计算时,无非就是加法和乘法。设计网络的里面的3种计算情况:

1、函数合成

                                                                   循环神经网络:RNN(Recurrent Neural Network) 

根据链式求导法则,求循环神经网络:RNN(Recurrent Neural Network)的导数:

                                                            循环神经网络:RNN(Recurrent Neural Network)

2、函数相加

                                                                 循环神经网络:RNN(Recurrent Neural Network) 

  根据链式求导法则,循环神经网络:RNN(Recurrent Neural Network)的导数:

                                                            循环神经网络:RNN(Recurrent Neural Network)

3、加权计算

                                                                 循环神经网络:RNN(Recurrent Neural Network)

循环神经网络:RNN(Recurrent Neural Network)的导数:                                             

                                                                     循环神经网络:RNN(Recurrent Neural Network)

在反向传播残差的过程中,残差值会乘以当前节点的到数值。再有函数合成和惩罚计算的地方,残差值会发生变化,在计算假发的地方残差值不变。

循环神经网络:RNN(Recurrent Neural Network)时刻的隐藏层状态依赖于循环神经网络:RNN(Recurrent Neural Network)之前的所有时刻。在反向传播过程中,梯度需要通过所有的中间隐藏层逐时间步回传,序列长度有多少,就要回传多少“层”。

在神经网络的计算中,经常会用到**函数,如:sigmoid **函数:

循环神经网络:RNN(Recurrent Neural Network)                   其导数为:循环神经网络:RNN(Recurrent Neural Network)   导数的最大值为:0.25。

根据反向传播,残差在往前传播的过程中,每经过一个sigmoid函数计要乘以一个sigmoid函数的导数值,那么残差值至少削减为原来的0.25倍。这样神经网络每多一层,残差往前传递的时候,就会减少3/4,如果层数太多,残差传递到前面层的网络基本上已经为0了,这导致前面网络中的参数无法更新,这就是梯度消失。

反过来,如果每次的导数都大于 1,梯度就会越传越大,导致 参数更新幅度很大,每次参数更新都会非常剧烈,这就是梯度爆炸。梯度消失和梯度爆炸与层数有关,只要层数深的网络,都会遇到梯度消失或梯度爆炸的问题。

二、LSTM(Long Short Term Memory) 长短时间记忆

基于门控的思想,1997年,Hochreiter和 Schmidhuber提出了LSTM模型,该模型通过可以的设计来避免长期依赖问题。

普通RNN单元和LSTM单元结构如下:

                                循环神经网络:RNN(Recurrent Neural Network)

为避免梯度消失和梯度爆炸问题,LSTM单元相对普通的RNN单元有较大的区别,核心思想有两个:

一是采用一个叫“细胞状态”的通道贯穿整个时间序列。从循环神经网络:RNN(Recurrent Neural Network)循环神经网络:RNN(Recurrent Neural Network),在这条线上的操作只有乘法操作和假发操作,加法操作不引起梯度传播的变化,加权运算只改变梯度的范围,所以在这条“细胞状态”的通道上,不会发生梯度的衰减,而其他输出值的计算依赖于“细胞状态‘的值,所以LSTM的设计就可以避免普通RNN在过长序列上的梯度消失或梯度爆炸。

二是通过精心设计的”门”结构来去除或者增加信息的到细胞状态的能力。

C:控制参数 

决定什么样的信息会被保留,什么样的信息会被遗忘 

                                             循环神经网络:RNN(Recurrent Neural Network)

                    循环神经网络:RNN(Recurrent Neural Network)

                        循环神经网络:RNN(Recurrent Neural Network)

 

                         循环神经网络:RNN(Recurrent Neural Network)

                         循环神经网络:RNN(Recurrent Neural Network)

                       循环神经网络:RNN(Recurrent Neural Network)

                         循环神经网络:RNN(Recurrent Neural Network)

三、增加peephole 的LSTM单元

除了前面说到的结构之外,LSTM单元还有很多的不同结构,例如增加peephole,让几个“门”的输入数据除了接受正常的输入数据和上一刻的输出之外,再接受“细胞状态”的输入。如下图加粗黑线的连接所示。

循环神经网络:RNN(Recurrent Neural Network)

四、GRU单元

LSTM有很多变种,改动较大的是GRU单元(Gated Recuurent Unit)。它将“忘记门”和“输入门”合成了一个单一的“更新门”,同时还混合了细胞状态和隐藏状态,以及其他的一些改动。最终的模型比标准的LSTM模型简单,计算速度更快,甚至在某些应用上表现更好,是非常流行的变体。结构如下图所示:

                             循环神经网络:RNN(Recurrent Neural Network)

GRU的计算过程,公式表示如下:

                           循环神经网络:RNN(Recurrent Neural Network)

                           循环神经网络:RNN(Recurrent Neural Network)

                           循环神经网络:RNN(Recurrent Neural Network)

此篇主要总结内容来自书《Tensor flow入门与实战》这本书,作者:罗冬日;还有一部分是所看资料的的总结。