参考了台湾大学李宏毅老师2021版《机器学习》课程
此处符号表示与吴恩达的略有不同。
单个训练集的代价函数用 C ( θ ) C(\theta) C(θ)表示,所有训练集代价函数之和用 L ( θ ) L(\theta) L(θ)表示,
神经网络中的参数 θ \theta θ包括权重 w w w和偏置 b b b,
g ( x ) g(x) g(x)和 σ ( x ) \sigma(x) σ(x)都是指某种激活函数。
终于理清反向传播算法(Backpropagation Algorithm,BP算法)的过程了。
1 梯度下降
在用梯度下降算法时,网络参数 θ = { 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 ) \nabla L(\theta^0) ∇L(θ0),然后通过梯度下降更新为 θ 1 = θ 0 − α ∇ J ( θ 0 ) \theta^1 = \theta^0-\alpha \nabla J(\theta^0) θ1=θ0−α∇J(θ0),反复这个过程直到收敛。
其中 ∇ L ( θ ) = [ ∂ ∂ w 1 L ( θ ) ∂ ∂ w 2 L ( θ ) . . . ∂ ∂ b 1 L ( θ ) ∂ ∂ b 2 L ( θ ) ] {{\nabla L(\theta)}}=\begin{bmatrix} \frac{\partial }{\partial {w_1}}L\left( \theta \right) \\\frac{\partial }{\partial {w_2}}L\left( \theta \right)\\ ...\\ \frac{\partial }{\partial {b_1}}L\left( \theta \right)\\ \frac{\partial }{\partial {b_2}}L\left( \theta \right) \end{bmatrix} ∇L(θ)=⎣⎢⎢⎢⎢⎢⎡∂w1∂L(θ)∂w2∂L(θ)...∂b1∂L(θ)∂b2∂L(θ)⎦⎥⎥⎥⎥⎥⎤
在神经网络中参数可能有上百万个, ∇ L ( θ ) {{\nabla L(\theta)}} ∇L(θ)为上百万维向量,反向传播算法就是用于高效地计算这个向量,然后再用梯度下降求代价函数最小值。
2 反向传播
设神经网络(NN)某一组输出值与标签之间的代价为
C
n
C^n
Cn,则将所有训练集的代价加起来即为
L
(
θ
)
L(\theta)
L(θ),这里以对权重
w
w
w求偏导为例得到右边的式子。
接下来只对一组训练数据进行计算
∂
C
∂
w
\frac{\partial C}{\partial {w}}
∂w∂C(最后将所有的训练集加起来即可)。
假设神经网络只有两个输入 x 1 , x 2 x_1,x_2 x1,x2,那么加权和为 z = x 1 w 1 + x 2 w 2 + b z=x_1w_1+x_2w_2+b z=x1w1+x2w2+b。通过链式法则可知:
∂ C ∂ w = ∂ z ∂ w ∂ C ∂ z \frac{\partial C}{\partial {w}}=\frac{\partial z}{\partial {w}}\frac{\partial C}{\partial {z}} ∂w∂C=∂w∂z∂z∂C
这里
∂
z
∂
w
\frac{\partial z}{\partial {w}}
∂w∂z将使用顺推法(forward pass) ,
∂
C
∂
z
\frac{\partial C}{\partial {z}}
∂z∂C将使用逆推法(backward pass) 。
2.1 顺推法
由上可得: ∂ z ∂ w 1 = x 1 \frac{\partial z}{\partial {w_1}}=x_1 ∂w1∂z=x1, ∂ z ∂ w 2 = x 2 \frac{\partial z}{\partial {w_2}}=x_2 ∂w2∂z=x2
即对于在这之后的层上 ∂ z ∂ w \frac{\partial z}{\partial {w}} ∂w∂z都为前一层的输出值。
只要把输入丢入神经网络,计算每个神经元的输出,即可得到每个
∂
z
∂
w
\frac{\partial z}{\partial {w}}
∂w∂z值。这个步骤即为顺推法 。
2.2 顺推法求 ∂ C ∂ z \frac{\partial C}{\partial {z}} ∂z∂C
如果继续使用顺推法,将网络向后拓展,第一层的输出值为 a = g ( z ) a=g(z) a=g(z),由链式法则可得:
∂ C ∂ z = ∂ a ∂ z ∂ C ∂ a \frac{\partial C}{\partial {z}}=\frac{\partial a}{\partial {z}}\frac{\partial C}{\partial {a}} ∂z∂C=∂z∂a∂a∂C
易算出
∂
a
∂
z
=
g
′
(
z
)
\frac{\partial a}{\partial {z}}=g'(z)
∂z∂a=g′(z),主要问题在于计算
∂
C
∂
a
\frac{\partial C}{\partial {a}}
∂a∂C。
由网络图可知,
a
a
a会通过
z
′
,
z
′
′
z',z''
z′,z′′影响
C
C
C。由链式法则可得:
∂ C ∂ a = ∂ z ′ ∂ a ∂ C ∂ z ′ + ∂ z ′ ′ ∂ a ∂ C ∂ z ′ ′ \frac{\partial C}{\partial {a}}=\frac{\partial z'}{\partial {a}}\frac{\partial C}{\partial {z'}}+\frac{\partial z''}{\partial {a}}\frac{\partial C}{\partial {z''}} ∂a∂C=∂a∂z′∂z′∂C+∂a∂z′′∂z′′∂C
此网络中只有两项,如果有更多项则都需根据链式法则加起来。
易算出 ∂ z ′ ∂ a = w 3 \frac{\partial z'}{\partial {a}}=w_3 ∂a∂z′=w3, ∂ z ′ ′ ∂ a = w 4 \frac{\partial z''}{\partial {a}}=w_4 ∂a∂z′′=w4,此时有:
∂ C ∂ z = ∂ a ∂ z ∂ C ∂ a = g ′ ( z ) [ w 3 ∂ C ∂ z ′ + w 4 ∂ C ∂ z ′ ′ ] \frac{\partial C}{\partial {z}}=\frac{\partial a}{\partial {z}}\frac{\partial C}{\partial {a}}=g'(z)[w_3\frac{\partial C}{\partial {z'}}+w_4\frac{\partial C}{\partial {z''}}] ∂z∂C=∂z∂a∂a∂C=g′(z)[w3∂z′∂C+w4∂z′′∂C]
问题在于如何算 ∂ C ∂ z ′ , ∂ C ∂ z ′ ′ \frac{\partial C}{\partial {z'}},\frac{\partial C}{\partial {z''}} ∂z′∂C,∂z′′∂C。可从两种情况考虑:
1、已经到了输出层可直接由链式法则算出。
2、还没到输出层,继续套娃计算直到到输出层。
但是这样计算过于复杂,所以需要使用逆推法。
2.3 逆推法
在顺推法求 ∂ C ∂ z \frac{\partial C}{\partial {z}} ∂z∂C中我们得到了这个式子:
∂ C ∂ z = ∂ a ∂ z ∂ C ∂ a = g ′ ( z ) [ w 3 ∂ C ∂ z ′ + w 4 ∂ C ∂ z ′ ′ ] \frac{\partial C}{\partial {z}}=\frac{\partial a}{\partial {z}}\frac{\partial C}{\partial {a}}=g'(z)[w_3\frac{\partial C}{\partial {z'}}+w_4\frac{\partial C}{\partial {z''}}] ∂z∂C=∂z∂a∂a∂C=g′(z)[w3∂z′∂C+w4∂z′′∂C]
将相应的计算图画出来,其实就是顺推倒过来。这里的
g
′
(
z
)
g'(z)
g′(z)已经通过正推得到,是一个常数。
由此可知,我们可以通过下一层的
∂
C
∂
z
(
L
)
\frac{\partial C}{\partial {z^{(L)}}}
∂z(L)∂C来推上一层的
∂
C
∂
z
(
L
−
1
)
\frac{\partial C}{\partial {z^{(L-1)}}}
∂z(L−1)∂C,只需要知道权值
w
w
w和已计算出
g
′
(
z
)
g'(z)
g′(z)。
这个步骤即为逆推法 。
对于下图的神经网络,用顺推法求
∂
C
∂
z
\frac{\partial C}{\partial {z}}
∂z∂C需要套娃递归,计算量过大,所以我们可以先算最后一层,再用逆推法往前推。
3 总结
使用反向传播我们要做的就是:
先用正向传播计算出各个加权和 z z z、神经元的输出值 a a a( a = g ′ ( z ) a=g'(z) a=g′(z))、最后一层的代价函数 C C C,
然后通过顺推法得到每个 ∂ z ∂ w \frac{\partial z}{\partial {w}} ∂w∂z值( ∂ z ∂ w = a \frac{\partial z}{\partial {w}}=a ∂w∂z=a),
然后通过逆推法,先求最后一层的 ∂ C ∂ z ( L ) \frac{\partial C}{\partial {z^{(L)}}} ∂z(L)∂C,再推出前面所有的 ∂ C ∂ z \frac{\partial C}{\partial {z}} ∂z∂C,
二者相乘,即为 ∂ C ∂ w = ∂ z ∂ w ∂ C ∂ z \frac{\partial C}{\partial {w}}=\frac{\partial z}{\partial {w}}\frac{\partial C}{\partial {z}} ∂w∂C=∂w∂z∂z∂C