Gradient Descent

//李宏毅视频官网:http://speech.ee.ntu.edu.tw/~tlkagk/courses.html                                                    点击此处返回总目录

//邱锡鹏《神经网络与深度学习》官网:https://nndl.github.io

 

 

 

今天要讲的是Gradient descent,Gradient descent 已经大概讲过怎么做了。但是有一些小技巧你可能是不知道的。所以我们要再详细说明一下Gradient descent,你要怎么把它做得更好。

 

-------------------------------------------------------------------------------------------------------------------------------

我们上次是这样说的,在整个machine learning的第三个步骤,我们要找一个最好的function。找一个最好的function这件事呢,是要解一个optimization problem。也就是在第二步的时候,我们定义了一个Loss function ,L。这个Loss function 呢,是function的function。你把一个function带到这个Loss function里面,或者你把一个操控function形状的参数(这里写作)带到Loss function里面,就会得到这组参数有多不好。那接下来要做的事情呢,就是找一组参数,让Loss function 越小越好。

 

                      Gradient Descent_第1张图片

那这件事情怎么做呢?可以用Gradient descent。

假设这个参数的set,里面有两个参数。首先随机选取起始的点,随机选取一组起始的参数,写成:。用上标0表示初试的那一组参数,用下标代表说这是这一组参数里面的第几个component。接下来计算偏微分。然后更新。然后这个步骤反复不断地进行。这个就是Gredient descent.

                          

如果你想要写的更简洁一些,假设你现在有两个参数,你可以这样写:

                            

把L对参数求偏微分,然后把两个偏微分放在一起,组成一个向量。这个向量就叫做梯度。

所以,可以把更新过程简写为:

                         

-------------------------------------------------------------------------------------------------------------------------------

如果把它virtualize的话呢,他看起来是这个样子:

首先初始,随机找两个参数:

                                   Gradient Descent_第2张图片

然后计算这个点,对Loss function的梯度。假设梯度是红色的箭头。Gradient是一个向量。如果你不知道gradient是什么的话,你就想成它是等高线的法线方向。如果你把Loss function 的等高线画出来的话呢,这个红色的箭头指的方向就是等高线的法线方向。

 

                                   Gradient Descent_第3张图片

 

那怎么update参数呢?你就把这个gredient乘上learning rate。再取一个负号,就是这个蓝色的箭头。再加上,就得到

                                   Gradient Descent_第4张图片

然后这个步骤就反复地进行下去,再计算一遍梯度,得到另外一个红色的箭头,走的方向是红色箭头相反的方向。一直进行下去。算一次Gredient,决定要走的方向。。。

                                 Gradient Descent_第5张图片

 

-------------------------------------------------------------------------------------------------------------------------------

以上的这些,我们其实都讲过了。接下来呢,讲一下gradient descent的tips。第一个呢是,你要小心地调你的learning rete。

                                             

如果你已经开始做作业1的话呢,你会知道说,learning rate 有时候会给你造成一些问题的。举例来说,下面是Loss function的曲线,长这个样子。

如果你的learning rate 调的刚刚好的话,你从左边开始,顺着红色的箭头可以很顺利地走到最低点。

                                          Gradient Descent_第6张图片

可是,如果learning rate 调的太小的话,会变得非常慢。虽然,实际上给它足够的时间,它终究会走到local minimum的地方。但是,如果他走得太慢的话,你会没有办法接受这件事。

                                          Gradient Descent_第7张图片

如果,今天这个learning rate 调的稍微大一点。像绿色这个箭头的话,那就变成说呢,它的步伐太大,它变得像个巨人一样,它永远没有办法走到这个特别低的地方。它都在这个山谷的口这个地方震荡。它永远走不下去。

                                          Gradient Descent_第8张图片

甚至,如果今天你把learning rate 调的太大的话,它可能就一瞬间就飞出去了。结果你update参数以后,loss function反而越来越大。

                                          Gradient Descent_第9张图片

