深度学习中的神经网络模型根据预测值和真实值构建一个损失函数,通过优化算法最优化这个损失函数来达到学习神经网络模型参数的目的,进而提高神经网络模型性能。神经网络模型的参数学习主要是使用梯度下降法,在具体实现中梯度下降法又可以分为批量梯度下降法、随机梯度下降法和小批量梯度下降法(SGD)三种形式。对于梯度下降法的改进,一是调整梯度方向,优化训练速度,如动量法;二是调整学习率,使得优化更稳定,如自适应梯度法(Adagrad)、均方根传递法(RMSprop)、自适应增量法(Adadelta)。综合了两方面改进的自适应矩估计法(Adam),以及Adam的改进算法,如基于无穷范数的Adam变体(Adamax)、解耦权重衰减的Adam(AdamW)、Nesterov加速Adam(NAdam)、矫正后的Adam(RAdam)。本文主要讨论了上述提及的优化算法的原理、基本运算过程和优缺点,为优化算法的选择应用提供参考。

参考:《动⼿学深度学习》,PyTorch官方文档PyTorch documentation — PyTorch 2.0 documentation

一、深度学习中常用优化算法

1 梯度下降法

        使用梯度下降法求解损失函数的最小值,要向函数上当前点对应梯度的反方向以规定步长进行迭代搜索。在具体实现过程中,梯度下降法又分为批量梯度下降法、随机梯度下降法和小批量梯度下降法三种形式,区别在于每次参数更新时计算的样本量不同。

1.1 批量梯度下降法

原理

        每次更新时,计算所有样本的梯度。

基本运算过程

       

优点

        1.通常可以收敛到全局最小值。

        2.每次更新是对所有样本进行计算,可以使用向量化计算,实现并行计算。

        3.收敛过程震荡非常小。

缺点

        1.数据集非常大时,计算量开销大,计算速度慢。

1.2 随机梯度下降法

原理

        每次更新时,计算一个随机样本的梯度。

基本运算过程

      

优点

        1.计算量开销小,计算速度快。

缺点

        1.收敛过程震荡非常大,上下震荡会减慢梯度下降的速度,同时无法使用较大的学习率,否则可能会震荡过大,而较小的学习率会使收敛缓慢。

        2.不会收敛到全局最小值,而是在最小值附近抖动。

        3.失去了使用向量化加速计算的机会,每次只处理一个数据,非常没有效率。

1.3 小批量梯度下降法(SGD)

原理

        批量梯度下降法和随机梯度下降法的折中方案,在一定程度上兼顾了以上两种方法的优点。每次更新时,从样本集上随机抽取一个小样本集,计算小样本集的所有样本的梯度。小样本集的样本数为batch_size,通常设置为2的幂次方,更有利于GPU加速处理,若batch_size=1则为随机梯度下降法,若batch_size=样本集的样本数则为批量梯度下降法。

基本运算过程

      

优点

        1.可以使用向量化计算,实现并行计算。

        2.计算的开销量较小,计算速度较快。

        3.通常收敛到全局最小值附近的一个值,不会总在最小值附近抖动,收敛效果更加接近批量梯度下降法。

        4.收敛过程仍有震荡,但相比随机梯度下降法,它趋向于更一致地朝全局最小值的方向前进,即降低了随机性。

以上算法共同缺点

        1.不保证收敛到全局最小值,在较平坦的区域,由于梯度接近于0,陷入临界点(局部最小值点或鞍点),而得不到全局最⼩值。

        2.固定学习率,缺乏适应性。

2 动量法(Momentum)

原理

        在SGD基础上结合指数加权平均的思想,用过去梯度的加权平均值来替换梯度更新参数,加速梯度下降。动量v累加了过去梯度,指向过去梯度的加权平均值的方向,通过控制不同方向的梯度,使得各个方向的梯度移动一致,从而减少梯度在各个位置的发散。

基本运算过程

      

优点

        1.可以防止SGD优化过程停滞的问题,在梯度接近于0的区域,动量因子β使得更新步幅增大,跳出临界点,从而可以收敛到全局最小值。

        2.在梯度方向改变时,可以降低参数更新速度,减少震荡;在梯度方向相同时,可以加快参数更新速度,加速收敛。

缺点

        1.需要存储额外的状态变量(动量v)。

        2.固定学习率,缺乏适应性。

3 Adagrad

