常用的优化器合集

1 篇文章 1 订阅
订阅专栏

目录

一、优化器

二、各优化器

 1、梯度下降法

1.1梯度下降(GD)

1.2、随机梯度下降(SGD)

1.3、小批量梯度下降法(MBGD)

1.4传统梯度优化的不足(BGD,SGD,MBGD)

2、动量优化法

2.1、NAG

2.2、SGD+Momentum

 3、自适应学习率

3.1、AdaGrad(自适应梯度)

3.2、 AdaDelta算法       

3.3、RMSprop

3.4、Adam

3.5、Adamax

3.6、AdamW

3.7、NAdam

三、优化器之间的对比

四、优化器的选择 

五、总结

六、主要的参考网址


一、优化器

(优化器有什么用?)

        深度学习模型通过引入损失函数,用来计算目标预测的错误程度。根据损失函数计算得到的误差结果,需要对模型参数(即权重和偏差)进行很小的更改,以期减少预测错误。但问题是如何知道何时应更改参数,如果要更改参数,应更改多少?这就是引入优化器的时候了。简单来说优化器可以优化损失函数,优化器的工作是以使损失函数最小化的方式更改可训练参数,损失函数指导优化器朝正确的方向移动。

        优化器即优化算法是用来求取模型的最优解的,通过比较神经网络自己预测的输出与真实标签的差距,也就是Loss函数。为了找到最小的loss(也就是在神经网络训练的反向传播中,求得局部的最优解),通常采用的是梯度下降(Gradient Descent)的方法,而梯度下降,便是优化算法中的一种。总的来说可以分为三类,一类是梯度下降法(Gradient Descent),一类是动量优化法(Momentum),另外就是自适应学习率优化算法。

        常见的一些优化器有:SGDAdagradAdadeltaRMSpropAdamAdamaxNadamTFOptimizer等等。

 


二、各优化器

 1、梯度下降法

1.1梯度下降(GD)

        假设要学习训练的模型参数为W,代价函数为J(W),则代价函数关于模型参数的偏导数即相关梯度为ΔJ(W),学习率为ηt,则使用梯度下降法更新参数为:

W _ { t + 1 } = W _ { t } - \eta _ { t } \bigtriangleup J ( W _ { t } )

其中,η为学习率、W_t表示t时刻的模型参数。

        从表达式来看,模型参数的更新调整,与代价函数关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数。

        基本策略可以理解为”在有限视距内寻找最快路径下山,因此每走一步,参考当前位置最陡的方向(梯度)进而迈出下一步。可以形象的表示为:

评价:标准梯度下降法主要有两个缺点:

        训练速度慢:每走一步都要要计算调整下一步的方向,下山的速度变慢。在应用于大型数据集中,每输入一个样本都要更新一次参数,且每次迭代都要遍历所有的样本。会使得训练过程及其缓慢,需要花费很长时间才能得到收敛解。这样就产生了很多比较新奇的优化器(SGDBGDMini-batch GD等)。批量梯度下降法(BGD)、随机梯度下降法(SGD)、小批量梯度下降法。

        容易陷入局部最优解:由于是在有限视距内寻找下山的反向。当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。所谓的局部最优解就是鞍点。落入鞍点,梯度为0,使得模型参数不在继续更新。(对于非凸函数而言,容易陷入局部最优解

1.2、随机梯度下降(SGD)

        均匀地、随机选取其中一个样本,(X^{(i)},Y^{(i)})用它代表整体样本,即把它的值乘以N,就相当于获得了梯度的无偏估计值。

SGD的更新公式为:

 W _ { t + 1 } = W _ { t } - \eta N\bigtriangleup J ( W _ { t },X^{(i)},Y^{(i)} )

        基本策略可以理解为随机梯度下降像是一个盲人下山,不用每走一步计算一次梯度,但是他总能下到山底,只不过过程会显得扭扭曲曲。

优点:

        虽然SGD需要走很多步的样子,但是对梯度的要求很低(计算梯度快)。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。

        应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。

缺点:

        SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。此外,SGD没能单独克服局部最优解的问题。

官方框架的代码:

(pytorch)

torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)
  • params(iterable)- 参数组(参数组的概念请查看 3.2 优化器基类:Optimizer),优化器要管理的那部分参数。

  • lr(float)- 初始学习率,可按需随着训练过程不断调整学习率。

  • momentum(float)- 动量,通常设置为0.9,0.8

  • dampening(float)- dampening for momentum ,暂时不了其功能,在源码中是这样用的:buf.mul(momentum).add(1 - dampening, d_p),值得注意的是,若采用nesterov,dampening必须为 0.

  • weight_decay(float)- 权值衰减系数,也就是L2正则项的系数

  • nesterov(bool)- bool选项,是否使用NAG(Nesterov accelerated gradient)

(tensorflow2)

tf.keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量

  • lr:大或等于0的浮点数,学习率

  • momentum:大或等于0的浮点数,动量参数

  • decay:大或等于0的浮点数,每次更新后的学习率衰减值

  • nesterov:布尔值,确定是否使用Nesterov动量

1.3、小批量梯度下降法(MBGD)