其实是只有你的参数在一维或者二维的时候,你才能画出这样的图。如果你有很多维的参数,error 在一个高维的空间里面,你是没有办法visualize它的。但是有另外一个东西,你是可以visualize的。什么东西呢,你可以visualize参数的变化对loss的变化。你可以visualize每次参数update的时候,Loss的改变的情形。所以如果你今天learning rate设置的太小的话,你就会发现,Loss下降的非常非常慢。

                                        Gradient Descent_第10张图片

如果,你今天learning rate调的太大的话,在前面的图也可以看到,loss 先快速的下降,接下来就卡住了。画出图来,是下面绿色的线,Loss很快就下降了,然后很快就卡住了。

                                       Gradient Descent_第11张图片

如果,你的learning rate 调的过于大了,你会发现你的loss直接就飞出去了。

                                       Gradient Descent_第12张图片

你需要调整他到刚刚好。你才能得到一个好的结果。

                                       Gradient Descent_第13张图片

所以你在做gradient descent 的时候,你应该要把这个图画出来,没有把这个图画出来会非常非常的卡。有的人反正就把gradient descent的式子写好,写好就开始跑,跑完之后就会说,结果烂掉了,他也不知道烂在哪里。

所以在做gradient descent的时候,你应该把这张图画出来。你要看一下它前几次update参数的时候,它update的走法是什么样子,搞不好它一下子就爆炸了,你就知道你赶快调learning rate。你要确定它是在稳定的下降。

-------------------------------------------------------------------------------------------------------------------------------

但是要调learning rate很麻烦,有没有办法自动地调learning rate呢?有一些自动的方法可以帮我们调learning rate。

 

最基本的而简单的大原则是,通常learning rate是随着参数的update会越来越小的。为什么会这样呢?因为当你在刚开始的起始点的时候,通常是离最低点是比较远的,所以步伐要踏大一点,走得快一点才能走到最低点。但是呢,经过好几次的参数的update以后呢,你已经比较靠近你的目标了,所以这个时候你就应该减小你的learning rate,让他能够收敛在最低点的地方。举例来说,你的learning rate的设法可以这样:,learning rate 是一个t的函数,在第t次update你的参数的时候,为常数除以根号t+1,这样当update的次数越多,learning rate越小。

 

                           Gradient Descent_第14张图片

 

但是光这样呢,是不够的。我们需要因材施教。所以,最好的状况应该是,每个不同的参数都给他不同的learning rate。

                            Gradient Descent_第15张图片

 

-------------------------------------------------------------------------------------------------------------------------------

这件事情呢,是有很多小的技巧的。其中,我觉得最容易最简单的叫做,Adagrad。

Adagrad是这样子的,他说呢,每一个参数的learning rate都把它除以之前算出来的微分值的root mean square(均方根).

                             

什么意思呢?我们原来的gradient descent是这样:

                             Gradient Descent_第16张图片

                      其中,

                               

假设W呢,是某一个参数。现在的w不是一组参数,而是我们只考虑一个参数。因为我们现在在做Adagrad,adagrad的每一个参数都有不同的learning rate,所以呢,我们要把每一个参数都分开来考虑。w是一个参数,w的learning rate,在一般的gradient descent中,可能就给他一个depend on 时间的值,比如说 。但是,你可以把这件事情做得更好:

                            Gradient Descent_第17张图片

在adagrad里面呢,你把除以是过去所有的微分的值的均方根。这个值对每一个参数而言,都是不一样。所以现在变成说,不同的参数,他的learning rate都是不一样的。

我们来实际举一个例子,来看这件事情是怎么做的。

假设初始的值是w0,接下来计算w0点的微分g0。他的learning rate是什么呢,是是一个时间depend的参数,呢是,过去所有微值的均方根。在这里,之算过一个,所以是根号g0的平方。以此类推。

                             Gradient Descent_第18张图片

所以呢,我们用adagrad的时候呢。他update的式子呢,可以写成下图中上式子。但是发现,分子分母都可以约掉根号t+1。所以式子可以化简。

                                       Gradient Descent_第19张图片

