Backpropagation Algorithm
在上一单讲梯度优化时讲到,偏导 $\partial{C}/\partial{w}$ 体现的是权重 $w$ 的变化对损失函数 $C$ 的影响。 怎么计算参数的梯度呢?答案是后向传播算法(Backpropagation Algorithm)。
下面都是些数学公式,先约定一个符号 $W_{jk}^l$,表示第 $l$ 层的第 $j$ 个结点与第 $l-1$ 层第 $k$ 个结点之间的参数。 为什么这样定义?为了在前向传播时,每一层的计算可以简洁地表示一个矩阵向量乘法 $Wx$。
$$ a^l=\sigma(w^la^{l-1}+b^l) $$
其中,$\sigma$是一个element-wise函数,即可以对向量的每一维并行计算,相互不依赖。
损失函数
假设: 损失函数可以写成单个训练样本损失累加和的平均。为了 batch 随机梯度下降, 在实现中有提及基本都满足。
推导
在NN中已经说明,本质: 梯度的链式法则。TODO: 可以将矩阵点乘的形式加入。
有了参数梯度计算的公式可以做简单的分析:
- 梯度等于激活值与误差敏感项的乘积;如果激活值小,梯度也小,权重更新就慢。
- 从后向前计算误差敏感项时,如果激活函数 $f$ 梯度比较小(针对 sigmoid 函数值饱和)时,参数梯度也变小。
对比
如果使用梯度的定义来计算梯度,复杂度不是一个量级。
理解
为什么BP算法能计算梯度? 其实是梯度链式法则的实现,不断地将各种路线累加起来了。 怎么才能成为第一个想到这个算法的人?一种理解是公式的简化,另外一种理解是DP算法,因为路径计算中有太多的重复子问题。
参考文献
Chris Olah, BP http://neuralnetworksanddeeplearning.com/chap2.html