机器学习笔记【Day5】参数学习_梯度下降算法


(本文为学习总结笔记,如有雷同请无视)

梯度下降

1 梯度下降算法

我们已经定义了代价函数J,而在这段视频中,我想向你们介绍梯度下降算法。这种算法可以将代价函数J最小化。梯度下降是很常用的算法,它不仅被用在线性回归上,它实际上被广泛的应用于机器学习领域中的众多领域。在后面课程中,为了解决其他线性回归问题,我们也将使用梯度下降法最小化其他函数,而不仅仅是只用在本节课的代价函数J。

下面是问题概述:
在这里插入图片描述
在这里我们有一个函数J(θ0,θ1),也许这是一个线性回归的代价函数,也许是一些其他函数。我们需要用一个算法,来最小化函数J(θ0,θ1),就像刚才说的:事实证明,梯度下降算法可应用于多种多样的函数求解,所以想象一下如果你有一个函数J(θ0,θ1,θ2,…,θn),你希望可以通过最小化θ0到θn来最小化此代价函数J(θ0,θ1,θ2,…,θn)。用n个θ是为了证明梯度下降算法可以解决更一般的问题,但为了简洁起见,为了简化符号,在接下来的视频中我只用两个参数。

下面就是关于梯度下降的构想:
在这里插入图片描述
我们要做的是我们要开始对θ0和θ0进行一些初步猜测。它们到底是什么其实并不重要,但通常的选择是将θ0设为0将θ1也设为0,将它们都初始化为0。我们在梯度下降算法中要做的就是不停地一点点地改变 θ0和θ1,试图通过这种改变使得J(θ0,θ1)变小,直到我们找到J的最小值,或许是局部最小值。

让我们通过一些图片来看看梯度下降法是如何工作的:
在这里插入图片描述
我在试图让这个函数值最小,注意坐标轴θ0和θ1在水平轴上,而函数J在垂直坐标轴上。图形表面高度则是J的值,我们希望最小化这个函数,所以我们从θ0和θ1的某个值出发,所以想象一下,对θ0和θ1赋以某个初值,也就是对应于从这个函数表面上的某个起始点出发。所以不管θ0和θ1的取值是多少,我将它们初始化为0,但有时你也可把它初始化为其他值。

现在我希望大家把这个图像想象为一座山,想像类似这样的景色:公园中有两座山,想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上。在梯度下降算法中我们要做的就是旋转360度,看看我们的周围,并问自己我要在某个方向上用小碎步尽快下山,如果我想要尽快走下山,这些小碎步需要朝什么方向?

如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向大约是那个方向。好的现在你在山上的新起点上:

在这里插入图片描述
你再看看周围,然后再一次想想我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,往那个方向走了一步,然后重复上面的步骤,从这个新的点,你环顾四周并决定从什么方向将会最快下山,然后又迈进了一小步,又是一小步,并依此类推……直到局部最低点的位置。
在这里插入图片描述
此外这种下降有一个有趣的特点,第一次我们是从这个点开始进行梯度下降算法的,在这一点上从这里开始。现在想象一下我们在刚才的右边一些的位置,开始使用梯度下降。如果你重复上述步骤停留在该点并环顾四周,往下降最快的方向迈出一小步,然后环顾四周,又迈出一步然后如此往复,如果你从右边不远处开始,梯度下降算法将会带你来到这个右边的第二个局部最优处:
在这里插入图片描述
如果从刚才的第一个点出发,你会得到第一个局部最优解,但如果你的起始点偏移了一些,你会得到一个非常不同的局部最优解。这就是梯度下降算法的一个特点。我们会在之后继续探讨这个问题。

看看这个图,这是梯度下降算法的定义:
在这里插入图片描述
我们将会反复做这些直到收敛。我们要更新参数θj,方法是反复执行:
θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) θ_{j} - α\frac{∂}{∂θ_{j}}J(θ_{0},θ_{1}) θjαθjJ(θ0,θ1)

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

首先,注意这个符号:=,我们使用:=表示赋值。这是一个赋值运算符。具体地说,如果我写a:=b在计算机专业内,这意味着不管a的值是什么,取b的值并将其赋给a这意味着我们让a等于b的值 这就是赋值。我也可以这样写 a:=a+1这意味着取出a值并将其增加1。与此不同的是如果我写a=b就是在断言a的值是等于b的值。

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