-------------------------------------------------------------------------------------------------------------------------------

这个方法你可以接受么?大家有问题么?

Adagrad他的参数uptate其实是越来越慢的。如果不喜欢这个结果的话,有很多比这个更强的方法。Adaptive learning rate其实是一些列的方法,今天将的adagrad其实是里面最简单的。有很多其他的,差不多都是用“ada-”开头这样。所以,如果你用别的方法,比如adam,它就比较不会有这样的情形。如果,其实你没有什么特别的偏好的话,其实你可以用adam,他现在应该是我觉得最稳定的。但是他的实现比较复杂,但是其实也没有特别复杂。

 

大家还有什么问题么?

好,我其实是有一个问题。我们在做一般的gradient descent的时候,我们参数的update取决于两件事情,一件事情是learning rate,另外一件事情是gradient。我们一直说,gradient越大,参数update的就越快。我相信你可以接受这件事情。但是在adagrad里面,你不觉得相当矛盾么,有些怪怪的地方。右边一项说,微分的值越大,参数update的越快。但是下面一项是相反的,当微分越大的时候,底下算出来的这一项越大,参数update的步伐越小。这不就跟我们原来要做的事情有所冲突的么?分子说gradient越大,参数update越大,分母说gradient越大,参数update的越小。好,怎么解释这件事情呢?

 

有一些paper是这样解释的。这个adagrad想要考虑的是,今天这个gradient有多surprise,也就是所谓的“反差”。反差大家都知道么。反差就是如果本来很凶恶的角色,突然对你很温柔这样子,就会觉得特别温柔。对gradient来说,也是一样的道理。假设有某一个参数,他在刚开始参数gradient为0.001,之后是0.001,0.003,。。到某一次呢,gradient算出来是0.1,你就觉得特别大。因为比之前的gradient算出来大了100倍。但是,如果有另外一个参数,他一开始算出来是10.8,然后是20.9,31.7,...但是,在某一次呢,他算出来是0.1,这时候就会觉得他特别小。所以为了强调这种反差的效果,所以在adagrad里面呢,我们就把它除以根号平方和这一项。这一项呢,就是把过去的gradient的平方和算出来,这样就知道过去gradient有多大,然后相除,看看反差有多大。【这一块没听懂】

                           Gradient Descent_第20张图片

 

上面是直观的解释。更正式的解释呢,我有这样的解释:

我们来考虑一个二次函数,这个二次函数为,它只有一个参数x。求微分为2ax+b。最低点在-b/2a。高中就学过。

                                     Gradient Descent_第21张图片

 

如果,今天呢,在这个二次函数上,随机地选一个点开始,要做gradient descent。那你的步伐踏出去多大是最好的呢?假设起始点是x0,最低点是-b/2a。那踏出去的一步最好的步伐其实就是这两个点之间的距离,因为如果踏出去的距离是这两个点之间的距离的话,就一步到位了。这两个点之间的距离就是x0+b/2a,整理一下就是(2ax0+b)/2a。

                                    Gradient Descent_第22张图片

分子2ax0+b就是导数这一项。就是x0这一点的微分。所以,gradient descent 听起来很有道理,就是说,如果我今天算出来的微分越大,我就离最低点越远,如果我踏出去的最好的步伐是跟微分的大小成正比。

                                    Gradient Descent_第23张图片

所以呢,如果踏出去的步伐跟微分成正比,他可能是最好的步伐。但是呢,这个事情是在只考虑一个参数的时候才成立。如果我们今天呢,我们要同时考虑好几个参数,这个时候呢,刚才的论述就不见得成立了。也就是说,gradient的值越大,就跟最低点的距离越远,这一件事情,在有好多个参数的时候,是不一定成立的。

比如,我们考虑w1和w2这两个参数。这个图上的颜色是他的loss.如果我们考虑w1的变化,我们就在这个蓝色这条线切一刀。我没看到error的surface(表面)长这样。如果比较图上的a点和b点,确实a点的微分值比较大,它离最低点比较远。

                          Gradient Descent_第24张图片

 

