RNN

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

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

首先定义loss function:
E = nt=0softmaxcrossntropyloss(yt,labelst)
这里n是batchsize,y为输出,损失函数为softmax交叉熵,RNN的BP和传统的BP的不同在于 ht 是和 ht1 相关的,所以我们关心的是 yh Ey 和传统的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 出现在 yt1 yt
ht2 出现在 yt2 yt1
ht3 出现在 yt3 yt2
正是因为RNN在时间轴上是关联的,所以前一时刻的输出和当前时刻的输入是相关联的,这也反映到了RNN的BP中,就是当前时刻的梯度是和前一时刻的梯度相关的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值