20-什么是梯度下降法

梯度下降法概念

  我们又要开始学习机器学习领域一个重要的方法—— 梯度下降法(Gradient Descent)。梯度下降法和我们之前学习的 kNN 算法和线性回归算法不同,梯度下降法本身不是一个机器学习算法,它既不是在做监督学习也不是在做非监督学习,它不能用于解决回归问题和分类问题。梯度下降法是一种基于搜索的的最优化的方法,它虽然也是人工智能领域的一个比较重要的方法,但是它的作用是用于优化一个目标函数,那么对于我们要最小化一个损失函数的话,相应的就是使用梯度下降法,而我们要最大化一个效用函数的话,我们使用的就是一个梯度上升法。

  回忆一下,之前在学习线性回归算法最终我们要求解那个线性回归的模型,本质其实就是要最小化一个损失函数。我们之前是直接计算出了最小化这个函数对应的参数它的数学解,但是我们后面就会发现很多机器学习的模型是求不到这样的数学解的。那么基于这样的模型,我们就需要使用一种基于搜索的策略来找到这个最优解,那么梯度下降法就是在机器学习领域最小化损失函数的一个最为常用的方法。总体而言,在机器学习领域,熟练的掌握梯度下降法来求解一个目标函数的最优解是非常最要的一个事情。


梯度下降法过程

  那么,下面我们就开始学习梯度下降法。

  在这里,我又绘制了一个二维坐标平面,不过一定要注意,这个二维平面不是描述特征平面,也不是描述每一个特征点相对应的那个输出标记的值是多少,它描述的是当我们定义了损失函数以后,这个 y 轴就是损失函数J 的取值,那么相应的,如果我们取不同的参数,x 轴代表参数 theta,每取一个参数,对应我们的损失函数 J 就会取到一个值。那么,这个损失函数 J 应该有个最小值,对于我们最小化损失函数这个过程来说,相当于是在这样的一个坐标系中寻找合适的参数,使得我们的损失函数 J 取得最小值。
在这里插入图片描述

  现在是在二维平面上,也相当于我们的参数只有一个,我们使用可视化的方式来帮助理解什么是梯度下降法,我们在后面也会将它拓展到高维的情况下。

  下面,我们再来看看这个图,我们每取一个 theta 值,相应的它就有一个损失函数 J。回忆一下,高数所学的知识,如果一个点的导数不为0的话,那么该点肯定不是极值点。那么该点的导数通常可以写做:
在这里插入图片描述

  在直线方程中,导数非常好理解,它就代表斜率。如果在曲线方程中,导数就代表经过该点的切线斜率。那么如果我们换一个角度来理解导数的话,导数代表 theta 单位变化时,J 相应的变化是多少。
在这里插入图片描述

  在这里,可以注意一下切线斜率的正负,由于在这一点上,它的导数为负值,相对应的就是图中的切线的斜率为负值,所以当我们的 theta 增加的时候,我们的 J 是减小的,theta 减小的时候,J 是增加的。这样的观察,从某种意义上告诉我们,导数可以代表方向,对应的就是 J 增大的方向。

  但是我们希望这个点能够向 J 减小的方向移动,所以就应该向导数的负方向移动,当然了,我们还需要移动一个步长,那么通常用 η 来表示,
在这里插入图片描述

  也就是说,对于一个点来说,我们求出它的导数,我们就知道这个点对应的这个J 增大的方向,但是我们要向 J 减小的方向继续前进的话,我们只需要用这个导数乘以负的 η,通常 η 我们会提前取好一个值,比如说取 0.1,那么在这个例子里,这个点对应的 theta 值就会首先减去 0.1乘以这个导数,相应的就是这个点在向右移动,也就是我们的 theta 在增大,这是因为导数是负值。那么移动一点之后,我们损失函数 J 就会减少一些。

在这里插入图片描述

  不过我们在这个新的点上再求一下这个导数,这个导数还不等于0,所以它还不处于一个极值点,我们就尝试再把这个点的 theta 值减去 η 乘以这个点上的导数值,也就是再向右移动一步达到另一个点,以此类推,我们逐渐的通过这个过程找到对于我们这个损失函数 J 来说 theta 到底到了哪里可以取到损失函数 J 的最小值。