我们考虑w2这个参数,在绿色这条线上切一刀。我们得到的值是这样子。得到的error surface是这样。它是比较尖的,谷是比较深的。w2在这个方向的变化是比较猛烈的。如果我们只比较这根线上的两个点c跟d的话,确实c的微分比较大,距离最低点比较远。  

                         Gradient Descent_第25张图片

但是如果今天比较跨参数的话,如果我们比较a点和c点,我们比较a这个点对w1的微分和c这个点对w2的微分。这个结论呢,就不成立了。虽然说c这个点的微分值是比较大的,a点的微分值是比较小的,但是c离最低点是比较近的,a离最低点是比较远的。所以,更新参数跟微分的值成正比,这样的论述是在没有考虑跨参数的情境下才成立的。当我们同时考虑好几个参数的时候,我们这样想呢,就不足够了。

所以我们今天要同时考虑好几个参数的时候,我们要怎么想呢?我们看刚才的最好的步伐,除了分子之外,分母还有2a,这个2a是什么呢?如果把y做二次微分,就会得到2a。所以今天最好的step他不只是要正比于一次微分,他同时要和二次微分的大小成反比。

                                    Gradient Descent_第26张图片

 

所以,最好的step他要把二次微分考虑进来。如果今天把二次微分考虑进来,会发现,在w1这个方向上,二次微分是比较小的。因为第一个抛物线比较平滑。在w2这个方向上,这个抛物线是比较深的谷,它的二次微分是比较大的。所以光比较a和c的微分值是不够的。你要比较a的微分值除以它的二次微分 跟 c的微分值除以它的二次微分 来比较。这样才能真正显示这些点跟最低点的真正距离。在a点,他的微分是比较小的,但是他的二次微分也是比较小的;在c点处,他的微分是比较大的,但是他的二次微分也是比较大的。

 

                           Gradient Descent_第27张图片

好,这件事情,跟adagrad的关系是什么呢?

如果你把adagrad的式子列出来的话,参数的update的量是左边这个样子。是一个常量,所以不理他。就是一次微分。下面这个所有过去微分值的平方和再开根号,它想要代表的就是二次微分。你可能会说,怎么不直接算二次微分呢?确实可以做二次微分,但是有时候你会遇到的状况是,参数量大,data多,可能算二次微分要花很长的时间。有时候这样的结果是你不能承受的。而且多花时间不一定效果好。adagrad的做法就是,我们在没有增加任何额外运算的前提之下,想办法能不能做一件事情去估一下二次微分是多少。在adagrad里面,只需要一次微分的值,而这个本来就是要算的,所以没有多做多余的任何运算。

                           Gradient Descent_第28张图片

那怎么做呢?如果我们考虑一个二次微分比较小的峡谷跟一个二次微分比较大的峡谷。他们的一次微分为下面的图。

如果只是随机sample一个点,算他的一次微分的话,你看不出来他的二次微分的值是多少。

                             

但是,如果你sample够多点,你就会发现说,在比较平滑的峡谷里面,他的一次微分通常是比较小的;在比较尖的峡谷里面,他的微分通常是比较大的。而adagrad中过去微分值的平方和再开根号,就相当于sample的这些点做平方和再开根号,就反映了二次微分的大小。adagrad怎么做,我们上次有示范过,就不在示范了。

                               Gradient Descent_第29张图片

-------------------------------------------------------------------------------------------------------------------------------

接下来,我们要讲的另外一件事情呢,是stochastic gradient descent (随机梯度下降)。他可以让你的training 更快一点。

                                         Gradient Descent_第30张图片

这个怎么说呢,我们之前的Regression里面讲,Loss function 长这样:

                                       Gradient Descent_第31张图片

