【深度学习-7】梯度下降与反向传播算法
我们确定好神经网络的结构(有多少层,每层有多少节点,每个节点的激活函数,权重的初始值)以后,就可以拿真实的数据来训练它。训练神经网络的本质是一个最优化的过程,也就是要找到最优的权重(weights),使得网络的输出和预期的结果最接近(误差最小)。
用简单的语言来描述训练的过程:我们先把训练集中的第一个数据输入神经网络,然后比较网络的输出和预期结果之间的误差(error)。如果有误差,我们就调整网络中的所有权重,然后再输入下一个数据,进行下一轮权重的调整,这个过程不断循环,直到网络输出和预期结果之间的误差下降到可接受的程度。
现在的问题是,如何根据神经网络的误差来调整权重?我们可以使用一种叫做梯度下降(Gradient Descent)的方法。在每轮训练中,我们计算权重在当前值的梯度,梯度的正负可以告诉我们该如何调整权重。如果梯度为负,我们就增加权重的值;如果梯度为正,我们就减少权重的值。如果网络的输出和预期完全一致,权重的梯度就是0,也就是说不需要调整。
那么梯度究竟是什么?我们前面提到的网络输出和预期结果之间的误差可以用损失函数(cost function or loss function or objective function)来表示。损失函数是一个含有多变量的复合函数。某个权重的梯度就是该权重对于损失函数的偏导数(partial derivative)。梯度可以告诉训练算法应该增加还是减少权重的值,而这种调整的结果会减少网络的误差。
我们可以用一幅图来帮助理解:
gradient_single_weight.png
x轴是权重(w),y轴是神经网络的误差(e)。从这幅图上我们可以很轻松的找到e的最小值(曲线的最低点)与之对应的w就是最优的权重。实际上,我们无法得到这样一个曲线(用最暴力的方法穷举所有权重值是不可能完成的任务),我们只知道当前的权重和误差(只见树木不见森林),唯一的办法就是摸着石头过河。我们可以计算误差函数在某个权重值时的斜率(slope),当斜率为负的时候(下坡),增加权重值(向前走)可以降低误差;当斜率为正的时候(上坡),减少权重值(向后走)可以降低误差。就这样怀着坚定的信念(损失函数的值最小),摸着脚下的石头(当前权重的梯度),我们终将走向河的对岸(最优的权重值)。
我们明白了什么是梯度,下一步就可以开始学习如何训练神经网络。反向传播(Backpropagation,BP)算法是训练神经网络最常用的算法。它的核心实际上就是运用链式法则对复合函数求偏导数。知乎上有关于BP算法的讨论,对于初学者很有帮助。我在网上阅读了大量关于BP算法的文章,有的侧重举例,有的侧重公式推导,但我觉得Michael Nielsen的文章写得深入浅出,强烈推荐!我反复阅读了这篇文章,每读一遍都会对BP算法有更清晰的认识。
下面就谈一谈我读Michael Nielsen文章时的一些体会。
-
如果不熟悉neuron,layer,weight,bias,activation function,activation output,weighted input,partial derivative的数学表示方法,在阅读公式推导的过程中就会觉得很痛苦。我的解决办法就是对照着神经网络的示意图反复看,把它们像英文单词一样都记住。
比如下面的例子说明了如何明确地表示网络中的一个权重(w)。这里的索引值有2类,上标(l)对应的是layer的索引,下标(j,k)对应的是layer中neuron的索引,j对应的是input neuron(在第l层),k对应的是output neuron(在第l-1层)。
bp_1.png -
用向量(vector)来表示同一个layer中的所有neurons或weights可以使公式得到简化。我们的思维方式从单个neuron或weight的计算(用k索引进行循环),转换成将layer视为一个整体进行向量之间的计算,这样公式中不出现循环,但是它实际上还是有的。
比如我们要表示第l层的第j个neuron的activation output,可以用下面的公式:
bp_2.png
也可以转换成向量之间的计算:
bp_3.png
向量的计算在R和Numpy中都十分常见,对于Rapper来说很容易理解这一点。 -
weighted input(z)在公式的推导中经常出现,它实际上就是一个neuron的激活函数的输入值。文章中的这段话写的十分清楚:
bp_4.png -
理解BP算法的关键是弄明白δ(error)的含义:
bp_5.png
我们一直在说反向传播,到底传播的是什么东西?原来就是这个δ。把error传播回去的最终目的是为了计算权重的梯度。
-
学会了四个公式,就等于学会了BP算法。
bp_6.png
(BP1)的目的是计算output layer(第L层)的error,可以看做反向传播的始发站。∇aC 是一个偏导数向量,作者的解释很清楚:
bp_7.png
(BP2)的目的是利用第l+1层的error计算第l层的error,换句话说,就是将error从第l+1层反向传播到第l层
(BP3)很简单,说明bias的偏导数等于它的error
(BP4)计算的是weight的偏导数(梯度),它还有更简洁的表示方式:
bp_8.png
6.文章最后对BP算法做的总结:
bp_9.png
参考文献
- Jeff Heaton. AIFH, Volume 3: Deep Learning and Neural Networks, 2015
- Michael Nielsen. How the backpropagation algorithm works, 2017
http://neuralnetworksanddeeplearning.com/chap2.html