RNN中的的反向传播推导(通俗版)

反向传播其实就是链式求导法则的重复使用,链式法则其实就是先计算外层函数的导数,再计算内层函数的导数,一直重复。误差反向传播的过程,就是层层求导的过程。在看RNN的反向传播之前,先看看简单网络的反向传播。

1、反向传播,链式求导

看一个小例子,如下图所示,其中f函数由x,y,z三种变量的组合来决定,x和y并不是直接和f相连。假设,x+y用q来表示,作为中间结果q=x+y。首先来看一下前向传播过程,就是根据当前的所有输入值来得到最后的输出值的过程。也就是f=(-2+5)*(-4)=-12。可以看出,三个输入x,y,z分别对最终的f值起到了不同的影响作用。有的影响大,有些影响小,有些是正的影响,有些是负的影响,因此,如果我们给出了f的真实值,就会出现一个误差,而每个输入x,y,z对这个误差的影响大小以及是正还是负的影响,可以用求导来得到。此处只演示x,y,z对f的影响,若要计算对误差的影响,只需对误差计算导数就可以。


这里给出第二个小例子:


需要注意的是,误差从输出一层一层往前传播,不可以跳过某些中间步骤,在计算每一步的误差时,需要乘上上一步得到的误差(链式法则,层层相乘)。在传播过程中,如果某一部分可以直接用一整个函数代替,则可以对整块求导,然后将导数值传到上一步,如下图所示,这仍然符合链式求导法则。


2、RNN中的反向传播


前向传播过程(黑色箭头方向):

输入为x,

隐层:ly1=sigmoid(x*W0)+pre_ly1*Wh,

由两部分组成,一部分是输入值乘以权重,再经过一个激活函数(这里暂时用sigmoid表示),另一部分是是隐藏层前一个状态保存的结果。

输出层:ly2=sigmoid(ly1*w1),

由隐层输出值和输出权重相乘,经过激活函数得到。

反向传播过程(红色箭头方向):

真实值为Y,输出层输出的预测值为ly2,两者差为:Y-ly2=err,计算得到总误差Err=1/2(Y-ly2)^2,也就是平方误差。接下来就要使用链式求导法则,反向传播误差,首先离误差最近的是输出ly2,则计算Err对ly2的偏导数,得到:

delta_ly2=(Y-ly2)*sigmoid'(ly2),

注意,这里sigmoid函数是对ly2求导。而Y-ly2=err,所以delta_ly2=err*sigmoid(ly2),接下来计算隐层的误差,从图中可以看出,隐层反向传过来的误差有两项,一个是后一个状态的隐层误差:next_ly1*Wh,另一个是输出层传下来的误差:delta_ly1=delta_ly2*W1*sigmoid'(ly1),

这个式子是由链式法则得出,每次计算当前步的误差需要乘上上一步的误差,因此有delta_ly2这一项,然后因为ly2=sigmoid(ly1*W1),根据链式法则计算ly2对ly1的导数,得到W1*singmoid'(ly1)。

然后计算按照下面公式更新参数:


需要更新的值也就是当前层的输出值乘以上一层传下来的误差。



猜你喜欢

转载自blog.csdn.net/sinat_33486980/article/details/80872082
今日推荐