这个式子非常合理,我们本来就应该考虑所有的sample。有了这些以后,就可以做gradient descent。但是stochastic gradient descent 它的想法就不一样,它每次就拿一个example xn出来(你可以按照顺序去,也可以随机取。),然后计算Loss,Loss呢,只考虑一个example。不做summation了。我们写作L上标n,表示考虑第n个example的Loss function。接下来呢,在update参数的时候,你只算L上标n的gradient。然后就很急躁的update参数了。所以在原来的gradient  descent里面,要计算所有data的loss,然后再update参数。但是在随机梯度下降法里面,你看一个example就更新一下参数。这有啥好呢?听起来好像没有什么好的。

                                        Gradient Descent_第32张图片

那我们来实际操作一下。

                     Gradient Descent_第33张图片

我们看到的图呢,可能是这样。原来的gradient descent,看完一遍example之后,就更新一遍参数。你会发现他是比较稳定的,他走的方向就是按照gradient descent 建议我们的方向来走。但是如果你是随机梯度下降的话,你每看一个example,你就update一次参数,如果你有20个example的时候,那你就update20次参数。所以当左边update一次的时候,右边已经update20次参数。右边,如果只看一个参数的话,他的步伐是小的,而且可能是散乱的,因为你每次只考虑一个example,他update的方向跟gradient descent 的tool Loss的error surface建议我们的方向不见得是一致的,但是因为我们可以看很多个example,左边走一步的时候,右边已经走了20步了,所以他走得反而是比较快的。

 

-------------------------------------------------------------------------------------------------------------------------------

接下来,我们讲的是第三个,就是你可以做feature scaling(特征归一化)。

                              

所谓的feature scaling的意思呢,是这样。假设现在我们要做Regression,那我们这个Regression 的function中input的feature有两个x1和x2。如果x1和x2他们的分布的range很不一样的话,那就建议你把他们做scaling。把他们range的分布变成是一样的。举例来说,x2他的分布呢,是远比x1大的。那就建议你呢,把x2做一下scaling,把他的值呢缩小,让x2的分布跟x1的分布是比较像的。希望不同的feature他们的scaling是一样的。

 

                            Gradient Descent_第34张图片

 

为什么要这么做呢?我们举一个例子。假设下面是我们的Regression的function。写成这样跟意思是一样的。

                                    Gradient Descent_第35张图片

假设x1平常的值都是比较小的,比如说1啊,2啊之类的。假设x2平常的值都很大,都是100啊,200啊之类的 。那把Loss的surface画出来,会遇到什么状况呢?你会发现,如果你更改w1和w2的值,假设你把w1和w2的值都做一样的变动,都加个daita w,你会发现w1的变化对y的变化是比较小的。w2的变化对y的变化而言是比较大的。这个是很合理的,因为你要把w2乘上100,200这些值,而w1乘上1,2这些值。如果w2乘上的这些值是比较大的,w2只需要做小小的变化,y就变化很大。所以把Loss的surface画出来,可能是下面这个样子:

                            

这个图呢,是什么意思呢?因为w1的变化的y的影响比较小,所以w1就对Loss的影响比较小。所以w1对Loss是有比较小的微分的。所以在w1这个方向上是比较平滑的。w2对y的影响比较大,所以对Loss的影响比较大。改变w2的时候对loss的影响比较大,所以在w2的方向上是比较sharp的,在w2这个方向上有一个比较尖的峡谷。

 

如果x1和x2他们的scale是接近的。如果你把Loss画出来的话呢,他就会比较接近圆形,因为w1和w2呢,对Loss是有差不多的影响力的。

                                 Gradient Descent_第36张图片

