我们在上一篇笔记中使用最小二乘法得到的目标函数是一个形式简单的2次函数,它是一个凸函数,对它的各个参数求偏导并令偏导为0后得到的是一个线性方程组,如果这个线性方程组存在唯一解那么求解这个线性方程组就要求解X转置乘X的逆矩阵,但是在实际中X转置乘X不一定可逆,而且即便逆矩阵存在,当矩阵的维度很高时求解解析解也是极为耗时。另一方面,在其它一些复杂的模型中,目标函数并不是2次函数,那么令偏导为0后得到的方程组可能是非线性方程组,使用计算机并不能很方便地直接求解这个非线性方程组。
由于上述的原因在机器学习中经常放弃求解解析解,而使用计算机擅长的迭代计算的方式去逐步地逼近目标函数的局部最优解,当目标函数是凸函数时,局部最优解也是全局最优解,在机器学习中目标函数就是损失函数。
这篇笔记要介绍的梯度下降法就是这样一种迭代算法。所谓函数F(x)在a点的梯度是指F(x)在a点的偏导数组成的向量,例如,如果F是一个二元函数,即F = F(x, y),且F在其定义域内具有一阶连续偏导数,则对于其定义域内每一点(x', y')其梯度∇F(x', y')为:
梯度是一个向量,向量是有方向的,所以梯度有时也称梯度方向,沿着梯度方向函数值增长最快,沿着负梯度方向(梯度相反方向)函数值下降最快。梯度下降算法的依据是:
如果函数F(x)在点a处可导,那么F(x)在a点沿着负梯度的方向-∇F(a)下降最快。F(x)在a点沿着负梯度方向前进一小步到达一个新的点再沿着新的点的负梯度方向前进一小步,重复这个步骤,直到到达F(x)的最小值点处。
下面我们结合线性回归模型来看看梯度下降算法的执行过程。先看看最简单的单变量的情况,在单变量线性回归模型中,模型可以表述如下:
假设函数:
为了和参考资料中的标记保持一致,这里使用θ作为参数标记,上一篇笔记中用的是w,实际上标记符号是什么无所谓。
损失函数:
损失函数是参数θ0和θ1的函数,是二元的,我们的目标是找到损失函数取最小值时θ0和θ1的值,即:
目标:
算法:我们解决这个最优化问题所采用的算法是梯度下降算法,总体步骤为:
1. 任意给定θ0和θ1的初始值,以及一个给定的步长𝛼;
2. 朝着负梯度方向不断修改θ0和θ1的值直到达到最优值点(或其附近)。θ0和θ1每次修改的增量是负梯度向量中对应于θ0或θ1的分量与步长𝛼的乘积。
对于二元的目标函数,上面的步骤可以描述如下:
repeat until convergence的意思是“重复直到收敛”,也就是重复大括号里的值更新操作直到J(θ)达到最小值。迭代公式中的𝛼为每一次迭代的步长,在机器学习中称为学习率。J(θ0, θ1)对θj的偏导即为梯度向量中对应于θj的分量。
形象化解释梯度下降:
我们可以结合下图来形象化地理解梯度下降的过程。下图为任意二元函数J可能的函数图像J(θ0, θ1),我们需要找到这个函数J的一个局部的最小值。首先任意找一个点,比如下图中的黑点:
选定一个初始点后,朝着这个点的负梯度方向前进一步到达一个新的点,重复这个过程,持续朝负梯度方向前进,最终到达函数J的一个局部最小值,其轨迹可能如下:
我们可以把这个过程形象地想象成下山的过程,初始点即为你在山上站的初始位置,然后你环顾四周,找到了一个下山最快的方向,然后朝这个方向迈了一步,你一直重复这个过程直到到达山脚下。
从上面的图我们可以看出下山的路径应该是和初始位置有关的,即,选定不同的初始点,梯度下降法可能会收敛到不同的局部最优值,如下所示:
一般而言这种情况的确是有可能的,但是对于线性回归中的J(θ0, θ1)来说不会存在不同的局部最优值,因为J(θ0, θ1)是均方误差的形式,它是一个凸函数,只有一个唯一的最优值,其形状如下:
所以,对于线性回归中的均方误差损失函数来说,无论选取何初始点最终都会收敛到相同的最小值处。
在这里还要提及两个要点:
要点一:同时更新
通过上一篇笔记,我们知道,J(θ0, θ1)对θj的偏导数如下:
代入到算法中,可得:
注意到h(x)是θ0和θ1的函数:
所以,在更新θ0和θ1的值的时候是需要用到更新前的θ0和θ1的值的,需要注意的是,在一次迭代中θ0和θ1的值是同时更新的,θ0和θ1的新值都是基于θ0和θ1的更新前的值来算的,而并不是算完θ0后用新的θ0来计算θ1。
要点二:学习率
如果学习率𝛼太小,梯度下降的收敛过程可能会很慢,因为学习率𝛼过小的话梯度下降的迭代次数会增多。
但是,学习率𝛼也不能太大,如果学习率太大,梯度下降的过程可能会越过最小值,那么梯度下降过程可能无法收敛。
这两种情况如下图所示:
还有一个问题,如果我们设定了一个学习率后,需要随着迭代过程不断调整学习率的大小吗?答案是,不需要。学习率不需要在每次迭代中改变,固定的学习率也可以保证收敛,因为越接近最优值时梯度越小,梯度与学习率的乘积也就越小,对x的更新也就越小。也就是说,接近最优值时,梯度下降会自动地使用较小的增量,如下图所示:
但是,记住,学习率不能太大,太大的学习率可能导致梯度下降无法收敛。
最后,对于单变量线性回归的梯度下降,我们来可视化地看看其过程。首先介绍一下等高线图,我们已经知道单变量线性回归中的损失函数J(θ0, θ1)的形状如下:
想象一下,如果我们用一系列平行于θ0θ1平面的平面沿着纵轴去截函数J(θ0, θ1)的曲面,那么这些平面与函数J(θ0, θ1)的交点为一系列的椭圆曲线,同一个椭圆上的所有点对应的函数值J都相等,而且椭圆越大,对应的函数值J越大,椭圆越小J值越小,我们把这些椭圆曲线垂直投影到θ0θ1平面,得到如下的等高线图,图中同一个椭圆上的所有(θ0, θ1)点对应的J(θ0, θ1)值相同,不同的椭圆上的点的J值不同,椭圆越大J越大,椭圆越小J越小,中心点处J最小:
现在假设我们要使用线性回归模型来根据房屋面积来预测房价(显然这不是一个很好的模型,这里只是用于说明梯度下降的过程),我们的训练数据集中的样本为(面积,售价)数据对。下面的这些图中,右边的坐标图为J(θ0, θ1)的等高线图,图中的红色x点,为某次迭代中θ0和θ1的取值。左边坐标图的横坐标为面积,纵坐标为售价,图中的散点为训练数据集中的样本点,图中的蓝色直线为θ0和θ1取右图中红色x点的值时对应的h(x)=θ0 + θ1x的函数图像。
下面的每个图对应了梯度下降过程中的一次迭代,对于每次迭代,右图确定了一个θ0和θ1,左图显示了对应这个θ0和θ1时的h(x)的图像。从下面这些图我们可以看到,随着梯度下降过程的进行,θ0和θ1不断地朝着J(θ0, θ1)值减小的方向更新,对应的h(x)对训练数据集的拟合程度也越来越好,最后梯度下降收敛在J(θ0, θ1)的最小值处,此时的θ0和θ1为最终的模型参数,得到的h(x)与训练数据拟合度最高,损失最小(训练误差最小)。
在这篇笔记中我们了解了梯度下降算法,以及它在线性回归模型中的用途,还可视化地理解了梯度下降及其在单变量线性回归中的执行过程。关于梯度下降还有一些内容没有提及,将放在下一篇笔记中讨论。
参考资料:
Andrew NG 《Machine Learning》课程。