Machine Learning(Stanford)| 斯坦福大学机器学习笔记--第一周(4.梯度下降)

来源:互联网 发布:重庆seo入门到精通 编辑:程序博客网 时间:2024/06/06 07:17

一.Gradient Descent(梯度下降)

之前已经定义了代价函数J,为了最小化代价函数,接下来将介绍梯度下降(Gradient Descent)这种算法。梯度下降是很常用的算法,它不仅被用在线性回归上,实际上也被广泛的应用于机器学习领域中的众多领域。为了解决其他线性回归问题,我们也将使用梯度下降法最小化其他函数,而不仅仅是只用在本节课的代价函数J。
下面是问题概述,首先看图1-1,

图1-1
在这里,我们有一个代价函数J(θ0, θ1),也许这是一个线性回归的代价函数,也许是一些其他函数。要使其最小化,我们需要用一个算法来最小化函数J(θ0, θ1) 。

事实证明,梯度下降算法可应用于多种多样的函数求解,所以想象一下如果你有一个函数J(θ0, θ1, θ2, ...,θn ),你希望可以通过找到一组θ0到θn来最小化此代价函数J(θ0, θ1, θ2, ...,θn),用n个θ是为了证明梯度下降算法可以解决更一般的问题。但为了简洁起见,特地简化了符号,所以接下来我只用两个参数来表示。 

图1-2就是关于梯度下降的构想。

图1-2
一开始我们要对θ0和θ1进行一些初步猜测,它们到底是什么其实并不重要,但通常的选择是将θ0设为0,将θ1也设为0 ,即都初始化为0。我们在梯度下降算法中要做的就是不停地一点点地改变 θ0和θ1试图通过这种改变使得J(θ0, θ1)变小,直到我们找到J的最小值,或许是局部最小值。让我们通过一些图片来看看梯度下降法是如何工作的,如图1-3
图1-3
这里要做的是试图让这个函数值最小,注意坐标轴θ0和θ1在水平轴上,而函数J则在垂直坐标轴上,图形表面高度则是J的值,我们希望最小化这个函数。

按照刚才的构想,我们随机从θ0和θ1的某个值出发,即对θ0和θ1随机赋以某个初值,也就是对应于从这个函数表面上的某个起始点出发。按照惯例是将它们初始化为0,但有时也可把它初始化为其他值。现在希望大家把这个图像(图1-3)想象为一座山,公园中有两座山,想象一下你正站立在山的这一点上(图1-3中最高点的叉叉上)。在梯度下降算法中,我们要做的就是环视360度,看看我们的周围,并问问自己我要朝哪个方向用小碎步尽快下山。 然后你按照自己的判断迈出一步,然后重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,又是一小步,并依此类推,直到接近局部最低点的位置。

此外,这种下降有一个有趣的特点,第一次我们是从图1-3这个点开始进行梯度下降算法的。现在想象一下,我们在刚才的右边一些的位置,对梯度下降进行初始化,如图1-4所示,
图1-4
想象我们在右边高一些的这个点,开始使用梯度下降。如果重复上述步骤,停留在该点 并环顾四周,往下降最快的方向迈出一小步,然后环顾四周,又迈出一步,然后如此往复。如果从右边不远处开始,梯度下降算法将会带你来到右边的第二个局部最优处。

如果从图1-3的第一个点出发,你会得到图1-3的这个局部最优解;但如果起始点偏移了一些,起始点的位置略有不同,便会得到一个非常不同的局部最优解,这就是梯度下降算法的一个特点。

让我们来看下梯度下降算法的定义,如图1-5所示,

图1-5


我们将会反复做图1-5中的步骤,直到收敛。这里我们更新参数θj方法是用θj减去α乘以

让我们来看看这个公式,当中有很多细节问题,这里来详细讲解一下。


首先,注意这个符号 := ,我们使用 := 表示赋值!!


其次,这里的α是一个数字,被称为学习速率。 在梯度下降算法中,形象地说它控制了我们下山时会迈出多大的步子。因此如果 α值很大,那么相应的梯度下降过程中我们会试图用大步子下山,如果α值很小,那么我们会迈着很小的小碎步下山。关于如何设置 α的值等内容在之后会回到这里并且详细说明。

最后,是,它是一个微分项。


现在,梯度下降算法中还有一个更微妙的问题。在梯度下降中,我们要做到同时更新 θ0和θ1。实现同时更新正确的方法如图1-6所示,


图1-6

在图1-6中,首先计算出公式右边这一部分,然后将计算出的结果一起存入 temp0和 temp1 之中,然后同时更新 θ0和θ1


与此相反,图1-7是不正确的实现方法,因为它没有做到同步更新。 


图1-7

在这种不正确的实现方法中,我们计算temp0,然后我们马上更新了θ0。就是这一步,如果这个时候你已经更新了θ0,那么我们将会会使用θ0的新的值来计算这个微分项,所以由于你已经在这个公式中使用了新的 θ0的值,那么这会产生一个与左边不同的 temp1的值,所以右边并不是正确地实现梯度下降的做法。 

实际上同步更新是更自然的实现方法,当人们谈到梯度下降时,他们的意思就是同步更新,如果用非同步更新去实现算法,代码可能也会正确工作,但是右边的方法并不是人们所指的那个梯度下降算法,而是具有不同性质的其他算法。由于各种原因,这其中会表现出微小的差别,我们应该做的是在梯度下降中真正实现同时更新

