前面的文章「机器学习入坑指南(三):简单线性回归」中提到,梯度下降法是一种常用的迭代方法,其目的是让输入向量找到一个合适的迭代方向,使得输出值能达到局部最小值。在拟合线性回归方程时,我们把损失函数视为以参数向量为输入的函数,找到其梯度下降的方向并进行迭代,就能找到最优的参数值。

一、一元函数与导数

一元函数可以看成是平面上的函数。设一次函数形式为 梯度下降法迭代公式使用算法_迭代,图像如下

梯度下降法迭代公式使用算法_梯度下降法_02


可以看出,如果要通过迭代(取不同的 梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_03 值代入方程)的方式找出最小的 梯度下降法迭代公式使用算法_迭代_04 值,我们实际上只有两个方向可以选择,即 梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_03

在定义域有限的情况下,一次函数的局部最值就是全局最值。而对于多次函数来说,可能有多个局部最值,而三角函数则不用考虑定义域······

总而言之,不管平面上的函数是什么形式,为了找到其局部最值,我们都只用考虑向前向后两个方向。

实际上,我们可以求得函数在某一点处的导数,如果它是正的,则说明向前迭代会使函数值增大,反之则减小。导数的意义,及函数在某一点处的斜率。

二、二元函数与梯度

1 如何寻找正确的迭代方向?

对三维空间中的二元函数 梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_06

我们固然可以像上面那样,任意找出一个方向,只要使 梯度下降法迭代公式使用算法_迭代_07 的值是减小的就可以,但如果在无数个方向中只有极少的一部分能达到这个目的呢?任意蒙出来的几率有点低吧?就算蒙出来了,梯度下降法迭代公式使用算法_迭代_07

显然,蒙这种方式不靠谱,而且根本体现不出逼格来,我们得找到一个从数学上说的通的方法才行。

2 什么是梯度?

假设我们在山上想下山,观察了观察四周,发现咦有好几个向下的坡,左前方这个坡太缓了,下山得老半天,右前方这个还行,我从这儿走。对于一般人来说,坡度不能太陡,但科学嘛,是对生活的提炼与升华,所以数学上的这个人就像怪物猎人一样从多高的地方跳下去都死不了,于是他老是找最陡的坡走、滑行或者跳下去,最后,他很快地到了山下,当然,运气背的时候他会发现自己到了一个山谷。。。

所谓梯度,就是上面的故事中猎人找到的最陡的坡的陡峭程度。当然,它不仅有大小,还有方向,是一个向量。那么我们如何找到这个向量呢?

我们可以求得函数图像上的任意一点处的偏导数 梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_09梯度下降法迭代公式使用算法_机器学习_10。同时,在自变量组成的平面空间中,任意取一个单位向量:

梯度下降法迭代公式使用算法_机器学习_11

其中 梯度下降法迭代公式使用算法_迭代_12 是该向量与 梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_03 轴的夹角,梯度下降法迭代公式使用算法_梯度下降法_14梯度下降法迭代公式使用算法_迭代_15 分别是 梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_03梯度下降法迭代公式使用算法_迭代_04方向上的单位向量。那么沿着 梯度下降法迭代公式使用算法_迭代_18 方向变化 梯度下降法迭代公式使用算法_迭代_19 ,相当于沿着 梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_03 方向变化了 $tcos\theta $,同时沿着 梯度下降法迭代公式使用算法_迭代_04 方向变化了 梯度下降法迭代公式使用算法_机器学习_22

接下来,我们要求函数在这个向量方向上的变化率,称为方向导数,即

梯度下降法迭代公式使用算法_机器学习_23

根据全微分公式,

梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_24

梯度下降法迭代公式使用算法_梯度下降法_25梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_26,则

梯度下降法迭代公式使用算法_机器学习_27

也就是说,当 梯度下降法迭代公式使用算法_机器学习_28梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_29 共线时,方向导数能取到最大值,故而向量梯度下降法迭代公式使用算法_梯度下降法_30,即 梯度下降法迭代公式使用算法_线性回归_31 就是我们要寻找的梯度,其方向代表函数某点处变化率最大的方向,大小(模)代表变化率的值。二元函数的梯度通常用 梯度下降法迭代公式使用算法_梯度下降法_32梯度下降法迭代公式使用算法_迭代_33

这个结论可以推广到多元,不管输入有多少,我们都可以把它们视为一个向量,从而通过梯度来找到迭代的方向。

三、梯度下降法应用举例

「斯坦福大学机器学习教程——线性回归」为例。

首先,给出线性回归的模型

梯度下降法迭代公式使用算法_机器学习_34

假设我们用来拟合的数据共有 梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_35

梯度下降法迭代公式使用算法_线性回归_36

最小的 梯度下降法迭代公式使用算法_迭代_12 值,其中上标 梯度下降法迭代公式使用算法_梯度下降法迭代公式使用算法_38 代表是第几组数据。设关于 梯度下降法迭代公式使用算法_迭代_12

梯度下降法迭代公式使用算法_梯度下降法_40

梯度下降法迭代公式使用算法_迭代_12 可以看做是一个参数向量,即 梯度下降法迭代公式使用算法_梯度下降法_42。式子的前面乘上系数,是为了方便计算。

根据前面梯度的概念,我们得到

梯度下降法迭代公式使用算法_迭代_43

也就是说,为了使损失函数达到局部最小值,我们只需要沿着这个向量的反方向进行迭代即可。

那么参数的值到底该一次变化多少呢?我们通常用 梯度下降法迭代公式使用算法_迭代_44 来表示这个大小,称为**“步长”**,它的值是需要我们手动设定的,显然,步长太小,会拖慢迭代的执行速度,而步长太大,则有可能在下降时走弯路或者不小心跳过了最优解。所以,我们应该根据实际的情况,合理地设置 梯度下降法迭代公式使用算法_迭代_44

于是,在每次迭代,中,我们令

梯度下降法迭代公式使用算法_线性回归_46

即可使损失函数最终收敛到局部最小值,我们也得到了我们想要的参数值。这个过程如下图

梯度下降法迭代公式使用算法_机器学习_47