在这里插入图片描述

  那么通过这个图示也可以看出来,这个点是逐渐跟着这个导数的方向逐渐的在这个损失函数中下降的,这也就是该方法为什么叫做梯度下降法的原因?那为什么叫做梯度呢?我们这个例子中用的是一维函数,所以我们直接用导数就可以了,但是在多维函数中,我们要对各个方向的分量分别求导,最终得到的这个方向就是梯度。也就是说对于多维函数来说,可以将 导数可以代表方向,对应 J 增大的方向改成梯度可以代表方向,对应的损失函数 J 增大的方向

  我们再举一个例子,我们在另一边上取一个点,此时这一点对应的导数应该是大于0的。意味着如果我们的 theta 继续向大于 0 的方向走,对应的就是函数 J 增大的方向,但是由于我们想找到 J 的最小值,所以我们要向在这个点对应的导数的负方向走,所以这个式子依然成立,这个 theta 要减去 η 乘以这个点的导数,由于导数大于0,相当于是 theta 变小,theta 变小一点,相应的损失函数 J 也会变小一点。

在这里插入图片描述
  然后我们会来到一个新的点,我们可以发现新的点的导数依然不等于0,我们依然朝着导数的负方向前进,theta 继续减去 η 乘以该点的导数。依此类推。
在这里插入图片描述

  我们看到整个梯度下降法的过程,我们可以把我们的损失函数比喻成一个山谷,我们在 J 上随便放一个球,让这个球自然的滚落下来,梯度下降法就好像是在模拟滚落的过程,直到这个球滚落到谷底的时候,我们就找到了损失函数 J 相应的最小值所在的位置,那么滚落的速度由谁来决定,是由这个 η 来决定的,通常我们在机器学习领域,我们称这个 η 为学习率(learning rate)

  它的取值影响我们获得最优解的速度。甚至如果它的取值不合适的话,甚至得不到最优解。η 相当于是梯度下降法的一个超参数,所以在使用梯度下降法的时候,有可能一上来我们的 η 的取值不是很准确,还可能会通过调参这样的方式来找到适合我们算法的一个最佳的 η 值。

  那么可以简单的理解一下为什么 η 会影响我们获得最优解的一个速度?

  如果 η 太小,那么每一次向最小的位置滚动的速度就慢,就会影响整个算法得到最终的这个最优解,也就是所谓的收敛的速度。

在这里插入图片描述

  但是如果 η 太大的话,甚至就会导致不收敛,见下图:

在这里插入图片描述

  如果我们的 x1 点一下蹦到了 x2 点,我们的损失函数不但没有减小,反而增大了。我们再来一步,很可能又蹦到了 x3,这个过程中我们使用梯度下降法,可是损失函数 J 却在不断增加。我们在后续的编程中,也会看到这种情况,一旦遇到了这种情况,可能就是在告诉我们 η 的取值或许是太大了。

  当然,梯度下降法还有其他的注意事项。我们上面举出的例子都是非常简单的二次曲线这种情况,它显然有唯一的极值点,但是要知道,我们学习的梯度下降法是要把它用在更复杂的函数上,对于二次曲线这么简单的函数,我们直接用数学解求出极值点即可。但是很多时候,我们使用梯度下降法的时候,面对的函数是非常复杂的,在这里,只是简单的举一个例子,如下图:

在这里插入图片描述

  在这个图上,最大的特点在于看起来有两个极小值(t1 和 t2,在该点导数为0),在这两个极小值中有一个最小值(t1)。那么在这种情况下,假如我们使用梯度下降法来寻找这个损失函数 J 对应的那个最小值,如果我们的初始点从 x1 点出发,最终到达最小值的点在 t2 处,而 t2 并不是我们整个函数的最小值的点,那么通常对于这种情况我们找到的是一个局部最优解,但是对于我们整个函数来说,局部最优解不是全局的最优解,而对于这个损失函数来说,这个全局的最优解在 t1 处。

在这里插入图片描述

  那就是使用这种搜索的策略可能会遇到的问题,就是在搜索的过程中,我们可能找到的是现在我们能够看到的最好的解而已,但是这个所谓的最好的解不是一个真正的在全局层面上的一个最优的解。换句话说,并不是所有的函数都有唯一的极值点,那么,对于这个问题,通常的解决方案是多次运行梯度下降法,并且每次都随机化初始点,当然通过这种方式也不一定能保证能找到全局最优解,毕竟对于一个复杂的函数来说,很有可能局部最优解有多个,甚至是成百上千个,通过这样的分析,对于梯度下降法来说,初始点的位置也是一个超参数

  不过一个好消息是,我们这里主要使用梯度下降法进行线性回归的训练,我们的目标函数是这样一个函数:
在这里插入图片描述

  使这样一个函数的的值尽可能的小,这个损失函数是具有唯一的最优解的。


  好了,在这里就简单介绍了梯度下降法来寻找一个损失函数的最值它相应的原理,我将在下一篇博客就来实际的编码来模拟一下我们在这篇博客中所有的梯度下降法对应的原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值