`
wx1568037608
  • 浏览: 33479 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

从 SGD 到 Adam —— 深度学习优化算法概览(一) 重点

 
阅读更多

https://zhuanlan.zhihu.com/p/32626442

445 人赞同了该文章

楔子

前些日在写计算数学课的期末读书报告,我选择的主题是「分析深度学习中的各个优化算法」。在此前的工作中,自己通常就是无脑「Adam 大法好」,而对算法本身的内涵不知所以然。一直希望能抽时间系统的过一遍优化算法的发展历程,直观了解各个算法的长处和短处。这次正好借着作业的机会,补一补课。

本文主要借鉴了 

 的文章[1]思路,使用一个 general 的框架来描述各个梯度下降变种算法。实际上,本文可以视作对[1]的重述,在此基础上,对原文描述不够详尽的部分做了一定补充,并修正了其中许多错误的表述和公式。

 

另一主要参考文章是 Sebastian Ruder 的综述[2]。该文十分有名,大概是深度学习优化算法综述中质量最好的一篇了。建议大家可以直接阅读原文。本文许多结论和插图引自该综述。

对优化算法进行分析和比较的文章已有太多,本文实在只能算得上是重复造轮,旨在个人学习和总结。希望对优化算法有深入了解的同学可以直接查阅文末的参考文献。

引言

最优化问题是计算数学中最为重要的研究方向之一。而在深度学习领域,优化算法的选择也是一个模型的重中之重。即使在数据集和模型架构完全相同的情况下,采用不同的优化算法,也很可能导致截然不同的训练效果。

梯度下降是目前神经网络中使用最为广泛的优化算法之一。为了弥补朴素梯度下降的种种缺陷,研究者们发明了一系列变种算法,从最初的 SGD (随机梯度下降) 逐步演进到 NAdam。然而,许多学术界最为前沿的文章中,都并没有一味使用 Adam/NAdam 等公认“好用”的自适应算法,很多甚至还选择了最为初级的 SGD 或者 SGD with Momentum 等。

本文旨在梳理深度学习优化算法的发展历程,并在一个更加概括的框架之下,对优化算法做出分析和对比。

Gradient Descent

梯度下降是指,在给定待优化的模型参数 [公式] 和目标函数 [公式] 后,算法通过沿梯度 [公式] 的相反方向更新 [公式] 来最小化 [公式] 。学习率 [公式] 决定了每一时刻的更新步长。对于每一个时刻 [公式] ,我们可以用下述步骤描述梯度下降的流程:

(1) 计算目标函数关于参数的梯度

[公式]

(2) 根据历史梯度计算一阶和二阶动量

[公式]

[公式]

(3) 更新模型参数

[公式]

其中, [公式] 为平滑项,防止分母为零,通常取 1e-8。

Gradient Descent 和其算法变种

根据以上框架,我们来分析和比较梯度下降的各变种算法。

Vanilla SGD

朴素 SGD (Stochastic Gradient Descent) 最为简单,没有动量的概念,即

[公式]

[公式]

[公式]

这时,更新步骤就是最简单的

[公式]

SGD 的缺点在于收敛速度慢,可能在鞍点处震荡。并且,如何合理的选择学习率是 SGD 的一大难点。

Momentum

SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量 Momentum[3],加速 SGD 在正确方向的下降并抑制震荡。

[公式]

SGD-M 在原步长之上,增加了与上一时刻步长相关的 [公式] ,[公式] 通常取 0.9 左右。这意味着参数更新方向不仅由当前的梯度决定,也与此前累积的下降方向有关。这使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛和减小震荡的效果。

图 1(a): SGD图 1(b): SGD with momentum

从图 1 中可以看出,引入动量有效的加速了梯度下降收敛过程。

Nesterov Accelerated Gradient

图 2: Nesterov update

更进一步的,人们希望下降的过程更加智能:算法能够在目标函数有增高趋势之前,减缓更新速率。

NAG 即是为此而设计的,其在 SGD-M 的基础上进一步改进了步骤 1 中的梯度计算公式:

[公式]

参考图 2,SGD-M 的步长计算了当前梯度(短蓝向量)和动量项 (长蓝向量)。然而,既然已经利用了动量项来更新 ,那不妨先计算出下一时刻 [公式] 的近似位置 (棕向量),并根据该未来位置计算梯度(红向量),然后使用和 SGD-M 中相同的方式计算步长(绿向量)。这种计算梯度的方式可以使算法更好的「预测未来」,提前调整更新速率。

Adagrad

SGD、SGD-M 和 NAG 均是以相同的学习率去更新 [公式] 的各个分量。而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有所区别。对于更新不频繁的参数(典型例子:更新 word embedding 中的低频词),我们希望单次步长更大,多学习一些知识;对于更新频繁的参数,我们则希望步长较小,使得学习到的参数更稳定,不至于被单个样本影响太多。

Adagrad[4] 算法即可达到此效果。其引入了二阶动量:

[公式]

其中, [公式] 是对角矩阵,其元素 [公式] 为参数第 [公式] 维从初始时刻到时刻 [公式] 的梯度平方和。

此时,可以这样理解:学习率等效为 [公式] 。对于此前频繁更新过的参数,其二阶动量的对应分量较大,学习率就较小。这一方法在稀疏数据的场景下表现很好。

RMSprop

在 Adagrad 中, [公式] 是单调递增的,使得学习率逐渐递减至 0,可能导致训练过程提前结束。为了改进这一缺点,可以考虑在计算二阶动量时不累积全部历史梯度,而只关注最近某一时间窗口内的下降梯度。根据此思想有了 RMSprop[5]。记 [公式] 为 [公式] ,有

[公式]

其二阶动量采用指数移动平均公式计算,这样即可避免二阶动量持续累积的问题。和 SGD-M 中的参数类似,[公式] 通常取 0.9 左右。

Adadelta

待补充

Adam

Adam[6] 可以认为是 RMSprop 和 Momentum 的结合。和 RMSprop 对二阶动量使用指数移动平均类似,Adam 中对一阶动量也是用指数移动平均计算。

[公式]

[公式]

其中,初值

[公式]

[公式]

注意到,在迭代初始阶段,[公式] 和 [公式] 有一个向初值的偏移(过多的偏向了 0)。因此,可以对一阶和二阶动量做偏置校正 (bias correction),

[公式]

[公式]

再进行更新,

[公式]

可以保证迭代较为平稳。

NAdam

NAdam[7] 在 Adam 之上融合了 NAG 的思想。

首先回顾 NAG 的公式,

[公式]

[公式]

[公式]

NAG 的核心在于,计算梯度时使用了「未来位置」[公式]。NAdam 中提出了一种公式变形的思路[7],大意可以这样理解:只要能在梯度计算中考虑到「未来因素」,即能达到 Nesterov 的效果;既然如此,那么在计算梯度时,可以仍然使用原始公式 [公式] ,但在前一次迭代计算 [公式] 时,就使用了未来时刻的动量,即 [公式] ,那么理论上所达到的效果是类似的。

这时,公式修改为,

[公式]

[公式]

[公式]

[公式]

理论上,下一刻的动量为 [公式],在假定连续两次的梯度变化不大的情况下,即 [公式],有 [公式]。此时,即可用 [公式] 近似表示未来动量加入到 [公式] 的迭代式中。

类似的,在 Adam 可以加入 [公式] 的变形,将 [公式] 展开有

[公式]

引入

[公式]

再进行更新,

[公式]

即可在 Adam 中引入 Nesterov 加速效果。

可视化分析

图 3: SGD optimization on loss surface contours
图 4: SGD optimization on saddle point

图 3 和图 4 两张动图直观的展现了不同算法的性能。(Image credit: Alec Radford)

图 3 中,我们可以看到不同算法在损失面等高线图中的学习过程,它们均同同一点出发,但沿着不同路径达到最小值点。其中 Adagrad、Adadelta、RMSprop 从最开始就找到了正确的方向并快速收敛;SGD 找到了正确方向但收敛速度很慢;SGD-M 和 NAG 最初都偏离了航道,但也能最终纠正到正确方向,SGD-M 偏离的惯性比 NAG 更大。

图 4 展现了不同算法在鞍点处的表现。这里,SGD、SGD-M、NAG 都受到了鞍点的严重影响,尽管后两者最终还是逃离了鞍点;而 Adagrad、RMSprop、Adadelta 都很快找到了正确的方向。

关于两图的讨论,也可参考[2]和[8]。

可以看到,几种自适应算法在这些场景下都展现了更好的性能。

讨论、选择策略

读书报告中的讨论内容较为杂乱,该部分待整理完毕后再行发布。

References

[1] Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法

[2] An overview of gradient descent optimization algorithms

[3] On the momentum term in gradient descent learning algorithms

[4] Adaptive Subgradient Methods for Online Learning and Stochastic Optimization

[5] CSC321 Neural Networks for Machine Learning - Lecture 6a

[6] Adam: A Method for Stochastic Optimization

[7] Incorporating Nesterov Momentum into Adam

[8] CS231n Convolutional Neural Networks for Visual Recognition

分享到:
评论

相关推荐

    deeplearning 深度学习笔记V5.5

    其中Adam算法因其能够自动调整学习率而被广泛采用。 - **正则化技术**:包括Dropout、Batch Normalization等技术,用于减少模型过拟合现象,提高泛化能力。 - **初始化策略**:如Xavier初始化和He初始化等方法,用于...

    深度学习面试资料-含答案

    #### 一、深度学习面试的重要性与内容概览 深度学习作为人工智能领域的重要分支,在当前科技发展中占据着举足轻重的地位。随着技术的进步和应用场景的不断扩大,深度学习工程师的需求量也在逐年增加。因此,对于...

    1天搞懂深度学习

    在一天内对深度学习有一个全面的理解并非易事,但我们可以快速概览其关键概念和组成部分。 首先,我们从基础开始。深度学习依赖于神经网络,这些网络由大量的人工神经元组成,它们模拟大脑中的神经元,负责处理和...

    吴恩达深度学习笔记

    综上所述,《吴恩达深度学习笔记》涵盖了从基础知识到高级技术的全面内容,不仅适合初学者入门,也为进阶用户提供深入了解和实践的机会。通过这门课程的学习,参与者不仅能够掌握深度学习的核心技术,还能了解其在...

    延世大学神经网络上课PPT(深度学习)

    延世大学的神经网络深度学习PPT是一份全面的学习资源,覆盖了从基本理论到最新进展的广泛内容。通过深入学习这些知识,学生将能够设计、训练和优化自己的神经网络模型,解决实际问题,并在AI领域取得卓越成就。

    机器学习&深度学习学习之路.zip

    2. 优化算法:梯度下降、随机梯度下降(SGD)、动量法、Adam等,更新模型参数。 3. 正则化:L1、L2正则防止过拟合,Dropout在训练时随机关闭神经元降低复杂度。 4. 批量归一化、权重初始化:改善网络内部梯度传播,...

    深度学习-PyTorch框架实战系列视频课程

    - 损失函数与优化算法:如均方误差(MSE)、交叉熵损失等,以及梯度下降法、随机梯度下降(SGD)、Adam等优化算法的原理与应用。 #### 二、PyTorch框架介绍 1. **PyTorch简介**: - 背景:PyTorch是由Facebook的...

    [.md & .ipynb] 人工智能与深度学习实战--数理统计与数据分析篇.zip

    2. **优化器**:如梯度下降、随机梯度下降(SGD)、Adam等,利用统计方法调整模型参数。 3. **超参数调优**:使用网格搜索、随机搜索等统计策略找到最佳模型配置。 4. **模型验证**:通过交叉验证评估模型泛化能力,...

    YOLO(You Only Look Once)是一个流行的实时目标检测算法,它通过单个神经网络模型同时预测图像中多个目标的位置

    ### YOLO(You Only Look Once)实时目标检测算法概览与开发流程 #### 一、YOLO 算法原理 YOLO 是一种高效且准确的目标检测算法,其核心思想在于通过一次图像扫描即可同时预测出图像中的多个对象及其类别。与传统...

    2020级-20210320-周宣辰 - 副本1

    【标题】: PyTorch深度学习实践概览 【描述】: 本文档记录了20210320周宣辰的工作进展,主要内容涉及使用PyTorch进行深度学习的实践,包括LeetCode刷题、PyTorch入门、MNIST手写体识别以及线性模型、梯度下降算法、...

    deep learning 书籍分享ppt

    - 训练深度学习模型涉及大量的优化问题,这部分可能讨论了梯度下降的各种变体,如随机梯度下降(SGD)、动量法以及Adam优化器等。 9. **章节11:实用方法** - 2017-05-21-chap11-Practical+Methodology.pdf可能...

    2024学习并就业人工智能-小宋编码(笔记+视频+源码).pdf

    - **优化算法选择**: 如Adam、SGD等优化器的选择依据。 - **正则化方法**: L1、L2正则化等防止过拟合的技术。 - **超参数调整**: 学习率、批次大小等超参数的调优策略。 - **模型评估与调试**: 使用准确率、损失函数...

    Ng-MachineLearning-XMind.rar

    常见的优化算法有梯度下降法及其变种,如随机梯度下降(SGD)、动量法和Adam优化器。正则化是防止过拟合的手段,如L1和L2正则化,它们通过对权重参数施加约束来限制模型复杂度。 数据预处理也是机器学习流程的关键...

    乐高图像分类数据集,20类乐高积木

    在训练过程中,通过反向传播和优化算法(如Adam或SGD)更新模型权重,以最小化损失函数,通常采用交叉熵作为多分类问题的损失函数。模型训练完成后,可以使用测试集来评估模型的准确性和泛化能力。 最后,标签...

    PyTorch-v1.0.0

    - **Optimizer**:提供各种优化算法,如SGD、Adam等。 - **数据处理模块**: - **Dataset**:抽象类,用户需要继承该类并实现特定的数据加载逻辑。 - **DataLoader**:封装了Dataset,提供迭代器接口,方便数据的...

    modelPiture项目

    5. **训练与优化**: 学习率调度、损失函数的选择(如交叉熵)、优化器(如Adam、SGD)的使用,以及模型的训练过程可能都在"modelPiture"文件中有所体现。 6. **模型保存与加载**: 项目可能包含模型权重的保存和加载...

    caffe 官方教程 中文版

    - **4.2.1 SGD**(随机梯度下降)是最常用的优化算法之一。 - **4.2.2 AdaDelta**、**4.2.3 AdaGrad**、**4.2.4 Adam**、**4.2.5 NAG**(带有动量的梯度下降)、**4.2.6 RMSprop**等方法,这些算法能够自动调整...

    pytroch 简易介绍教程

    PyTorch作为一款强大的深度学习框架,不仅提供了一系列高级功能,而且易于使用,适合从初学者到专家级用户的广泛需求。通过本教程,读者可以了解到PyTorch的基本概念和用法,为进一步深入学习打下坚实的基础。

    cs231m-2015:斯坦福大学 CS231M 的课程材料

    总结来说,CS231M课程是一个全面的深度学习和计算机视觉教程,使用Java语言,涵盖了从基础理论到实践应用的各个层面,对于想要在这一领域深入学习的Java开发者来说,是一个不可多得的学习机会。

Global site tag (gtag.js) - Google Analytics