每次迭代使用m个样本来对参数进行更新,MBGD的更新公式为:

其中W_t表示t时刻的模型参数。

        从表达式来看,模型参数的调整更新与小部分的输入样本的代价函数的和(即批量/全局误差)有关。即每次权值调整发生在批量样本输入之后,而不是每输入一个样本就更新一次模型参数。这样就会大大加快训练速度。

        基本策略可以理解为,在下山之前掌握了附近的地势情况,选择相对的总体平均梯度最小的方向下山。

评价:

1、优点:使用mini-batch的时候,可以收敛得很快,有一定摆脱局部最优的能力。

2、缺点:

  •         在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。
    •         不能解决局部最优解的问题

1.4传统梯度优化的不足(BGD,SGD,MBGD)

        BGD、SGDMBGD分别为批量梯度下降算法、随机梯度下降算法、小批量梯度下降算法。BGD在训练的时候选用所有的训练集进行计算,SGD在训练的时候只选择一个数据进行训练,而MBGD在训练的时候只选择小部分数据进行训练。这三个优化算法在训练的时候虽然所采用的的数据量不同,但是他们在进行参数优化的时候是相同的。

        这种梯度更新算法简洁,当学习率取值恰当时,可以收敛到全面最优点(凸函数)或局部最优点(非凸函数)但其还有很大的不足点:

1对超参数学习率比较敏感(过小导致收敛速度过慢,过大又越过极值点)。

2、学习率除了敏感,有时还会因其在迭代过程中保持不变,很容易造成算法被卡在鞍点的位置。

3、在较平坦的区域,由于梯度接近于0,优化算法会因误判,在还未到达极值点时,就提前结束迭代,陷入局部极小值。

其他的SGD优化器--官方框架的代码:

ASGD(随机平均梯度下降)

(pytorch)

torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0)
  • params(iterable)- 参数组,优化器要优化的那些参数。
  • lr(float)- 初始学习率,可按需随着训练过程不断调整学习率。
  • lambd(float)- 衰减项,默认值 1e-4。
  • alpha(float)- power for eta update ,默认值 0.75。
  •  t0(float)- point at which to start averaging,默认值 1e6。
  • weight_decay(float)- 权值衰减系数,也就是 L2 正则项的系数。

2、动量优化法

2.1、NAG

牛顿加速梯度动量优化方法(NAG, Nesterov accelerated gradient):拿着上一步的速度先走一小步,再看当前的梯度然后再走一步。

 

SGDM对比NAG如下:

        其中,v_t表示t时刻积攒的加速度;α表示动力的大小;\eta _t表示学习率;W_t表示t时刻的模型参数,\bigtriangleup J ( W _ { t } - \alpha v _ { t - 1 } )表示代价函数关于W_t的梯度。Nesterov动量梯度的计算在模型参数施加当前速度之后,因此可以理解为往标准动量中添加了一个校正因子。 

        理解策略:在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误。所以需要一个更聪明的小球,能提前知道它要去哪里,还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。计算W _ { t } - \alpha v _ { t - 1 }可以表示小球下一个位置大概在哪里。从而可以提前知道下一个位置的梯度,然后使用到当前位置来更新参数。

        在凸批量梯度的情况下,Nesterov动量将额外误差收敛率从O(1/k)(k步后)改进到O(1/k2)。然而,在随机梯度情况下,Nesterov动量对收敛率的作用却不是很大。

优点: 梯度下降的方向更加准确

缺点: 对收敛率作用不是很大

2.2、SGD+Momentum

        使用动量(Momentum)的随机梯度下降法(SGD),主要思想是引入一个积攒历史梯度信息动量来加速SGD

        理解策略为:由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。

        从训练集中取一个大小为n的小批量\{​{X^{(1)},X^{(2)},...,X^{(n)}} \}样本,对应的真实值分别为Y(i),则Momentum优化表达式为:

 

        其中,v_t表示t时刻积攒的加速度。α表示动力的大小,一般取值为0.9(表示最大速度10倍于SGD)。\bigtriangleup J ( W _ { t } , X ^ { ( i_s ) } , Y ^ { ( i_s ) } )含义见SGD算法。W_t表示t时刻模型参数。

        动量主要解决SGD的两个问题:一是随机梯度的方法(引入的噪声);二是Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。

        SGDM相比SGD优势明显,加入动量后,参数更新就可以保持之前更新趋势,而不会卡在当前梯度较小的点了。

 美中不足的是,SGDM没有考虑对学习率进行自适应更新,故学习率的选择很关键。

        在梯度方向改变时,momentum能够降低参数更新速度,从而减少震荡;在梯度方向相同时,momentum可以加速参数更新, 从而加速收敛。动量移动得更快(因为它积累的所有动量)。动量有机会逃脱局部极小值(因为动量可能推动它脱离局部极小值)        

3、自适应学习率

3.1、AdaGrad(自适应梯度)

论文网址: https://arxiv.org/pdf/1609.04747.pdf

