梯度下降法---优化器optimizer

手动指定学习率:SGD,Momentum,Nesterov Momentum,

自动调节学习率:AdaGrad,RMSProp,Adam

梯度下降法变体:

  • 批量梯度下降 BGD------batch gradient descent
  • 随机梯度下降法 SGD------stochastic gradient descent
  • 小批量梯度下降法 BMGD------mini-batch gradient descent

常用的梯度下降法:

  • Momentum
  • Nesterov
  • Adagrad
  • AdaDelta
  • RMSprop
  • Adam

梯度下降法是训练神经网络最常用的优化算法。

梯度下降法是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。

1、BGD------batch gradient descent:

即batch gradient descent. 在训练中,每一步迭代都使用训练集的所有内容. 也就是说,利用现有参数对训练集中的每一个输入生成一个估计输出,然后跟实际输出比较,统计所有误差,求平均以后得到平均误差,以此来作为更新参数的依据.

具体实现: 
需要:学习速率 , 初始参数  
每步迭代过程: 
1. 提取训练集中的所有内容,以及相关的输出 
2. 计算梯度和误差并更新参数:

优点: 
由于每一步都利用了训练集中的所有数据,因此当损失函数达到最小值以后,能够保证此时计算出的梯度为0,换句话说,就是能够收敛.因此,使用BGD时不需要逐渐减小学习速率

缺点: 
由于每一步都要使用所有数据,因此随着数据集的增大,运行速度会越来越慢。而且不能投入新数据实时更新模型。

for i in range(nb_epochs):
    sum_grad=0
    for x,y in data:
        grad=gradient(loss_function,x,y,params)
        sum_grad+=grad
    avg_grad=sum_grad/len(data)
    params=params-learning_rate*avg_grad
  • 在凸优化(convex optimization)的情况下,一定会找到全局最优解
  • 在非凸优化的情况下,一定能找到局部最优解
  • 单次参数调整计算量大
  • 不适合在线(online)的情况

2、SGD-----stochastic gradient descent

和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。

 

优点:

随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况,那么可能只用其中部分的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。缺点是SGD的噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向所以虽然训练速度快,但是准确度下降,并不是全局最优虽然包含一定的随机性,但是从期望上来看,它是等于正确的导数的。

缺点:

SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。

BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。

当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。

for i in range(nb_epochs):
    np.random.shuffle(data)
    for x,y in data:
        grad=gradient(loss_function,x,y,params)
        params=params-learning_rate*grad
  • 适合online的情况
  • 通常比批量梯度下降算法快(在批处理的情况下,有可能许多的数据点产生的梯度是相似度的,这些计算是冗余的,并不会有实际的帮助)
  • 通常目标函数震荡严重。在神经网络优化情况下(没有全局最优解),这种震荡反而有可能让它避免被套牢在一个局部最小值,而找到更好的局部最优解。
  • 通过调节学习率,能够找到和批处理相似的局部或者全局最优解。

stochastic gradient descent 随机梯度下降,现在一般与MBGD(minibatch gradient descent)是一个意思,即随机抽取一批样本来更新参数。

3、MBGD------mini-batch gradient descent

随机抽取一批样本,以此为根据来更新参数.

具体实现: 
需要:学习速率 , 初始参数  
每步迭代过程: 
1. 从训练集中的随机抽取一批容量为m的样本,以及相关的输出 
2. 计算梯度和误差并更新参数: 、

优点: 
训练速度快,对于很大的数据集,也能够以较快的速度收敛.

缺点: 

  1. 不过 Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。)对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。
  2. SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。
for i in range(nb_epochs):
    np.random.shuffle(data)
    for mini_batch in get_mini_batch(data,batch_size=50):
        sum_grad=0
        for x,y in data:
            grad=gradient(loss_function,x,y,params)
            sum_grad+=grad
        avg_grad=sum_grad/len(data)
        params=params-learning_rate*avg_grad
  • 结合了批处理和随机梯度下降法的优点
  • 减弱了目标函数震荡,更加稳定
  • 易于硬件加速实现,常用的机器学习库都利用了这个特性提供了高性能的计算速度
  • 一般的mini-batch大小为50-256,取决于不同的应用

传统梯度下降法面临的挑战:

  • 传统mini-batch不能保证能够收敛
  • 当学习率太小,收敛会很慢,学习率抬高容易震荡,甚至无法收敛
  • 可以按照某个公式随着训练逐渐减小学习率,但是不同的数据集需要不同的学习率变化曲线,不容易估计
  • 所有的参数使用同样的学习率并不合适
  • 容易被套牢在马鞍点

