反向传播和梯度下降这两个词,第一眼看上去似懂非懂,不明觉厉。这两个概念是整个神经网络中的重要组成部分,是和误差函数/损失函数的概念分不开的。
神经网络训练的最基本的思想就是:先“蒙”一个结果,我们叫预测结果h,看看这个预测结果和事先标记好的训练集中的真实结果y之间的差距,然后调整策略,再试一次,这一次就不是“蒙”了,而是有依据地向正确的方向靠近。如此反复多次,一直到预测结果和真实结果之间相差无几,亦即|h-y|->0,就结束训练。
在神经网络训练中,我们把“蒙”叫做初始化,可以随机,也可以根据以前的经验给定初始值。即使是“蒙”,也是有技术含量的。
通俗地理解反向传播举个通俗的例子,Bob拿了一支没有准星的步枪,或者是准星有bug,或者是Bob眼神儿不好看不清靶子,或者是雾很大......反正就是Bob很倒霉。第一次试枪后,拉回靶子一看,弹着点偏左了,于是在第二次试枪时,Bob就会有意识地向右侧偏几毫米,再看靶子上的弹着点,如此反复几次,Bob就会掌握这支步枪的脾气了。下图显示了Bob的5次试枪过程:
在这个例子中:
每次试枪弹着点和靶心之间的差距就叫做误差,可以用一个误差函数来表示,比如差距的绝对值,如图中的红色线。
一共试枪5次,就是迭代/训练了5次的过程 。
每次试枪后,把靶子拉回来看弹着点,然后调整下一次的射击角度的过程,叫做反向传播。注意,把靶子拉回来看和跑到靶子前面去看有本质的区别,后者容易有生命危险,因为还有别的射击者。一个不恰当的比喻是,在数学概念中,人跑到靶子前面去看,叫做正向微分;把靶子拉回来看,叫做反向微分。
每次调整角度的数值和方向,叫做梯度。比如向右侧调整1毫米,或者向左下方调整2毫米。如图中的绿色矢量线。
上图是每次单发点射,所以每次训练样本的个数是1。在实际的神经网络训练中,通常需要多个样本,做批量训练,以避免单个样本本身采样时带来的误差。在本例中,多个样本可以描述为连发射击,假设一次可以连打3发子弹,每次的离散程度都类似,如下图所示:
如果每次3发子弹连发,这3发子弹的弹着点和靶心之间的差距之和再除以3,叫做损失,可以用损失函数来表示。
其实损失就是所有样本的误差的总和,所以有时候损失函数可以和误差函数混用概念。
其实射击还不这么简单,如果是远距离狙击,还要考虑空气阻力和风速,在神经网络里,空气阻力和风速可以对应到隐藏层的概念上。
用数学概念理解反向传播我们再用一个纯数学的例子来说明反向传播的概念。
假设我们有一个函数 \(z = x * y,其中: x = w * 2 + b, y = b + 1,即: z = (w * 2 + b) * (b + 1)\)
关系如下图:
注意这里x, y, z不是变量,w, b是才变量,因为在神经网络中,我们要最终求解的是w和b的值,x,y,z只是样本值。
当w = 3, b = 4时,会得到如下结果
最终的z值,受到了前面很多因素的影响:变量w,变量b,计算式x,计算式y。常数是个定值,不考虑。目前的z=50,如果我们想让z变大一些,w和b应该如何变化呢?
我们从z开始一层一层向回看,图中各节点关于变量b的偏导计算结果如下图:
因为z = x * y,其中x = w * 2 + b,y = b + 1
所以:
\[\frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}}*\frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}*\frac{\partial{y}}{\partial{b}}=5*1+10*1=15\]
其中:
\[\frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x*y)=y=5\]
\[\frac{\partial{z}}{\partial{y}}=\frac{\partial{}}{\partial{y}}(x*y)=x=10\]
\[\frac{\partial{x}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(w*2+b)=1\]
\[\frac{\partial{y}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(b+1)=1\]
有一个很有趣的问题是:z = x * y = 10 * 5 = 50,表面看起来x=10,y=5,似乎x对z的贡献较大。那么x的微小变化和y的微小变化对z来说,哪一个贡献大呢?
我们假设只有x变化时,△x = 0.1, 则z = (x + △x) * y = 10.1 * 5 = 50.5
我们再假设只有y变化时,△y = 0.1, 则z = x * (y +△y) = 10 * 5.1 = 51
50.5 < 51,说明y的微小变化对z的贡献比较大,这个从
\[\frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x*y)=5 < \frac{\partial{z}}{\partial{y}}=\frac{\partial{}}{\partial{y}}(x*y)=10\]
和这两个值的比较来看也可以证明。而△x和△y就可以理解为梯度值。
同理,我们也可以得到图中各变量对w的偏导值: