反向传播(BP)算法到底传播了个啥?

反向传播算法 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)},xiRd,yiRl,即输入由 𝑑 个属性描述(𝑑 个𝑥),输出 𝑙 维实值向量(𝑙个𝑦)。
其中:
输出层第 𝑗 个神经元的阈值(偏置)用 θ 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=1l(y^jkyjk)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 vv+Δ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=ηwhjEk(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} whjEk=y^jkEkβjy^jkwhjβ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)(1f(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^jkEkβjy^jk=(y^jkyjk)f(βjθj)=(yjky^jk)y^jk(1y^jk)=y^jk(1y^jk)(yjky^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=ηvihEk(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} vihEk=j=1l(y^jkEkβjy^jkbhβj)αhbhvihαh=j=1l(βjEkbhβj)αhbhvihαh=j=1l(gjwhj)f(αhγh)vihαh=j=1l(whjgj)bh(1bh)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) αhbh=f(αhγh)=bh(1bh)

将式子(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(1bh)j=1lwhjgj(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月.
周志华 著. 机器学习,

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracelessLe

❀点个赞加个关注再走吧❀

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值