博客: 深度学习中的优化算法之AdaGrad_fengbingchun的博客-CSDN博客_adagrad

        AdaGrad算法,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有个快速下降的学习率,而具有小梯度的参数在学习率上有相对较小的下降。SGD的区别在于,学习率除以 t-1 迭代的梯度的平方和。故称为自适 梯度下降

        从表达式可以看出,对出现比较多的类别数据,Adagrad给予越来越小的学习率,而对于比较少的类别数据,会给予较大的学习率。因此Adagrad适用于数据稀疏或者分布不平衡的数据集。

        Adagrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0, 使得训练提前结束,无法继续学习。

        Adagrad有个致命问题,就是没有考虑迭代衰减。极端情况,如果刚开始的梯度特别大,而后面的比较小,则学习率基本不会变化了,也就谈不上自适应学习率了。这个问题在RMSProp中得到了修正

官方框架的代码:

(pytorch)

torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0)
  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict

  • lr (float, 可选) – 学习率(默认: 1e-2)

  • lr_decay (float, 可选) – 学习率衰减(默认: 0)

  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

  • initial_accumulator_value - 累加器的起始值,必须为正。

    (tensorflow2)

    tf.keras.optimizers.Adagrad(
        learning_rate=0.001,
        initial_accumulator_value=0.1,
        epsilon=1e-07,
        name='Adagrad',
        **kwargs
    )
    • lr:大于0的浮点数,学习率

    • epsilon:大于0的小浮点数,防止除0错误

3.2、 AdaDelta算法       

论文地址: https://arxiv.org/pdf/1609.04747.pdf

博客: 深度学习中的优化算法之Adadelta_fengbingchun的博客-CSDN博客_adadelta

        Adadelta依然对学习率进行了约束,但是在计算上进行了简化。

 

        其中,E代表求期望,RMS(Root Mean Squared,均方根)

特点:

  • 此时可以看出Adadelta已经不依赖全局learning rate了。
  • 在模型训练的初期和中期,AdaDelta表现很好,加速效果不错,训练速度快。
  • 在模型训练的后期,模型会反复地在局部最小值附近抖动。

官方框架的代码:

(pytorch)

torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)
  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict

  • rho (float, 可选) – 用于计算平方梯度的运行平均值的系数(默认:0.9)

  • eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-6)

  • lr (float, 可选) – 在delta被应用到参数更新之前对它缩放的系数(默认:1.0)

  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

(tensorflow2)

tf.keras.optimizers.Adadelta(
    learning_rate=0.001,
    rho=0.95,
    epsilon=1e-07,
    name='Adadelta',
    **kwargs
)
  • lr:大于0的浮点数,学习率

  • rho:大于0的浮点数

  • epsilon:大于0的小浮点数,防止除0错误

3.3、RMSprop

论文网址: https://arxiv.org/pdf/1609.04747.pdf

博客地址: 深度学习中的优化算法之RMSProp_fengbingchun的博客-CSDN博客_rmsprop

        RMSprop可以看做Adadelta的一个特例。RMSProp算法修改了AdaGrad的梯度积累为指数加权的移动平均,使得其在非凸设定下效果更好。

特点

  • 其实RMSprop依然依赖于全局学习率
  • RMSprop的效果介于AdagradAdadelta之间
  • 适合处理非平稳目标——对于RNN效果很好。
  • RMSProp借鉴了Adagrad的思想,观察表达式,分母为\sqrt { E [ g ^ { 2 } ] _ { t } + \epsilon }。由于取了个加权平均,避免了学习率越来越低的的问题,而且能自适应地调节学习率。
  • RMSProp算法在经验上已经被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。

官方框架的代码:

(pytorch)

torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
  • - params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • - lr (float, 可选) – 学习率(默认:1e-2)
  • - momentum (float, 可选) – 动量因子(默认:0),该参数的作用下面会说明。
  • - alpha (float, 可选) – 平滑常数(默认:0.99)
  • - eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
  • - weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)
  • - centered (bool, 可选) – 如果为True,计算中心化的RMSProp,并且用它的方差预测值对梯度进行归一化

(tensorflow2)

tf.keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)

        除学习率可调整外,建议保持优化器的其他默认参数不变。该优化器通常是面对递归神经网络时的一个良好选择

  • lr:大或等于0的浮点数,学习率

  • rho:大或等于0的浮点数

  • epsilon:大或等于0的小浮点数,防止除0错误

3.4、Adam

论文网址: https://arxiv.org/pdf/1609.04747.pdf
博客网址: 深度学习中的优化算法之Adam_fengbingchun的博客-CSDN博客_adam优化算法

AdamSGDMRMSProp的结合,它基本解决了之前提到的梯度下降的一系列问题,比如随机小样本、自适应学习率、容易卡在梯度较小点等问题,2015年提出。如下:

 

评价:

  •         Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。
    •         自动调整参数的学习率;大幅提升了训练速度;提高了稳定性;

主要包含以下几个显著的优点:

  •          实现简单,计算高效,对内存需求少
    •         参数的更新不受梯度的伸缩变换影响
      •         超参数具有很好的解释性,且通常无需调整或仅需很少的微调
        •         更新的步长能够被限制在大致的范围内(初始学习率)
          •         能自然地实现步长退火过程(自动调整学习率)
            •         很适合应用于大规模的数据及参数的场景
              •         适用于不稳定目标函数
                •         适用于梯度稀疏或梯度存在很大噪声的问题