最后,是公式的这一部分:

∂ ∂ θ j J ( θ 0 , θ 1 ) \frac{∂}{∂θ_{j}}J(θ_{0},θ_{1}) θjJ(θ0,θ1)

这是一个微分项。我现在不想谈论它,但我会推导出这个微分项,并告诉你到底这要如何计算。你们中有人大概比较熟悉微积分,但即使你不熟悉微积分也不用担心,我会告诉你对这一项你最后需要做什么。

现在,在梯度下降算法中还有一个更微妙的问题:在梯度下降中,当j=0和j=1时,更新θ0和θ1的值,等式产生更新。实现梯度下降算法的微妙之处是,在这个表达式中如果你要更新这个等式,你需要同时更新θ0和θ1。我的意思是在这个等式中我们要这样更新
θ 0 : = θ 0 − 一 些 东 西 θ_{0} := θ_{0} - 一些东西 θ0:=θ0西

并更新

θ 1 : = θ 1 − 一 些 东 西 θ1:=θ1−一些东西 θ1:=θ1西

实现方法是你应该计算公式右边的部分,通过那一部分计算出θ0和θ1的值,然后同时更新θ0和θ1。

让我进一步阐述这个过程。在梯度下降算法中,这是正确实现同时更新的方法:
在这里插入图片描述
我要先设temp0和temp1变量,并且为它们付初值。然后同时更新θ0和θ1。这才是正确的实现方法。

与此相反,下面是不正确的实现方法:

在这里插入图片描述
因为它没有做到同步更新。在这种不正确的实现方法中,我们计算 temp0然后更新θ0,然后我们计算temp1,然后我们将 temp1赋给θ1。这种方法和上面的方法的区别是,在计算temp1之前你已经更新了θ0,那么你会使用θ0的新的值来计算这个微分项,那么这会产生一个与上边不同的temp1的值。所以这并不是正确地实现梯度下降的做法。

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

在接下来的视频中,我们要进入这个微分项的细节之中。我已经写了出来但没有真正定义。如果你已经修过微积分课程,如果你熟悉偏导数和导数,这其实就是这个微分项。如果你不熟悉微积分,不用担心。即使你之前没有看过微积分,或者没有接触过偏导数,在接下来的视频中你会得到一切你需要知道的如何计算这个微分项的知识。下一个视频中希望我们能够给出实现梯度下降算法的所有知识。

2 深入研究梯度下降算法

之前,我们给出了一个数学上关于梯度下降的定义。本次我们更深入研究一下,更直观地感受一下这个算法是做什么的,以及梯度下降算法的更新过程有什么意义。

上次的梯度下降算法:
在这里插入图片描述
提醒一下,这个参数α术语称为学习速率。它控制我们以多大的幅度更新这个参数θj。第二部分是导数项。而我在这个视频中要做的就是给你一个更直观的认识,这两部分有什么用,以及为什么当把这两部分放一起时,整个更新过程是有意义的。为了更好地让你明白我要做是用一个稍微简单的例子:比如我们想最小化的那个函数只有一个参数的情形,所以假如我们有一个代价函数J只有一个参数θ1,那么我们可以画出一维的曲线:

在这里插入图片描述
假如这是关于θ1的函数J,其中θ1是一个实数。现在我们已经对这个点上用于梯度下降法的θ1进行了初始化。想象一下在我的函数图像上从这个点出发,那么梯度下降要做的事情是不断更新

θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) θ_{j} - α\frac{∂}{∂θ_{j}}J(θ_{0},θ_{1}) θjαθjJ(θ0,θ1)

这个项。我们要计算这个导数,我不确定之前你是否在微积分中学过导数,但对于这个问题,基本上可以说取这一点的切线,这条切线的斜率,其实这就是导数:
在这里插入图片描述
现在这条线有一个正斜率,也就是说它有正导数。因此我得到的新的θ是:

θ 1 : = θ 1 − α ( p o s i t i v e n u m ) θ_{1} := θ_{1} - α(positive num) θ1:=θ1α(positivenum)

