梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法。本文旨在让你对梯度下降有一个基础认识,并会对梯度下降的一些变体(涉及BGD、SGD、MSGD)进行讲解。
相信学过高数的同学对梯度都不会陌生,在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。梯度是与方向导数有关联的一个概念,例如在二元函数的情形下,设函数f(x,y)在平面区域D内具有一阶连续偏导数,则对于每一点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0) 属于D都可以定义一个向量
f x ( x 0 , y 0 ) i + f y ( x 0 , y 0 ) j f_x(x_0,y_0)i+f_y(x_0,y_0)j fx(x0,y0)i+fy(x0,y0)j
该向量称为函数f(x,y)在点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0) 的梯度,记作grad f ( x 0 , y 0 ) f(x_0,y_0) f(x0,y0) 或 ▽ f ( x 0 , y 0 ) ▽f(x_0,y_0) ▽f(x0,y0)。
那么求出梯度向量有什么意义呢?这个就需要提一下我们曾学过的方向导数了,我们知道偏导数反映的是函数沿坐标轴方向的变化率,但是许多时候只是讨论沿坐标轴方向变化率是不够的。我们需要函数沿任意方向的变化率。当函数f(x,y)在一点 P 0 ( x 0 , y 0 ) P_0(x_0,y_0) P0(x0,y0)可微分,那么函数在该点沿任意方向l的方向导数存在,且有:
d f d l ∣ ( x 0 , y 0 ) = f x ( x 0 , y 0 ) cos α + f y ( x 0 , y 0 ) cos β \left. \frac{df}{dl} \right| _{(x_0,y_0)}=f_x(x_0,y_0)\cos\alpha+f_y(x_0,y_0)\cos\beta dldf∣∣∣∣(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ
其中 cos α \cos\alpha cosα, cos β \cos\beta cosβ 是方向 l l l 的方向余弦.上文曾提到梯度是和方向导数相关的概念,那么观察两个公式你有发现他们之间的联系吗?如下所示,其中$e_l=(\cos\alpha,\cos\beta) $ 是方向 l l l同向的单位向量。
d f d l ∣ ( x 0 , y 0 ) = g r a d f ( x 0 , y 0 ) e l = ∣ g r a d ( x 0 , y 0 ) ∣ cos θ \left. \frac{df}{dl} \right| _{(x_0,y_0)} = gradf(x_0,y_0) e_l=|grad(x_0,y_0) |\cos\theta dldf∣∣∣∣(x0,y0)=gradf(x0,y0)el=∣grad(x0,y0)∣cosθ
从以上公式我们可以得出,当 θ = 0 \theta = 0 θ=0,即与梯度 g r a d f ( x 0 , y 0 ) gradf(x_0,y_0) gradf(x0,y0)的方向相同时,函数 f ( x , y ) f(x,y) f(x,y)增加最快,此时函数在这个方向的方向导数达到最大值,这个最大值就是梯度 g r a d f ( x 0 , y 0 ) gradf(x_0,y_0) gradf(x0,y0)的模。相应地,沿其反方向,函数$ f(x,y)$ 减少最快,函数在这个方向的方向导数达到最小值。
在机器学习算法中,在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。理论上,如果一个函数是收敛的,那么在经过有限次迭代后模型参数就会逐渐趋近于一个解,换句话说,就是上一次迭代得到的模型参数和当前迭代得到的模型参数的距离会越来越小。