梯度下降算法及其改进方法详解
本文中例子来源于:
https://zhuanlan.zhihu.com/p/21486826
https://zhuanlan.zhihu.com/p/22810533
1. 前提
1.1 成本函数
设计完神经网络结构之后,接下来就要设计神经网络的学习算法。假设向量 X 为神经网络的输入向量,向量 Y 为神经网络的输出向量,向量 A 为实际输出。我们算法的目的是使实际输出尽可能等于期望输出。为了量化算法的好坏,我们定义一个损耗函数(cost function):
上式中, w,b 分别为网络中权值和偏置的集合,即 w=w1,w2,… 而 b=b1,b2,… 。 n 是输入训练样本的总数。
公式(1)实际上是计算的期望输出与实际输出差值的平均值,因此(1)也被称为均方误差(MSE, mean squard error)。当我们的算法足够好时,期望输出与实际输出应近似相等,此时公式(1)均方误差 C≈0 。换句话说,我们的算法的目的变为找到一组权值和偏置的集合使得均方误差取得最小值。
1.2 为什么要用均方误差?
我们最终的目的是神经网络输出的准确率,为什么不直接让正确率最大化而是找一个替代方法?这是因为神经网络的正确率不是关于权值和偏置的光滑函数。更进一步来说,权值和偏置的微小变化不一定能引起正确率的变化,所以我们就不能通过正确率来不断修改权值和偏置来提升性能。为什么我们选择均方误差作为成本函数而不用其他?当然有其他成本函数我们在后面介绍,但要指出的是,公式(1)很好用。
2. 梯度下降算法
上面已经说了,我们的目的是求成本函数的最小值。数学上常用的方法是通过求导计算目标函数的最小值(如拉格朗日乘数法)。这在目标函数变量不太多时非常有效,但在变量很多时就有些力不从心了。比如,一个大型神经网络,权值和偏置的数目往往以亿万计,如果用上述方法会变得异常麻烦(此时拉格朗日乘数法要解一个亿万个函数组成的方程组)。对此,我们提出了梯度下降算法(GD, gradient descent)来解决这个问题。
2.1 批梯度下降算法(BGD)
我们把成本函数 C 想象成一个山谷表面,其梯度的负方向就是下降速度最快的方向,假设我们有一个小球,那么小球只要沿着这个方向就可以最快到达谷底,即最快取得最小值(有可能停在局部极小值处,我们要避免这种情况)。梯度的定义为:
假设球在 w1 方向上移动的距离为 Δw1 ,在 w2 方向上移动的距离为 Δw2 , …… 。由全微分可得,求在曲面上移动距离为: