为了使得计算梯度下降时更加有效率,我们使用反向传播(backpropagation)。
链式法则
我们使用链式法则对神经网络的损失函数求偏导然后就可以代入式子优化参数了:
其中
C
(
y
,
y
^
)
=
−
∑
i
=
1
n
y
i
l
n
y
^
i
C(y,\hat y)=-\sum_{i=1}^ny_iln\hat y_i
C(y,y^)=−∑i=1nyilny^i,
y
i
y_i
yi代表标签值,
y
^
i
\hat y_i
y^i代表依据模型计算出来值。
我们先考虑其中的一个节点:
如图所示我们称
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z为前向传播(Forward pass),称
∂
C
∂
z
\frac{\partial C}{\partial z}
∂z∂C为反向传播(Backward pass)。
上式中
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z比较好算:
计算前向传播(Forward pass)和反向传播(Backward pass)
下面来解释一下为什么称
∂
z
∂
w
\frac{\partial z}{\partial w}
∂w∂z为前向传播(Forward pass):
如上图所示,因为
∂
z
∂
w
i
=
x
i
\frac{\partial z}{\partial w_i}=x_i
∂wi∂z=xi所以看起来就像-1往前传了一步,0.12往前传了一步······也就是说计算
∂
z
∂
w
i
\frac{\partial z}{\partial w_i}
∂wi∂z时只要那个节点的输入往前传一步赋值给
∂
z
∂
w
i
\frac{\partial z}{\partial w_i}
∂wi∂z即可。
计算反向传播(Backward pass)
其中
a
=
σ
(
z
)
=
1
1
+
e
−
z
a=\sigma(z)=\frac{1}{1+e^{-z}}
a=σ(z)=1+e−z1
假设打红色问号的两项已知的话,整个式子就很容易算出来了,即:
其中
σ
′
(
z
)
=
∂
a
∂
z
\sigma'(z)=\frac{\partial a}{\partial z}
σ′(z)=∂z∂a,因为在后传的时候
z
z
z已经是一个已知的常数了,所以
σ
′
(
z
)
\sigma'(z)
σ′(z)就是一个常数了。
接下来我们解决上面留下来的一个问题,计算
∂
C
∂
z
′
\frac{\partial C}{\partial z'}
∂z′∂C和
∂
C
∂
z
′
′
\frac{\partial C}{\partial z''}
∂z′′∂C
我们分两种情况来计算:
情况一:
C
C
C位于输出层
这种情况下比较好算,因为此时
y
1
=
σ
(
z
′
)
y_1=\sigma(z')
y1=σ(z′)且
C
=
−
y
^
1
l
n
y
1
−
y
^
2
l
n
y
2
C=-\hat y_1lny_1-\hat y_2lny_2
C=−y^1lny1−y^2lny2
情况二: C C C位于隐藏层
此时就用到了类似于递归的思想,一直往后推导输出层。但是这样一层一层往后推会很费劲,所以我们最好从最后一项开始一层一层往前推,如下图所示,先算出
∂
C
∂
z
5
\frac{\partial C}{\partial z_5}
∂z5∂C和
∂
C
∂
z
6
\frac{\partial C}{\partial z_6}
∂z6∂C再算
∂
C
∂
z
4
\frac{\partial C}{\partial z_4}
∂z4∂C和
∂
C
∂
z
3
\frac{\partial C}{\partial z_3}
∂z3∂C最后算
∂
C
∂
z
2
\frac{\partial C}{\partial z_2}
∂z2∂C和
∂
C
∂
z
1
\frac{\partial C}{\partial z_1}
∂z1∂C 。
总结
总的来说我们只需要先对整个网络进行前向传播(Forward Pass)然后再对整个网络进行反向传播(Backward Pass)把二者的结果相乘就是我们所要求解的
∂
C
∂
w
\frac{\partial C}{\partial w}
∂w∂C。