其中positivenum就是一个为整数的斜率。α也就是学习速率也是一个正数,所以我要使θ1减去一个东西,所以相当于我将θ1向左移,使θ1变小了。实际上我往这个方向移动,确实让我更接近那边的最低点:

在这里插入图片描述
所以梯度下降到目前为止似乎是在做正确的事。

让我们来看看另一个例子。我们用同样的函数J,同样再画出函数J(θ1)的图像。而这次我们把参数初始化到左边这点:
在这里插入图片描述
现在这一点切线的斜率,就是这个点的导数。但是这条线向下倾斜,所以这个点的导数是负数。因此,这个导数项小于等于零。所以当我更新θ时θ被更新为:

θ 1 : = θ 1 − α ( n e g a t i v e n u m ) θ_{1} := θ_{1} - α(negative num) θ1:=θ1α(negativenum)

这意味着我实际上是在增加θ1,因为这是减去一个负数,意味着给θ加上一个正数。因此,我们将增加θ1的值,这也让我更接近最小值了。

让我们接下来再看一看学习速率α:如果α太小或α太大,会出现什么情况。

这第一个例子:α太小会发生什么呢?
在这里插入图片描述
如果α太小了,那么我要做的是要去用一个比较小的数乘以更新的值。 所以如果我的学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点。所以如果α太小的话,可能会很慢。因为它需要很多步才能到达全局最低点。

那么如果α太大又会怎样呢?

如果α太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛。比如我们从一个已经接近最低点的点开始,由于导数是负数,因此指向右侧。但如果α太大的话,我会迈出很大一步。我的代价函数可能会离这个最低点越来越远。
在这里插入图片描述
现在我的导数指向左侧,实际上在减小θ,但是你看如果我的学习速率过大,我会移动一大步,从这点一下子又到那点了。如果我的学习率太大,下一次迭代又移动了一大步,越过一次又越过一次,一次次越过最低点。直到你发现实际上离最低点越来越远,所以如果α太大,它会导致无法收敛,甚至发散。

在这里插入图片描述
现在我还有一个问题,这问题挺狡猾的。当我第一次学习这个地方时 我花了很长一段时间才理解这个问题。如果我们预先把θ1放在一个局部的最低点,你认为下一步梯度下降法会怎样工作?
在这里插入图片描述
其实,如果你将θ1初始化在局部最优点,那么这一点的导数将等于0,因为那一点的切线是与x轴平行的,斜率为0。因此,在你的梯度下降更新过程中,所以θ1的变化过程为:
θ 1 : = θ 1 − α ∗ 0 θ_{1} := θ_{1} - α * 0 θ1:=θ1α0

所以这意味着你已经在局部最优点,它使得θ1不再改变。因此,如果你的参数已经处于局部最低点,那么梯度下降法更新其实什么都没做。它不会改变参数的值。这也正是你想要的,因为它使你的解始终保持在局部最优点。

局部最优点也解释了为什么即使学习速率α保持不变时,梯度下降也可以收敛到局部最低点。我们来看一个例子:
在这里插入图片描述
这是代价函数J(θ),我想找到它的最小值。首先在那个品红色的点初始化我的梯度下降算法,如果我更新一步梯度下降,它会带我到这个绿色的点,因为这个点的导数是相当陡的。现在,在这个绿色的点,再更新一步,你会发现我的导数(即斜率)相对于在品红色点是没那么陡的,对吧?因为随着我接近最低点,我的导数越来越接近零。所以,梯度下降一步后,新的导数会变小一点点。然后我想再梯度下降一步,在这个绿点我会用一个更小的一步到达新的红色点,这时更接近全局最低点了。因此这点的导数会比在绿点时更小。所以我再进行一步梯度下降时,我的导数项是更小的,θ1更新的幅度就会更小,所以你会移动更小的一步。随着梯度下降法的运行,你移动的幅度会自动变得越来越小,直到最终移动幅度非常小,你会发现已经收敛到局部极小值。所以回顾一下,在梯度下降法中,当我们接近局部最低点时 梯度下降法会自动采取更小的幅度,这是因为当我们接近局部最低点时,很显然在局部最低时导数等于零。所以当我们,接近局部最低时,导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度。所以实际上没有必要再另外减小α。

