-
回顾梯度下降:
有一堆参数 θ = w 1 , w 2 , . . . , b 1 , b 2 , . . . \theta= {w_1,w_2,...,b_1,b_2,... } θ=w1,w2,...,b1,b2,...
首先由一个初始化值 θ 0 \theta^0 θ0
计算损失函数的梯度 ▽ L ( θ 0 ) \triangledown L(\theta^0) ▽L(θ0)
迭代 θ \theta θ
参数过多,这么多梯度怎么办?BP算法提供了一种快速计算梯度的方法 -
回顾链式求导法则
BP
- y ^ n \hat{y}^n y^n是理想输出; y n y^n yn是实际输出
-
C
n
C^n
Cn表示
y
n
y^n
yn和
y
^
n
\hat{y}^n
y^n之间的距离
- 先看第一层
BP-Forward pass
显然
所以,可以总结出:z对w的偏导数是前一个神经元/激活函数的输出值
这个计算过程是从前到后的,因此叫做Forward pass
BP-backward pass
为了计算
∂
C
/
∂
z
\partial C / \partial z
∂C/∂z,将其拆成
∂
C
/
∂
a
\partial C / \partial a
∂C/∂a和
∂
a
/
∂
z
\partial a / \partial z
∂a/∂z
因为
a
=
σ
(
z
)
a=\sigma(z)
a=σ(z)
所以
∂
a
/
∂
z
=
σ
′
(
z
)
\partial a / \partial z=\sigma'(z)
∂a/∂z=σ′(z)
- 那么 ∂ C / ∂ a \partial C / \partial a ∂C/∂a怎么算呢?
显然,a通过影响 z ′ z' z′和 z ′ ′ z'' z′′影响C
现在的问题是画问号的两项未知
- case1 假设是最后一层
只需要知道输出层函数,就可以轻松算出$\partial y_1 / \partial z’;而 ∂ C / ∂ y 1 \partial C/\partial y_1 ∂C/∂y1由loss函数也可以轻松算出 - case2 不是最后一层
同理于
可以由 ∂ C / ∂ z a \partial C / \partial z_a ∂C/∂za 和 ∂ C / ∂ z b \partial C/\partial z_b ∂C/∂zb算出 ∂ C / ∂ z ′ \partial C / \partial z' ∂C/∂z′
所以从output layer往前算,就能算出所有 ∂ C / ∂ z \partial C / \partial z ∂C/∂z
Summary
信号正向传播,误差反向传播,乘起来就是所求梯度