Backpropagation
@[深度学习, 向后传播算法]
wjkl
表示
(l−1)th
层的第
k
个神经元和第
blj
第
l
层神经元的bias
wljk
:
j
的范围是第l层神经元的个数,
这里 al−1 是第 l 层的激活神经元
代价函数相关的两个假设
backpropagation的目标就是计算代价函数对
二次代价函数的形式:
- 假设1:代价函数能够被写成 C=1n∑xCx ,需要这个假设的原因是backpropagation实际上需要我们计算的是对单个训练样本的偏导( ∂Cx∂w 和 ∂Cx∂b )
- 假设2:代价函数能够被写成神经网络输出的函数
例如:二次代价函数能够写成:
Hadamard product
Backpropagation的四个基本等式
backpropagation是为了理解在神经网络中改变weights和biases是怎样改变代价函数,最终,意味着计算偏导 ∂C∂wljk 和 ∂C∂blj
为了计算偏导,我们首先计算中间量, δlj ,表示 lth 层第 j 个神经元的error
backpropagation给了一个对每层计算 δl 的方法
误差在输出层的等式
* ∂C/∂aLj 衡量了以第 jth 个激活元为函数的变化速率
* σ′(zLj) 衡量了sigmoid函数对 zLj 的变化速率
* ∂C/∂aLj 的精确形式取决于代价函数的选择,例如针对二次代价函数而言
* 当 σ(zLj) 趋近于0或1的时候, σ′(zLj)≈0 , δLj 也会变的很小,可以说输出神经元已经饱和,weight开始停止学习或学习的很慢
C=12∑j(yj−aj)2
∂C∂aLj=(aj−yj)
δL=∇aC⊙σ′(zL).(BP1a)
二次代价函数的 δL
δL=(aL−y)⊙σ′(zL)
在式子中都有较好的向量形式,因此容易利用Numpy等库进行计算
下一层误差等式,
δl+1
总结而言:
* 当输出神经元的状态是low-activation或者sturated时,weight将会缓慢的学习
* 这四个公式对任何形式的激活函数都有用
An equation for the rate of change of the cost with respect to any bias in the network:
An equation for the rate of change of the cost with respect to any weight in the network
证明
(BP1)
δLj=∂C∂zLj
链式法则
δLj=∂C∂aLj∂aLj∂zLj
(BP2)
δlj=∂C∂zlj=∑k∂C∂zl+1k∂zl+1k∂zlj=∑k∂zl+1k∂zljδl+1k,(链式法则)(a)(b)
zl+1k=∑jwl+1kjalj+bl+1k=∑jwl+1kjσ(zlj)+bl+1k
(BP3)
∂C∂blj=∂C∂zlj∂zlj∂blj
∂zlj∂blj=1
(BP4)
∂C∂wljk=∂C∂zlj∂zlj∂wljk(链式法则)
zlj=∑kwljkal−1k+blj
backpropagation算法
backpropagation equations 提供了一个计算代价函数梯度的方式
- 输入 x :设置相应的 activation a1 为输入层
- Feedforward: 对每一层 l=2,3,...,L 计算 zl=wlal−1+bl 和 al=σ(zl)
- Output error (输出层误差) : 计算向量 δL=∇aC⊙σ′(zL)
- Backpropagate the error : 对每一层 l=L−1,L−2,...,2 计算 δl=((wl+1)Tδl+1)⊙σ′(zl)
- 输出 : 计算代价函数的梯度,通过 ∂C∂wljk=al−1kδlj和∂C∂blj=δjl
mini-batch:(随机梯度下降结合backpropagation)
1. 输入一组训练样本
2. 对每个训练样本:设置相应的输入激活元
ax,1
- Feedforward: 对每一层
l=2,3,...,L
计算
zx,l=wlax,l−1+bl
和
ax,l=σ(zx,l)
- Output error (输出层误差) : 计算向量
δx,L=∇aCx⊙σ′(zx,L)
- Backpropagate the error : 对每一层
l=L−1,L−2,...,2
计算
δx,l=((wl+1)Tδx,l+1)⊙σ′(zx,l)
3. 梯度下降 : 对每一层
l=L,L−1,...,2
,更新权重weights,根据规则