• 入门神经网络优化算法(一):Gradient Descent,Momentum,Nesterov accelerated gradient
  • 入门神经网络优化算法(二):Adaptive Optimization Methods:Adagrad,RMSprop,Adam
  • 入门神经网络优化算法(三):待定
  • 入门神经网络优化算法(四):AMSGrad,Radam等一些Adam变种
  • 入门神经网络优化算法(五):二阶优化算法Natural Gradient Descent(Fisher Information)
  • 入门神经网络优化算法(六):二阶优化算法K-FAC
  • 入门神经网络优化算法(七):二阶优化算法Shampoo

梯度下降

基于梯度的优化算法,Gradient based optimization,也往往被称为一阶优化算法。所以很容易猜到,还有二阶优化算法等的高阶优化算法,但是在实际应用中,基于梯度的一阶优化算法是目前的绝对主流方法(当前是,2~3年以后未必),本文就重点罗列一下基于梯度的优化算法。

最典型以及简单的是:梯度下降算法。梯度下降法是神经网络求解优化中最常用的一类算法(实际上是在数值优化方法里的一种常用方法,常常用以求解连续可微函数的局部极小值)。

  • gradient descent:梯度下降,又叫做Vanilla gradient descent,或者Batch gradient descent,特指用整个数据集来计算变量的梯度,它的形式是这样
    θ=θ−η⋅∇θJ(θ)\theta = \theta - \eta \cdot \nabla_\theta J( \theta)θ=θ−η⋅∇θ​J(θ)
    其中θ\thetaθ是求解法变量或者叫weight,也叫parameter,JJJ是cost function或者叫loss function,η\etaη是学习率learning rate。相信很多人初学优化算法一定会看资料[1],其中有说道:Batch gradient descent is guaranteed to converge to the global minimum for convex error surfaces and to a local minimum for non-convex surfaces[1]。前半句global minimum for convex是对的,后半句不完全对,除了local minimum也可能会遇到鞍点(saddle point),以及大片的平坦区域(plateau)。

  • stochastic gradient descent:随机梯度下降,最早提出来是相反于gd每次要用所有的数据,而每次更新只用一个样本:
    θ=θ−η⋅∇θJ(θ;x(i),y(i))\theta = \theta - \eta \cdot \nabla_\theta J( \theta; x^{(i)}, y^{(i)})θ=θ−η⋅∇θ​J(θ;x(i),y(i))
    最大的不同就是只用一个样本来计算梯度,这样做的好处是计算一次梯度代价是O(1),但是往往需要反复计算,而且一般variance比较大,学习率比较难调,容易震荡甚至不收敛。所以实际上我们平时用的最多的是mini-batch stochastic gradient descent,很容易想到,是一个折中方案——每次取一个小batch来计算梯度(平均梯度),比如常用的batch = 32,128,256等,通过一个batch既一定程度上减少了方差,也不会太多增加单次梯度计算cost。然后神奇的地方是,现在的神经网络,只要喂进去数据,用一些default的学习率策略,比如multi-step(0.1),或者poly,总能够收敛,真是香。当然,需要知道,现在很少有人直接用基本的SGD了(还是有些不稳定),而是用Momentum SGD,或者用Nesterov Momentum SGD,我个人觉得这两个优化器才是深度学习算法如此低门槛(好用)可用的关键,虽然说有一阶需要调节的超参数,但是实际上都有一些default经验值非常好用。

Momentum SGD,Nesterov accelerated gradient