1、Momentum

SGD方法更新方向完全依赖于当前的batch,导致更新不稳定,每次迭代计算的梯度含有比较大的噪音。解决这个问题的方法便是引入momentum

momentum即动量,模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样可以在一定程度上增加稳定性,从而学习的更快,并且还有一定摆脱局部最优的能力。

梯度更新规则:

Momentum通过加入γv_t−1,可以加速SGD,并且一直震荡

当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。
加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。

超参数设定值:  一般 γ 取值 0.9 左右。

特点:

  • 前后梯度方向一致时,能够加速学习
  • 前后梯度方向不一致时,能够一直震荡

缺点:

这种情况相当于小球从山上滚下来时是在盲目地沿着坡滚,如果它能具备一些先知,例如快要上坡时,就知道需要减速了的话,适应性会更好

2、Nesterov  accelerated gradient-----NAG

梯度更新规则:

θ−γv_t−1 来近似当做参数下一步会变成的值,则在计算梯度时,不是在当前位置,而是在未来的位置上。

超参数设定值:一般 γ仍取值0.9左右。

蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。
而 NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。

NAG 可以使 RNN 在很多任务上有更好的表现。

目前为止,我们可以做到,在更新梯度时顺应 loss function 的梯度来调整速度,并且对 SGD 进行加速

我们还希望可以根据参数的重要性而对不同的参数进行不同程度的更新。

3、Adagrad(Adaptive gradient algrithm)

这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了SGD的鲁棒性,例如识别YouTube视频里的猫,训练GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。

梯度更新规则:

其中 g 为:t 时刻参数 θ_i 的梯度

如果是普通的 SGD, 那么 θ_i 在每一时刻的梯度更新公式为:

但这里的 learning rate η 也随 t 和 i 而变:

其中 G_t 是个对角矩阵, (i,i) 元素就是 t 时刻参数 θ_i 的梯度平方和。

优点:

  • Adagrad 的优点是减少了学习率的手动调节
  • 超参数设定值:一般η选取0.01

缺点:

  • 随着训练,分母总是增大,这样学习率就会收缩并最终会变得非常小,算法无法收敛。

4、Adadelta

这个算法是对 Adagrad 的改进,

和 Adagrad 相比,就是分母的 G 换成了过去的梯度平方的衰减平均值,指数衰减平均值

这个分母相当于梯度的均方根 root mean squared (RMS),在数据统计分析中,将所有值平方求和,求其均值,再开平方,就得到均方根值 ,所以可以用 RMS 简写:

其中 E 的计算公式如下,t 时刻的依赖于前一时刻的平均和当前的梯度:

梯度更新规则:

此外,还将学习率 η 换成了 RMS[Δθ],这样的话,我们甚至都不需要提前设定学习率了:

超参数设定值:  γ 一般设定为 0.9

5、RMSprop

RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。

RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的

梯度更新规则:

RMSprop 与 Adadelta 的第一种形式相同:(使用的是指数加权平均,旨在消除梯度下降中的摆动,与Momentum的效果一样,某一维度的导数比较大,则指数加权平均就大,某一维度的导数比较小,则其指数加权平均就小,这样就保证了各维度导数都在一个量级,进而减少了摆动。允许使用一个更大的学习率η)

 

超参数设定值:

Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001。


6.Adam:Adaptive Moment Estimation

这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum

除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值

如果 mt 和 vt 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:

梯度更新规则:

超参数设定值:
建议 β1 = 0.9,β2 = 0.999,ϵ = 10e−8

实践表明,Adam 比其他适应性学习方法效果要好。

下面看一下几种算法在鞍点和等高线上的表现:

SGD optimization on saddle point

SGD optimization on saddle point

 SGD optimization on loss surface contours

上面两种情况都可以看出,Adagrad, Adadelta, RMSprop 几乎很快就找到了正确的方向并前进,收敛速度也相当快,而其它方法要么很慢,要么走了很多弯路才找到。

由图可知自适应学习率方法即 Adagrad, Adadelta, RMSprop, Adam 在这种情景下会更合适而且收敛性更好。


如何选择优化算法

如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。

RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。

Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,

随着梯度变的稀疏,Adam 比 RMSprop 效果会好。

整体来讲,Adam 是最好的选择

很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点

如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值