反向传播算法 BackPropagation ,简称BP算法。常用于训练多层神经网络,那么它到底传播了个啥?又是怎么传播的呢?
我们知道,对于一个机器学习算法,其最终预测出的值与实际值一般会存在差异,那么我们定义这个差异为误差E。算法中有若干参数需要学习,那么怎么学习呢?以什么策略去变化参数,使得预测值更接近真实值呢?
这就是采用BP算法的初衷,我们知道预测值是由所有参数与相连的输入运算后得到的,也就是说预测值与真实值之间的误差E其实是与每个参数相关的,可以认为误差是由每个参数造成的,因此我们试图将误差进行反向传播,计算每个参数引起的误差大小,以此为依据来更新参数,使得重新进行前向传播计算出的预测值越来越接近真实值,由此起到训练的作用。
从西瓜书中摘取示例网络的图片来计算BP的过程:
注:该图示中输入层在最下面,输出层在最上面。我们可能更习惯输入层在左侧,输出层在右侧。如下图所示。

给定以上含一层隐层的神经网络,有 𝑑 个输入神经元、𝑞 个隐层神经元、𝑙个输出神经元。
给定:
训练集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
,
x
i
∈
R
d
,
y
i
∈
R
l
D=\left \{ (x_{1},y_{1}),(x_{2},y_{2}),..., (x_{m},y_{m})\right \},x_{i}\in \mathbb{R}^{d},y_{i}\in \mathbb{R}^{l}
D={(x1,y1),(x2,y2),...,(xm,ym)},xi∈Rd,yi∈Rl,即输入由 𝑑 个属性描述(𝑑 个𝑥),输出 𝑙 维实值向量(𝑙个𝑦)。
其中:
输出层第 𝑗 个神经元的阈值(偏置)用
θ
j
\theta _{j}
θj表示,
隐层第 ℎ 个神经元的阈值用
γ
h
\gamma _{h}
γh 表示。
输入层第 𝑖 个神经元与隐层第 ℎ 个神经元之间的连接权重为
v
i
h
v_{ih}
vih,
隐层第 ℎ 个神经元与输出层第 𝑗 个神经元之间的连接权重为
w
i
h
w_{ih}
wih。
记隐层第 ℎ 个神经元接收到的输入为
α
h
=
∑
i
=
1
d
v
i
h
x
i
\alpha _{h}=\sum_{i=1}^{d}v_{ih}x_{i}
αh=∑i=1dvihxi,
输出层第 𝑗 个神经元接收到的输入为
β
j
=
∑
h
=
1
q
w
h
j
b
h
\beta _{j}=\sum_{h=1}^{q}w_{hj}b_{h}
βj=∑h=1qwhjbh,
其中
b
h
b_{h}
bh为隐层第 ℎ 个神经元的输出,即
b
h
=
f
(
α
h
−
γ
h
)
b_{h}=f\left ( \alpha _{h}-\gamma _{h} \right )
bh=f(αh−γh)。
假设隐层和输出层的激活函数为Sigmoid函数(注:Sigmoid函数求导特性良好,见公式6)。
对训练集
(
x
k
,
y
k
)
(x_{k}, y_{k})
(xk,yk),假定神经网络的输出为
y
^
k
=
(
y
^
1
k
,
y
^
2
k
,
.
.
.
,
y
^
l
k
)
\hat y_{k}=\left (\hat y_{1}^{k}, \hat y_{2}^{k}, ..., \hat y_{l}^{k} \right )
y^k=(y^1k,y^2k,...,y^lk)
即:
y
^
l
k
=
f
(
β
j
−
θ
j
)
(1)
\hat y_{l}^{k}=f\left ( \beta _{j}-\theta _{j} \right )\tag{1}
y^lk=f(βj−θj)(1)
则网络在
(
x
k
,
y
k
)
(x_{k}, y_{k})
(xk,yk)上的均方误差为
E
k
=
1
2
∑
j
=
1
l
(
y
^
j
k
−
y
j
k
)
2
(2)
E_{k}=\frac{1}{2}\sum_{j=1}^{l}\left ( \hat y_{j}^{k}- y_{j}^{k} \right )^{2}\tag{2}
Ek=21j=1∑l(y^jk−yjk)2(2)
(注:加
1
2
\frac{1}{2}
21是为了约掉平方求导得到的2。)
网络中需要更新的参数个数为 ( d + l + 1 ) q + l \left ( d+l+1 \right )q+l (d+l+1)q+l个:输入层到隐层的 d × q d\times q d×q个权值、隐层到输出层的 q × l q\times l q×l个权值、 𝑞 个隐层神经元的阈值, 𝑙 个输出层神经元的阈值。
BP是一个迭代学习算法,在迭代的每一轮中,采用广义的感知机学习规则对参数进行更新估计。
对任意参数 𝑣 的更新公式为 v ← v + Δ v v\leftarrow v+\Delta v v←v+Δv,
BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整,对式子(2)的 E k E_{k} Ek,给定学习率 𝜂 ,有
Δ w h j = − η ∂ E k ∂ w h j (3) \Delta w_{hj}=-\eta \frac{\partial E_{k}}{\partial w_{hj}}\tag{3} Δwhj=−η∂whj∂Ek(3)
注意到, w h j w_{hj} whj先影响到第 𝑗 个输出层神经元的输入值 β j \beta _{j} βj,再影响到其输出值 y ^ j k \hat y_{j}^{k} y^jk,然后影响到 E k E_{k} Ek,有
∂ E k ∂ w h j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ w h j (4) \frac{\partial E_{k}}{\partial w_{hj}}=\frac{\partial E_{k}}{\partial \hat y_{j}^{k}}\cdot \frac{\partial \hat y_{j}^{k}}{\partial \beta _{j}}\cdot \frac{\partial \beta _{j}}{\partial w_{hj}}\tag{4} ∂whj∂Ek=∂y^jk∂Ek⋅∂βj∂y^jk⋅∂whj∂βj(4)
根据 β j \beta _{j} βj定义,有:
b h = ∂ β j ∂ w h j (5) b_{h}= \frac{\partial \beta _{j}}{\partial w_{hj}}\tag{5} bh=∂whj∂βj(5)
Sigmoid函数的导数为:
f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) (6) {f}'\left ( x \right )=f\left ( x \right )\left ( 1-f\left ( x \right ) \right ) \tag{6} f′(x)=f(x)(1−f(x))(6)
于是根据式子(1)和(2),取出式(4)中的前两项并取负后设为 g j g_{j} gj(注:此处设为 g j g_{j} gj是为了后面继续往前一层求导时复用此结果值,见式12第三行),有
g
j
=
−
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
=
−
(
y
^
j
k
−
y
j
k
)
⋅
f
′
(
β
j
−
θ
j
)
=
(
y
j
k
−
y
^
j
k
)
⋅
y
^
j
k
(
1
−
y
^
j
k
)
=
y
^
j
k
(
1
−
y
^
j
k
)
(
y
j
k
−
y
^
j
k
)
(7)
\begin{aligned}g_{j} &=-\frac{\partial E_{k}}{\partial \hat y_{j}^{k}}\cdot \frac{\partial \hat y_{j}^{k}}{\partial \beta _{j}}\\ &=-\left ( \hat y_{j}^{k}- y_{j}^{k}\right )\cdot{f}'\left ( \beta _{j}-\theta _{j} \right )\\ &=\left ( y_{j}^{k} -\hat y_{j}^{k}\right ) \cdot\hat y_{j}^{k}\left ( 1- \hat y_{j}^{k}\right ) \\&=\hat y_{j}^{k}\left ( 1- \hat y_{j}^{k}\right )\left ( y_{j}^{k} -\hat y_{j}^{k}\right ) \end{aligned} \tag{7}
gj=−∂y^jk∂Ek⋅∂βj∂y^jk=−(y^jk−yjk)⋅f′(βj−θj)=(yjk−y^jk)⋅y^jk(1−y^jk)=y^jk(1−y^jk)(yjk−y^jk)(7)
将式(5)、(7)代入式子(4),再代入式(3)得到BP算法中关于
w
h
j
w_{hj}
whj的更新公式:
Δ w h j = η g j b h (8) \Delta w_{hj}=\eta g_{j}b_{h}\tag{8} Δwhj=ηgjbh(8)
根据
y
^
l
k
=
f
(
β
j
−
θ
j
)
\hat y_{l}^{k}=f\left ( \beta _{j}-\theta _{j} \right )
y^lk=f(βj−θj)可以看出偏置
θ
j
\theta _{j}
θj更新公式的计算方法与
w
h
j
w_{hj}
whj类似,只需要特别注意相比
Δ
w
h
j
\Delta w_{hj}
Δwhj的式子(8)少了
b
h
b_{h}
bh而多了一个负号(
f
(
β
j
−
θ
j
)
f(\beta _{j}-\theta _{j})
f(βj−θj)中的
−
θ
j
-\theta _{j}
−θj),即:
Δ
θ
j
=
−
η
g
j
(9)
\Delta \theta _{j}=-\eta g_{j}\tag{9}
Δθj=−ηgj(9)
又有:
Δ
v
i
h
=
−
η
∂
E
k
∂
v
i
h
(10)
\Delta v _{ih}=-\eta \frac{\partial E_{k}}{\partial v _{ih}}\tag{10}
Δvih=−η∂vih∂Ek(10)
其中:
∂
E
k
∂
v
i
h
=
∑
j
=
1
l
(
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
∂
β
j
∂
b
h
)
⋅
∂
b
h
∂
α
h
⋅
∂
α
h
∂
v
i
h
=
∑
j
=
1
l
(
∂
E
k
∂
β
j
⋅
∂
β
j
∂
b
h
)
⋅
∂
b
h
∂
α
h
⋅
∂
α
h
∂
v
i
h
=
∑
j
=
1
l
(
−
g
j
⋅
w
h
j
)
⋅
f
′
(
α
h
−
γ
h
)
⋅
∂
α
h
∂
v
i
h
=
−
∑
j
=
1
l
(
w
h
j
g
j
)
⋅
b
h
(
1
−
b
h
)
⋅
x
i
(11)
\begin{aligned} \frac{\partial E_{k}}{\partial v _{ih}}&=\sum_{j=1}^{l}(\frac{\partial E_{k}}{\partial \hat y_{j}^{k}}\cdot \frac{\partial \hat y_{j}^{k}}{\partial \beta _{j}}\cdot \frac{\partial \beta _{j}}{\partial b_{h}})\cdot \frac{\partial b_{h}}{\partial \alpha_{h}}\cdot \frac{\partial \alpha _{h}}{\partial v _{ih}} \\ &=\sum_{j=1}^{l}(\frac{\partial E_{k}}{\partial \beta _{j}}\cdot \frac{\partial \beta _{j}}{\partial b_{h}})\cdot \frac{\partial b_{h}}{\partial \alpha_{h}}\cdot \frac{\partial \alpha _{h}}{\partial v _{ih}} \\&=\sum_{j=1}^{l}(-g_{j}\cdot w_{hj})\cdot{f}'\left ( \alpha _{h}-\gamma _{h} \right )\cdot \frac{\partial \alpha _{h}}{\partial v _{ih}} \\&=-\sum_{j=1}^{l}(w_{hj}g_{j})\cdot b_{h}\left ( 1- b_{h}\right )\cdot x_{i} \end{aligned}\tag{11}
∂vih∂Ek=j=1∑l(∂y^jk∂Ek⋅∂βj∂y^jk⋅∂bh∂βj)⋅∂αh∂bh⋅∂vih∂αh=j=1∑l(∂βj∂Ek⋅∂bh∂βj)⋅∂αh∂bh⋅∂vih∂αh=j=1∑l(−gj⋅whj)⋅f′(αh−γh)⋅∂vih∂αh=−j=1∑l(whjgj)⋅bh(1−bh)⋅xi(11)
注: ∑ j = 1 l \sum_{j=1}^{l} ∑j=1l是因为输出层的各个元素都与 b h b_{h} bh相连,需要综合影响。这也是式子(7)中设 g j g_{j} gj的原因,保存中间值,加速上一层的计算,避免重复计算。另外, ∂ b h ∂ α h = f ′ ( α h − γ h ) = b h ( 1 − b h ) \frac{\partial b_{h}}{\partial \alpha_{h}}={f}'\left ( \alpha _{h}-\gamma _{h} \right )=b_{h}\left ( 1- b_{h}\right) ∂αh∂bh=f′(αh−γh)=bh(1−bh)
将式子(11)中的部分值抽出来设为:
e
h
=
b
h
(
1
−
b
h
)
∑
j
=
1
l
w
h
j
g
j
(12)
\begin{aligned}e_{h} =b_{h}\left ( 1- b_{h}\right )\sum_{j=1}^{l}w_{hj}g_{j}\end{aligned}\tag{12}
eh=bh(1−bh)j=1∑lwhjgj(12)
则得到
Δ
v
i
h
\Delta v _{ih}
Δvih:
Δ
v
i
h
=
η
e
h
x
i
(13)
\Delta v _{ih}=\eta e_{h}x_{i}\tag{13}
Δvih=ηehxi(13)
同理得到,
Δ
γ
h
=
−
η
e
h
(14)
\Delta \gamma _{h}=-\eta e_{h} \tag{14}
Δγh=−ηeh(14)
注:需要特别注意的就是运算过程中的符号,是否需要 ∑ \sum ∑,中间结果的保存。
对于每一个训练样本,BP算法执行的步骤为:先将输入样本提供给输入层神经元,然后逐层将信号前传,指导产生输出层的结果;然后计算出输出层的误差,再将误差逆向传播到隐层神经元,最后根据隐层神经元的误差来对连接权重和阈值(偏量)进行调整。该过程为循环进行,直到满足某一过程为止。
如果直接能推理懂西瓜书中的内容,那就最好了。不过由于这个官方配图其实不太符合习惯而且没有标明偏置,所以我自己重新画了一遍并将原推理过程中省略的部分加上了,避免过程跳跃太快带来疑惑。
参考:
[1] 周志华, 机器学习, 北京: 清华大学出版社, 2016年1月.