原理

        在SGD基础上用过去梯度的平方和来调整学习率,它会随梯度的大小自动变化,通常对于较⼤梯度的坐标会显著缩小,而其他梯度较小的坐标则会得到更平滑的处理。变量s累加了过去梯度平方,指向过去梯度平方和的方向。

基本运算过程

      

优点

        1.会在单个坐标层面动态降低学习率。对于稀疏特征特别有效,在此情况下由于不常出现的问题,学习率需要更慢地降低。

缺点

        1.需要存储额外的状态变量(变量s)。

        2.仍依赖手动设置全局学习率γ。

        3.由于缺乏规范化,没有约束力,st持续增长,几乎上是在算法收敛时呈线性递增,学习率衰减太快,导致变量在算法的后期阶段移动非常缓慢的问题。

4 RMSprop

原理

        在Adagrad的基础上结合指数加权平均的思想,用过去梯度平方的加权平均值来调整学习率,使用该参数的梯度一致性缓慢调整速率,分离每个坐标的缩放,即每个参数使用单独的自适应学习率。变量s累加了过去梯度平方,指向过去梯度平方的加权平均值的方向。

基本运算过程

     

优点

        1.可以防止Adagrad优化过程中由于学习率衰减太快导致变量在算法的后期阶段移动非常缓慢的问题。

        2.适合处理非平稳目标。

缺点

        1.需要存储额外的状态变量(变量s)。

        2.仍依赖手动设置全局学习率γ。

        3.在最小值附近抖动。

5 Adadelta

原理

        在Adagrad的基础上改进了两个改进。一是和RMSprop一样结合指数加权平均的思想,用过去梯度平方的加权平均值来调整学习率,加以限制,防止Adagrad在降低学习率方面可能过于剧烈的问题,变量s用于存储梯度平方的加权平均值。二是使用参数本身的变化量来调整学习率,无需手动设置全局学习率,即使用了(Ut-1+)1/2代替了全局学习率γ,变量u用于存储模型本身中参数变化平方的加权平均值。

基本运算过程

       

优点

        1.可以防止Adagrad优化过程中由于学习率衰减太快导致变量在算法的后期阶段移动非常缓慢的问题。

        2.不需要全局学习率。

缺点

        1.需要存储额外的状态变量(变量s和变量u)。

        2.在最小值附近抖动。

6 Adam

原理

        Adam相当于Momentum加上RMSprop,不直接使用动量RMSprop的原因:动量RMSprop使用重新缩放梯度的动量来更新参数,而Adam更新是使用梯度的一阶矩和二阶矩的移动平均值直接估计,更重要的是动量RMSprop缺少偏差校正项。通常β1为0.9,β2为0.999,二阶矩估计的移动远远慢于一阶矩估计的移动,如果一阶矩估计和二阶矩估计都初始化为 0 向量,那就会有相当大的初始偏差,所以做了偏差校正,从而调整缓慢的启动速度。

基本运算过程

      

       

优点

        1.结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点。

        2.易于实现,只需要很少的内存。

        3.适用大型数据集和高维参数空间。

        4.适用非凸优化问题。

缺点

        1.需要存储额外的状态向量(变量m和变量v)。

        2.仍依赖手动设置全局学习率γ。

        3.L2正则化对Adam的效果不如SGD。

二、Adam改进的优化算法

1 Adamax

Adamax是一种基于无穷范数的Adam变体,由Adam基于L2范数的更新规则推广到基于Lp范数的更新规则,并让p趋向无穷,算法简单又稳定。Adamax的学习率边界范围更简单。

2 AdamW

通过将Adam中的权重衰减和针对损失函数采取的优化步骤解耦来恢复权重衰减正则化的原始公式,允许它在图像分类数据集上与带动量SGD竞争,它还使学习率和权重衰减因子的最佳设置更加独立,从而简化了超参数优化。

3 NAdam

Adam中的动量替换成Nesterov动量,提高了收敛速度和学习模型的质量。

 

4 RAdam

   RAdam是一种基于学习率预热的Adam的变体,自适应学习率被校正以具有一致的方差,稳定训练、加速收敛。由于模型训练早期样本量有限,自适应学习率具有不期望的大方差,并可能导致模型收敛到可疑/坏的局部最优,在早期阶段设置较小的学习率可以减少方差,可以缓解这个问题。

 

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