官方框架的代码:

(pytorch)

torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict

  • lr (float, 可选) – 学习率(默认:1e-3)

  • betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)

  • eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)

  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

(tensorflow2)

tf.keras.optimizers.Adam(
    learning_rate=0.001, 
    beta_1=0.9,  
    beta_2=0.999,  
    epsilon=1e-07,  
    amsgrad=False,  
    name='Adam',  
    **kwargs)
  • learning_rate=0.001, # 学习率 默认 0.001

  • beta_1=0.9, # 一阶矩估计的指数衰减率。 默认 0.9

  • beta_2=0.999, # 二阶矩估计的指数衰减率。 默认 0.999

  • epsilon=1e-07, # 模糊因子。如果None,默认为K.epsilon()。该参数是非常小的数,其为了防止在实现中除以零。默认 1e-07

  • amsgrad=False, # 布尔。是否应用该算法的AMSGrad变体。默认 False

  • name='Adam', # 应用渐变时创建的操作的可选名称。

3.5、Adamax

论文网址: https://arxiv.org/pdf/1412.6980.pdf、 https://arxiv.org/pdf/1609.04747.pdf

参考博客: Pytorch优化器全总结(二)Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdam_小殊小殊的博客-CSDN博客_pytorch nadam

 

Adamax总结

        Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。总的来说跟Adam效果差不了多少。

推荐程度:非常推荐

官方框架的代码:

(pytorch)

torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)
  • params (iterable) – 待优化参数的iterable或者是定义了参数组的dict

  • lr (float, 可选) – 学习率(默认:2e-3)

  • betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数

  • eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)

  • weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

(tensorflow2)

tf.keras.optimizers.Adamax(
    learning_rate=0.001,
    beta_1=0.9,
    beta_2=0.999,
    epsilon=1e-07,
    name='Adamax',
    **kwargs
)
  • learning_rate=0.001, # 学习率 默认 0.001

  • beta_1=0.9, # 一阶矩估计的指数衰减率。 默认 0.9

  • beta_2=0.999, # 二阶矩估计的指数衰减率。 默认 0.999

  • epsilon=1e-07, # 模糊因子。如果None,默认为K.epsilon()。该参数是非常小的数,其为了防止在实现中除以零。默认 1e-07

  • name='Adamx', # 应用渐变时创建的操作的可选名称。

3.6、AdamW

参考论文: https://arxiv.org/pdf/1412.6980.pdf

参考博客: Pytorch优化器全总结(二)Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdam_小殊小殊的博客-CSDN博客_pytorch nadam

 

AdamW总结

         因为Adam的学习率自适应的,而L2正则遇到自适应学习率后效果不理想,所以使用adam+权重衰减的方式解决问题。多说一句,如果epoch比较多推荐使用 SGD(无momentum)+ L2正则化;poch比较少推荐使用AdamW。比Adam收敛得更快,参数更稀疏。

官方框架的代码:

(pytorch)

torch.optim.AdamW(params,lr=0.001,betas=(0.9,0.999),eps=1e08,weight_decay=0.01,amsgrad=False)
  • - params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • - lr (float, 可选) – 学习率(默认:1e-3)
  • - betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
  • - eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
  • - weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 1e-2)
  • - amsgrad(boolean, optional) – 是否使用从论文On the Convergence of Adam and Beyond中提到的算法的AMSGrad变体(默认:False)

(tensorflow2)

        无

3.7、NAdam

参考论文: https://arxiv.org/pdf/1412.6980.pdf

参考博客: 链接 Pytorch优化器全总结(二)Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdam_小殊小殊的博客-CSDN博客_pytorch nadam 链接

NAdam总结

优点:具有Adam的优点的同时,在也兼具NAG收敛速度快、波动也小的特点。(NAdam是在 Adam 中引入 Nesterov 加速效果。)

推荐程度:推荐,在想使用带动量的RMSprop,或者Adam的地方,大多可以使用NAdam取得更好的效果。

官方框架的代码:

(pytorch)

torch.optim.NAdam(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, momentum_decay=0.004, foreach=None)
  • - params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
  • - lr (float, 可选) – 学习率(默认:1e-3)
  • - betas (Tuple[float,float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)
  • - eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)
  • - weight_decay (float, 可选) – 动量衰减
  • - foreach(boolean, optional) – 是否使用每个优化器的实现,可以添加一些复杂的foreach逻辑

(tensorflow2)

tf.keras.optimizers.Nadam(
    learning_rate=0.001,
    beta_1=0.9,
    beta_2=0.999,
    epsilon=1e-07,
    name='Nadam',
    **kwargs
)
  • -learning_rate=0.001,  # 学习率 默认 0.001
  • beta_1=0.9,  # 一阶矩估计的指数衰减率。 默认 0.9
  •  beta_2=0.999,  # 二阶矩估计的指数衰减率。 默认 0.999
  •  epsilon=1e-07,  # 模糊因子。如果None,默认为K.epsilon()。该参数是非常小的数,其为了防止在实现中除以零。默认 1e-07
  • name='Nadam',  # 应用渐变时创建的操作的可选名称。