微分项的作用

现在让我们好好地来理解图1-5中的微分项。为了更好地明白,这里用一个稍微简单的例子:比如我们想最小化的那个函数只有一个参数的情形,如图1-8 所示,


图1-8


由于只有1个参数,那么我们可以画出一维的曲线来帮助理解,如图1-9所示。

图1-9

让我们试着去理解,为什么梯度下降法会在这个函数上起作用。我们首先对θ1进行初始化,如图1-9中的蓝色点。想象一下在函数图像上,从这个蓝色的点出发,梯度下降要做的事情是不断更新θ1,使。这里稍微提一下,之前J有两个参数的时候用的是偏导符号,这里由于只有1个参数,所以用的是导数符号,进行的操作都是很类似的。那么我们来看这个方程,根据高数中所学的知识,求导的目的基本上可以说取这一点的切线,就是这样一条红色的直线,刚好与函数相切于这一点,如图1-10,

图1-10

让我们看看这条红色直线的斜率,其实这就是导数。同时容易看出直线的斜率是正的,也就是说它有正导数。因此,θ1更新后等于θ1减去一个正数乘以α,如图1-11,

图1-11

α之前讲过,学习速率,同时也是一个正数。所以我要使θ1减去一个东西,相当于我将θ1向左移,使θ1变小了。我们可以看到,这么做是对的,是符合我梯度下降的目的的。因为实际上我往这个方向移,确实让我更接近那边的最低点。所以梯度下降到目前为止似乎是在做正确的事。


让我们来看看另一个例子,如图1-12,


图1-12

让我们用同样的函数J,同样再画出函数J(θ1)的图像。而这次把参数初始化到左边这点。现在可以看到导数项在这点上计算是一个负数,同时我们也可以判断出这条直线的斜率也是负的。因为这个导数项小于等于零,所以当我更新θ时,θ被更新为θ减去α乘以一个负数 ,因此我是在用θ1减去一个负数,这意味着我实际上是在增加θ1。增加θ似乎也是我们希望得到的,也就是让我更接近最小值了。

学习速率α

以上两个例子很直观地解释了导数项的意义,让我们接下来再看一看学习速率α。我们来研究一下它有什么用。

让我们来看看如果α太小或α太大会出现什么情况,如图1-13这个例子,

图1-13

从图中可以看到,当我们的α取得很小,那么我要做的是要去 用一个比较小的数乘以更新的值,由于α 太小,因此只能迈出另一个小碎步。所以如果我的学习速率太小,结果就是只能像图中一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点。所以如果α 太小的话,梯度下降到全局最低点会很慢。


讲完α很小,讲讲如果α取得太大的情况。如果α太大,就会出现如图1-14的情况,



图1-14

我们从图1-14左上角这幅图上的这个点开始,由于这个点在左边,易得导数值是负的,并且这个点已经很接近最低点了。此时如果α太大的话,这里就会迈出很大一步,像图1-14右上角这样巨大的一步。因为我迈出了一大步,导致现在我的代价函数变得更糟了,因为离这个最低点越来越远 。所以如果我的学习率太大,下一次迭代又会移动了一大步 ,一次次越过最低点,实际上离最低点越来越远。所以如果α太大,它会导致无法收敛,甚至发散。 


现在,还有一个问题。如果我们预先把θ1放在一个局部的最低点,你认为下一步梯度下降法会怎样工作?如图1-15,


图1-15

答案θ1将不会变化。假设这里将θ1初始化在局部最低点,如上图1-15所示,在这儿它已经在一个局部的最优处或局部最低点了。在局部最优点的导数是等于零的,因为这个点对应的切线的斜率是等于零的。所以在梯度下降更新过程中,用θ1减α 乘以0来更新θ1 。这意味着我们已经在局部最优点,它使得θ1不再改变,也就是新的θ1等于原来的θ1。因此 如果你的参数已经处于局部最低点,那么梯度下降法更新其实什么都没做,它不会改变参数的值。这同时也解释了为什么即使学习速率α 保持不变时,梯度下降也可以收敛到局部最低点。


最后再来看一个例子,如图1-16,


图1-16

首先要做到是初始化我的梯度下降算法,我们在图1-16右上角那个品红色的点来初始化,当我更新一步梯度下降,它会带我到绿色这个点。很明显绿色这个点的导数是相当陡的,在绿色这个点如果我再更新一步,你会发现我的导数,也即斜率相比于在品红点是没那么陡的。因为随着我接近最低点,我的导数越来越接近零。

所以,不难发现每做一次梯度下降,新的导数会变小一点点,θ1更新的幅度就会变小,所以我们移动的幅度也就更小,就像图1-16中各段线条所示。

所以说,随着梯度下降法的运行,我们移动的幅度会自动变得越来越小,直到最终移动幅度变得非常小,此时就会发现已经收敛到了局部极小值。

所以回顾一下,在梯度下降法中,当我们接近局部最低点时,梯度下降法会自动采取更小的幅度。这是因为当我们接近局部最低点时,导数值会自动变得越来越小直到0为止。 

这就是梯度下降算法,我们可以用它来最小化任何代价函数J ,不只是线性回归中的代价函数。


0 0
原创粉丝点击