这就是梯度下降算法,你可以用它来最小化任何代价函数J。不只是线性回归中的代价函数J。在接下来的视频中,我们要用代价函数J回到它的本质:线性回归中的代价函数(也就是我们前面得出的平方误差函数)结合梯度下降法以及平方代价函数,我们会得出第一个机器学习算法即线性回归算法。

3 线性回归中的梯度下降

我们谈到关于梯度下降算法。梯度下降是很常用的算法它不仅被用在线性回归上和线性回归模型、平方误差代价函数。在这段视频中,我们要将梯度下降和代价函数结合,在后面的视频中我们将用到此算法,并将其应用于具体的拟合直线的线性回归算法里。

这就是我们在之前的课程里所做的工作:
在这里插入图片描述
左侧梯度下降法,这个算法你应该很熟悉。右侧是线性回归模型,还有线性假设和平方误差代价函数。我们将要做的就是:用梯度下降的方法 来最小化平方误差代价函数。为了达到梯度下降,我们需要的关键项 是这里这个微分项 :

∂ ∂ θ j J ( θ 0 , θ 1 ) \frac{∂}{∂θ_{j}}J(θ_{0},θ_{1}) θjJ(θ0,θ1)

通过之前学习的公式,带入之后,可以得出:

∂ ∂ θ j J ( θ 0 , θ 1 ) = ∂ ∂ θ j 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 \frac{∂}{∂θ_{j}}J(θ_{0},θ_{1}) = \frac{∂}{∂θ_{j}} \frac{1}{2m} \sum_{i=1}^{m} (h_{θ}(x^{(i)}) - y^{(i)})^{2} θjJ(θ0,θ1)=θj2m1i=1m(hθ(x(i))y(i))2

= ∂ ∂ θ j 1 2 m ∑ i = 1 m ( θ 0 + θ 1 ( x ( i ) ) − y ( i ) ) 2 = \frac{∂}{∂θ_{j}} \frac{1}{2m} \sum_{i=1}^{m} (θ_{0} + θ_{1}(x^{(i)}) - y^{(i)})^{2} =θj2m1i=1m(θ0+θ1(x(i))y(i))2

实际上我们需要弄清楚这两个偏导数项是什么:

j = 0 时 : ∂ ∂ θ 0 J ( θ 0 , θ 1 ) = ? j = 1 时 : ∂ ∂ θ 1 J ( θ 0 , θ 1 ) = ? j = 0 时: \frac{∂}{∂θ_{0}}J(θ_{0},θ_{1}) = ? \\ j = 1 时: \frac{∂}{∂θ_{1}}J(θ_{0},θ_{1}) = ? j=0:θ0J(θ0,θ1)=?j=1:θ1J(θ0,θ1)=?

其实根据上面的推导,我们很容易就能得出结果:

j = 0 时 : ∂ ∂ θ 0 J ( θ 0 , θ 1 ) = ∂ ∂ θ 0 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) j = 0 时: \frac{∂}{∂θ_{0}}J(θ_{0},θ_{1}) = \frac{∂}{∂θ_{0}} \frac{1}{2m} \sum_{i=1}^{m} (h_{θ}(x^{(i)}) - y^{(i)})^{2}= \frac{1}{m} \sum_{i=1}^{m} (h_{θ}(x^{(i)}) - y^{(i)}) j=0:θ0J(θ0,θ1)=θ02m1i=1m(hθ(x(i))y(i))2=m1i=1m(hθ(x(i))y(i))

j = 1 时 : ∂ ∂ θ 1 J ( θ 0 , θ 1 ) = ∂ ∂ θ 1 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ⋅ x i j = 1 时: \frac{∂}{∂θ_{1}}J(θ_{0},θ_{1}) = \frac{∂}{∂θ_{1}} \frac{1}{2m} \sum_{i=1}^{m} (h_{θ}(x^{(i)}) - y^{(i)})^{2}\\ = \frac{1}{m} \sum_{i=1}^{m} (h_{θ}(x^{(i)}) - y^{(i)})·x^{i} j=1:θ1J(θ0,θ1)=θ12m1i=1m(hθ(x(i))y(i))2=m1i=1m(hθ(x(i))y(i))xi

