3.2 梯度下降

3.2 梯度下降

    上一小节,我们已经介绍了代价函数J,这一节我们将介绍梯度下降算法,这种算法可以将代价函数最小化,梯度下降是很常用的算法,它不仅被使用在线性回归问题上,实际上它还被用在机器学习的其它许多地方,在后面的其它课程中,我们也将使用这种方法,而不是仅仅使用在这里的代价函数J上。

    问题简介:有一个代价函数J,也许是一个线性回归函数或者其它函数,我们需要一个算法来最小化J。可以证明梯度下降方法可以用于解决一般的最小化问题,简单起见(入门),具体证明就不给出了。

    下面是梯度下降的构想,我们开始要对θ0和θ1作出一些猜想,它们是什么通常不重要,通常将它们都初始化为0,我们第二步要做的就是不断的改变θ0和θ1的值,使J(θ0,θ1)越来越小,直到我们找到J的最小值,也可能是局部最小值。

    我们来看看,梯度下降算法是怎么工作的?如下图所示,我们试图让这个函数值最小,注意坐标轴θ0和θ1在水平轴上,J在垂直坐标轴上,图形表面高度就是J的值。我们从θ0和θ1的某个值出发,赋予它们某个初始值,也就是从图形表面的某个点出发。我们将它们初始化为0,你也可以将它们初始化为其他值。你可以将这张图想像成公园中的两座高山,想像你正站在你所想像的公园的这座红色的高山上,在梯度下降算法中,我们要做的就是,旋转360度,看我们周围,我们要在某个方向上,以小碎步尽快下山。如果我要下山,我想以最快的速度下去,这些小碎步要朝什么方向???如果我们站在山坡上的这一点,你发现最佳的下山方向是这一方向(如图所示,黑色十字),然后你在山上的新的起点,现在你在看看你的周围,又想想该朝哪个方向下山,然后按照自己的判断迈出下一步。依次类推,直到你到达或者接近局部最低点。

    这种算法有一个比较特殊的特点,如果选择的起点不同,梯度下降算法,可能将你带到不同的局部最优解的位置,后面我们将探讨这个问题。

 

    下面我们看看梯度下降算法的定义,如下图所示。

    我们将详细解释一下。首先,

     := 表示赋值,我们使用:=表示赋值运算符。例如a:=b,表示将b的值赋值给a。

     = 如果使用等号,例如a=b表示判断为真的申明。就是判断a的值是否等于b的值。

     α 被称为学习速率(learning rate),在梯度下降算法中α是什么呢???它控制了我们下山时会迈出多大的步子,因此α的值越大,我们会使用更大步子下山,α的值越小,就意味着我们使用小碎步下山,在后面的课程中,我们会介绍如何设置α的值。

     公式的最后一个部分,是一个微分项,现在我们不讨论它。后续,我们将会推导它,并且告诉你如何计算它。

     在梯度下降算法中,还有一个更加微妙的问题,我们要更新θ0和θ1,当j==0和j=1(j代表特征的索引号)时会产生更新,所以你将更新J、θ0还有θ1,在这个表达式中,如果你要更新这个等式,你需要同时更新θ0和θ1。实现方法是你应该计算公式的右边,通过这一部分计算出θ0和θ1的值,然后同时更新θ0和θ1的值。

     首先计算出公式(图中下半部分)右边的值,然后赋值给temp0和temp1,然后同时更新θ0和θ1。下半部分的右边先计算temp0,然后紧接着更新θ0是不对的,因为计算temp1的时候会使用到新产生的θ0的值,会产生一个不同的与左边temp1不同到值。

     当人们谈到梯度下降时,他就是在指同步更新,如果使用非同步更新的算法,代码可能也能够正常工作,但是右边的方法并不是人们常指的梯度下降算法,而是其它具有不同性质的算法,由于各种原因,这其中会表现出微小的差别。

    

    上面我们给出了梯度下降的一个数学上的定义,现在我们将更加深入的研究、更加直观的感受一下这个算法是做什么的,以及梯度下降算法的更新过程有什么意义。回顾一下公式中的参数α,它控制着我们以多大的速率更新θ和j;第二部分是导数部分,这里我们将介绍这两部分有什么用,以及为什么将这两个部分结合起来。这两个部分结合起来时,是有意义的。

    举一个简单的例子,前面我们介绍过想要最小化的只有一个参数的J(θ1),让我们试着去理解为什么梯度下降会在这个代价函数上起作用???想像一下,我们有如下的代价函数J(θ1)。我们已经在这个代价函数上使用了梯度下降算法,进行了初始化,如图所示的θ1,要做的事情是从这个点出发,不断的更新θ1等于θ1减去α倍的那个偏导数式子(详情见图片),求导的目的就是图中红色的切线,它是某一个点的切线的斜率,现在这条线有一个正斜率,也就是说它有一个正导数,我们会得到新的θ1,新的θ1等于原先的θ1减去α倍的那个偏导数式子,相当于,在横轴上,θ1在向左边移动,将θ1变小了,从图中可以看到,这样做目前是正确的,我们更加的接近了最低点,梯度下降目前为止似乎是在做正确的事情。

    我们来看看另一个例子,我们使用同样的代价函数J(θ1),同样的图像,现在我们将初始点选择在最低点的左边,如图所示,这时候导数是一个负数。对吧?或者说这个函数有负导数,也就意味着在那一点上有负斜率,当我们更新θ1的时候,新的θ1等于原先的θ1减去α倍的那个偏导数式子,我们会发现减去一个负数,相当于加上一个正数,θ1会不断的变大,也是朝着最低点去的。这样我们就直观的解释了后面导数项的意义。

    现在我们看看学习速率α的意义,我们来看看α太大或者太小会出现什么情况。当它较小的时候,用一个比较小的值乘以要更新的值,最终,它像一个小宝宝的步伐,一步一步的像最低点走去,会需要许多步才能到达最低点,可能会很慢;如果α太大的话,那么梯度下降可能会越过最低点,甚至可能无法收敛,如图所示,我们选择的点已经比较接近最低点,因为导数是负导数,如果α太大的话,我们会迈出很大的一步,直接越过了最低点,现在我们的代价函数变得越来越糟,越来越远离最低点,现在导数又变成了正导数,这时如果α太大,可能有一下子越过了最低点,又来到了最低点左边,这样循环往复,导致梯度下降无法收敛,甚至发散。

    还有一个比较狡猾的问题,就是如果一开始我们就将θ1选在了局部最低点,你认为下一步梯度下降算法将怎么进行工作???参考下图进行理解。

    你将θ1选在了一个局部最优的点,此时,这点的斜率为0,也就是导数项为0,你会发现θ1不再改变,也就是你已经在局部最优点,所以,如果你已经处于局部最优点,其实梯度下降算法什么也没有做,它不会改变参数的值,这也正是你想要的,因为它使你的解保持在局部最优点。

这也解释了即使学习速率α保持不变的时候,梯度下降也能收敛到局部最优点。让我们来看一个例子。如下图所示,有一个代价函数J(θ1)。初始化一个点(绿色),该点切线的斜率比较大,θ1减小的比较快,到达品红色的点,随着接近最低点,斜率变得越来越小,对应的θ1减小的速度会变小,随着越来越接近最低点,θ1更新的速度会越来越小,随意你会移动更小的一步,像这样,随着梯度下降算法的运行,你移动的幅度会越来越小,直到最终收敛到局部最小值点。也就是说,梯度下降算法会自动采取较小的幅度,所以实际山没有必要在另外减小α。

这就是梯度下降算法,你不仅可以使用它来最小化线性回归函数J,还可以用它来最小化其他函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值