本文介绍常见的一阶数值优化算法,这些方法在现代神经网络框架(tensorflow, caffe, torch)中已经是标准配置。

问题

设系统参数为 ω \omega ω。对于样本 i i i,其代价函数为 Q i ( ω ) Q_i(\omega) Qi​(ω)。在n个样本组成的训练集上,其整体代价函数为:
Q ( ω ) = ∑ i = 1 n Q i ( ω ) Q(\omega)=\sum_{i=1}^nQ_i(\omega) Q(ω)=i=1∑n​Qi​(ω)

要求 ω \omega ω使得上式最小,由于没有闭式解,需要通过近似迭代逐步逼近。

基础一阶优化

GD

GD(Gradient Descent)以 η \eta η为学习率,在每次迭代中用一阶泰勒展开近似:
ω t + 1 = ω t − η ∇ Q ( ω ) \omega_{t+1}=\omega_t - \eta\nabla Q(\omega) ωt+1​=ωt​−η∇Q(ω)

将求和与梯度互换。GD方法的增量来源于对所有样本同时求梯度之和:
ω t + 1 = ω t − η ∑ i = 1 n ∇ Q i ( ω ) \omega_{t+1}=\omega_t - \eta\sum_{i=1}^n\nabla Q_i(\omega) ωt+1​=ωt​−ηi=1∑n​∇Qi​(ω)

设 ω \omega ω的维度为D,代价函数 Q Q Q是个标量,减号后的梯度也是一个D维向量。

SGD

SGD(Stochastic Gradient Descent)在每次迭代中,顺次使用每个样本的梯度,更新参数:

for i=1 to n
ω t + 1 = ω t − η ∇ Q i ( ω ) \omega_{t+1}=\omega_t - \eta \nabla Q_i(\omega) ωt+1​=ωt​−η∇Qi​(ω)

一种折衷的方法是,把m个样本组成一个mini-batch,使用mini-batch的总梯度更新参数:

for i=1 to n/m
ω t + 1 = ω t − η ∑ j = 1 m ∇ Q i j ( ω ) \omega_{t+1}=\omega_t - \eta \sum_{j=1}^m \nabla Q_{ij}(\omega) ωt+1​=ωt​−ηj=1∑m​∇Qij​(ω)

其中 Q i j ( ω ) Q_{ij}(\omega) Qij​(ω)为第i个minibatch中第j个样本的代价。

为书写简便,以下说明中不再出现样本序号i。 ∇ Q ( ω ) \nabla Q(\omega) ∇Q(ω)可以指一个样本、一个mini-batch或者全部样本的梯度只和。

更快的一阶优化

这些方法都以GD为基础,但收敛速度更快,换句话说 ϵ t \epsilon_t ϵt​更小。
关于收敛速度的意义,请参看这篇博客。

ASGD

ASGD(Average Stochastic Gradient Descent)选择一个迭代的时间点(代数) t 0 t_0 t0​,在这个时间点之前,和SGD一样:
ω ˉ t = ω t \bar{\omega}_t = \omega_t ωˉt​=ωt​

在这个时间点之后,使用 t 0 t_0 t0​到当前时刻 t t t的平均值:
ω ˉ t = 1 t − t 0 + 1 ∑ τ = t 0 t ω τ \bar{\omega}_t = \frac{1}{t-t_0+1}\sum_{\tau=t_0}^t\omega_\tau ωˉt​=t−t0​+11​τ=t0​∑t​ωτ​

AdaGrad

AdaGrad1(Adaptive Gradient)方法对参数的每一维进行归一化,使用的分母是之前步骤中该维度的平方和:
ω t + 1 d = ω t d − η 1 ∑ τ = 1 t − 1 [ ∇ Q ( ω t ) d ] 2 ∇ Q ( ω t ) \omega_{t+1}^d=\omega_t^d-\eta\frac{1}{\sqrt{\sum_{\tau=1}^{t-1} \left[ \nabla Q(\omega_t)^d\right]^2}}\nabla Q(\omega_t) ωt+1d​=ωtd​−η∑τ=1t−1​[∇Q(ωt​)d]2 ​1​∇Q(ωt​)
相当于为每一维参数设定了不同的学习率:压制常常变化的参数,突出稀缺的更新。能够更有效地利用少量有意义样本。