那这个对做gradient descent 会有什么样的影响呢?是会有影响的。比如从某个点开始,这种长椭圆的error surface,如果你不出些adagrad之类的方法,很难搞定它。因为在不同的方向上你会需要不同的learning rate,同一组learning rate你会搞不定他,一定要各自的learning rate才能搞定。所以没有scaling的时候,它update参数是比较难的。但是,如果你有scaling的话,他就变成正圆形。正圆形的时候,update参数就会变得比较容易。而且,你知道gradient descent并不是向着最低点走的,update的时候是顺着等高线的方向,是顺着gradient建议我们的方向。左边的图,虽然最低点在中间,但是不会指向最低点去走。但是右边的图呢,就不一样,如果是正圆的话,不管在区域的哪一个点,他都会向着圆心走。所以,如果有做scaling,在update参数的时候,是会比较有效率。

 

                            

那怎么做scaling?方法有千百种。选一个你喜欢的就是了。常见的做法是这样的。假设我有R笔example,x1到xR。每一笔example里面都有一组feature。

                    Gradient Descent_第37张图片

那怎么做feature scaling,你就对每一个dimension i,都去算他的mean,写成mi;都去算他的stand deviation,写成

 

                     Gradient Descent_第38张图片

然后对每一个example,比如第r个example的第i个component,减掉mi,再除以。做完这件事以后,所有dimension的mean就是0,variance就会是1。

 

                    Gradient Descent_第39张图片

这就是常见的做normalization的方法。

-------------------------------------------------------------------------------------------------------------------------------

最后,我们来讲一下为什么gradient descent他会work。他背后的理论基础是什么。

                                 Gradient Descent_第40张图片

在真正深入数学部分之前呢,我们来问大家一个问题。大家都已经知道gradient descent是怎么做的。假设,问一个判断题。每一次我们在update参数的时候,我们都得到一个新的。这个新的总是会让我们的Loss比较小么?

 

                             Gradient Descent_第41张图片

答案:update参数以后,Loss不见得会下降的。

-------------------------------------------------------------------------------------------------------------------------------

在解释theory之前。首先声明一下,这一部分就算你没有听懂,也没有关系,太阳明天已经回升起。

好,我们先不要管gradient descent。假设你要解一个问题,你要在图上找他的最低点。你到底应该怎么做。有一个这样的做法,如果今天给我一个起始的点,也就是,我们有方法在起始点的附近画一个圆圈,画一个范围,然后在红色圈圈里面,找出他的最低点,比如在边上。这个的意思是说,如果你给我一整个error function,我没有办法立刻告诉你说它的最低点在哪里。但是,你给我一个error function加上一个初试的点,我会告诉你,在这个初试点的附近,画一个范围之内,找出一个最小的点。

                           Gradient Descent_第42张图片

假设找到最小的值之后,我们就更新我们的中心的位置,把中心的位置挪到。接下来,再画一个圆圈,我们可以在这个圆圈范围之内,再找一个最小的点,假设落在上面这个地方。

                           Gradient Descent_第43张图片

然后再更新中心的位置到这个地方。然后再找范围内最小的点。。。就这样更新下去。

                             Gradient Descent_第44张图片

那现在的问题就是,怎么很快地,在红色的圈圈里面,找一个可以让Loss最小的参数呢?怎么做这件事情呢?

这个地方就要从泰勒公式说起。

-------------------------------------------------------------------------------------------------------------------------------

在讲之前,我首先补充一下高数里面泰勒公式的内容。

                               Gradient Descent_第45张图片

-------------------------------------------------------------------------------------------------------------------------------

泰勒公式说,任何一个function h(x),如果在x0点,是无限可微的。那可以把h(x)写成以下这个样子:

 

                              Gradient Descent_第46张图片

当x很接近x0的时候,(x-x0)就远大于(x-x0)的平方。所以就可以把后面的高次项删掉。

                              

下面一个例子,假设h(x)=sin(x).在x0=pi/4时。sin(x)可以写成以下式子。如果把这些项画出来的话是下图这个样子。如果只考虑一项的话就是直线;如果考虑2项的话,就是直线;考虑3项的话就是抛物线。在pi/4附近,就可以用一次的来代替。

 

                            Gradient Descent_第47张图片

-------------------------------------------------------------------------------------------------------------------------------

泰勒series也可以有好几个参数的。如果有好几个参数,就可以这样做:

 

                            

