zoukankan      html  css  js  c++  java
  • 梯度下降法综述

    Gradient Descent Variants

    reference: http://sebastianruder.com/optimizing-gradient-descent/

    (1)Batch gradient descent: 计算整个数据集上, Cost function 对于parameters的偏导,而后更新梯度;对于convex error surfaces能够得到global minimum,而对于non-convex error surfaces能得到local minimum

    (2) Stochastic gradient descent: 计算单个sample上,Cost function对于parameters的偏导,而后更新梯度。相较于BGD,SGD更easy从一个local minimum跳到另一个local minimum(可是当learning rate过小时。performance便和BGD类似)。High variance,更easy使得loss curve产生震荡

    (3)Mini-batch gradient descent: 计算whole dataset某个子集(通常设置为50-256)对于paremeters的偏导,而后更新梯度;比SGD更稳定。更易收敛。能够使用高效的矩阵化trick。使得在runing的时候更加efficient

    (4)面临几大问题:

    1.Learning rate非常难选择,太小了收敛非常慢,太大了easy在local minimum周围晃动。甚至发散

    2.在训练时当loss一直在某个范围摆动时,这时候应该减小learning rate,可是这个trick受数据集属性或者模型的capacity等因素的影响较大,须要觉得的精调

    3.所用的參数更新都是基于同一个learning rate的,可是当数据集非常稀疏,或者features出现的频率有非常大不同。这时候我们会希望用较大的learning rate来更新rarely出现的feature,即希望实现feature-wise的learning rate的调整

    4.另一个问题时saddle points 的问题,例如以下图:

    这里写图片描写叙述
    下文在SGD指的是Mini-batch gradient descent,事实上在其它非常多地方也是这样

    Gradient descent optimization algorithms

    Newton’s method.对于高维问题infeasible。所以以下不讨论

    (1)Momentum: 当遇到沟壑问题(一个方向的坡度比其它方向明显要陡峭,大多数情况下都会相应到一个local minimum)时,SGD不会沿着沟壑加速下降到local minimum,而Momentum的想法则是将上一次更新时的梯度乘以一个因数γ(一般设置为0.9),然后加上此时的梯度。若两个梯度的方向类似。则会加速在这一方向上的移动,即加速了收敛:

    vt=γvt1+ηθJ(θ)

    θ=θvt

    这里写图片描写叙述这里写图片描写叙述

    (2)Nesterov accelerated gradient: Momentum的一个问题是盲目,即不推断下一步将要下降到哪,就一直加速下降,所以在坡度開始由下降转为上升时。可能会越过local minimum。Nesterov有效的攻克了这个问题。大概意思就是先大概预測下一步要下降到的位置(通过计算J(θγvt1)的梯度推断),而后再做出修正,Nesterov在非常多RNN的tasks中都非常有效:

    vt=γvt1+ηθJ(θγvt1)

    θ=θvt

    这里写图片描写叙述
    蓝色箭头是Momentum:首先计算当前梯度(短箭头),然后再加上上一步的梯度(长箭头)。棕色箭头是J(θγvt1)的梯度,即预判,然后再做出修正(绿色箭头)

    (3)Adagrad:对于不同的timestep(能够理解为第几次更新)以及不同位置的weight(层内或者层间),Momentum和Nesterov都仅仅能使用同一个learning rate进行更新。这样在处理稀疏数据集的时候(比方word embedding 任务),不能实现lager更新出现不频繁的parameters,small 更新频繁出现的parameters.Adagrad则能够有效改善这一情况:

    θt+1,i=θt,iηGt,ii+ϵgt,i, GtRd×d是一个对角矩阵,每一个对角元素i,i等于前t个timesteps的关于θi的梯度的平方的总和,ϵ(一般设置为1e8)用于smoothing,以防分子为0     

    向量化之后: θt+1=θtηGt+ϵgt

    Adagrad不须要精调learning rate(一般设置为0.01就可以),可是有一个weakness,就是ηGt+ϵ会随着分子的增大(每一个对角元素都是正数相加)而逐渐减小,甚至接近于0,使得相应的权重得不到更新

    (4)Adadelta: Adadelta是Adagrad的一个拓展,为的是解决Adagrad learning rate减小为接近0的情况,所以相比較与Adagrad对过去全部的梯度的平方进行累加,Adadelta添加了一个限制窗体。大小为m(即仅仅统计前m步的梯度的平方);而相较于直接计算累加和(须要保留前m步的梯度的平方),Adadelta採用的是计算前面steps的梯度的平方的均值方法:

    E[g2]t=γE[g2]t1+(1γ)g2t

    Δθt=ηE[g2]t+ϵgt

    The authors note that the units in this update (as well as in SGD, Momentum, or Adagrad) do not match, i.e. the update should have the same hypothetical units as the parameter. To realize this, they first define another exponentially decaying average, this time not of squared gradients but of squared parameter updates:

    E[Δθ2]t=γE[Δθ2]t1+(1γ)Δθ2t

    Δθt=RMS[Δθ]tRMS[g]tgt

    θt+1=θt+Δθt

    由上述式子可知。Adadelta甚至不须要设置Leaning rate

    (5)RMSprop:Adadelta和RMSprop都是为了解决Adagrad learning rate消失的问题。而 RMSprop事实上就是上述Adadelta的一部分(算梯度的均值):

    E[g2]t=0.9E[g2]t1+0.1g2t

    θt+1=θtηE[g2]t+ϵgt

    γ一般设置为0.9,η一般设置为0.001

    (6)Adam:Adam除了保留梯度平方的exponentially decaying average vt,还保留了梯度的exponentially decaying average mt

    mt=β1mt1+(1β1)gt

    vt=β2vt1+(1β2)g2t

    m^t=mt1βt1

    v^t=vt1βt2

    θt+1=θtηv^t+ϵm^t

    default values of 0.9 for β1, 0.999 for β2, and 108 for ϵϵ

    Visualization of algorithms

    这里写图片描写叙述这里写图片描写叙述

  • 相关阅读:
    SQL server 语言基础
    存储过程练习
    触发器
    存储过程
    时间日期函数,类型转化,子查询,分页查询
    数学函数,字符串函数
    用 CREATE TABLE 命令建立表的结构
    结构体,枚举类型
    函数练习
    集合以及特殊集合
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7158865.html
Copyright © 2011-2022 走看看