AdaDelta

AdaDelta2(Adaptive Delta)和AdaGrad一样为每一维参数设定不同学习率,但是不用再设定基础学习率 η \eta η。

首先维护一个期望D,描述之前迭代中的参数变化情况,同样是个D维向量:
D t = γ D t − 1 + ( 1 − γ ) Δ ω t 2 D_t=\gamma D_{t-1}+(1-\gamma)\Delta\omega^2_t Dt​=γDt−1​+(1−γ)Δωt2​

另一个期望G,描述之前迭代中的梯度的平方:
G t = γ G t − 1 + ( 1 − γ ) ∇ Q ( ω ) t 2 G_t=\gamma G_{t-1} + (1-\gamma)\nabla Q(\omega)_t^2 Gt​=γGt−1​+(1−γ)∇Q(ω)t2​

使用D和G的比值作为权重,分别归一化每一维参数:
ω t + 1 d = ω t d − D t d G t + 1 d ∇ Q ( ω ) \omega_{t+1}^d=\omega_t^d-\frac{D_t^d}{G_{t+1}^d}\nabla Q(\omega) ωt+1d​=ωtd​−Gt+1d​Dtd​​∇Q(ω)

减号后的归一化参数决定了:单位梯度变化对应多少参数变化。

Adam

Adam3(Adaptive Moment Estimation)的思路和AdaGrad相似,都使用梯度平方根归一化学习率。

注意:为书写简便,后续的矩阵相乘相除都逐元素进行,更新也对参数每一维单独进行。

维护一个一阶momentum,等价于梯度:
m t = α ⋅ m t − 1 + ( 1 − α ) ⋅ ∇ Q ( ω ) m_t=\alpha\cdot m_{t-1} + (1-\alpha)\cdot \nabla Q(\omega) mt​=α⋅mt−1​+(1−α)⋅∇Q(ω)

另一个二阶momentum,等价于梯度平方:
v t = β ⋅ v t − 1 + ( 1 − β ) ⋅ ∇ Q ( ω ) 2 v_t=\beta\cdot v_{t-1}+(1-\beta)\cdot \nabla Q(\omega)^2 vt​=β⋅vt−1​+(1−β)⋅∇Q(ω)2

由于 m , v m,v m,v都初始化为0,使用t次幂让其在头几次迭代中更大一些:
m ^ t = m t 1 − α t , v ^ t = v t 1 − β t \hat m_t=\frac{m_t}{1-\alpha^t}, \hat v_t=\frac{v_t}{1-\beta^t} m^t​=1−αtmt​​,v^t​=1−βtvt​​

使用梯度平方 v v v归一化学习率,更新幅度为梯度 m m m:
ω t + 1 = ω t − η 1 v ^ t m ^ t \omega_{t+1}=\omega_t-\eta\frac{1}{\sqrt{\hat v_t}}\hat m_t ωt+1​=ωt​−ηv^t​ ​1​m^t​

Rprop

RProp4(Resilient Propagation)比较本次梯度 ∇ Q ( ω ) t + 1 d \nabla Q(\omega)_{t+1}^d ∇Q(ω)t+1d​和上次梯度 ∇ Q ( ω ) t d \nabla Q(\omega)_t^d ∇Q(ω)td​符号变化来为参数d的变化加权。

如果两次梯度符号相反,则抑制参数变化( η − < 1 \eta^-<1 η−<1):
ω t + 1 d = ω t d − η − ⋅ ∇ Q ( ω ) \omega_{t+1}^d=\omega_t^d-\eta^-\cdot \nabla Q(\omega) ωt+1d​=ωtd​−η−⋅∇Q(ω)

如果两次符号相同,则增强参数变化( η + > 1 \eta^+>1 η+>1):
ω t + 1 d = ω t d − η + ⋅ ∇ Q ( ω ) \omega_{t+1}^d=\omega_t^d-\eta^+\cdot \nabla Q(\omega) ωt+1d​=ωtd​−η+⋅∇Q(ω)

RMSprop

