摘要:
本文主要讲述的RNN(循环神经网络)在训练过程中BP算法的推导。
在阅读本文之前希望读者看过我的另一篇文章BP算法心得体会。因为大部分的思路沿用的就是这篇文章的思路。
参考文章:
数学推导-1
数学推导-2
更新-2018-01-23:
之前写完这篇文章之后,回头看了一遍文章,发现在整个推导的过程都无视了时间维度的存在,所以后来查阅了相关的资料,发现目前网上有一部分RNN的推导过程和本文是一样的,比如上面给到的2篇参考文章,思路和本文是一致的。但是也存在另外一些版本的推导,其过程和本文的截然不同。
所以后来在参考了大神的代码后,重新思考了rnn的训练算法,因此重新写一个篇rnn和bptt供大家参考。
正文
RNN的一般原理介绍这里就不再重复了,本文关注的是RNN是如何利用BP算法来进行训练的。
推导
在推导BP算法之前,我们先做一些变量上的规定,这一步非常关键。
本文使用的RNN是只含一个隐藏层(多个隐藏层其实也是一样的道理)。其结构如下图所示:
(大家看到这个网络结构可能有些困惑,比如说,RNN是由多个网络组成的吗?这里值得注意的是,RNN就只由一个网络组成,图上有多个网络是在不同时刻的输入下的网络情况)
现在,作如下的一些规定:
vim 是输入层第 m 个输入与隐藏层中第
uin 是隐层自循环的权重(具体表现为上面结构图中那些紫色、绿色的线)
wkm 是隐藏层中第m个神经元与输出层第k个神经元连接的权重。
网络中共有 N(i)个输入单元 , N(h)个隐藏层 , N(o)个输出单元
netthi 表示隐藏层第 i 个神经元在
具体为: netthi=∑N(i)m=1(vimxtm)+∑N(h)s=1(uisht−1s)
经过激活后的输出为: hti=f(netthi)
nettyk 表示输出层第 k 个神经元在
具体为: nettyk=∑N(h)m=1(wkmhtm)
经过激活后的输出为: otk=f(nettyk)
这里同样地,为了方便推导,假设损失函数 Et=0.5∗∑N(o)k=1(otk−ttk)2 (本文也会说明使用其他损失函数的情况)
E=∑stept=1Et
首先我们需要解决的问题就是求出:
∂E∂uin , ∂E∂wkm , ∂E∂vim 。
1.先来求最简单的 ∂E∂wkm :
和之前讲解BP的文章套路一样,我们可以对 ∂E∂wkm 使用链式法则,具体如下:
∂E∂wkm=∂E∂nettyk∗∂nettyk∂wkm