梯度下降 Gradient Descent

θ* = argmin L(θ)
 
梯度方向:损失函数等高线的法线方向(切线方向,变化最快的方向)
θt+1 = θt - ηg(θt)
 
关于梯度下降的Tips:
 
1. 调整学习率 adaptive learning rates
简单直觉的想法:训练刚开始的时候可以用比较大的学习率;经过一些epochs之后应该要减小学习率;比如说 1/t decay:η =  η / √(t+1)
更好的做法是每个参数都有不同的学习率  => 一个比较简单的方法是 adagrad
Adagrad:在 1/t decay 的基础上,不同参数的学习率除以过去(包括该当前时刻)该参数所有微分值的均方,这里 w 表示单个的参数
其中,t+1项消掉了
 
但是Adgrad在这里是否存在矛盾呢?
 
分子的微分项越大,更新的 step 就越大;但同时分母的历史梯度求和项就越大,反而导致 step 越小
直觉的解释:分母的项是为了造成一个反差的效果,如果 t 时刻的梯度和历史梯度的大小突然差别很大,就强调这种变化
 
更正式的解释:
更大的梯度就意味着会走更大的step吗?或者说,一个最合理的step,跟梯度g的关系是什么样的?

只考虑一个参数:Larger gradient,Larger step,可以;更大的 1st order derivative 意味着离 minima 更远

 
但同时考虑多个参数时,这个结论有问题:(不能 cross parameters
 
如果要跨参数?—— 再考虑 second order derivative
 
最好的step:|first derivative| / second derivative,和一次微分成正比,和二次微分成反比,这样才能真正显示到 minima 的距离大小。
 
这和 Adagrad 的关系?
用足够多的一次微分的采样点,计算采样的平均值,去估计二次微分的大小趋势。(没有额外运算。当然也可以直接算二次微分,但是计算代价更大)
2. Stochastic Gradient Descent
原始的梯度下降是,全部训练样本都计算完了更新参数一次
stochastic gradient descent,每个样本都更新参数一次,会更快
而实际做的时候,会取一个batch更新一次
 
3. Feature Scaling
如果 x的数量级大于 x1 ,改变 w会对 loss 影响比较大,导致 w方向更加 sharp,梯度下降优化过程中不同方向需要的学习率就非常不同。所以 feature scaling 会让优化过程更容易。
 
常见的做法是 standard scaling
For each dimension i :
  mean: mi
  standard deviation: σi
  xir = (xi - mi) / σi
 
 
Gradient Descent 背后的理论 (为什么梯度下降能work)
如果用梯度下降解决一个优化问题,θ* = argmin L(θ),那么每次更新参数都一定会使得损失函数变小吗?(一定能收敛吗?)
——不一定。原因?
 
假设损失函数有两个参数 {θ1, θ2}
给定一个点p,能够很容易的找出点p邻域内的最小值。 怎么做? => 泰勒公式
只要h(x) 在x0的邻域无限可微,那么h(x)可以表示为
 
多变量的情况:
当 (x, y) 很接近 (x0, y0) 的时候,考虑用一阶微分项来近似。即,当处在  (x0, y0)  半径很小的邻域内时,利用泰勒公式来逼近损失函数 L:
其中L(a, b) 和两个微分项都是确定的常数,简化表示法,得到

那么就是要找 {θ1, θ2} 令 L 最小,s.t.

为了最小化 L,就选取和 (u, v) 内积最小的 (θ1 - a, θ2 - b),显然就是 (u, v) 反方向,再正好 scale 到很小的直径d表示的圈边:
而 u 和 v 表示的正是梯度,这个方法正是梯度下降
所以,Gradient Descent 能 work 的前提条件是:learning rate 足够小(泰勒公式的逼近够精确)
 
梯度下降的局限:
1. 卡在局部极小值或者鞍点(微分值为0,但实际上这种情况很少,因为需要所有的方向都满足,参数越多这种情况发生概率越小)
2. 在plateau的阶段很慢(微分值很小,然后就停下了,但其实离 local minima 还很远)

原文地址:https://www.cnblogs.com/chaojunwang-ml/p/11190403.html