先统一下叫法,我们指的Momentum SGD算法一般是指最简单的Polyak‘s momentum(Boris Polyak在1964年提出),又名Heavy Ball算法。Nesterov‘s momentum也就是我们一般指的Nesterov accelerated gradient(NAG)。

  • Momentum SGD:动量SGD,最简单的理解就是在梯度上做一个moving avg,如下形式:
    vt=mvt−1−η∇θJ(θt)θt+1=θt+vtv_t = m v_{t-1} - \eta \nabla_\theta J( \theta_t) \\ \theta_{t+1} = \theta_t + v_t vt​=mvt−1​−η∇θ​J(θt​)θt+1​=θt​+vt​
    其中mmm叫做momentum parameter, m∈[0,1)m \in [0,1)m∈[0,1),当 m=0m=0m=0的时候,就退化成了原始的Vanilla Gradient Method (VGM)。η≥0\eta\ge0η≥0是学习率,在这里假设mmm和η\etaη都是常数,因此不写下标了。注意的是,在不同的文献或代码中,有几种实现方式,都是等价的。比如把加减号换下位置:
    vt=mvt−1+η∇θJ(θt)θt+1=θt−vtv_t = m v_{t-1} + \eta \nabla_\theta J( \theta_t) \\ \theta_{t+1} = \theta_t - v_t vt​=mvt−1​+η∇θ​J(θt​)θt+1​=θt​−vt​
    或者把学习率写在更新项上(第二行):
    vt=mvt−1−∇θJ(θt)θt+1=θt+ηvtv_t = m v_{t-1} - \nabla_\theta J( \theta_t) \\ \theta_{t+1} = \theta_t + \eta v_t vt​=mvt−1​−∇θ​J(θt​)θt+1​=θt​+ηvt​
    当然这个是假设lr是一个常数,所以可以提出来,如果不是一个常数,形式上要想提出来就没那么简单了。但是因为lr本身也很经验性去调,实际中好像也没什么关系。这里我还要再推一个形式,是比较有意思的(看上面第一种形式):
    θt+1=θt+mvt−1−η∇θJ(θt)θt+1=θt−η∇θJ(θt)+m(θt−θt−1)\theta_{t+1} = \theta_t + m v_{t-1} - \eta \nabla_\theta J( \theta_t) \\ \theta_{t+1} = \theta_t - \eta \nabla_\theta J( \theta_t) + m (\theta_{t} - \theta_{t-1}) θt+1​=θt​+mvt−1​−η∇θ​J(θt​)θt+1​=θt​−η∇θ​J(θt​)+m(θt​−θt−1​)
    这个的解释看这一段很有启发[3]:

其实momentum的中文就是高中物理学到的动量。之所以被称作动量,是因为使用momentum的初衷,就是模拟有质量的粒子在有阻尼的场里运动轨迹 。空间内的反梯度方向就是场的作用力方向,粒子会从能量高的位置(初始解)向能量低的位置(最优解)移动,momentum parameter决定阻尼系数。因为粒子有质量,所以具有惯性,而惯性的定性定义是为物体抵抗“动量”改变的性质。换句话说,粒子具有保持静止状态或匀速直线运动状态的性质,所以粒子的运动的瞬时方向,会是力的作用方向和轨迹切线方向的一个组合。
这个物理解释可以用于理解MGM的加速效果,粒子从起点到距离终点 [公式] 距离的时间可以解释为算法的迭代复杂度(iteration complexity)。如果阻尼小,会使得粒子产生很高的移动速度,但过大的动量会使得粒子震荡,并非保持向终点移动。而当阻尼过大,又会导致粒子移动过于缓慢的话,会花很久时间接近终点,同时震荡会减小。那么如何选择最优的设置阻尼,这就是已有的大量文献里提供的参数选择了。知道了这个简单的物理解释,其实就可以理解为什么momentum会被称作overshoot了。因为vanilla gradient method其实对应0质量粒子,所以粒子不具备惯性,会始终按作用力方向运动(加速度无穷大)。

很多帖子里写到动量SGD会用类似下面这个图,说左边是sgd,而右边是带动量的。其实这个图的本意是说动量的会快一些,但是实际上对sgd的示意图有问题。可以参考【3】进行理解,我这里就不赘述了。

  • Nesterov‘s momentum:NAG算法是Yurii Nesterov在1983年提出的对冲量梯度下降算法的改进版本,其速度更快。其变化之处在于计算“超前梯度”更新冲量项
    vt=γvt−1−η∇θJ(θt+γvt−1)θt+1=θt+vtv_t = \gamma v_{t-1} - \eta \nabla_\theta J( \theta_t + \gamma v_{t-1} ) \\ \theta_{t+1} = \theta_t + v_t vt​=γvt−1​−η∇θ​J(θt​+γvt−1​)θt+1​=θt​+vt​
    一个NAG计算的梯度的更新方向的示意图如下:

While Momentum first computes the current gradient (small blue vector) and then takes a big jump in the direction of the updated accumulated gradient (big blue vector), NAG first makes a big jump in the direction of the previous accumulated gradient (brown vector), measures the gradient and then makes a correction (red vector), which results in the complete NAG update (green vector).

以上,总结来看可以看下TensorFlow的描述https://tensorflow.google.cn/api_docs/python/tf/keras/optimizers/SGD?hl=en