三、优化器之间的对比

机器学习:各种优化器Optimizer的总结与比较_SanFanCSgo的博客-CSDN博客_optimizer

(1) 示例一

 

上图描述了在一个曲面上,6种优化器的表现,从中可以大致看出:

  • 下降速度:

   三个自适应学习优化器Adagrad、RMSProp与AdaDelta的下降速度明显比SGD要快,其中,Adagrad和RMSProp齐头并进,要比AdaDelta要快。

        两个动量优化器Momentum和NAG由于刚开始走了岔路,初期下降的慢;随着慢慢调整,下降速度越来越快,其中NAG到后期甚至超过了领先的Adagrad和RMSProp。

  • 下降轨迹:

        SGD和三个自适应优化器轨迹大致相同。两个动量优化器初期走了“岔路”,后期也调整了过来。

示例二

 

上图在一个存在鞍点的曲面,比较6中优化器的性能表现,从图中大致可以看出:

        三个自适应学习率优化器没有进入鞍点,其中,AdaDelta下降速度最快,AdagradRMSprop则齐头并进。

        两个动量优化器MomentumNAG以及SGD都顺势进入了鞍点。但两个动量优化器在鞍点抖动了一会,就逃离了鞍点并迅速地下降,后来居上超过了AdagradRMSProp

        很遗憾,SGD进入了鞍点,却始终停留在了鞍点,没有再继续下降。

示例三

 

上图比较了6种优化器收敛到目标点(五角星)的运行过程,从图中可以大致看出:

  •  在运行速度方面

        两个动量优化器MomentumNAG的速度最快,其次是三个自适应学习率优化器AdaGradAdaDelta以及RMSProp,最慢的则是SGD

  •  在收敛轨迹方面

        两个动量优化器虽然运行速度很快,但是初中期走了很长的”岔路”。

        三个自适应优化器中,Adagrad初期走了岔路,但后来迅速地调整了过来,但相比其他两个走的路最长;AdaDeltaRMSprop的运行轨迹差不多,但在快接近目标的时候,RMSProp会发生很明显的抖动。

        SGD相比于其他优化器,走的路径是最短的,路子也比较正。

常见的优化器(Optimizer)原理_hello2mao的博客-CSDN博客_优化器原理

