杂记:神经网络BP反向传播公式推导【前馈神经网络篇】
本篇文章是在学习了邱锡鹏老师的《神经网络与深度学习》之后写得。邱老师写的很好,本篇文章主要是对反向传播这块的公式进行整理与推导。
前馈神经网络的简单模型:
他的基本结构是:前一层的神经元输出,经过激活函数后,成为后一层神经网络的输入。
用公式来表达上述关系就是:
z
(
l
+
1
)
=
W
(
l
+
1
)
a
(
l
)
+
b
(
l
+
1
)
a
(
l
)
=
f
l
(
z
(
l
)
)
\begin{aligned} \boldsymbol{ z}^{(l+1)}&=\boldsymbol{W}^{(l+1)}\boldsymbol{a}^{(l)}+\boldsymbol{b}^{(l+1)} \\ \boldsymbol{ a}^{(l)}&=f_l(\boldsymbol{z}^{(l)}) \end{aligned}
z(l+1)a(l)=W(l+1)a(l)+b(l+1)=fl(z(l))上述模型揭示了两个关系:
(1)全连接网络的网络结构是:由输入经过一个权重矩阵
W
\boldsymbol{W}
W和偏置
b
\boldsymbol{b}
b,得到全连接层的输出。
(2)
z
(
l
)
\boldsymbol{ z}^{(l)}
z(l)是第
l
l
l层全连接层的直接输出,经过激活函数
f
l
(
⋅
)
f_l(\boldsymbol ·)
fl(⋅)得到本层的输出
a
(
l
)
\boldsymbol{ a}^{(l)}
a(l),它也是下一层的输入。
模型优化简述:
在前馈神经网络的模型上,多层的神经网络已经能够完成由给定输入得到输出,为了让神经网络更好的表示输入和输出的关系,我们需要逐步更改权重矩阵
W
W
W,使得给定输入、尽可能的得到期望的正确输出。
这种更改模型的参数
W
\boldsymbol W
W使得模型结果变优的过程,可以说是训练过程,它的常用的方法是梯度下降法:它的核心是在量化预测结果和输出结果的误差的基础上,以梯度下降的方法使得预测误差下降以达到可接受的范围内。
梯度下降法在网络训练中存在的问题:
W
(
l
)
←
W
(
l
)
−
α
∂
R
(
W
,
b
)
∂
W
(
l
)
=
W
(
l
)
−
α
(
1
N
∑
n
=
1
N
(
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
W
(
l
)
)
+
λ
W
(
l
)
)
b
(
l
)
←
b
(
l
)
−
α
∂
R
(
W
,
b
)
∂
b
(
l
)
=
b
(
l
)
−
α
(
1
N
∑
n
=
1
N
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
b
(
l
)
)
\begin{aligned} \boldsymbol{W}^{(l)} & \leftarrow \boldsymbol{W}^{(l)}-\alpha \frac{\partial \mathcal{R}(\boldsymbol{W}, \boldsymbol{b})}{\partial \boldsymbol{W}^{(l)}} \\ &=\boldsymbol{W}^{(l)}-\alpha\left(\frac{1}{N} \sum_{n=1}^{N}\left(\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}}\right)+\lambda \boldsymbol{W}^{(l)}\right) \\ \boldsymbol{b}^{(l)} & \leftarrow \boldsymbol{b}^{(l)}-\alpha \frac{\partial \mathcal{R}(\boldsymbol{W}, \boldsymbol{b})}{\partial \boldsymbol{b}^{(l)}} \\ &=\boldsymbol{b}^{(l)}-\alpha\left(\frac{1}{N} \sum_{n=1}^{N} \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}}\right) \end{aligned}
W(l)b(l)←W(l)−α∂W(l)∂R(W,b)=W(l)−α⎝⎛N1n=1∑N⎝⎛∂W(l)∂L(y(n),y^(n))⎠⎞+λW(l)⎠⎞←b(l)−α∂b(l)∂R(W,b)=b(l)−α⎝⎛N1n=1∑N∂b(l)∂L(y(n),y^(n))⎠⎞ 参数迭代需要计算大量的计算,非常复杂。
参数优化的解决方案:反向传播算法
先把握核心概念:仍然是梯度下降,但是是利用后一层的“误差”去更新前一层的“误差”。我觉得这是反向传播的内涵,抓住了这一点就不会在复杂的公式中迷失了。
再把握优化目标:
参数1:权重矩阵
W
\boldsymbol W
W 参数2:偏置向量
b
\boldsymbol b
b
明确直接目的:
根据梯度下降法的内涵,参数的更新过程应为:
W
(
l
)
←
W
(
l
)
−
α
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
W
(
l
)
b
(
l
)
←
b
(
l
)
−
α
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
b
(
l
)
\begin{aligned} \boldsymbol{W}^{(l)} & \leftarrow \boldsymbol{W}^{(l)}-\alpha \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}} \\ \boldsymbol{b}^{(l)} & \leftarrow \boldsymbol{b}^{(l)}-\alpha \frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}} \\ \end{aligned}
W(l)b(l)←W(l)−α∂W(l)∂L(y(n),y^(n))←b(l)−α∂b(l)∂L(y(n),y^(n)) 也就是说我们只需要考虑两个指标:
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
W
(
l
)
,
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
b
(
l
)
\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}} ,\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{b}^{(l)}}
∂W(l)∂L(y(n),y^(n)),∂b(l)∂L(y(n),y^(n))
L
(
y
(
n
)
,
y
^
(
n
)
)
\mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)
L(y(n),y^(n))表示的是经过一种损失函数比如平方、交叉熵等量化的
y
(
n
)
,
y
^
(
n
)
\boldsymbol{y}^{(n)},\hat{\boldsymbol{y}}^{(n)}
y(n),y^(n)的偏差。
反向传播算法推导之权重矩阵:
明确一个概念:讨论
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
W
(
l
)
\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}}
∂W(l)∂L(y(n),y^(n))和讨论
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
w
i
j
(
l
)
\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{w_{ij}}^{(l)}}
∂wij(l)∂L(y(n),y^(n))是等价的,进一步是
[
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
W
(
l
)
]
i
j
=
∂
L
(
y
(
n
)
,
y
^
(
n
)
)
∂
w
i
j
(
l
)
\left[\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{W}^{(l)}}\right ]_{ij} =\frac{\partial \mathcal{L}\left(\boldsymbol{y}^{(n)}, \hat{\boldsymbol{y}}^{(n)}\right)}{\partial \boldsymbol{w_{ij}}^{(l)}}
[∂W(l)∂L(y(n),y^(n))]ij=∂wij(l)∂L(y(n),y^(n))
所以只讨论:
∂
L
(
y
,
y
^
)
∂
w
i
j
(
l
)
=
∂
z
(
l
)
w
i
j
(
l
)
∂
L
(
y
,
y
^
)
∂
z
(
l
)
\frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial {w_{ij}}^{(l)}} =\frac{\partial \boldsymbol z^{(l)}}{{w_{ij}}^{(l)}}\frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial \boldsymbol { z}^{(l)}}
∂wij(l)∂L(y,y^)=wij(l)∂z(l)∂z(l)∂L(y,y^)
第一部分:证明 ∂ z ( l ) w i j ( l ) = [ 0... , a j ( l − 1 ) , 0... ] \frac{\partial\boldsymbol z^{(l)}}{{w_{ij}}^{(l)}}=\left[ 0...,a_{j}^{(l-1)},0... \right ] wij(l)∂z(l)=[0...,aj(l−1),0...]
因为:
z
(
l
)
=
W
(
l
)
a
(
l
−
1
)
+
b
(
l
)
\boldsymbol{ z}^{(l)}=\boldsymbol{W}^{(l)}\boldsymbol{a}^{(l-1)}+\boldsymbol{b}^{(l)}
z(l)=W(l)a(l−1)+b(l),写成每一项的形式的话有:
z
i
(
l
)
=
∑
k
w
i
k
(
l
)
a
k
(
l
−
1
)
+
b
j
(
l
)
z^{(l)}_{i}=\sum_{k}w_{ik}^{(l)}a_k^{(l-1)}+b_j^{(l)}
zi(l)=∑kwik(l)ak(l−1)+bj(l)(矩阵乘法展开)
所以唯一能出现
w
i
j
(
l
)
w_{ij}^{(l)}
wij(l)项只有
k
=
j
k=j
k=j的情况,根据求导法则,其余项与
w
i
j
(
l
)
w_{ij}^{(l)}
wij(l)无关,偏导为0,则有:
∂
z
(
l
)
w
i
j
(
l
)
=
[
∂
z
1
(
l
)
w
i
j
(
l
)
,
.
.
.
∂
z
M
(
l
)
w
i
j
(
l
)
]
=
[
0...
,
∂
z
j
(
l
)
w
i
j
(
l
)
,
0...
]
=
[
0...
,
a
j
(
l
−
1
)
,
0...
]
\begin{aligned} \frac{\partial\boldsymbol z^{(l)}}{{w_{ij}}^{(l)}}&=\left[ \frac{\partial z_1^{(l)}}{{w_{ij}}^{(l)}} , ...\frac{\partial z_M^{(l)}}{{w_{ij}}^{(l)}} \right] \\&=\left[ 0...,\frac{\partial z_{j}^{(l)}}{{w_{ij}}^{(l)}},0... \right ] =\left[ 0...,a_{j}^{(l-1)},0... \right ] \end{aligned}
wij(l)∂z(l)=[wij(l)∂z1(l),...wij(l)∂zM(l)]=[0...,wij(l)∂zj(l),0...]=[0...,aj(l−1),0...]
第二部分:记 ∂ L ( y , y ^ ) ∂ z ( l ) \frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial { z}^{(l)}} ∂z(l)∂L(y,y^)为 δ ( l ) \delta^{(l)} δ(l),表示第 l l l层的误差项,推导反向传播公式,即用 δ ( l + 1 ) \delta^{(l+1)} δ(l+1)来计算 δ ( l ) \delta^{(l)} δ(l)
根据模型:
z
(
l
+
1
)
=
W
(
l
+
1
)
a
(
l
)
+
b
(
l
+
1
)
a
(
l
)
=
f
l
(
z
(
l
)
)
\begin{aligned} \boldsymbol{ z}^{(l+1)}&=\boldsymbol{W}^{(l+1)}\boldsymbol{a}^{(l)}+\boldsymbol{b}^{(l+1)} \\ \boldsymbol{ a}^{(l)}&=f_l(\boldsymbol{z}^{(l)}) \end{aligned}
z(l+1)a(l)=W(l+1)a(l)+b(l+1)=fl(z(l)) 可以看出,公式(1)中蕴含着“传播递推规律”,公式(2)作为联系两个变量的桥梁。
所以核心公式推导为(利用链式法则):
δ
(
l
)
≜
∂
L
(
y
,
y
^
)
∂
z
(
l
)
=
∂
a
(
l
)
∂
z
(
l
)
∂
z
(
l
+
1
)
∂
a
(
l
)
∂
L
(
y
,
y
^
)
∂
z
(
l
+
1
)
=
∂
a
(
l
)
∂
z
(
l
)
∂
z
(
l
+
1
)
∂
a
(
l
)
δ
(
l
+
1
)
\begin{aligned} \delta^{(l)} &\triangleq \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} \\ &= \frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}\frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l+1)}} \\ &=\frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}\frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}\delta^{(l+1)} \end{aligned}
δ(l)≜∂z(l)∂L(y,y^)=∂z(l)∂a(l)∂a(l)∂z(l+1)∂z(l+1)∂L(y,y^)=∂z(l)∂a(l)∂a(l)∂z(l+1)δ(l+1)
因为
z
(
l
+
1
)
=
W
(
l
+
1
)
a
(
l
)
+
b
(
l
+
1
)
\boldsymbol{ z}^{(l+1)}=\boldsymbol{W}^{(l+1)}\boldsymbol{a}^{(l)}+\boldsymbol{b}^{(l+1)}
z(l+1)=W(l+1)a(l)+b(l+1),和矩阵的微分法则:
∂
A
x
∂
x
=
A
⊤
,
∂
(
y
+
z
)
∂
x
=
∂
y
∂
x
+
∂
z
∂
x
\frac{\partial \boldsymbol{A} \boldsymbol{x}}{\partial \boldsymbol{x}}=\boldsymbol{A}^{\top},\frac{\partial(\boldsymbol{y}+\boldsymbol{z})}{\partial \boldsymbol{x}}=\frac{\partial \boldsymbol{y}}{\partial \boldsymbol{x}}+\frac{\partial \boldsymbol{z}}{\partial \boldsymbol{x}}
∂x∂Ax=A⊤,∂x∂(y+z)=∂x∂y+∂x∂z,得到:
∂
z
(
l
+
1
)
∂
a
(
l
)
=
[
W
(
l
+
1
)
]
⊤
\frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}=\left [\boldsymbol{W}^{(l+1)}\right ]^{\top}
∂a(l)∂z(l+1)=[W(l+1)]⊤
由于激活函数具有按位计算的性质:
a
k
=
f
l
(
z
k
)
,
∀
k
=
1
,
⋯
,
K
a_{k}=f_l\left(z_{k}\right), \quad \forall k=1, \cdots, K
ak=fl(zk),∀k=1,⋯,K,也就是说
∂
a
m
∂
z
n
=
0
,
m
≠
n
∂
a
m
∂
z
n
=
f
l
′
(
z
m
)
,
m
=
n
\begin{aligned} &\frac{\partial a_m}{\partial z_n}=0,m\ne n\\ &\frac{\partial a_m}{\partial z_n}=f_l'(z_m),m= n \end{aligned}
∂zn∂am=0,m=n∂zn∂am=fl′(zm),m=n 所以:
∂
a
(
l
)
∂
z
(
l
)
=
d
i
a
g
(
f
′
(
z
(
l
)
)
)
\frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}=diag(f'(\boldsymbol z^{(l)}))
∂z(l)∂a(l)=diag(f′(z(l))) 结论是:
δ
(
l
)
=
d
i
a
g
(
f
′
(
z
(
l
)
)
)
[
W
(
l
+
1
)
]
⊤
δ
(
l
+
1
)
\delta^{(l)}=diag(f'(\boldsymbol z^{(l)}))\left [\boldsymbol{W}^{(l+1)}\right ]^{\top}\delta^{(l+1)}
δ(l)=diag(f′(z(l)))[W(l+1)]⊤δ(l+1)
第三部分:结合前两个部分总结:
∂
L
(
y
,
y
^
)
∂
w
i
j
(
l
)
=
∂
z
(
l
)
w
i
j
(
l
)
∂
L
(
y
,
y
^
)
∂
z
(
l
)
=
[
0...
,
a
j
(
l
−
1
)
,
0...
]
[
δ
1
(
l
)
,
.
.
.
δ
i
(
l
)
,
.
.
.
]
⊤
=
δ
i
(
l
)
a
j
(
l
−
1
)
\begin{aligned} \frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial {w_{ij}}^{(l)}} &=\frac{\partial z^{(l)}}{{w_{ij}}^{(l)}}\frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial { z}^{(l)}}\\ &=\left[ 0...,a_{j}^{(l-1)},0... \right ]\left[ \delta_1^{(l)},...\delta_i^{(l)},...\right]^{\top}\\ &=\delta_i^{(l)}a_{j}^{(l-1)} \end{aligned}
∂wij(l)∂L(y,y^)=wij(l)∂z(l)∂z(l)∂L(y,y^)=[0...,aj(l−1),0...][δ1(l),...δi(l),...]⊤=δi(l)aj(l−1) 注解:
∂
z
(
l
)
w
i
j
(
l
)
\frac{\partial\boldsymbol z^{(l)}}{{w_{ij}}^{(l)}}
wij(l)∂z(l)只有第
z
i
(
l
)
z_i^{(l)}
zi(l)的项目的偏导不为0
更新过程:利用第二部分反向传播计算
δ
(
l
)
\delta^{(l)}
δ(l),再结合第一部分,利用第三部分的公式,更新权重矩阵
反向传播算法推导之偏置矩阵:
∂
L
(
y
,
y
^
)
∂
b
(
l
)
=
∂
z
(
l
)
b
(
l
)
∂
L
(
y
,
y
^
)
∂
z
(
l
)
\frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial {\boldsymbol b}^{(l)}} =\frac{\partial \boldsymbol z^{(l)}}{{\boldsymbol b}^{(l)}}\frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial \boldsymbol { z}^{(l)}}
∂b(l)∂L(y,y^)=b(l)∂z(l)∂z(l)∂L(y,y^)由于前面已经推导过:
δ
(
l
)
≜
∂
L
(
y
,
y
^
)
∂
z
(
l
)
=
∂
a
(
l
)
∂
z
(
l
)
∂
z
(
l
+
1
)
∂
a
(
l
)
∂
L
(
y
,
y
^
)
∂
z
(
l
+
1
)
=
∂
a
(
l
)
∂
z
(
l
)
∂
z
(
l
+
1
)
∂
a
(
l
)
δ
(
l
+
1
)
\begin{aligned} \delta^{(l)} &\triangleq \frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l)}} \\ &= \frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}\frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}\frac{\partial \mathcal{L}(\boldsymbol{y}, \hat{\boldsymbol{y}})}{\partial \boldsymbol{z}^{(l+1)}} \\ &=\frac{\partial \boldsymbol a^{(l)}}{{\partial \boldsymbol z^{(l)}}}\frac{\partial \boldsymbol{z}^{(l+1)}}{\partial \boldsymbol a^{(l)}}\delta^{(l+1)} \end{aligned}
δ(l)≜∂z(l)∂L(y,y^)=∂z(l)∂a(l)∂a(l)∂z(l+1)∂z(l+1)∂L(y,y^)=∂z(l)∂a(l)∂a(l)∂z(l+1)δ(l+1)只需要考虑
∂
z
(
l
)
b
(
l
)
\frac{\partial \boldsymbol z^{(l)}}{{\boldsymbol b}^{(l)}}
b(l)∂z(l),由于
z
(
l
+
1
)
=
W
(
l
+
1
)
a
(
l
)
+
b
(
l
+
1
)
\boldsymbol{ z}^{(l+1)}=\boldsymbol{W}^{(l+1)}\boldsymbol{a}^{(l)}+\boldsymbol{b}^{(l+1)}
z(l+1)=W(l+1)a(l)+b(l+1),可知
∂
L
(
y
,
y
^
)
∂
b
(
l
)
=
∂
z
(
l
)
b
(
l
)
δ
(
l
)
=
δ
(
l
)
\frac{\partial \mathcal{L}\left(\boldsymbol{y}, \hat{\boldsymbol{y}}\right)}{\partial {\boldsymbol b}^{(l)}}= \frac{\partial \boldsymbol z^{(l)}}{{\boldsymbol b}^{(l)}}\delta^{(l)} =\delta^{(l)}
∂b(l)∂L(y,y^)=b(l)∂z(l)δ(l)=δ(l)更新过程:利用反向传播计算
δ
(
l
)
\delta^{(l)}
δ(l),直接更新偏置矩阵
本文的算法公式主要参考邱锡鹏老师的《神经网络与深度学习》