RNN

来源:互联网 发布:网络热词2015 编辑:程序博客网 时间:2024/05/17 03:27

一个小的例子mini_char_rnn
我们主要看代码中的backward部分:

dh = np.dot(Why.T, dy) + dhnextdhraw = (1 - hs[t] * hs[t]) * dhdhnext = np.dot(Whh.T, dhraw)

首先定义loss function:
E = nt=0softmaxcrossntropyloss(yt,labelst)
这里n是batchsize,y为输出,损失函数为softmax交叉熵,RNN的BP和传统的BP的不同在于ht是和ht1相关的,所以我们关心的是yhEy和传统的BP并无两样,单隐层RNN的forward如下:
ht=f(Wxhxt+Whhht1+bh)
yt=htWhy+by
所以在backward中
Eht=Eytytht+Eyt1yt1ht1
后面一项正是代码中的dhnext,我们可以把nt=0yt展开来看:
yt=htWhy+by=f(Wxhxt+Whhht1+bh)
yt1=ht1Why+by=f(Wxhxt1+Whhht2+bh)
yt2=ht2Why+by=f(Wxhxt2+Whhht3+bh)
yt3=ht3Why+by=f(Wxhxt3+Whhht4+bh)
yt4=ht4Why+by=f(Wxhxt4+Whhht5+bh)
……
我们可以看到
ht出现在yt中(因为t已经是最后一项了)
ht1出现在yt1yt
ht2出现在yt2yt1
ht3出现在yt3yt2
正是因为RNN在时间轴上是关联的,所以前一时刻的输出和当前时刻的输入是相关联的,这也反映到了RNN的BP中,就是当前时刻的梯度是和前一时刻的梯度相关的

0 0