RMSprop5(Root Mean Square Propagation)类似于简化版的AdaDelta,但是是独立发展而来的。

维护期望G,描述之前迭代中的梯度的平方:
G t = γ G t − 1 + ( 1 − γ ) ∇ Q ( ω ) t 2 G_t=\gamma G_{t-1} + (1-\gamma)\nabla Q(\omega)_t^2 Gt​=γGt−1​+(1−γ)∇Q(ω)t2​

用G修正学习率:
ω t + 1 d = ω t d − η G t + 1 d ∇ Q ( ω ) \omega_{t+1}^d=\omega_t^d-\frac{\eta}{G_{t+1}^d}\nabla Q(\omega) ωt+1d​=ωtd​−Gt+1d​η​∇Q(ω)

NAG

NAG6(Nesterov’s Accelerated Gradient),发明者是毛国数学家Yurii Nesterov。

参数变化由 γ \gamma γ控制:
m t = γ ⋅ m t − 1 + η ⋅ ∇ Q ( ω − γ ⋅ m t − 1 ) m_t = \gamma \cdot m_{t-1} + \eta \cdot \nabla Q(\omega - \gamma\cdot m_{t-1}) mt​=γ⋅mt−1​+η⋅∇Q(ω−γ⋅mt−1​)

导数的计算点不再是当前参数 ω \omega ω,而是从当前参数根据前次变化前进一小步。

用 m t m_t mt​更新参数:
ω t + 1 = ω t − m t \omega_{t+1}=\omega_t-m_t ωt+1​=ωt​−mt​

总结

提速可以归纳为以下几个方面:

  • 使用momentum来保持前进方向(velocity);
  • 为每一维参数设定不同的学习率:在梯度连续性强的方向上加速前进;
  • 用历史迭代的平均值归一化学习率:突出稀有的梯度;

辨:其他优化方法

共轭梯度法(Conjugate Gradient)也是一阶方法,针对特殊形式的代价函数:
Q ( ω ) = 1 2 ω T A ω − ω T b Q(\omega) = \frac{1}{2}\omega^T A \omega - \omega^Tb Q(ω)=21​ωTAω−ωTb

常见的各种牛顿法, L-BFGS核心都是二阶优化方法,利用了代价函数的Hessian矩阵:
x t + 1 = x t − η ⋅ H [ Q ( ω ) ] − 1 ∇ Q ( ω ) x_{t+1}=x_t - \eta \cdot H[Q(\omega)]^{-1}\nabla Q(\omega) xt+1​=xt​−η⋅H[Q(ω)]−1∇Q(ω)
换句话说,牛顿法用线性函数拟合代价函数的导数,而不是代价函数本身。

单纯形法,插值法等只计算代价函数值,不需要求导。


  1. Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. Journal of Machine Learning Research, 12, 2121–2159. ↩︎

  2. Zeiler, M. D. (2012). ADADELTA: An Adaptive Learning Rate Method. Retrieved from http://arxiv.org/abs/1212.5701 ↩︎

  3. Kingma, D. P., & Ba, J. L. (2015). Adam: a Method for Stochastic Optimization. International Conference on Learning Representations, 1–13. ↩︎

  4. Martin Riedmiller und Heinrich Braun: Rprop - A Fast Adaptive Learning Algorithm. Proceedings of the International Symposium on Computer and Information Science VII, 1992 ↩︎

  5. http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf ↩︎

  6. https://blogs.princeton.edu/imabandit/2013/04/01/acceleratedgradientdescent/ ↩︎