-------------------------------------------------------------------------------------------------------------------------------

回到刚才的问题,怎么在红色的圈圈里面,找一个可以让Loss最小的参数呢?

如果今天给我一个中心点(a,b),那我画一个很小很小的圆圈。在这个红色圆圈的范围之内,我其实可以把Loss function泰勒展开。

                           Gradient Descent_第48张图片

L(a,b)就是一个常数,两个偏微分也是常数。我们用s,u,v来替换:

                             Gradient Descent_第49张图片

那么就得到:

                              

这样能不能秒算哪一个让Loss最小呢?我们还是来解一下。

我们的问题是,在红色圈圈里面找让Loss最小。

                             

在红色圈圈的意思就是:

                            

我们用来表示。s的值不影响Loss的变化,可以化简掉。

                          Gradient Descent_第50张图片

这样Loss就变成了两个向量的乘积:

                            

画成图就是:

                        Gradient Descent_第51张图片

那向量取什么值才能让乘积最小呢?显然,只有当向量与向量方向相反且长度为d(即长到红色圈圈边缘)时,乘积才最小:

                        Gradient Descent_第52张图片

所以:

                         Gradient Descent_第53张图片

                        其中,用来调节长度,使得长度刚好低到红色圈圈的边边。

代回得:

                       

代回u,v得:

                  Gradient Descent_第54张图片

这个式子,发现其实就是gradient descent。我们做gradient descent 就是找一个初始值;然后算初始值地方的偏微分,把它排成一个向量,就是gradient;最后乘以一个learning rate ;再把它减掉。

所以这个式子就是gradient descent。

-------------------------------------------------------------------------------------------------------------------------------

注意1:

我们可以用上面的方法来找一个最小的Loss(即,我们可以用gradient descent的方法来做),有一个前提就是

这个式子要成立。

只有当今天画出来的圈圈够小的时候,泰勒公式才成立。

                

这就告诉我们说,红色圈圈的半径要够小。而learning rate 跟红色圈圈的半径是成正比的。因此learning rate不能太大。learning rate 要无穷小,式子才成立。所以gradient descent 你要让你的Loss都越来越小的话,理论上你的learning rate要无穷小,才能保证这件事情。实际操作上只要够小就行了。

所以,如果你的learning rate 没有设好,是有可能你每次update 参数的时候,这个式子是不成立的,所以导致没有办法让loss越来越小。

 

注意2:

你会发现说,它只考虑了泰勒公式的一次式。可不可以考虑二次式呢?

是可以的,有一些方法比如牛顿法。但是在实际上,尤其是你在做deep learning的时候,这些方法并不见得太普及,太实用。

因为你要算二次微分,甚至还会算海森矩阵,总之会多很多运算。而这些运算你在做deep learning的时候呢,你是无法承受的。用这个运算来换,update的时候比较有效率,是不划算的。所以,要做deep learning的时候,gradient descent还是比较主流的做法。

 

-------------------------------------------------------------------------------------------------------------------------------

最后要讲一下gradient descent的限制。

有一个大家都知道的,就是它会卡在局部最小值的地方。如果下图是你的error surface,从左边的点开始更新参数,最后走到一个微分值是0,也就是local minimum的地方,参数就不更新了。

                         Gradient Descent_第55张图片

 

一般人都知道上面这个问题,其实还有别的问题。事实上,微分值是0的地方不一定只有local minimum。saddle point(鞍点)的微分值也是0。不是local minimum 但是微分值是0,也是有可能发生的。

                         Gradient Descent_第56张图片

其实在local minima或者是saddle point都是幻想,真正的问题是,并不是算出来微分值正好等于0的时候停下来的,而是微分值小于一个很小的值就停下来了。你怎么知道微分值算出来很小的时候,就很接近local minimum呢?不见得接近。有可能算出来很小,但是在一个高原的地方,觉得是在local minimum。因为很少有机会算出来正好是0.

                         Gradient Descent_第57张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(15,机器学习)