作者 | 梁唐
大家好,我是梁唐。
之前我们聊了线性回归的公式推导,最后关于参数求解的地方卖了个关子。想要针对函数求极值处的参数值,其实我们有很多方法可以用,除了简单粗暴的公式推导之外,还有牛顿法、拟牛顿法、梯度下降法等许多方法。今天我们来聊聊其中比较简单的梯度下降法。
梯度下降法可以说是机器学习和深度学习当中最重要的方法,甚至可以说是没有之一。尤其是在深度学习当中,几乎清一色所有的神经网络都是使用梯度下降法来训练的。
想要理解梯度下降算法, 首先要理解梯度这个概念,究竟什么是梯度呢?
我们先来看看维基百科当中的定义:梯度(gradient)是一种关于多元导数的概括。平常的一元(单变量)函数的导数是标量值函数,而多元函数的梯度是向量值函数。多元可微函数{\displaystyle f} 在点{\displaystyle P} 上的梯度,是以{\displaystyle f} 在{\displaystyle P} 上的偏导数为分量的向量。
这句话很精炼,但是不一定容易理解,我们一点一点来看。
我们之前高中学过导数,但是高中时候计算的求导往往针对的是一元函数。也就是说只有一个变量x,求导的结果是一个具体的值,它是一个标量。
而多元函数在某个点求导的结果是一个向量,比如n元函数,它当中包含了n个变量。那么在某一点求导得到的结果就有n个数,我们可以把这n个数看成是一个向量。这个向量每个分量是对应的变量在该点的偏导数,这个偏导数组成的向量,就是这个函数在该点的梯度。
那么,根据上面的定义,我们可以明确两点,首先梯度是一个向量,它既有方向,也有大小。其次梯度这个向量中的每一个数是对应变量的偏导数。
维基百科当中还列举了两个关于梯度的例子,帮助我们更好的理解。
第一个例子是最经典的山坡模型,假设我们当下站在一个凹凸不平的山坡上,我们想要以最快的速度下山,那么我们应该该从什么方向出发呢?很简单,我们应该计算一下脚下点的梯度,由于向量的方向可正可负,要下山自然要沿着梯度下降的方向下山。梯度的方向告诉我们下山最快的方向,梯度的大小代表这点的坡度。
第二个例子是房间温度模型,假设我们对房间建立坐标系,那么房间里的每一个点都可以表示成
,该点的温度是
。如果假设房间的温度不随时间变化,那么房间里每个点的梯度表示温度变热最快的方向,梯度的大小代表温度变化的速率。
通过这两个例子,应该很容易理解梯度的方向和大小这两个概念。

理解了梯度的概念之后,再来看梯度下降法其实就是一张图的事。请看下面这张图。

这里的黑色的曲线表示我们损失函数的函数曲线,我们要做的,就是找到这个最佳的参数x,使得损失函数的值最小。损失函数的值达到最小,也就说明了模型的效果达到了极限,这也就是我们预期的。
我们一开始的时候显然是不知道最佳的x是多少的(废话,知道了还求啥),所以我们假设一开始的时候在一个随机的位置。
假设是图中的x_1 的位置。接着我们对x_1 求梯度。我们之前说了,梯度下降的方向就是该点最陡峭的方向,梯度的大小就是它的陡峭程度。有了梯度之后,就很简单了,我们要做的就是朝着梯度下降,也就是最陡峭的方向向前走一小步。
我们假设,x_1 处的梯度是s_1 ,那么我们将x_1 的值朝着梯度的方向前进一小步。我们通过一个参数\eta 来控制,这里的\eta 称作学习率,它控制的是我们每次迭代的时候超梯度方向前进的距离大小。
我们通过不停地迭代,来优化参数。理论上来说,这样的迭代是没有穷尽的,我们需要手动终止迭代。什么时候可以停止呢?我们可以判断每一次迭代的梯度,当梯度已经小到逼近于0的时候,就说明模型的训练已经收敛了,这个时候可以停止训练了。
很明显学习率\eta 的选择会影响模型的收敛速度,因为如果学习率很小,那么每次迭代参数的值变化就很小,如果学习率比较大,那么参数值的变化也就比较剧烈,自然需要的迭代次数也就越少。
那么问题来了,学习率应该怎么选呢,是不是越大越好呢?
由于篇幅原因,对于这个问题,我们放在下篇文章当中讨论。