Gradient Descent

笔记对应的课程链接
详细介绍Gradient Descent

Review

前面预测神奇宝贝CP值的例子中,已经初步介绍了Gradient Descent的用法
 
李宏毅__ML_Notes_4.21
 
下图是将gradient descent在投影到二维坐标系中可视化的样子,图上的每一个点都是(θ1,θ2,loss)\left(\theta_1,\theta_2,loss \right)在该平面的投影。
 
红色箭头是指在(θ1,θ2)\left(\theta_1,\theta_2\right)这点的梯度,梯度方向即箭头方向(从低处指向高处),梯度大小即箭头长度(表示在θi\theta^i点处最陡的那条切线,该方向也是梯度上升最快的方向)。
 
蓝色曲线代表实际情况下参数θ1\theta_1θ2\theta_2的更新过程图,每次更新沿着蓝色箭头方向loss会减小,蓝色箭头方向与红色箭头方向相反,代表着梯度下降的方向
 
李宏毅__ML_Notes_4.21
 
因此,在整个gradient descent的过程中,梯度不一定是递减的(红色箭头的长度可以长短不一),但是沿着梯度下降的方向,函数值loss一定是递减的,且当gradient=0时,loss下降到了局部最小值,总结:梯度下降法指的是函数值loss随梯度下降的方向减小

Tip1:Turning your learning rates

gradient descent过程中,影响结果的一个很关键的因素就是learning rate的大小,不能太大也不能太小。
 
李宏毅__ML_Notes_4.21
 
当参数有很多个的时候(>3),其实我们很难做到将loss随每个参数的变化可视化出来(因为最多只能可视化出三维的图像,也就只能可视化三维参数),但是我们可以把update的次数作为唯一的一个参数,将loss随着update的增加而变化的趋势给可视化出来(上图右半部分)。

所以做gradient descent一个很重要的事情是,要把不同的learning rate下,loss随update次数的变化曲线给可视化出来,它可以提醒你该如何调整当前的learning rate的大小,直到出现稳定下降的曲线。

Adaptive Learing Rates

最基本、最简单的大原则是:learning rate通常是随着参数的update越来越小的

因为在起始点的时候,通常是离最低点是比较远的,这时候步伐就要跨大一点;而经过几次update以后,会比较靠近目标,这时候就应该减小learning rate,让它能够收敛在最低点的地方

举例:假设到了第t次update,此时ηt=η/t+1\eta^t=\eta/\sqrt{t+1}。这种方法使所有参数以同样的方式同样的learning rate进行update,但是最好的状况是每个参数都给他不同的learning rate去update。

Adagrad

Divide the learning rate of each parameter by the root mean square(方均根) of its previous derivatives

Adagrad就是将不同参数的learning rate分开考虑的一种算法。
 
李宏毅__ML_Notes_4.21
 
这里的w是function中的某个参数,t表示第t次update,gtg^t表示Loss对w的偏微分,而σt\sigma^t是之前所有Loss对w偏微分的方均根(根号下的平方均值),这个值对每一个参数来说都是不一样的,如下
 
李宏毅__ML_Notes_4.21
 
由于ηt\eta^tσt\sigma^t中都有1t+1\sqrt{\frac{1}{t+1}}因子,两者相消,即可得到Adagrad的最终表达式:
wt+1=wtηi=0t(gi)2gt(1)w^{t+1}=w^t-\frac{\eta}{\sum_{i=0}^t (g^i)^2} \cdot g^t\tag{1}

Contradiction
式(1)有一件很矛盾的事情:我们在做gradient descent的时候,希望的是当梯度值即微分值越大的时候(此时斜率越大,还没有接近最低点)更新的步伐要更大一些,但是Adagrad的表达式中,它是用商来表示步伐

那么Adagrad要考虑的是,这个gradient有多surprise,即反差有多大,假设t=4的时候g4g^4与前面的gradient反差特别大,那么gtg^ti=0t(gi)2\sqrt{\sum_{i=0}^t(g^i)^2}之间的大小反差就会比较大,它们的商就会把这一反差效果体现出来,如下图
 
李宏毅__ML_Notes_4.21
 
gradient越大,离最低点越远这件事情在有多个参数的情况下是不一定成立的

