梯度下降是一种通用的优化算法,核心是目标函数梯度的方向更新参数以期望降低目标函数值
反向传播是梯度下降算法在深度学习中的具体实现方式
CNN的BP
【转自】深度学习---反向传播的具体案例
两层CNN神经网络:隐层和输出层
初始化权重和偏置量,得到如下效果:
前向传播
隐层前向传播
输出层前向传播,使用隐层输出作为输出层的输入
计算loss
反向传播
通过对权重参数求偏导数来计算其改变对总误差有多少影响
具体计算使用链式法则:
输出层
隐藏层
最终使用学习率更新权重:
Pooling的反向传播
由于pooling操作会使feature map降维ie,其本身是不可导的,如L层大小8*8,有64个梯度,那么2*2的max pooling后,feature map大小变为4*4,一共16个梯度,两层之间无法一一对应。因此pooling操作的反向传播是将梯度进行拆分/合并,保证loss/梯度的总和不变。如下图所示:
最大池化
平均池化
RNN的反向传播
TBPTT:每次处理一个时间步,每前向传播 k1 步,后向传播 k2 步
两个结论:
1. TBPTT(1, k2) 和 TBPTT(1, n) (其中n表示序列总长) 的时间代价相差不大,并且TBPTT(1, n)效果会更好一点,因此并不是很有必要采用TBPTT(1, k2);
2. 由实验得知,在相同时间步时,TensorFlow的TBPTT(k1, k2)效果并不如TBPTT(1, k2),这表示TBPTT(1, k2) 可能不能学得更加全面的序列的信息(同上文分析的naive方式的不足),因此,可以考虑采用TBPTT(k1, k2)(其中k1 < k2 < n)这种方式。
于transformer的比较:
结合RNN的反向传播过程,突出了RNN的权重W累乘问题,即单向语言模型的时序依赖问题,naive BPTT对长序列的计算量不可承受,上面的TBPTT对长序列则无法有效挖掘上下文依赖;
transformer的self attention过程每次计算是query和上下文的key/value之间进行,可做到全局感受野,不存在时序依赖,即双向语言模型。