首先明确一下,本文须要对RNN有必定的了解,并且本文只针对标准的网络结构,旨在完全搞清楚反向传播和BPTT。网络
反向传播形象描述架构
什么是反向传播?传播的是什么?传播的是偏差,根据偏差进行调整。函数
举个例子:你去买苹果,你说,老板,来20块钱苹果(目标,真实值),老板开始往袋子里装苹果,感受差很少了(预测),放称上一称,还差点(偏差),又装了一个,还差点(调整一次以后的偏差),又装了一个...迭代,直到20块钱。优化
注意每次都是根据偏差来进行调整,这点谨记。spa
BPTT 剖析3d
RNN网络结构比较复杂,BPTT在梯度计算时也不一样于常规。blog
不一样1:权重共享,多个偏差教程
常规是偏差分两条路传递,而后每条路分别算w,很容易理解变量
而权重共享时,一个权重,生成了2个偏差,还有个总偏差,到底用哪一个?怎么反向?假设能反向回去,2个w,怎么处理?咋一想,好乱,im
实际上是这样的
1. 总偏差,分偏差,实际上是同样的
2. 2个w,须要求和。
一个权重,多个偏差,求和
不一样2:权重共享,链式传递
也是2个w,咋一看,不知道咋算。
实际上是这样的
链式法则
一个权重,屡次传递,其梯度中含有w,且容易看出,传递次数越多,w的指数越大
其实rnn比这些不一样点更复杂
图不解释了,直接上干货。
首先对网上各类坑爹教程进行补充和完善,总结,固然虽然坑爹,可是对咱们理解也是有帮助的。
教程1:教程描述ly1的偏差来自ly2 和 next_ly1两个方向(下图),其实说法不错,只是不完整。
补充:
1. ly1的偏差来自两个方向,ly2和next_ly1,这两条路都要从各自的偏差开始算起。(这里体现了我上面例子里提醒谨记的话)
2. 这里计算的是“单层”的梯度,即单个w的梯度,实际计算BPTT梯度时并非这样。
这里的公式应该是这样子
教程2:教程定义了中间变量,并用中间变量来表示梯度
各类δ,彻底搞不清,公式也没有推导过程。
补充:这里针对单个节点自定义了变量,而后把每一个节点直接相加获得总梯度。
总结:这里定义了中间变量δ,之因此定义这个,是由于这个计算比较麻烦,并且要常常用到,这样会很好地简化运算。
这里的公式应该是这样子
这些教程加上个人补充,其实已经能够算出梯度了。
下面我再系统的讲一遍BPTT
仍是用这张图,这张图在整个网络架构上比较完整,可是缺少完整的cell,我在前向传播中标记一下。
前向传播
wi 表示输入权重,wh表示隐层权重
反向传播
首先理解以下公式
1. v 和 c并无多路传递偏差,和普通的梯度计算无差异
2. wi wh b都有多路传播
一样设定中间变量,注意这个变量最好是个递推公式,可以大大简化运算,且容易获得规律
初步设定
优化
再优化
这样貌似好多了,递推下去
注意到这里仍是传递偏差,从上式大概能够看出
1. 这是t时刻隐层cell的偏差 ,固然要乘以总偏差
2. t时刻的偏差是t时刻到T的一个和,也就是说是从终点一步一步传过来的
3. 每步传递都是从t时刻到传递时刻的连乘,w指数。
4. 大概是这样 w * losst1 + ww * losst2 + www * losst3 + wwww * losst4 + wwwww * losst5 ,越往前传这个式子越长,损失也越传越小
5. 加上激活函数的搅和,其导数常常小于1
wi同理