入门神经网络优化算法(一):Gradient Descent,Momentum,Nesterov accelerated gradient
- 入门神经网络优化算法(一):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相关推荐
- NESTEROV ACCELERATED GRADIENT AND SCALE INVARIANCE FOR ADVERSARIAL ATTACKS (翻译,侵删)
NESTEROV ACCELERATED GRADIENT AND SCALE INVARIANCE FOR ADVERSARIAL ATTACKS(Nesterov 加速梯度和缩放不变性攻击) 摘要 ...
- Paper:论文解读《Adaptive Gradient Methods With Dynamic Bound Of Learning Rate》中国本科生提出AdaBound的神经网络优化算法
Paper:论文解读-<Adaptive Gradient Methods With Dynamic Bound Of Learning Rate>中国本科生(学霸)提出AdaBound的 ...
- 【深度学习】从梯度下降到 Adam!一文看懂各种神经网络优化算法
王小新 编译自 Medium 量子位 出品 | 公众号 QbitAI,编辑:AI有道 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯 ...
- 从梯度下降到 Adam!一文看懂各种神经网络优化算法
来源丨量子位 编辑丨极市平台 导读 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法?这篇文章介绍了不同优化算 ...
- 各种神经网络优化算法:从梯度下降到Adam方法
在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳 ...
- 神经网络优化算法总结【SGD】---【Adam】
在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳 ...
- 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-d ...
- 神经网络优化算法总结
Datawhale干货 编译:王小新,来源:量子位 在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法? 这篇文 ...
- 一文概览神经网络优化算法
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一.机器学习的优化 机器学习的优化(目标),简单来说是:搜索模型的 ...
最新文章
- python event多线程回调
- Google 图片搜索的原理是什么?
- sklearn one_hot向量输出维度第2维大小的本质
- CPU 乱序执行验证
- 通过NetMassDownloader批量下载和使用微软.NET框架源代码
- sklearn自学指南(part49)--字典学习
- 微信公众号接口添加菜单时错误(errcode:40017 invalid button type)
- c# 服务器性能监控,C#服务器性能监控之WMI的代码示例详解
- IP多播技术及其应用
- expect详解及自动登录脚本的实现
- (pytorch-深度学习系列)正向传播与反向传播-学习笔记
- 使用注解配置spring如@Compnent、@Service、@Consroller、@scope和@value的使用
- JAVA SSM框架+Redis 实现单点登录
- 大数据和人工智能,金融产业的创新发展通道
- ConcurrentHashMap源码分析
- Java集合面试题看这篇就够了
- 【html教程】非常全的主页设置代码,HTML代码教程
- 什么是着色器 (Shader)占用率(Occupancy)? 为什么我们应该关心它?
- 使用shell脚本删除rabbitMq的exchange
- 猫咪APP 服务器不稳定,这下知道猫咪为啥经常情绪不稳定了不?
热门文章
- 河北计算机对口高考数学考试题,河北省对口招生考试数学模拟试题
- ArcGIS学习记录—SHP文件转换为KML KMZ数据,并显示面要素相应的标注
- 1.$是什么 2.阿贾克斯是什么,怎么创建和优点
- python实现中文繁体和中文简体之间的相互转换的代码
- MTK 驱动---MTK平台 电池驱动相关
- 牛客网C++刷题 万能头文件
- laravel 模板
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业生书籍回购及租赁销售管理系统1c16w
- Redis开发与运维笔记_1 初识2 API
- 打开我的计算机桌面分块,win10如何在桌面分块展示四个文件