【深度学习】常见优化算法相关推荐

  1. 深度学习常见优化算法,图解AdaGrad、RMSProp,Adam

    1. AdaGrad AdaGrad算法是梯度下降法的改进算法,其优点是可以自适应学习率.该优化算法在较为平缓处学习速率大,有比较高的学习效率,在陡峭处学习率小,在一定程度上可以避免越过极小值点.在S ...

  2. 深度学习的优化算法——梯度下降和随机梯度下降

    深度学习的优化算法--梯度下降和随机梯度下降 优化算法在深度学习中存在的问题 优化在深度学习中有很多挑战,下面描述其中两个,局部最小值和鞍点. 1.局部最小值 深度学习模型的目标函数可能存在若干极点- ...

  3. 深度学习(五)优化算法--提高神经网络的训练速度和精度

    转自:https://blog.csdn.net/red_stone1/article/details/78348753 上节课我们主要介绍了如何建立一个实用的深度学习神经网络.包括Train/Dev ...

  4. 收藏 | 从SGD到NadaMax,深度学习十种优化算法原理及实现

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨永远在你身后@知乎 来源丨https://zhuanl ...

  5. 动手学深度学习——基础优化算法梯度下降,小批量随机梯度下降

    一.梯度下降算法 挑选一个初始值w0: 重复迭代参数t=1,2,3: 在接下来不断的更新w0,使它接近最优解: 具体来说,法则如下: wt等于wt的上一时刻减去η乘以损失函数关于wt的上一时刻的梯度. ...

  6. 深度学习经典优化算法-公式汇总

    -----整理自DeepLearning chapter8,主要是方便做算法的对比. 1.基础算法 1.1 随机梯度下降(SGD,Stochastic Gradient Descent) 随机梯度下降 ...

  7. 「深度学习之优化算法」(六)人工蜂群算法

    1. 人工蜂群算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读) 工蜂群算法(Artificial Bee Colony Algorithm,ABC)是一种模仿蜜蜂采蜜机理而产生的群智能优化算 ...

  8. 【深度学习】优化算法-Ftrl

    脑图 代码实现 '''DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSEVersion 2, December 2004Copyright (C) 2004 Sam ...

  9. 深度学习加速:算法、编译器、体系结构与硬件设计

    2020-03-28 10:38:33 概述 NeurlPS2019 大会的「Efficient Processing of Deep Neural Network: from Algorithms ...

  10. 基于深度学习的多目标跟踪算法(上):端到端的数据关联

    ©PaperWeekly 原创 · 作者|黄飘 学校|华中科技大学硕士生 研究方向|多目标跟踪 最近基于深度学习的多目标跟踪算法越来越多,有用于特征提取的,有改进单目标跟踪器的,也有提升数据关联的.如 ...

最新文章

  1. iOS的block内存管理
  2. 微信小程序页面文字超出一行隐藏,文字超出两行隐藏。
  3. Model层视频播放关闭问题及手机视频播放的适配问题解决方案
  4. python扫题软件_python 实现端口扫描工具
  5. android下载 sdk 的两个代理 ,解决下载sdk慢的问题
  6. 【渝粤教育】国家开放大学2018年春季 0133-22T大学物理 参考试题
  7. 平衡二叉树(AVL Tree)
  8. ==与===的区别 与类型转换
  9. 单片机定时报警C语言程序,单片机控制的简易定时报警器电路设计( - 控制/MCU - 电子发烧友网...
  10. pmp 资料_1年 = 15300订阅 + 超100万次收听 (感恩有您,这些PMP备考资料您值得拥有!)...
  11. (转载addone)完全使用Linux作为桌面系统 —— 使用Linux两年记 --软件列表
  12. 使用代理软件SocksCap-v2.38H玩网络游戏
  13. HDOJ1008 Elevator
  14. 图片转换html源代码,将图片转换成HTML格式的文字图程序源代码
  15. 1字符集 iso latin_ISO Latin-1字符集
  16. 解决 Missing GL version
  17. 命令行导入 .dmp文件,亲测可行
  18. 开源BI报表工具Metabase初体验
  19. Markdown 新手指南
  20. org.eclipse.wst.xsl.jaxp.debug.invoker.TransformationException

热门文章

  1. 基于物理的渲染PBR(一):pbr的基础理论和推导
  2. 3D设计软件中怎么画锥齿轮?浩辰3D设计实例
  3. pytorch-多卡GPU训练
  4. python打印电子标签--ghostscript 和reportlab实现
  5. Unity 基于PDFViewer制作读取横板PDF,改为横向滑动读取并做自适应(可网络同步)
  6. IE10,带您走进HTML5时代
  7. 企业数字化转型的步骤是什么?
  8. 《MFC如何添加子对话框》
  9. 背景与小鸟--FlappyBird游戏开发教程之二
  10. 电磁场与仿真软件(21)