本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍解决多元线性回归的另一种方法梯度下降算法,梯度下降算法也是求解机器学习算法比较通用的方法。
01
梯度下降算法
梯度下降算法和前面介绍的kNN算法以及线性回归算法不同,因为梯度下降算法本身不是一个机器学习算法,因此即不是监督学习也不是非监督学习,不能解决机器学习中的回归问题和分类问题。
梯度下降算法是一种基于搜索的最优化方法,梯度下降算法虽然也是人工智能领域非常重要的一个方法,他的作用就是优化一个目标函数:
- 如果最小化损失函数,相应的使用梯度下降法;
- 如果最大化效用函数,相应的使用梯度上升法。
在上一章介绍的线性回归算法中,最终求解线性回归的模型,本质就是最小化损失函数,在上一章直接计算出了最小化函数对应参数的数学解,前面也说了在机器学习领域中很少有像线性回归算法这样直接求解出数学解的机器学习模型,对于这样的模型,我们就需要使用一种基于搜索的策略来找到这个最优解。梯度下降法就是在机器学习领域最小化损失函数的一个最为常用的方法,在下一章还会举另外一个梯度上升法的例子,总体而言在机器学习领域熟练的掌握梯度算法来求一个目标函数的最优值,这是非常重要的一件事情。
02
解释梯度下降算法
绘制一个二维坐标平面,此时的横坐标为参数theta,纵坐标为损失函数J:
这个二维坐标描述的是当我们定义了一个损失函数以后,纵坐标就是损失函数J的取值,相应的如果我们取不同的参数,横坐标就是参数theta,每取一个参数theta对应的损失函数J会取到与之相对应的一个值。此时在这个二维坐标中损失函数J有一个最小值,对于我们最小化一个损失函数这个过程来说,相当于在这样一个二维坐标系中,寻找合适的点的参数,使得我们损失函数J取得最小值,由于此时在二维平面上,因此相当于参数只有一个,使用这种二维坐标可视化的方式来帮助理解什么是梯度下降算法,在后面会将其扩展成高维的情况。
- 前面在kNN算法中使用二维坐标表示样本的两个特征,样本的种类使用不用的数据点颜色或者样式来进行标示;
- 在简单线性回归算法中,由于样本只拥有一个特征,因此此时将横坐标表示为样本唯一特征,纵坐标表示对应样本的目标值。
对于这个损失函数J来说每取一个theta值,如上图中的蓝色数据点所示,对应某一个theta值就相应的有一个损失值。根据高数中所学知识,如果此时的蓝色点导数不为0的话,那么这个点肯定不是极值点,对一阶函数求导的话,就是求J对theta的进行求导。
- 如果在直线方程中,导数代表斜率;
- 如果在曲线方程中,导数代表切线斜率,此时这个点导数代表在这一点切线斜率是多少;
如果换个角度来理解这个导数的话,其实导数代表的就是theta单位变化时,J相应的变化,本质就是斜率的定义。
此时蓝色的点对应着一个J值:
- 如果此时将蓝色点的theta值向右移动一小步(即增大theta),相应的损失函数J就会取另外一个值,此时的J比原来的J相当于是减少了,减少的多少就是被导数所刻画的;
- 如果此时让蓝色点的theta值向左移动一小步(即减少theta),相应的损失函数J就会取另外一个值,此时的J比原来的J相当于增大了,增大的多少就是被导数所刻画的。
由于此时在蓝色的数据点上,导数为负值,相对应的过蓝色的数据点与曲线相切的直线的斜率为负值,此时导数的方向为沿着切线指向外,所以当theta增加的时候,损失函数J是减小的,反之,当theta是减少的时候,损失函数J是增加的,因此,导数可以代表一个方向,这个方向就是对应损失函数J增加的方向。
在蓝色数据点上由于导数为负值,所以损失函数J增大的方向应该X轴的负方向上,也就是theta减少的时候。由于我们的目标是最小化损失函数,找到损失函数J的最小值,所以我们希望蓝色数据点向着损失函数J减少,所以要想使损失函数J减少,应当向导数的负方向移动,对应我们还需要移动一个步长,这个移动的步长通常记为η,也就是说对于一个点来说,求出他的导数就知道这个点对应损失函数J增大的方向,但是我们的目标是最小化损失函数J,因此如果向损失函数J减小的方向移动的话,需要使用计算出来的导数乘上一个"-"即可。
通常η会提前取好,也就是前面所提到的超参数,假设此时将η值设置为0.1,那么此时蓝色点的移动轨迹如下图所示:
此时的theta参数值在增大,因为在第一次蓝色的数据点时,计算得到的导数为负值,而-η乘上一个负值为正值,因此theta参数在增大,移动一点之后相应的损失函数J的值就会减少一些,在下一点的时候,导数并不等于0,因此此时依然使得theta参数值增大,对应的损失函数J值减少一些:
通过上图也可以看出,迭代的数据点,在梯度的反方向上损失函数J上是逐渐的下降的,这也是为什么被称之为梯度下降法的原因。为什么称为梯度呢?如果在处理一维函数的时候,直接使用导数就可以了。但是在多维函数中,我们需要对各个方向的分量分别求导,最终得到的方向就是梯度,因此在多维情况中,上图中的话可以改成“梯度可以代表方向,对应J增大的方向”。
为了加深理解,将起始数据点换成左边方向:
此时这个蓝色的数据点的导数是大于0的,换句话说,theta继续向大于0的方向走,就是损失函数J增大的方向,但是由于我们想找到损失函数J的最小值,我们需要找到此时蓝色数据点导数的反方向,因此前面介绍的式子依然是成立的,对于theta参数要减去η乘上蓝色数据点的导数,由于此时导数大于0,因此相当于theta值变小,对应的损失函数J也会变小一点。
到了新的数据点之后,导数依然是不等于0,并且此时的导数大于0,theta继续减去η乘上当前位置的导数,
梯度下降过程就相当于把损失函数J当成是一个山谷,损失函数J上随便放上一个球,球会很自然的滚落下来,梯度下降算法就好像是在模拟球的滚落过程,直到这个球滚落到谷底的时候,就说找到了损失函数J相应的一个最小值所在的位置,此时滚落的速度由η来决定的:
下面说一说为什么η会影响最优解的速度:
梯度下降算法还有其他的注意事项,前面介绍的都是非常简单的二次曲线的情况,很显然有唯一的极值点,需要注意的是,对于这种简单的求极值问题我们可以直接求解出解析解,因此通常使用梯度下降法来求解一些复杂函数上,通常情况下这些复杂的函数并不一定有唯一的极值,也就是说并不是所有函数都有唯一的极值点。
比如下面这种比较复杂的损失函数,当然了在二维坐标下,即使在复杂也是可以直接进行求解的,这里只是为了演示方便,当然更复杂的求解对应于更高维度的损失函数:
上面损失函数图像和前面二次曲线不同的是此时的损失函数有两个极小值点,所谓的极小值就是在这些位置的时候导数为0的时候,从图中也可以看出,在两个极小值中是有一个最小值的,在这种情况下,使用梯度下降法,找到损失函数J的最小值。如果初始点从右上角出发的话:
此时找到的是函数的局部最优解,但是对于整个函数来说,全局最优解在其左边的极小值点处:
这就是使用这种搜索的策略可能会出现的问题,在搜索的过程中,只是找到了一个现在我们能看到的最好的解而已,但是这个最好的解,不是在全局层面的最优解,换句话说并不是所有函数都有唯一的极值点。
03
线性回归中的梯度下降法
因为线性回归损失函数具有唯一的最优解,所以在应用梯度下降法求解线性回归问题不需要考虑重复多次初始化起始点。即使如此,起始点对于梯度下降法是非常重要的。