计算这些偏导数项需要一些多元微积分,如果你掌握了微积分你可以随便自己推导这些。但如果你不太熟悉微积分,别担心,你可以直接用这些已经算出来的结果。你不需要掌握微积分或者别的东西来完成作业,你只需要会用梯度下降就可以。
在我们算出这些微分项以后 这些微分项实际上就是代价函数J的斜率。现在可以将它们放回我们的梯度下降算法中:
在这里插入图片描述
所以这就是专用于线性回归的梯度下降。反复执行括号中的式子直到收敛。θ0和θ1不断被更新。

提醒一下:执行梯度下降时有一个细节要注意,就是必须要同时更新θ0和θ1。

所以让我们来看看梯度下降是如何工作的。我们用梯度下降解决问题的 一个原因是它更容易得到局部最优值。当我第一次解释梯度下降时,我展示过这幅图:

在这里插入图片描述
我们知道根据你的初始化的不同,你会得到不同的局部最优解。但是 事实证明,用于线性回归的代价函数,总是这样一个弓形的样子:
在这里插入图片描述
这个函数的专业术语是:凸函数(convex function)。

我不打算在这门课中给出凸函数的定义,但不正式的说法是它就是一个弓形的函数。因此这个函数,没有任何局部最优解,只有一个全局最优解。并且无论什么时候,你对这种代价函数使用线性回归,梯度下降法得到的结果,总是收敛到全局最优值。因为没有全局最优以外的其他局部最优点。

现在让我们来看看这个算法的执行过程:

像往常一样这是假设函数的图,还有代价函数J的图:
在这里插入图片描述
为了展示需要,在这个梯度下降的实现中,我们把θ0初始化为900,θ1初始化为-0.1。这对应的假设就应该是这样

h ( x ) = 900 − 0.1 x h(x)= 900 - 0.1x h(x)=9000.1x

现在如果我们进行梯度下降,在之前点的基础上向左下方移动了一小步,这就得到了第二个点。而且你注意到这条线改变了一点点,然后我再继续一步步进行梯度下降,左边这条线就会越来越拟合所有的点,直到它渐渐的收敛于全局最小值。这个全局最小值对应的假设函数给出了最拟合数据的解,这就是梯度下降法。
在这里插入图片描述
我们最终得到了房价数据的最好拟合结果,现在你可以用它来预测。假如你有个朋友,他有一套房子面积1250平方英尺(约116平米)。现在你可以通过这个数据,然后告诉他们,也许他的房子可以卖到35万美元。

实际上我们刚刚使用的算法,有时也称为批量梯度下降(Batch Gradient Descent)。”批量梯度下降”指的是在梯度下降的每一步中,我们都用到了所有的训​​练样本。在梯度下降中,在计算微分求导项时,我们需要进行求和运算。所以在每一个单独的梯度下降中,我们最终都要计算这样一个东西,这个项需要对所有m个训练样本求和。因此,“批量梯度下降法”这个名字说明了我们需要考虑所有这一”批”训练样本。事实上有时也有其他类型的“梯度下降法”不是这种”批量”型的,不考虑整个的训练集而是每次只关注训练集中的一些小的子集。在后面的课程中我们也将介绍这些方法。但就目前而言,应用刚刚学到的算法,你应该已经掌握了批量梯度算法并且能把它应用到线性回归中了。

这就是用于线性回归的梯度下降法。如果你之前学过线性代数,你应该知道有一种计算代价函数J最小值的数值解法,不需要梯度下降这种迭代算法。在后面的课程中,我们也会谈到这个方法。它可以在不需要 多步梯度下降的情况下也能解出代价函数J的最小值,这是另一种称为正规方程(normal equations)的方法。可能你之前已经听说过这种方法,但实际上在数据量较大的情况下,梯度下降法比正规方程要更适用一些。现在我们已经掌握了梯度下降,我们可以在不同的环境中使用梯度下降法。我们还将在不同的机器学习问题中大量地使用它。所以祝贺大家成功学会你的第一个机器学习算法!希望大家能让这些算法真正地为你工作。但在此之前,我还想先在下一组视频中告诉你“泛化的梯度下降算法”,这将使梯度下降更加强大。在下一段视频中我将介绍这一问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值