RNN公式推导

来源:互联网 发布:手游直播软件 编辑:程序博客网 时间:2024/06/05 03:13

循环神经网络

神经网络是由一层一层的神经元首尾相连构成,通常情况下网络分为输入层、隐层和输出层三种。而这里要讲的循环神经网络,是下面这样一种结构: 

fig0

如上图所示RNN结构,其隐层除了传递信息给输出层,还会传给自己,换句话说,就是传给下一时刻的隐层。这样做的目的在于,让神经网络在时间维度上产生“记忆”。至于RNN的应用场景,可自行查资料了解。话不多说,接下来我们直接开始公式推导过程。

为了便于直观理解推导,我们先按时间维度展开RNN的网络结构,并对各个部分给出相应的符号标注,如下图所示: 

fig1

其中x代表输入,W代表权重;a表示汇集计算的结果,b表示经过激活函数的结果;i是输入向量下标,h是隐层神经元编号,k是输出层神经元编号;t表示时间步。可知朴素RNN有三个权重矩阵:输入层到隐层的矩阵Wih,隐层到自身的矩阵Wh’h,以及隐层到输出层的矩阵Whk

首先,我们写出RNN的前向传播公式。前向传播指的是从前往后传递信息,传递的是输入x。前向传播公式如下: 

fig2

上面分别描述了t时刻的隐层汇集计算(来自输入层与t-1时刻的隐层)、隐层激活输出、输出层汇集计算、输出层激活输出。

模型训练过程大致是这样:样本信息通过输入层传递到输出层,得到实际输出值,然后与真实值通过损失函数(均方差或者交叉熵公式等)计算出误差L,再反向传播分别修正三个W权重矩阵,直到误差收敛至某一阈值。反向传播指的是从后往前传递信息,传递的是误差信号L,求导之后称之为残差δ。

和普通DNN一样,根据前向传播公式,采用链式法则,我们可以很容易的给出WhkWih这两个权重矩阵的梯度计算过程以及权重更新方式,如下图所示: 

fig3

fig4

其中η是学习步长,请注意,本文给出的公式均省略了关于时间t的求和运算Σ。

RNN中比较难理解的是对Wh’h的梯度计算,因为Wh’h残差不仅来自于当前t时刻的输出层,也来自于下一个t+1时刻隐层。其中来自当前输出层的残差比较容易给出,如下图所示: 

fig4.5

而t+1时刻隐层传回的残差无法从刚才的前向传播式子中反推出来。上周日正是因为式中的隐层残差是传给t-1时刻而不是当前t时刻,才没有推出t+1时刻的残差。所以,我们需要写一个“新”的前向传播公式,其前向传播的方向如下图红色箭头所示: 
fig5

针对t时刻的隐层而言,蓝色箭头的反方向代表输出层的残差传递,红色箭头的反方向则代表隐层残差传递。为了推出另一部分从t+1时刻的隐层传递回来得残差,我们不妨写出红色箭头所代表的前向传播公式: 
fig6

跟之前的前向传播公式相比,其实就是输出层换成了下一时刻隐层。有了这个时间维度的前向传播公式,我们就能写出另一半来自t+1时刻隐层的残差公式: 
fig7

最后,隐层权重向量Wh’h的梯度计算过程以及权重更新方式如下图所示: 
fig8

至此,朴素RNN的三个权重向量W的公式就全部推导完成了。这里想特别讲一下RNN的梯度消失问题,回到上面图中的那个红色箭头,这里只推导了t+1时刻隐层传回的残差。试想一下,如果是t+n时刻呢?可想而知,时间相隔越远,梯度的贡献越小。这便是朴素RNN的缺点,模型表现为容易“忘事”。但经过改进的RNN模型可以克服这个缺点,便是我们上节提到的LSTM模型。敬请期待下节。

对本文推导有任何问题或疑问,欢迎留言交流。


转载自:http://m.blog.csdn.net/cherrylvlei/article/details/75269614

原创粉丝点击