反向传播(BP)算法

反向传播(BP)算法

我们知道反向传播(BP)算法的发明促成了神经网络的第二次发展浪潮,到目前为止BP算法依旧是训练神经网络的首选算法。但是对于如此重要的一个算法,我们大多数人只是记住算法的计算公式,或者在程序中直接调用,对算法的来龙去脉知之甚少,这篇博客将从数学上推导出BP算法的计算公式。

损失函数最小化和梯度下降法

几乎所有的机器学习算法的训练目标都是找到使损失函数最小的参数。具体到神经网络模型中,我们给定网络输入{(x1,y^1),(x2,y^2),...,(xn,y^n)},其中xk表示第k(k[1,n])个输入样本,y^k(k[1,n])代表对应的理想输出。我们期望网络输出和理想输出的总体误差越小越好,我们用损失函数C来度量这个误差,因此得到我们的训练目标——使损失函数C尽可能小(C的定义方式有多种,下面只是其中一种):

C=1Nk=1N(yky^k)2

其中yk表示网络输出,现在我们就是要去找到损失函数的最小值点,对应的参数就是我们要求的最佳参数。求最小值在数学中经常使用梯度下降算法,所以求解问题等价于求:

CwijlCbil

其中wijl表示第l层第i个神经元与第l1层第j个神经元之间的连接权重,bil表示第l层第i个神经元的偏置。如果我们直接去求所有神经元的导数,将是一个费时费力的过程,能不能找到一个高效的算法来计算网络参数的梯度呢?

链式求导法则

在介绍BP算法之前,有必要介绍一下高等数学中的链式求导法则,主要包括以下两种情形。
Case 1

y=g(x)z=h(y)Δ(x)Δ(y)Δ(z)


dzdx=dzdydydx

Case 2

x=g(s)y=h(s)z=k(x,y)

反向传播(BP)算法


zs=zxxs+zyys

上面两条就称为求导的链式法则。

BP算法推导过程

下面以求Cwijl为例。首先看下图所示的一般情况。

反向传播(BP)算法

根据链式求导法则有,

ΔwijlΔzilΔC

所以我们可以将Cwijl下成下面的形式:

Cwijl=Czilzilwijl

根据

zil=jwijlajl1+bil


zilwijl=ajl1

所以现在的目标就是求出Czil
Czil=δil
我们容易发现,当l是最后一层(即l=L)时,δiL是容易计算的。
因为

ΔziLΔaiL=ΔyiΔC

所以

δiL=CziL=CyiyiziL

式中第一项取决于我们定义的损失函数,第二项就是对**函数求导,我们记为σ(ziL)。考虑第L层中所有的神经元,写成矩阵的形式有:

(1)δL=σ(zL)C(y)

现在考虑l不是最后一层的情况,同样的,我们根据求导的链式法则有:

反向传播(BP)算法

所以

δil=Czil=ailzilkCzkl+1zkl+1ail

式中,第一项同样是**函数的导数,第二项又是一个δkl+1,第三项等于wkil+1。所以有:

δil=σ(zil)kwkil+1δkl+1

同样整理成矩阵的形式有:

(2)δl=σ(zl)(wl+1)Tδl+1

最后,综上所述,整理(1)(2)可得:

δl={σ(zL)C(y)l=Lσ(zl)(wl+1)Tδl+1lL

同前向传播比较,我们发现误差是一个从后向前传递的过程,所以我们称该算法为反向传播(BackPropagation,BP)算法。具体的误差传播过程如下图所示:

反向传播(BP)算法

总结

BP算法作为一个经典的神经网络训练算法深刻的促进了神经网络的发展,目前一些深度学习算法中依旧可以看到BP的身影。但是BP算法也存在一些缺陷,比如:

  • 训练时间长
  • 可能陷入局部最小值

针对BP算法的这些缺陷,目前也有许多BP算法的改进型,比如Adagrad,Momentum等。总之,BP算法作为神经网络训练最经典的算法,需要我们从来源到结果有一个深入的了解。

参考文献

李宏毅 (Hung-yi Lee)的主页