v(t+1) = momentum * v(t) - learning_rate * gradient
theta(t+1) = theta(t) + v(t+1)
if `nesterov` is False, gradient is evaluated at theta(t).
if `nesterov` is True, gradient is evaluated at theta(t) + momentum * v(t),and the variables always store theta + m v instead of theta

本篇就到这里,下一篇继续。

参考资料

[1] https://ruder.io/optimizing-gradient-descent/index.html#gradientdescentvariants
[2] 数值优化(Numerical Optimization)学习系列-目录
[3] 知乎:常见的关于momentum的误解(上)
[4] 知乎:一文看懂常用的梯度下降算法
[5] 知乎:Nesterov加速和Momentum动量方法

入门神经网络优化算法(一):Gradient Descent,Momentum,Nesterov accelerated gradient相关推荐

  1. NESTEROV ACCELERATED GRADIENT AND SCALE INVARIANCE FOR ADVERSARIAL ATTACKS (翻译,侵删)

    NESTEROV ACCELERATED GRADIENT AND SCALE INVARIANCE FOR ADVERSARIAL ATTACKS(Nesterov 加速梯度和缩放不变性攻击) 摘要 ...

  2. Paper:论文解读《Adaptive Gradient Methods With Dynamic Bound Of Learning Rate》中国本科生提出AdaBound的神经网络优化算法

    Paper:论文解读-<Adaptive Gradient Methods With Dynamic Bound Of Learning Rate>中国本科生(学霸)提出AdaBound的 ...

  3. 【深度学习】从梯度下降到 Adam!一文看懂各种神经网络优化算法

    王小新 编译自 Medium 量子位 出品 | 公众号 QbitAI,编辑:AI有道 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯 ...

  4. 从梯度下降到 Adam!一文看懂各种神经网络优化算法

    来源丨量子位 编辑丨极市平台 导读 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法?这篇文章介绍了不同优化算 ...

  5. 各种神经网络优化算法:从梯度下降到Adam方法

    在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳 ...

  6. 神经网络优化算法总结【SGD】---【Adam】

    在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳 ...

  7. 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-d ...

  8. 神经网络优化算法总结

    Datawhale干货 编译:王小新,来源:量子位 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文 ...

  9. 一文概览神经网络优化算法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.机器学习的优化 机器学习的优化(目标),简单来说是:搜索模型的 ...

最新文章

  1. python event多线程回调
  2. Google 图片搜索的原理是什么?
  3. sklearn one_hot向量输出维度第2维大小的本质
  4. CPU 乱序执行验证
  5. 通过NetMassDownloader批量下载和使用微软.NET框架源代码
  6. sklearn自学指南(part49)--字典学习
  7. 微信公众号接口添加菜单时错误(errcode:40017 invalid button type)
  8. c# 服务器性能监控,C#服务器性能监控之WMI的代码示例详解
  9. IP多播技术及其应用
  10. expect详解及自动登录脚本的实现
  11. (pytorch-深度学习系列)正向传播与反向传播-学习笔记
  12. 使用注解配置spring如@Compnent、@Service、@Consroller、@scope和@value的使用
  13. JAVA SSM框架+Redis 实现单点登录
  14. 大数据和人工智能,金融产业的创新发展通道
  15. ConcurrentHashMap源码分析
  16. Java集合面试题看这篇就够了
  17. 【html教程】非常全的主页设置代码,HTML代码教程
  18. 什么是着色器 (Shader)占用率(Occupancy)? 为什么我们应该关心它?
  19. 使用shell脚本删除rabbitMq的exchange
  20. 猫咪APP 服务器不稳定,这下知道猫咪为啥经常情绪不稳定了不?

热门文章

  1. 河北计算机对口高考数学考试题,河北省对口招生考试数学模拟试题
  2. ArcGIS学习记录—SHP文件转换为KML KMZ数据,并显示面要素相应的标注
  3. 1.$是什么 2.阿贾克斯是什么,怎么创建和优点
  4. python实现中文繁体和中文简体之间的相互转换的代码
  5. MTK 驱动---MTK平台 电池驱动相关
  6. 牛客网C++刷题 万能头文件
  7. laravel 模板
  8. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业生书籍回购及租赁销售管理系统1c16w
  9. Redis开发与运维笔记_1 初识2 API
  10. 打开我的计算机桌面分块,win10如何在桌面分块展示四个文件