RNN循环神经网络里的BPTT算法

这两天对RNN循环神经网络进行了学习,由一无所知到现在对什么是RNN以及它的前向传播和反向传播有了认识,尤其是BPTT算法的推导有些繁琐,但是推过一次后,对RNN反向传播求梯度的过程有了更清晰的认识。

下面是朴素的RNN循环神经网络图。(图1)
RNN网络图

我在写博客前,自己先手写了一份推导过程。(图2)
手写BTPP推导

为何BPTT更难?

因为多了状态之间的传递(即隐层单元之间的“交流”),根据前向传播算法,我们知道 st=Wst1+Uxt, st1=f(st1)=f(Wst2+Uxt1) ,这说明 st1 也是关于 W 的式子。

这样层层嵌套下去……就会追溯到 s0 。可以意识到我们对 WU 的梯度求解是繁琐的,而这正是BPTT的难点所在。对于 V 的梯度求解,并没有受到状态之间传递的影响,因此和我们BP算法求解方式是一样的。

我们用 表示element-wise, × 表示矩阵乘法。
我们采用交叉熵损失函数,即 Lt=(ytlog(ot)+(1yt)log(1ot))
我们定义隐藏层的激活函数为sigmoid函数 st=f(st) ,输出层的激活函数也为sigmoid函数 ot=g(ot) f=st(1st),g=ot(1ot) 。具体求导读者自行证明。

由前向传播可知, ot=g(ot)=g(Vst)

那么 LtV=LtototototV=(ytot+yt11ot)ot(1ot)otV=(otyt)×sTt

不同时刻的 LtV 要相加,得到最后的 LV

由前向传播可知,对于时刻t而言, st1 也是关于 W 的式子,因此我们在求 LtW 时,不能简单的将 st1 视为常量,因此 LtW=tk=0Ltsk×sTk1 (注意,在我这里是把第一个时刻从0开始)。

Ltst=Ltototst=VT×(otyt)st(1st)
Ltsk1=Ltsksksk1sk1sk1=sk1(1sk1)WT×Ltsk(k=1,2,3...t)

同理, LtU=tk=0Ltsk×xTk

猜你喜欢

转载自blog.csdn.net/yqmind/article/details/78060715