深入浅出反向传播原理 Backpropagation

前述

在深度学习中,我们的训练模型是一个多层次的神经网络,每个节点对应一个激活函数,上一个Layer的输出就是下一个Layer的输入。这样的模型,非常像复合函数层层的依赖关系:可以把第一层Layer想象成g(x),则经过下一个Layer,函数就可以表示成f[g(x)]。依靠链式法则,我们可以简化对神经网络梯度下降优化参数时的计算,从而大大减少训练所需时间,这就是反向传播算法。可以说反向传播算法只是链式法则原理的一个应用。

为了在以后能记住反向传播原理,特将其推导过程记录如下,便于回忆。本文图片内容来源于台湾大学李宏毅教授的机器学习课程。本文的内容包含了很多个人的理解,如有纰漏或错误,还请指出。

台湾大学李宏毅反向传播视频资源:
https://www.youtube.com/watch?v=ibJpTrp5mcE
https://www.bilibili.com/video/av15889450/?p=11
台湾大学李宏毅反向传播课程pdf:
http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/BP.pdf


储备原理:梯度下降法 和 链式法则

虽然优化参数有两种方式:一种是直接解出最优解,另一种就是梯度下降法优化参数。我们平时说的训练模型其实就是指梯度下降法。在linear regression中,我们可以直接通过数学解出最优解,但在神经网络中,模型是复杂的,不能或难以通过直接求解的方法给出,因此梯度下降法就成了这里的首选。对于梯度下降法的原理,请读者自己搜索相关资料,在这里就不细讲了。

其次,反向传播原理中用的最多的就是链式法则(Chain Rule)
深入浅出反向传播原理 Backpropagation_第1张图片

上面的Case1是针对一元的复合函数来讲的,Case2是针对多元的情况。在实际深度学习应用中,每一层都有多个神经元,也就是多个激活函数,因此使用更多的是Case2。(或者将每一层神经元向量化就变成了Case1的形式)

有了梯度下降和链式法则的基础,我们就可以开始利用反向传播算法计算每一层神经网络参数的微分了。

反向传播算法原理

第0步:在梯度下降算法中,每次需要计算Loss函数分别对所有参数θ的偏微分。对N个样本而言,每个样本的输出与Label之间的距离记为C^n,这里用一个summation符号表示出Loss和C之间的关系。这样我们之后只需要考虑每个样本的C(θ)对各个参数的偏微分即可。

深入浅出反向传播原理 Backpropagation_第2张图片

第1步:反向传播虽然叫做Backpropagation,但其实在前向传播的过程中就已经开始了:前向传播过程中就已经计算了一部分,将其保存在内存中,另一部分在反向传播过程中进行计算,并与前向传播过程中计算的另外一部分相乘,逐层对参数进行更新。如下图所示,由于C是z的函数,z又是w的函数,依据链式法则就可以表示为∂C/∂w = ∂z/∂w * ∂C/∂z。
深入浅出反向传播原理 Backpropagation_第3张图片

第2步:而由于z=x1w1+x2w2 +…+ b,因此∂z/∂w则等于x。也就是说对于w1,∂z/∂w1 = x1;对于w2来说,∂z/∂w2 = x2,以此类推。
这样,在前向传递(Forward pass)中:
如果是第一个hidden layer,则∂z/∂w = x,即神经网络的输入;
如果是其他的hidden layer,则∂z/∂w就等于上一层的输出a。
这样从前往后计算∂z/∂w,并将∂z/∂w记录在内存中。而另一部分∂C/∂z在反向传递(Backward pass)过程中计算。
深入浅出反向传播原理 Backpropagation_第4张图片
深入浅出反向传播原理 Backpropagation_第5张图片

第3步:由于C是激活函数a的函数,a又是z的函数,因此∂C/∂z又可以分为两部分的乘积,如下图所示。前一部分其实就是激活函数的导数σ’(z),带入z的值,因此可以看成是一个值。
深入浅出反向传播原理 Backpropagation_第6张图片

第4步:∂C/∂a又又叕叕(此时已经是第三次了)可以分为两部分,如下图所示。第一部计算出来的结果就是参数w3,和w4。
深入浅出反向传播原理 Backpropagation_第7张图片

第5步:对于∂C/∂z’ 和 ∂C/∂z”,有两种情况可以考虑:
如果是最后一层(分类问题通常为softmax层,如图最后一层淡红色的节点),则直接计算:
深入浅出反向传播原理 Backpropagation_第8张图片
否则,如果是hidden layer,则通过上一层计算出的∂C/∂za 和 ∂C/∂zb分别乘以w5、w6再相加,结果再乘以σ’(z’)即可(如果还是不懂,可以回过头看第4步,这里是递归求解的思想,第4步是递,第5步是归)。
深入浅出反向传播原理 Backpropagation_第9张图片

至此为止,这就是反向传播算法的所有过程。值得指出的是,可以将Backward Pass也想象成一个Network,层层计算∂C/∂z的值,将其和Forward Pass计算出的∂z/∂w相乘,就计算出了∂C/∂w,即每一个参数的微分。接着就可以用梯度下降法,来对每个参数进行更新了。

深入浅出反向传播原理 Backpropagation_第10张图片

这只是对参数w的推导过程,而对参数b的推导过程也类似,在这里就不进行繁琐的推导了。

总结

反向传播算法可以看成是梯度下降法在神经网络中的变形版本,它的原理主要利用了链式法则,通过递归的方式求解微分。
虽然大多数从事AI相关工作的人并不知道反向传播算法的数学推导过程,这不妨碍我们使用深度学习解决问题,因为大多数的Tool Kit都帮我们实现了参数的优化。但学习底层原理可以帮我们更好地认识神经网络,因此我觉得还是有必要记录一下的。

你可能感兴趣的:(深度学习)