Gradien Descent
回顾
Loss function是一个function的function,他的input来自一个function,但我们也可以写成关于这个function的参数形式作为Loss function的input。我们要找一组参数θ,让Loss function越小越好。这件事就可以用Gradien Descent来做。
假设有两个参数{θ1,θ2}
随机取一个起始点θ0,他是一个向量
然后计算Loss function对θ上标0下标1和θ上标0下标2的偏导(反之是偏微分),再用θ上标0下标1和θ上标0下标2减去这个偏微分的值,得到一组新的参数:θ上标1下标1和2。
然后还是按照同样的步骤重复去计算得到新的参数。
把式子写的简单一点就是如下图,意义是一样的,▽L(θ)是一个向量,他代表的就是Gradien计算梯度。
图像化展示出来就是如下图,假设θ0,首先计算梯度Gradien,他的方向就是Loss的等高线的法线方向。
然后我们更新参数就是我们用计算出的Gradien乘上leanring rate学习频率再取负号加上θ0(也就是θ0减去计算出的Gradien乘上leanring rate学习频率),就得到新参数θ1。
然后按照这个步骤再反复计算下去,就得到了其他新的参数θ2,θ3…。算一次Gradien再决定要走的方向。
这个就是梯度下降Gradien Descent。
Gradien Descent的Tip
- 本段讲的是关于Gradien Descent的一些提示(技巧)。
Tip1:Tuning your learning rates(1.小心的调你的学习频率)
-
有时候learning rates学习频率是会给我们带来许多问题的
-
假设Loss function如下图,如果learning rates调的刚刚好的话,那么就如下图红线,到达最低点。如果learning rates调的太小的话,他可以到达最小点但是速度会非常非常慢,就如下图蓝色线。如果learning rates过大的话就如下图绿色线,太大的话就如下图黄色线。如果有很多维的参数,我们是无法进行可视化的(左图),但我们可以可视化参数的变化对Loss的影响,每次update参数的时候就可以看到Loss的变化如下图右边的二维坐标系。如果learning rates调的太小的话,Loss下降的非常慢,蓝色线。如果过调大的话就如绿色线,太大就如黄色线,红色线是刚刚好的。我们在做Gradien Descent的时候就要先把右图画出来,然后对learning rates进行调整。但是调learning rates很麻烦,有没有可以让他自动调呢?
-
每隔一段时间就把学习速度降低一些。
一开始,我们离目的地很远,所以我们使用更大的learning rates
经过了一段时间,我们离目的地越来越近了,所以我们的learning rates要变小(就好像PID)。
根据这个公式来进行η^t=η∕√(t+1)。
但我们的learning rates不可能是永远相等的,所以我们可以让每一个不同的参数都给他不同的learning rates。
那这件事怎么做呢?最简单的就是Adagrad自适应梯度算法
-
Adagrad自适应梯度算法
-
他的基本概念就是,在使用梯度下降进行求解Loss function时,每次求微分会得到一个新的越来越靠近最低点的,也就是最小的Loss function的值,而这个值所对应的在每次进行梯度下降时都会有一个新的参数对应,自适应梯度算法他的基本概念就是:用每次梯度下降求解的点所对应的的参数的learning rates除以之前算出来的偏微分值的均方根。
假设如下图,现在使用Gradien Descent求解的参数为w^ (t+1) = w^ t-η^t * g^ t,而自适应梯度算法之后在下一刻进行梯度下降时,结果就是w^(t+1) = w ^t-η ^ t/σ^t * g^t如下图所示。
σ^t :参数w之前的偏微分的均方根
g^t:是我们进行梯度下降时的偏微分的值
-
那怎么做到的?
现在我们进行自适应梯度下降,假设初始值为w0,要求下一时刻的值w1,所以我们计算在w0点的微分,记作g0,那么σ^t就是过去的微分值的平方根,就是g0的平方再开均根号。
那么继续进行自适应梯度下降的时候,也就是求w2,他就是计算在w1点的偏微分记作g1,那么σ^t就是过去的微分值的平方根,就是g0的平方加上g1的平方,再乘以二分之一再开根。
然后就反复如上过程。如下图所示。
简化Adagrad的式子,用n^ t与σ^ t的根号t+1约掉就成了下图中的式子。
Contradiction矛盾?
我们知道,在普通Gradien Descent梯度下降的时候的当g^t越大,也就是Gradien计算梯度值(微分后的值)越大,那么参数更新的越快。
但用在自适应梯度下降算法时,他的公式分母和分子都存在g^t(Gradien),当Gradien越大时,参数更新会越大,但分母会使参数更新的越慢,这样就有点矛盾了。
Tip2:Stochastic Gradient Descent(随机梯度下降法)
-
功能:加快训练速度
-
实现:假设Loss function如下图式子,那么进行Gradient Descent梯度下降他的参数的式子如下图所示,那我们使用Stochastic Gradient Descent随机梯度下降法时,他是每次取一个xn出来,然后估测Loss function误差函数。也就是他只考虑我现在的参数w对这个xn的y的估测值,然后用实际值减去这个y值来进行估测Loss function的值。他只算某一个example的Loss function的值,那么接下来在update参数的时候,他只考虑这一个example的Loss function的值,记作L上标n,代表只考虑第n个example的Loss function的值。那在算Gradient梯度的时候,他不是算所有参数求梯度的和,而是只算某一个Data example他的Loss function的Gradient梯度。在之前Gradient Descent的时候他是计算所有Data的Loss,然后再使用Update参数的这个函数更新参数。而Stochastic Gradient Descent随机梯度下降,他就是看一个example,他就update一个参数。
-
好处:原来的 Gradient Descent是查看所有example后更新参数,如下图左图所示。Stochastic Gradient Descent随机梯度下降是每看到一个example就更新一次参数,如下图右图所示。如果有20个x值,也就是20个example,他就更新20次参数。他是肯定要比前者出来的快的,因为每看一次就更新一次,而前者是要看完20次再更新,是比较快的。如果每个示例有20个示例,则更新速度要快20倍。
Tip3:Feature Scaling(特征缩放)
-
解释意思:假设现在做回归,假设他的function中的input Feature 输入特征有两个:x1和x2,假设x1是宝可梦进化前的cp值记作xcp,x2是宝可梦的生命值记作xhp。
如果x1和x2的分布是很分散的话,那么建议就对其进行Feature Scaling(特征缩放),比如x2的分布是远比x1大,那么就对x2进行Feature Scaling(特征缩放),使得x2和x1的分布都是比较小的,我们希望不同的特征他们的分布是一样的。
那为什么要这么做?举一个例子
如果x1可取的值是比较小的,x2可取的值是比较大的,那么根据这个function
我们就知道x1乘上w1,当w1有微小的变化时对y的值的变化影响是比较小的,但x2乘w2,当w2的值发生微小的变化对y值的变化时非常大的,因为x2input的值非常大。那么把他的Loss function图画出来就如下图左图所示。那么如果x1和x2的值很接近的话,那么就会使如下图右图所示。
这个是对做Gradient Descent梯度下降是有影响的。
在进行梯度下降对参数update的时候,会是如下图左图所示红色箭头进行求梯度。这样的椭圆形的做Gradient Descent梯度下降是比较难的,他需要斜着往最低点去,而且还可能出现错误。而如下图右图圆形求Gradient Descent梯度下降是比较简单的,无论从哪个方向进行Gradient Descent梯度下降,都会往圆心走。
那怎么做Feature Scaling?
-
实现
假设有R个example,对于每个维度的i,都去求这个维度的所有example的平均值和标准偏差,然后对第r个example(xr)的第i个元素减去所有Data的第i个元素的平均值,再除以所有Data的第i个元素的标准偏差,然后就得到所有维度的均值都是0,方差都是1。
Gradien Descent Theory(梯度下降的原理)
当我们进行梯度下降的时候,通过梯度下降的参数公式如下:
那我们每次更新参数时,得到的Loss function的值都会变小吗?
其实不一定,有时候不见的会下降,也不一定是程序的问题。
先不管Gradien Descent,先考虑现在的问题:假如我要解一个Loss function。
他的原理就是:给定一个初始点θ0,给定一个点,画一个范围,然后找出他的最低点,我们可以很容易地找到它附近的最小值点,我们就更新点为θ1,再画一个以θ1为圆心再画一个圈,然后就找到这个圆圈的最小点。
那问题就是怎么在红色的圈圈里面找一个可以让Loss最小的参数呢?这就要从Taylor series泰勒级数开始说起。
Taylor series泰勒级数
-
泰勒级数的定义:令h(x)是在点x=x0具有任意阶导数,那么就可以吧h(x)写成如下图的样子:
那么当x很接近x0的时候,那x-x0就会远大于(x-x0)²,也就会远大于(x-x0)³…
所以我们就可以把后面的高次项给删掉,所以当x很接近x0的时候,h(x)就可以写成如下图所示的样子
-
举个例子:假设泰勒级数h (x) = sin(x),周围的x0 =π/ 4,那么sin(x)就可以写成如下图,画出来的话就可以参考如下图:
如上图可以看出如果x很接近四分之π的话,那后面的项就可以忽略他们。
那么当h函数是个多变量的话,且x和y分别接近于x0和y0的话,同样也可以省略高次项
那如果我们现在考虑Gradien Descent的话,也就是回到之前的问题,如果给我一个点,在周围 画一个圆圈,点就是圆圈的圆心,那么在红色的圆圈内,当a接近于θ1和当b接近于θ2时,我们可以把Loss function用泰勒级数做简化。我们可以把L(θ)写成如下图所示
再分别用符号代替如下图
u和v就是本节开始说的:▽L(θ)是一个向量,他代表的就是Gradien计算梯度。
然后我们算出这个L(θ)就得出红色圈圈最小的Loss值了
计算过程:直接利用圆的性质,最边缘点就是最小的Loss值,到圆心的距离就可以列出一个式子。
现在我们设出△θ1和△θ2
然后L(θ)就列成了下面的式子
现在假设△θ1和△θ2是一个向量,u和v是一个向量(偏导)
那我们要怎么样选择△θ1和△θ2让L(θ)最小呢?,只需要和向量u,v相反(与本节开始相对应,先进行计算Gradien,然后确定方向,这个方向就是与其相反的方向),然后把△θ1和△θ2长度增长,长到可以到达红圈的边缘就找到了△θ1和△θ2,下式中的n就是learning rate,表示可调整的长度。
那怎么找到边缘的点θ1和θ2呢,就可以通过原点减去这个向量得到。
所以我们接下来要做的事就是把u和v代入即可。
我们发现这就是Gradien Descent的式子。
但前提是上面的泰勒式子是成立的。也就是红色的圈圈要小,而learning rate是和红色圈的半径成正比 的。如果红圈(learning rate)不够小就不成立。
所以说learning rate没设好,就会导致泰勒级数不成立。
我们发现这个泰勒级数我们考虑的是个一次式,那么可以考虑二次式吗?
你可以考虑二阶项,例如牛顿法。
-
Gradien Descent的限制
1.他会卡在local minma的地方(第二节就讲过),就停止更新参数了
2.他也可能会卡在微分值为0的地方。
3.他也会卡在一个微分值很小很小的地方,但他却不是最低值,所以就停下继续梯度下降了,停止参数更新了。
-
易忘知识点
- Gradient Descent梯度下降的目的是求解最小的Loss function,那么要做的就是不断进行对参数求偏导(如果有多个参数也是这样),求到最小的偏导也就找到了最小的参数那个点,对应代入到Loss function中就得出来了。(而Loss function是通过Training Data训练数据中的出来的(误差函数嘛,就是通过训练数据的实际进化后的CP值是y,用y与function所预测的进化后的cp值做差——欧氏距离)),这就是Gradient Descent梯度下降的目的。