https://shaoanlu.wordpress.com/2017/05/29/sgd-all-which-one-is-the-best-optimizer-dogs-vs-cats-toy-experiment/

 Validation accuracy(验证集acc

Training accuracy(训练集acc

 

Validation loss(测试集loss

Training loss(训练集loss

四、优化器的选择 

(这里我引入一些大佬博客的想法,没有改动)

【深度学习】优化器详解_LogosTR_的博客-CSDN博客_优化器是什么

1. 优化算法的选择

(1)对于稀疏数据,尽量使用学习率可自适应的算法,不用手动调节,而且最好采用默认参数

(2)SGD通常训练时间最长,但是在好的初始化和学习率调度方案下,

(3)结果往往更可靠。但SGD容易困在鞍点,这个缺点也不能忽略。

(4)如果在意收敛的速度,并且需要训练比较深比较复杂的网络时,推荐使用学习率自适应的优化方法。

(5)Adagrad,Adadelta和RMSprop是比较相近的算法,表现都差不多。

(6)在能使用带动量的RMSprop或者Adam的地方,使用Nadam往往能取得更好的效果。

2. 优化SGD的其他策略

2.1. Shuffling and Curriculum Learning

        Shuffling就是打乱数据,每一次epoch之后 shuffle一次数据,可以避免训练样本的先后次序影响优化的结果。但另一方面,在有些问题上,给训练数据一个有意义的顺序,可能会得到更好的性能和更好的收敛。这种给训练数据建立有意义的顺序的方法被叫做Curriculum Learning。

2.2. Batch Normalization

(1)为了有效的学习参数,我们一般在一开始把参数初始化成0均值和单位方差。但是在训练过程中,参数会被更新到不同的数值范围,使得normalization的效果消失,从而导致训练速度变慢或梯度爆炸等等问题(当网络越来越深的时候)。

BN给每个batch的数据恢复了normalization,同时这些对数据的更改都是可还原的,即normalization了中间层的参数,又没有丢失中间层的表达能力。

(2)使用BN之后,我们就可以使用更高的学习率,也不用再在参数初始化上花费那么多注意力。

(3)BN还有正则化的作用,同时也削弱了对Dropout的需求。

2.3. Early Stopping

        在训练的时候我们会监控validation的误差,并且会(要有耐心)提前停止训练,如果验证集的error没有很大的改进。

2.4. Gradient noise

在梯度更新的时候加一个高斯噪声:

方差值的初始化策略是:

 

        Neelakantan等人表明,噪声使得网络的鲁棒性更好,而且对于深度复杂的网络训练很有帮助。他们猜想添加了噪声之后,会使得模型有更多机会逃离局部最优解(深度模型经常容易陷入局部最优解)

优化方法总结以及Adam存在的问题(SGD, Momentum, AdaDelta, Adam, AdamW,LazyAdam)_糖葫芦君的博客-CSDN博客_adam改进

用Adam还是SGD?Adam的两大罪状----这个更详细可以查看上面的链接。

3. 优化算法的常用tricks

(1)首先,各大算法孰优孰劣并无定论。如果是刚入门,优先考虑SGD+Nestero V Momentum或者Adam.(Standford 231n : The two recommended updates to use are either SGD+NesteroV Momentum or Adam)

(2)选择你熟悉的算法——这样你可以更加熟练地利用你的经验进行调参。充分了解你的数据——如果模型是非常稀疏的,那么优先考虑自适应学习率的算法。如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用自适应学习率的优化方法。

(3)根据你的需求来选择——在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam进行快速实验优化;在模型上线或者结果发布前,可以用精调的SGD进行模型的极致优化。

(4)先用小数据集进行实验——有论文研究指出,随机梯度下降算法的收敛速度和数据集的大小的关系不大。因此可以先用一个具有代表性的小数据集进行实验,测试一下最好的优化算法,并通过参数搜索来寻找最优的训练参数。

(5)考虑不同算法的组合:先用Adam进行快速下降,而后再换到SGD进行充分的调优。切换策略可以参考本文介绍的方法。

(6)数据集一定要充分的打散(shuffle):这样在使用自适应学习率算法的时候,可以避免某些特征集中出现,而导致的有时学习过度、有时学习不足,使得下降方向出现偏差的问题。

(7)训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练——下降方向正确,且学习率足够高;对验证数据的监控是为了避免出现过拟合。

(8)制定一个合适的学习率衰减策略。可以使用定期衰减策略,比如每过多少个epoch就衰减一次;或者利用精度或者AUC等性能指标来监控,当测试集上的指标不变或者下跌时,就降低学习率。

学习率衰减

        在训练模型的时候,通常会遇到这种情况:我们平衡模型的训练速度和损失后选择了相对合适的学习率,但是训练集的损失下降到一定的程度后就不再下降了,最后最小值在附近摆动,不会精确地收敛,这是因为mini-batch中有噪声。遇到这种情况通常可以通过适当降低学习率来实现。但是,降低学习率又会延长训练所需的时间。学习率衰减就是一种可以平衡这两者之间矛盾的解决方案。

几种梯度衰减的方式:

 

五、总结

        本文章总结了常用的优化器,其中包括梯度下降法、动量优化法和自适应学习率优化算法三种,分别从原理、公式、优缺点以及pytorch及tensorflow2的官方代码展示这几个方面进行演示,最后可视化对比了各个优化器之间的效果以及如何选择优化器。如果你觉得本章论文对你有帮助,请点个👍,谢谢。

六、主要的参考网址

常见的优化器(Optimizer)原理_hello2mao的博客-CSDN博客_优化器原理

Pytorch优化器全总结(一)SGD、ASGD、Rprop、Adagrad_小殊小殊的博客-CSDN博客_pytorch sgd

Pytorch优化器全总结(二)Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdam(重置版)_小殊小殊的博客-CSDN博客_adadelta优化器

SGD — PyTorch 1.12 documentation

tf.keras.optimizers 常用的优化器_甜辣uu的博客-CSDN博客_tf.keras.optimizers.

  tf.keras.optimizers.Nadam  |  TensorFlow v2.10.0

机器学习:各种优化器Optimizer的总结与比较
SanFancsgo的博客
04-26 13万+
优化器总结 机器学习中,有很多优化方法来试图寻找模型的最优解。比如神经网络中可以采取最基本的梯度下降法。 梯度下降法(Gradient Descent) 梯度下降法是最基本的一类优化器,目前主要分为三种梯度下降法:标准梯度下降法(GD, Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及批量梯度下降法(BGD, B...
深度学习--优化器
qq_45875106的博客
05-14 6006
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言1 随机梯度下降法2 Momentum3 AdaGrad4 RMSProp5 Adam 前言 优化器是引导神经网络更新参数的工具,深度学习在计算出损失函数之后,需要利用优化器来进行反向传播,完成网络参数的更新。在这个过程中,便会使用到优化器优化器可以利用计算机数值计算的方法来获取损失函数最小的网络参数。在深度学习中,不同的优化器只是定义了不同的一阶动量和二阶动量,一阶动量是与梯度相关的函数,二阶动量是与梯度平方相.
Pytorch常用的函数(八)常见优化器SGD,Adagrad,RMSprop,Adam,AdamW总结
最新发布
qq_44665283的博客
04-23 1564
Pytorch常用的函数(八)常见优化器SGD,Adagrad,RMSprop,Adam,AdamW总结
【面试总结】常见的优化器
Icanhearwawawa的博客
03-27 2101
常见的优化器 机器学习中,往往求解目标函数的最优解时,需要对函数进行进行最优化,因此会用到一些比较经典的优化器。总的来说可以分为三类,一类是梯度下降法(Gradient Descent),一类是动量优化法(Momentum),另外就是自适应学习率优化算法。 1.梯度下降法(Gradient Descent) 首先对目标函数J(θ)J(\theta )J(θ)关于每一个参数θi\theta_iθi​求偏导数,把求得的各个参数以向量的形式写出来就是梯度。梯度是函数值变化最快的地方。其计算过程是沿梯度下降的方向求
机器学习常用优化器汇总
十三
12-16 507
1 梯度下降算法 假设模型参数为θ\thetaθ,损失函数为J(θ)J(\theta)J(θ),▽θJ(θ)\triangledown_{\theta}J(\theta)▽θ​J(θ)为J(θ)J(\theta)J(θ)关于θ\thetaθ的偏导数,也就是梯度,学习率为α\alphaα,则使用梯度下降法更新参数为: θt+1=θt−α⋅▽θJ(θ)\theta_{t+1} = \theta_{t} - \alpha·\triangledown_{\theta}J(\theta)θt+1​=θt​−α⋅▽θ​
机器学习(七)——tf.keras搭建神经网络固定模式
qq_40739219的博客
03-08 2595
一.总纲 import——导入相关模块 train,test——指定训练集与测试集 model = tf.keras.models.Sequential model.compile model.fit model.summary
深度学习+优化器+详解各种常用优化器+测试各优化器的结果作为文章的补充
05-29
按照出现时间的顺序依次介绍各种优化器的实现原理附带个人理解的通俗数学公式,而且有torch中封装好的函数类用法和参数介绍等等,也包括优化器各自的优缺点,以及常用超参数的值大小;链接地址:...
CSS常用优化技巧
09-25
CSS常用优化技巧,提高css书写技巧。
【Matlab】常用优化算法程序框架.zip
10-03
【Matlab】常用优化算法程序框架.zip
电脑性能优化常用工具大全
07-22
资源名称:电脑性能优化常用工具大全资源目录:【】Gavotte Ramdisk(内存虚拟磁盘)【】一键清理系统垃圾文件【】为32位系统开启4GB以上大内存【】内存释放专家——MemEmpty【】让普通CPU拥有双核心的能力Process ...
6Java性能优化常用工具.zip
12-24
JAVA性能优化之操作系统优化 以及常用工具命令 操作系统,调优的手段和參数可能有所不同,比方,在主流Unix系统中。共享内存段。信号量,共享内存最大值(shmmax)。共享内存最小值(shmmin)等都是能够进行优化的...
深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)...
weixin_34326179的博客
03-10 3152
机器学习深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论文中给出了常用优化器的比较,今天来学习一下:https://arxiv.org/pdf/1609.04747.pdf 本文将梳理: 每个算法的梯度更新规则和缺点 为了应对这个不足而提出的下...
神经网络模型优化器
weixin_45847320的博客
07-02 610
SGD是最基本的一种方法,先初始化参数,计算梯度,往梯度的反方向走一步到达,因为拐点的方向L是增加的,所以要往它的反方向走一步,继续计算处的梯度,再往其反方向走,每一个time_step都是计算梯度之后往其反方向走一步。 和SGD一样,一开始都要初始化参数,不同的是设置一个movement即=0,计算处的梯度,取其反方向作为需要更新的方向,movement计算更新的步长更新▽L(),同时=+。 加入moment的好处就在于,即使当前步骤的梯度为0,由于前一项的移动会累加到下一步
Adam优化器(通俗理解)
热门推荐
BeiErGeLaiDe的博客
07-29 6万+
Adam,名字来自:Adaptive Moment Estimation,自适应矩估计。是2014年提出的一种万金油式的优化器,使用起来非常方便,梯度下降速度快,但是容易在最优值附近震荡。竞赛中性能会略逊于SGD,毕竟最简单的才是最有效的。但是超强的易用性使得Adam被广泛使用。...
神经网络中各种优化器介绍
Abraham Ben
10-28 1985
1. SGD 1.1 batch-GD 每次更新使用全部的样本,注意会对所有的样本取均值,这样每次更新的速度慢。计算量大。 1.2 SGD 每次随机取一个样本。这样更新速度更快。SGD算法在于每次只去拟合一个训练样本,这使得在梯度下降过程中不需去用所有训练样本来更新Theta。BGD每次迭代都会朝着最优解逼近,而SGD由于噪音比BGD多,多以SGD并不是每次迭代都朝着最优解逼近,但大体方向是朝着最优解,SGD大约要遍历1-10次数据次来获取最优解。 但是 SGD 因为更新比较频繁,会造成 cost func
各种优化器整理
qq_43270687的博客
07-05 222
梯度下降 批量梯度下降 2.随机梯度下降 3.小批量梯度下降 牛顿法 m是梯度值 v是学习率 Momentum(动量法) Nesterov Momentun(牛顿动量法) Adagrad(Adaptive Gradient) diag是累加 RMSprop Adadelta Adam ...
如何选择深度学习优化器
qunnie_yi的博客
06-12 4599
作者:不会停的蜗牛 CSDN AI专栏作家 在很多机器学习深度学习的应用中,我们发现用的最多的优化器是 Adam,为什么呢?下面是 TensorFlow 中的优化器, https://www.tensorflow.org/api_guides/python/train在 keras 中也有 SGD,RMSprop,Adagrad,Adadelta,Adam 等: https://ker...
优化器(Optimizer)介绍
Aliz_
08-10 5万+
Gradient Descent(Batch Gradient Descent,BGD) 梯度下降法是最原始,也是最基础的算法。 它将所有的数据集都载入,计算它们所有的梯度,然后执行决策。(即沿着梯度相反的方向更新权重) 优点是在凸函数能收敛到最小值。但显而易见的是,这方法计算量太大。假如我们的数据集很大的话,普通的GPU是完全执行不来的。还有一点,它逃不出鞍点,也容易收敛到局部最小值(也就...
常见的机器学习优化器
Yasin的博客
06-23 1220
梯度下降最常见的三种变形是BGD,SGD,MBGD,区别是梯度下降时用多少数据来计算目标函数的梯度。 批量梯度下降法(Batch Gradient Descent)更新参数时使用所有样本来进行更新。 随机梯度下降法(Stochastic Gradient Descent)更新参数时使用一个样本来进行更新。(但平时提到的SGD是指的Mini-batch SGD)。 小批量梯度下降法(M...
优化器Optimizer
03-24
优化器(Optimizer)是机器学习中的一个重要组件,用于调整模型的参数以最小化损失函数。它通过迭代的方式不断更新模型参数,使得模型在训练过程中逐渐收敛到最优解。 常见的优化器包括: 1. 梯度下降法(Gradient Descent):是最基本的优化算法,通过计算损失函数对参数的梯度来更新参数。梯度下降法有多个变种,如批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)和小批量梯度下降(Mini-batch Gradient Descent)等。 2. 动量优化器(Momentum):在梯度下降法的基础上引入了动量的概念,通过累积之前梯度的方向和速度来更新参数。这样可以加速收敛,并且在参数更新方向改变时减少震荡。 3. 自适应学习率优化器(Adaptive Learning Rate):根据参数的梯度情况自适应地调整学习率。常见的自适应学习率优化器有AdaGrad、RMSprop和Adam等。 4. 共轭梯度法(Conjugate Gradient):用于求解无约束最优化问题的一种方法,通过迭代地搜索共轭方向来更新参数。 5. L-BFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno):也是一种用于求解无约束最优化问题的方法,它利用有限内存来近似存储Hessian矩阵的逆。 6. AdamW:是Adam优化器的一种变种,通过引入权重衰减(Weight Decay)来解决Adam优化器对权重衰减不敏感的问题。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 常用的激活函数合集(详细版) 35756
  • 梯度消失与梯度爆炸产生、原理和解决方案 12279
  • 膨胀卷积(Dilated convolutions)(又叫空洞卷积、扩张卷积) 10339
  • 常用的损失函数合集 9964
  • 安装双系统之Ubuntu 9823

分类专栏

  • 开发环境问题 3篇
  • 部署 1篇
  • 评价指标 1篇
  • 外围设备 1篇
  • 深度学习环境安装系列 6篇
  • 前端 1篇
  • FFMPEG 2篇
  • 通信 1篇
  • RKNN开发板 1篇
  • 激活函数 1篇
  • 深度学习 4篇
  • 损失函数 1篇
  • github 3篇
  • 目标检测 1篇
  • 卷积运算 4篇
  • Python脚本 1篇
  • 梯度问题 1篇
  • 微信小程序 1篇
  • 优化器 1篇
  • 安卓开发 3篇

最新评论

  • Jetson nano 安装Ubuntu20.04系统

    2301_80724748: 作者您好,能给下镜像文件的网盘吗,这个实在下不下来,十分感谢

  • VS2019 快速配置Onnxruntime环境

    2301_77829978: 你好,能问一下问题怎么解决的吗,我找了一下include文件夹里有onnxruntime_cxx_api.h这个啊

  • 矩阵乘法实现卷积运算

    Pan_William: 卷积核矢量化,再滑动,本质上来说是构造一个托普利兹矩阵吧

  • 控制小米插座(Python-miio)

    小wu学cv: 内网穿透

  • 控制小米插座(Python-miio)

    幻境迷: 这个必须要在同一个局域网,不在同一局域网怎么控制

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • FFMPEG推流到B站直播
  • Opencv C++ 绘制中文
  • Cat将所有安装包打包一个可执行文件(bin等),实现一键安装
2024年1篇
2023年22篇
2022年20篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码德州网站优化按天计费报价伊犁网站推广工具哪家好布吉seo价格罗湖网站排名优化报价银川百度标王推荐淄博网站优化按天扣费公司桂林优化永新seo排名推荐滨州网站搜索优化哪家好张家口英文网站建设多少钱南充关键词排名包年推广哪家好永湖建站多少钱新余网站seo优化公司天门网站优化排名多少钱海北seo优化南阳SEO按天计费哪家好玉树关键词按天收费报价常德seo排名公司横岗百度竞价包年推广报价河池seo优化湘西网站推广工具三明网站seo优化推荐垦利建站推荐衡阳外贸网站建设哪家好赤峰网站推广系统报价南通英文网站建设价格海南百度关键词包年推广价格遵义网站优化按天扣费公司邢台网页制作来宾百度网站优化报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化