如下图所示,w1和w2分别是loss function的两个参数,loss的值投影到该平面中以颜色深度表示大小,分别在w2和w1处垂直切一刀(这样就只有另一个参数的gradient会变化),对应的情况为右边的两条曲线,可以看出,比起a点,c点距离最低点更近,但是它的gradient却越大。
 
李宏毅__ML_Notes_4.21
 
实际上,对于一个二次函数y=ax2+bx+cy=ax^2+bx+c来说,最小值点的x=b2ax=-\frac{b}{2a},而对于任意一点x0x_0,它迈出最好的步伐长度是x0+b2a=2ax0+b2a\left\vert x_0+\frac{b}{2a} \right\vert=\left\vert \frac{2ax_0+b}{2a} \right\vert(这样就一步迈到最小值点了),联系该函数的一阶和二阶导数$ y’=2ax+by’’=2a$,可以发现the best step is yy\left\vert\frac{y'}{y''} \right\vert ,也就是说它不仅跟一阶导数(gradient)有关,还跟二阶导师有关,因此我们可以通过这种方法重新比较上面的a和c点,就可以得到比较正确的答案。

回顾Adagrad的表达式,gtg^t就是一次微分,而分母中的i=0t(gi)2\sqrt{\sum_{i=0}^t(g^i)^2}就是对映(类似,不相等)二次微分的大小,所以Adagrad想要做的事情就是,在不增加任何额外运算的前提下,想办法去估测二次微分的值
 
李宏毅__ML_Notes_4.21
 

Tip2:Stochastic Gradient Descent

随机梯度下降的方法可以让训练更快速,传统的gradient descent的思路是看完所有的样本点之后再构建loss function,然后去update参数;而stochastic gradient descent的做法是,看到一个样本点就update一次,因此它的loss function不是所有样本点的error平方和,而是这个随机样本点的error平方
 
李宏毅__ML_Notes_4.21
 
stochastic gradient descent与传统gradient descent的效果对比如下:
 
李宏毅__ML_Notes_4.21
 

Tip3:Feature Scaling

特征缩放,当多个特征的分布范围很不一样时,最好将这些不同feature的范围缩放成一样

假设一个functiony=b+w1x1+w2x2y=b+w_1x_1+w_2x_2,假设x1的值都是很小的,x2的值都是很大的。此时去画出loss的error surface,如果对w1和w2都做一个同样的变动Δw\Delta w,那么w1的变化对y的影响是比较小的,而w2的变化对y的影响是比较大的。
 
李宏毅__ML_Notes_4.21
 
左边的error surface表示,w1对y的影响比较小,所以w1对loss是有比较小的偏微分的,因此在w1的方向上图像是比较平滑的;w2对y的影响比较大,所以w2对loss的影响比较大,因此在w2的方向上图像是比较sharp的。

如果x1和x2的值,它们的scale是接近的,那么w1和w2对loss就会有差不多的影响力,loss的图像接近于圆形,那这样做对gradient descent有什么好处呢?

之前我们做的demo已经表明了,对于这种长椭圆形的error surface,如果不使用Adagrad之类的方法,是很难搞定它的,因为在像w1和w2这样不同的参数方向上,会需要不同的learning rate,用相同的lr很难达到最低点。

如果有scale的话,loss在参数w1、w2平面上的投影就是一个正圆形,update参数会比较容易。

而且gradient descent的每次update并不都是向着最低点走的,每次update的方向是顺着等高线的方向(梯度gradient下降的方向),而不是径直走向最低点;但是当经过对input的scale使loss的投影是一个正圆的话,不管在这个区域的哪一个点,它都会向着圆心走。因此feature scaling对参数update的效率是有帮助的

如何做feature scaling
 
李宏毅__ML_Notes_4.21
 

Gradient Descent Theory

Talyor Series
表达式:h(x)=k=0h(k)(x0)k!(xx0)k=h(x0)+h(x0)(xx0)+h(x0)2!(xx0)2+h(x)=\sum_{k=0}^\infty \frac{h^{(k)}(x_0)}{k!}(x-x_0)^k=h(x_0)+h'(x_0)(x-x_0)+\frac{h''(x_0)}{2!}(x-x_0)^2+\cdots
xx趋近于x0x_0时:h(x)h(x0)+h(x0)(xx0)h(x)\approx h(x_0)+h'(x_0)(x-x_0)
同理,对于二元函数,当xxyy趋近于x0x_0y0y_0时:
h(x,y)h(x0,y0)+h(x0,y0)x(xx0)+h(x0,y0)y(yy0)h(x,y)\approx h(x_0,y_0)+\frac{\partial h(x_0,y_0)}{\partial x}(x-x_0)+\frac{\partial h(x_0,y_0)}{\partial y}(y-y_0)
从泰勒展开式推导出Gradient Descent

对于loss图像上的某一个点(a,b),如果我们想要找这个点附近loss最小的点,就可以用泰勒展开的思想
 
李宏毅__ML_Notes_4.21
 
假设用一个red circle限定点的范围,这个圆足够小以满足泰勒展开的精度,那么此时我们的loss function就可以化简为:
L(θ)L(a,b)+L(a,b)θ1(θ1a)+L(a,b)θ2(θ2b)L(\theta)\approx L(a,b)+\frac{\partial L(a,b)}{\partial \theta_1}(\theta_1-a)+\frac{\partial L(a,b)}{\partial \theta_2}(\theta_2-b)
s=L(a,b),u=L(a,b)θ1,v=L(a,b)θ2s=L(a,b),u=\frac{\partial L(a,b)}{\partial \theta_1},v=\frac{\partial L(a,b)}{\partial \theta_2},则L(θ)s+u(θ1a)+v(θ2b)L(\theta)\approx s+u(\theta_1-a)+v(\theta_2-b)
假定red circle的半径为dd,则有限制条件(θ1a)2+(θ2b)2d2(\theta_1-a)^2+(\theta_2-b)^2\le d^2
此时去求L(θ)minL(\theta)_{min},这里有个小技巧,即把L(θ)L(\theta)转化成两个向量的乘积u(θ1a)+v(θ2b)=(u,v)(θ1a,θ2b)=(u,v)(Δθ1,Δθ2)u(\theta_1-a)+v(\theta_2-b)=(u,v)\cdot(\theta_1-a,\theta_2-b)=(u,v)\cdot (\Delta \theta_1, \Delta \theta_2)
观察图形可知,当向量(θ1a,θ2b)(\theta_1-a,\theta_2-b)与向量(u,v)(u,v)反向时,且刚好到达red circle的边缘时(用η\eta去控制向量的长度),L(θ)L(\theta)最小
 
李宏毅__ML_Notes_4.21
 
这就是gradient descent在数学上的推导,注意它的重要前提是,给定的那个红色圈圈的范围要足够小,这样泰勒展开给我们的近似才会更精确,而η\eta的值代表着(不等于)圆的半径成正比的,因此理论上learning rate要无穷小才能够保证每次gradient descent在update参数之后的loss会越来越小。如果learning rate没有设置好,泰勒近似不成立,就有可能使gradient descent过程中的loss没有越来越小。当然泰勒展开可以使用二阶、三阶乃至更高阶的展开,但这样会使得运算量大大增加,反而降低了运行效率

Gradient Descent的限制

之前已经讨论过,gradient descent有一个问题是它会停在local minima的地方就停止update了

事实上还有一个问题是,微分值是0的地方并不是只有local minima,settle point的微分值也是0

以上都是理论上的探讨,到了实践的时候,其实当gradient的值接近于0的时候,我们就已经把它停下来了,但是微分值很小,不见得就是很接近local minima,也有可能像下图一样在一个高原的地方
 
李宏毅__ML_Notes_4.21
 
gradient descent的限制是,它在gradient即微分值接近于0的地方就会停下来,而这个地方不一定是global minima,它可能是local minima,可能是saddle point鞍点,甚至可能是一个loss很高的plateau平缓高原

相关文章:

  • 2021-06-27
  • 2021-06-02
  • 2021-11-11
  • 2021-05-04
  • 2021-08-12
  • 2021-04-20
  • 2021-09-18
  • 2021-07-17
猜你喜欢
  • 2021-12-18
  • 2021-09-02
  • 2021-09-15
  • 2021-05-21
  • 2021-10-02
  • 2021-05-31
  • 2021-05-06
相关资源
相似解决方案