BP算法简述
一、正向传播
这是一个简单的网络模型,正向传播就是将一个样本数据
X
\mathbf{X}
X(
X
\mathbf{X}
X=[
x
1
,
x
2
,
.
.
.
.
,
x
n
x_{1},x_{2},....,x_{n}
x1,x2,....,xn])输入,从而获取输出的过程。其中具体过程如下:
通过这个过程就是不断的进行线性组合以及激活函数,来获得本层输出,即下层输入。不断重复此过程就可达网络的最后一层。
对每层来说,有两个运算过程:
等式一:
a
l
=
W
l
o
l
−
1
\mathbf{a_{l}=W_{l}o_{l-1}}
al=Wlol−1
等式一:
o
l
=
f
(
a
l
)
\mathbf{o_{l}=f(a_{l})}
ol=f(al)
由此,我们可以依次求出 o 0 , a 1 , o 1 , a 2 , o 2 , . . . . . . . , o L \mathbf{o_{0},a_{1},o_{1},a_{2},o_{2},.......,o_{L}} o0,a1,o1,a2,o2,.......,oL,最后的 o L o_{L} oL就是最后的输出值。
需要注意的是这里的参数都是代表的向量。
这里的 f ( ) \mathbf{f()} f()也代表向量函数,它的意思是对输入的每一个分量都应用那个节点的激活函数,它输出的也是一个向量。但在实际应用中,一般这些分量都是选择同一个函数。
二、BP算法
给一个输入,通过一次正向传播,我们就能获得一次输出,这是在训练好网络的前提下进行的,而训练网络才是最难的部分。下面就是经典训练网络的算法——BP算法。
BP算法是一个更新网路权重的算法,我们知道每一层都有一个权重 W l W_{l} Wl,BP算法中更新权重的依据如下:
W l = W l − η ∂ C ∂ W l \mathbf{W_{l}=W_{l}}-\eta\frac{\partial C}{\mathbf{\partial W_{l}}} Wl=Wl−η∂Wl∂C
其中 C C C代表的是损失函数, η \eta η使我们设定的学习效率,对于回归问题,损失函数通常定义如下:
C = 1 2 ( o L − y ) 2 C=\frac{1}{2}(o_{L}-y)^2 C=21(oL−y)2
此等式中L代表网络层数,简单来说就是最后一层(用当前的初始权重计算的最后一层)与实际标签y的差值,对于有多个输出的神经网络,则需要修改成向量形式:
C = 1 2 ∣ ∣ o L − y ∣ ∣ 2 \mathbf{C=\frac{1}{2}||o_{L}-y||^2} C=21∣∣oL−y∣∣2
现在关键在于如何求出这个偏导 ∂ C ∂ W l \frac{\partial C}{\partial W_{l}} ∂Wl∂C,这时就要通过上面所提到的等式一和等式二了:
等式一:
a
l
=
W
l
o
l
−
1
\mathbf{a_{l}=W_{l}o_{l-1}}
al=Wlol−1
等式二:
o
l
=
f
(
a
l
)
\mathbf{o_{l}=f(a_{l})}
ol=f(al)
上文我们提到由此等式我们可以得到
o
0
,
a
1
,
o
1
,
a
2
,
o
2
,
.
.
.
.
.
.
.
,
o
L
\mathbf{o_{0},a_{1},o_{1},a_{2},o_{2},.......,o_{L}}
o0,a1,o1,a2,o2,.......,oL,在此说明,这个序列中每个量都求出来过,并且每个量都可以表示成它之前任何一个量的函数,因此,对于最后一个量来说,在这个序列中选取之前的任何一项,都有如下关系:
o
L
=
t
(
之
前
任
意
一
项
)
\mathbf{o_{L}=t(之前任意一项)}
oL=t(之前任意一项)
我们选取 a l a_{l} al项,再加上等式一,可得:
o
L
=
t
(
a
l
)
\mathbf{o_{L}=t(a_{l})}
oL=t(al)
a
l
=
W
l
o
l
−
1
=
g
(
W
l
)
\mathbf{a_{l}=W_{l}o_{l-1}=g(W_{l})}
al=Wlol−1=g(Wl)
上式可化为
o
L
=
t
(
g
(
W
l
)
)
\mathbf{o_{L}=t(g(W_{l}))}
oL=t(g(Wl))。
C C C是一个关于 o L o_{L} oL的函数,这里假设其为 h ( o L ) h(o_{L}) h(oL),再联系上式,显然 C C C是一个关于 W l \mathbf{W_{l}} Wl的复合函数。根据链式求导法则,有 ∂ C ∂ W l = ∂ C ∂ a l ∂ a l ∂ W l \frac{\partial C}{\mathbf{\partial W_{l}}}=\frac{\partial C}{\mathbf{\partial a_{l}}} \mathbf{\frac{\partial a_{l}}{\partial W_{l}}} ∂Wl∂C=∂al∂C∂Wl∂al
根据上式,很显然这里的 ∂ a l ∂ W l = ∂ W l o l − 1 ∂ W l = o l − 1 \mathbf{\frac{\partial a_{l}}{\partial W_{l}}=\frac{\partial W_{l}o_{l-1}}{\partial W_{l}}=o_{l-1}} ∂Wl∂al=∂Wl∂Wlol−1=ol−1
在此定义 ∂ C ∂ a l \frac{\partial C}{\mathbf{\partial a_{l}}} ∂al∂C这一项为误差 ξ l \mathbf{\xi_{l}} ξl, ∂ a l ∂ W l \mathbf{\frac{\partial a_{l}}{\partial W_{l}}} ∂Wl∂al求出来为 o l − 1 \mathbf{o_{l-1}} ol−1, ξ l \mathbf{\xi_{l}} ξl为相当重要的一个值,它是第l层的误差向量。BP之所以叫误差反向传播,即来源于这个误差向量沿着从右向左的方向来传播。
现在,等式变为 ∂ C ∂ W l = ξ l o l − 1 \frac{\partial C}{\mathbf{\partial W_{l}}}=\mathbf{\xi_{l}o_{l-1}} ∂Wl∂C=ξlol−1,对于我们来说, ξ l o l − 1 \mathbf{\xi_{l}o_{l-1}} ξlol−1中的 o l − 1 \mathbf{o_{l-1}} ol−1是已知的,只是不知道 ξ l \mathbf{\xi_{l}} ξl,这时我们就要想办法来求出这一项。我们回顾一下现在都知道了哪些量:首先,我们知道这一次还未更新时的所有层的权重 W 1 , W 2 , . . . , W n \mathbf{W_{1},W_{2},...,W_{n}} W1,W2,...,Wn,上文所提到的在当前权重下计算出来的 o 0 , a 1 , o 1 , a 2 , o 2 , . . . . . . . , o L \mathbf{o_{0},a_{1},o_{1},a_{2},o_{2},.......,o_{L}} o0,a1,o1,a2,o2,.......,oL,还有其他一大堆等式。
我们要想办法通过这些已知量来求出 ξ l \mathbf{\xi_{l}} ξl,如何才能把这些已知量和 ξ l \mathbf{\xi_{l}} ξl联系起来呢?这时我们就需要用到上文提到的两个等式以及 ξ l \mathbf{\xi_{l}} ξl的定义式:
等式一:
a
l
=
W
l
o
l
−
1
\mathbf{a_{l}=W_{l}o_{l-1}}
al=Wlol−1
等式二:
o
l
=
f
(
a
l
)
\mathbf{o_{l}=f(a_{l})}
ol=f(al)
ξ
l
\mathbf{\xi_{l}}
ξl的定义式:
ξ
l
=
∂
C
∂
a
l
\mathbf{\xi_{l}=\frac{\partial C}{\partial a_{l}}}
ξl=∂al∂C
通过观察发现 ξ L \xi_{L} ξL可以求出来,因为上文有 C = 1 2 ∣ ∣ o L − y ∣ ∣ 2 \mathbf{C=\frac{1}{2}||o_{L}-y||^2} C=21∣∣oL−y∣∣2,可对 ξ l \mathbf{\xi_{l}} ξl的定义式进行代换,代换之后为:
ξ l = ∂ 1 2 ∣ ∣ o L − y ∣ ∣ 2 ∂ a l = ∂ 1 2 ∣ ∣ f ( a L ) − y ∣ ∣ 2 ∂ a l \mathbf{\xi_{l}=\frac{\partial \frac{1}{2}||o_{L}-y||^2}{\mathbf{\partial a_{l}}}=\frac{\partial \frac{1}{2}||f(a_{L})-y||^2}{\mathbf{\partial a_{l}}}} ξl=∂al∂21∣∣oL−y∣∣2=∂al∂21∣∣f(aL)−y∣∣2
通过观察这个等式,我们发现当其中的 a l = a L a_{l}=a_{L} al=aL时,我们可以得到
ξ L = ∂ 1 2 ∣ ∣ o L − y ∣ ∣ 2 ∂ a L = ∂ 1 2 ∣ ∣ f ( a L ) − y ∣ ∣ 2 ∂ a L = ( f ( a L ) − y ) ∘ f ′ ( a L ) \mathbf{\xi_{L}=\frac{\partial \frac{1}{2}||o_{L}-y||^2}{\mathbf{\partial a_{L}}}=\frac{\partial \frac{1}{2}||f(a_{L})-y||^2}{\mathbf{\partial a_{L}}}=(f(a_{L})-y)\circ f'(a_{L})} ξL=∂aL∂21∣∣oL−y∣∣2=∂aL∂21∣∣f(aL)−y∣∣2=(f(aL)−y)∘f′(aL)
上述点乘代表将相同形式的矩阵的相同位置相乘。现在,我们发现 ξ L \mathbf{\xi_{L}} ξL也是已知的,那我们就可以想办法构造递推公式,将 ξ l \mathbf{\xi_{l}} ξl用 ξ L \mathbf{\xi_{L}} ξL表示出来,那么 ξ l \mathbf{\xi_{l}} ξl就会被求出。递推公式构造方法如下:
ξ l = ∂ C ∂ a l = ∂ C ∂ o l ∂ o l ∂ a l = ∂ C ∂ a l + 1 ∂ a l + 1 ∂ o l ∂ o l ∂ a l \mathbf{\xi_{l}=\frac{\partial C}{\partial a_{l}}=\frac{\partial C}{\partial o_{l}}\frac{\partial o_{l}}{\partial a_{l}}=\frac{\partial C}{\partial a_{l+1}}\frac{\partial a_{l+1}}{\partial o_{l}}\frac{\partial o_{l}}{\partial a_{l}}} ξl=∂al∂C=∂ol∂C∂al∂ol=∂al+1∂C∂ol∂al+1∂al∂ol
通过上述等式一二我们可得:
∂ a l + 1 ∂ o l = W l + 1 \mathbf{\frac{\partial a_{l+1}}{\partial o_{l}}=W_{l+1}} ∂ol∂al+1=Wl+1
∂ o l ∂ a l = f ′ ( a l ) \mathbf{\frac{\partial o_{l}}{\partial a_{l}}=f'(a_{l})} ∂al∂ol=f′(al)
至此, ξ l \mathbf{\xi_{l}} ξl的递推公式已经确定:
ξ l = ξ l + 1 W l + 1 f ′ ( a l ) \mathbf{\xi_{l}=\xi_{l+1}W_{l+1}f'(a_{l})} ξl=ξl+1Wl+1f′(al)
但由于这些量都是矩阵、向量,因此要注意他们相乘时的形式和顺序,最后化出来应该是这样: ξ l = ( W l + 1 ξ l + 1 ) ∘ f ′ ( a l ) \mathbf{\xi_{l}=(W_{l+1}\xi_{l+1}) \circ f'(a_{l})} ξl=(Wl+1ξl+1)∘f′(al)
这样递推式就确定了,我们就可以根据 W l = W l − η ∂ C ∂ W l \mathbf{W_{l}=W_{l}}-\eta\frac{\partial C}{\mathbf{\partial W_{l}}} Wl=Wl−η∂Wl∂C来更新每层权重了。
至此,BP算法也介绍完毕。