优化器总结

机器学习中,有很多优化方法来试图寻找模型的最优解。比如神经网络中可以采取最基本的梯度下降法。

梯度下降法(Gradient Descent)

梯度下降法是最基本的一类优化器,目前主要分为三种梯度下降法:标准梯度下降法(GD, Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及批量梯度下降法(BGD, Batch Gradient Descent)。

标准梯度下降法(GD)

  • 假设要学习训练的模型参数为WW,代价函数为J(W)J(W),则代价函数关于模型参数的偏导数即相关梯度为ΔJ(W)ΔJ(W),学习率为ηtηt,则使用梯度下降法更新参数为:

     

    其中,WtWt表示tt时刻的模型参数。

  • 从表达式来看,模型参数的更新调整,与代价函数关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数。
  • 基本策略可以理解为”在有限视距内寻找最快路径下山“,因此每走一步,参考当前位置最陡的方向(即梯度)进而迈出下一步。可以形象的表示为:

评价:标准梯度下降法主要有两个缺点:

  • 训练速度慢:每走一步都要要计算调整下一步的方向,下山的速度变慢。在应用于大型数据集中,每输入一个样本都要更新一次参数,且每次迭代都要遍历所有的样本。会使得训练过程及其缓慢,需要花费很长时间才能得到收敛解。
  • 容易陷入局部最优解:由于是在有限视距内寻找下山的反向。当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。所谓的局部最优解就是鞍点。落入鞍点,梯度为0,使得模型参数不在继续更新。

批量梯度下降法(BGD)

  • 假设批量训练样本总数为nn,每次输入和输出的样本分别为X(i),Y(i)X(i),Y(i),模型参数为WW,代价函数为J(W)J(W),每输入一个样本ii代价函数关于WW的梯度为ΔJi(Wt,X(i),Y(i))ΔJi(Wt,X(i),Y(i)),学习率为ηtηt,则使用批量梯度下降法更新参数表达式为:

     


    其中,WtWt表示tt时刻的模型参数。

  • 从表达式来看,模型参数的调整更新与全部输入样本的代价函数的和(即批量/全局误差)有关。即每次权值调整发生在批量样本输入之后,而不是每输入一个样本就更新一次模型参数。这样就会大大加快训练速度。
  • 基本策略可以理解为,在下山之前掌握了附近的地势情况,选择总体平均梯度最小的方向下山。

评价:

  • 批量梯度下降法比标准梯度下降法训练时间短,且每次下降的方向都很正确。

随机梯度下降法(SGD)

  • 对比批量梯度下降法,假设从一批训练样本nn中随机选取一个样本isis。模型参数为WW,代价函数为J(W)J(W),梯度为ΔJ(W)ΔJ(W),学习率为ηtηt,则使用随机梯度下降法更新参数表达式为:

     
  • E(gt)=ΔJ(Wt)E(gt)=ΔJ(Wt),这里虽然引入了随机性和噪声,但期望仍然等于正确的梯度下降。
  • 基本策略可以理解为随机梯度下降像是一个盲人下山,不用每走一步计算一次梯度,但是他总能下到山底,只不过过程会显得扭扭曲曲。

评价:

  • 优点:
  • 虽然SGD需要走很多步的样子,但是对梯度的要求很低(计算梯度快)。而对于引入噪声,大量的理论和实践工作证明,只要噪声不是特别大,SGD都能很好地收敛。
  • 应用大型数据集时,训练速度很快。比如每次从百万数据样本中,取几百个数据点,算一个SGD梯度,更新一下模型参数。相比于标准梯度下降法的遍历全部样本,每输入一个样本更新一次参数,要快得多。
  • 缺点:
  • SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。
  • 此外,SGD也没能单独克服局部最优解的问题

动量优化法

动量优化方法是在梯度下降法的基础上进行的改变,具有加速梯度下降的作用。一般有标准动量优化方法Momentum、NAG(Nesterov accelerated gradient)动量优化方法。

NAG在Tensorflow中与Momentum合并在同一函数tf.train.MomentumOptimizer中,可以通过参数配置启用。

Momentum

  • 使用动量(Momentum)的随机梯度下降法(SGD),主要思想是引入一个积攒历史梯度信息动量来加速SGD。
  • 从训练集中取一个大小为nn的小批量{X(1),X(2),...,X(n)}{X(1),X(2),...,X(n)}样本,对应的真实值分别为Y(i)Y(i),则Momentum优化表达式为:
     
     

  • 动量主要解决SGD的两个问题:一是随机梯度的方法(引入的噪声);二是Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。
  • 理解策略为:由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样可以加快小球向下滚动的速度。

NAG

  • 牛顿加速梯度(NAG, Nesterov accelerated gradient)算法,是Momentum动量算法的变种。更新模型参数表达式如下:

     
  • Nesterov动量梯度的计算在模型参数施加当前速度之后,因此可以理解为往标准动量中添加了一个校正因子。
  • 理解策略:在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误。所以需要一个更聪明的小球,能提前知道它要去哪里,还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。计算Wt−αvt−1Wt−αvt−1可以表示小球下一个位置大概在哪里。从而可以提前知道下一个位置的梯度,然后使用到当前位置来更新参数。
  • 在凸批量梯度的情况下,Nesterov动量将额外误差收敛率从O(1/k)(k步后)O(1/k)(k步后)改进到O(1/k2)O(1/k2)。然而,在随机梯度情况下,Nesterov动量对收敛率的作用却不是很大。

自适应学习率优化算法

自适应学习率优化算法针对于机器学习模型的学习率,传统的优化算法要么将学习率设置为常数要么根据训练次数调节学习率。极大忽视了学习率其他变化的可能性。然而,学习率对模型的性能有着显著的影响,因此需要采取一些策略来想办法更新学习率,从而提高训练速度。
目前的自适应学习率优化算法主要有:AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。

AdaGrad算法

思想:

  • AdaGrad算法,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有个快速下降的学习率,而具有小梯度的参数在学习率上有相对较小的下降。

算法描述:

  • AdaGrad算法优化策略一般可以表示为:

     


    假定一个多分类问题,ii表示第ii个分类,tt表示第tt迭代同时也表示分类ii累计出现的次数。η0η0表示初始的学习率取值一般为0.01,ϵϵ是一个取值很小的数(一般为1e-8)为了避免分母为0。WtWt表示tt时刻即第tt迭代模型的参数,gt,i=ΔJ(Wt,i)gt,i=ΔJ(Wt,i)表示tt时刻,指定分类ii,代价函数J(⋅)J(⋅)关于WW的梯度。

  • 从表达式可以看出,对出现比较多的类别数据,Adagrad给予越来越小的学习率,而对于比较少的类别数据,会给予较大的学习率。因此Adagrad适用于数据稀疏或者分布不平衡的数据集。
  • Adagrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0。

RMSProp算法

思想:

  • RMSProp算法修改了AdaGrad的梯度积累为指数加权的移动平均,使得其在非凸设定下效果更好。

算法描述:

  • RMSProp算法的一般策略可以表示为:

     

  • RMSProp借鉴了Adagrad的思想,观察表达式,分母为E[g2]t+ϵ−−−−−−−−√E[g2]t+ϵ。由于取了个加权平均,避免了学习率越来越低的的问题,而且能自适应地调节学习率。
  • RMSProp算法在经验上已经被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。

AdaDelta算法

思想:AdaGrad算法和RMSProp算法都需要指定全局学习率,AdaDelta算法结合两种算法每次参数的更新步长即:

 
  • 从表达式可以看出,AdaDelta不需要设置一个默认的全局学习率。

评价:

  • 在模型训练的初期和中期,AdaDelta表现很好,加速效果不错,训练速度快。
  • 在模型训练的后期,模型会反复地在局部最小值附近抖动。

Adam算法

思想:

  • 首先,Adam中动量直接并入了梯度一阶矩(指数加权)的估计。其次,相比于缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSProp,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩估计。

算法描述:

评价:Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。

各种优化器的比较

终于结束的漫长的理论分析,下面对各种优化器做一些有趣的比较。

可视化比较

(1) 示例一

上图描述了在一个曲面上,6种优化器的表现,从中可以大致看出:

① 下降速度:

  • 三个自适应学习优化器Adagrad、RMSProp与AdaDelta的下降速度明显比SGD要快,其中,Adagrad和RMSProp齐头并进,要比AdaDelta要快。
  • 两个动量优化器Momentum和NAG由于刚开始走了岔路,初期下降的慢;随着慢慢调整,下降速度越来越快,其中NAG到后期甚至超过了领先的Adagrad和RMSProp。

② 下降轨迹:

  • SGD和三个自适应优化器轨迹大致相同。两个动量优化器初期走了“岔路”,后期也调整了过来。

(2) 示例二

上图在一个存在鞍点的曲面,比较6中优化器的性能表现,从图中大致可以看出:

  • 三个自适应学习率优化器没有进入鞍点,其中,AdaDelta下降速度最快,Adagrad和RMSprop则齐头并进。
  • 两个动量优化器Momentum和NAG以及SGD都顺势进入了鞍点。但两个动量优化器在鞍点抖动了一会,就逃离了鞍点并迅速地下降,后来居上超过了Adagrad和RMSProp。
  • 很遗憾,SGD进入了鞍点,却始终停留在了鞍点,没有再继续下降。

(3) 示例三

上图比较了6种优化器收敛到目标点(五角星)的运行过程,从图中可以大致看出:

① 在运行速度方面

  • 两个动量优化器Momentum和NAG的速度最快,其次是三个自适应学习率优化器AdaGrad、AdaDelta以及RMSProp,最慢的则是SGD。

② 在收敛轨迹方面

  • 两个动量优化器虽然运行速度很快,但是初中期走了很长的”岔路”。
  • 三个自适应优化器中,Adagrad初期走了岔路,但后来迅速地调整了过来,但相比其他两个走的路最长;AdaDelta和RMSprop的运行轨迹差不多,但在快接近目标的时候,RMSProp会发生很明显的抖动。
  • SGD相比于其他优化器,走的路径是最短的,路子也比较正。

应用于简单分类问题的比较

使用SGD优化器

  1. #梯度下降:SGD优化器
  2. train_step=tf.compat.v1.train.GradientDescentOptimizer(0.2).minimize(loss)
  3. # Iter 0,Testing Accuracy 0.9236
  4. # Iter 1,Testing Accuracy 0.9449
  5. # Iter 2,Testing Accuracy 0.9508
  6. # Iter 3,Testing Accuracy 0.9527
  7. # Iter 4,Testing Accuracy 0.9591
  8. # Iter 5,Testing Accuracy 0.962
  9. # Iter 6,Testing Accuracy 0.9643
  10. # Iter 7,Testing Accuracy 0.9672
  11. # Iter 8,Testing Accuracy 0.9675
  12. # Iter 9,Testing Accuracy 0.9696
  13. # Iter 10,Testing Accuracy 0.9702

自适应学习率-使用AdaGrad优化器

  1. #使用自适应学习率,使用AdaGrad优化器
  2. train_step=tf.compat.v1.train.AdagradOptimizer(0.2).minimize(loss)
  3. # Iter 0,Testing Accuracy 0.855
  4. # Iter 1,Testing Accuracy 0.8647
  5. # Iter 2,Testing Accuracy 0.957
  6. # Iter 3,Testing Accuracy 0.9633
  7. # Iter 4,Testing Accuracy 0.9683
  8. # Iter 5,Testing Accuracy 0.9723
  9. # Iter 6,Testing Accuracy 0.9707
  10. # Iter 7,Testing Accuracy 0.9727
  11. # Iter 8,Testing Accuracy 0.9748
  12. # Iter 9,Testing Accuracy 0.9738
  13. # Iter 10,Testing Accuracy 0.9752

使用RMSProp优化器

  1. #使用自适应学习率:使用RMSProp优化器
  2. train_step=tf.compat.v1.train.RMSPropOptimizer(0.02).minimize(loss)
  3. # Iter 0,Testing Accuracy 0.9007
  4. # Iter 1,Testing Accuracy 0.9102
  5. # Iter 2,Testing Accuracy 0.9165
  6. # Iter 3,Testing Accuracy 0.9298
  7. # Iter 4,Testing Accuracy 0.9373
  8. # Iter 5,Testing Accuracy 0.9205
  9. # Iter 6,Testing Accuracy 0.9306
  10. # Iter 7,Testing Accuracy 0.9422
  11. # Iter 8,Testing Accuracy 0.9297
  12. # Iter 9,Testing Accuracy 0.9417
  13. # Iter 10,Testing Accuracy 0.9359

使用Adam优化器

  1. # 使用自适应学习绿:使用Adam优化器
  2. train_step=tf.compat.v1.train.AdamOptimizer(0.02,0.9).minimize(loss)
  3. # Iter 0,Testing Accuracy 0.8112
  4. # Iter 1,Testing Accuracy 0.8114
  5. # Iter 2,Testing Accuracy 0.81
  6. # Iter 3,Testing Accuracy 0.7948
  7. # Iter 4,Testing Accuracy 0.8212
  8. # Iter 5,Testing Accuracy 0.8145
  9. # Iter 6,Testing Accuracy 0.8443
  10. # Iter 7,Testing Accuracy 0.8678
  11. # Iter 8,Testing Accuracy 0.8394
  12. # Iter 9,Testing Accuracy 0.8934
  13. # Iter 10,Testing Accuracy 0.8917

使用AdaDelta优化器

  1. #使用自适应学习绿:使用AdaDelta优化器
  2. train_step=tf.compat.v1.train.AdadeltaOptimizer(0.02).minimize(loss)
  3. # Iter 0,Testing Accuracy 0.4545
  4. # Iter 1,Testing Accuracy 0.5644
  5. # Iter 2,Testing Accuracy 0.7053
  6. # Iter 3,Testing Accuracy 0.759
  7. # Iter 4,Testing Accuracy 0.7785
  8. # Iter 5,Testing Accuracy 0.7925
  9. # Iter 6,Testing Accuracy 0.8028
  10. # Iter 7,Testing Accuracy 0.8114
  11. # Iter 8,Testing Accuracy 0.8165
  12. # Iter 9,Testing Accuracy 0.82
  13. # Iter 10,Testing Accuracy 0.8237

动量优化法-Momentum优化器

  1. #使用动量优化法:Momentum优化器
  2. train_step=tf.compat.v1.train.MomentumOptimizer(0.2,0.5).minimize(loss)
  3. # Iter 0,Testing Accuracy 0.8425
  4. # Iter 1,Testing Accuracy 0.8539
  5. # Iter 2,Testing Accuracy 0.9527
  6. # Iter 3,Testing Accuracy 0.9588
  7. # Iter 4,Testing Accuracy 0.9665
  8. # Iter 5,Testing Accuracy 0.9697
  9. # Iter 6,Testing Accuracy 0.9699
  10. # Iter 7,Testing Accuracy 0.9724
  11. # Iter 8,Testing Accuracy 0.9723
  12. # Iter 9,Testing Accuracy 0.9719
  13. # Iter 10,Testing Accuracy 0.9731

动量优化法-NAG优化器

  1. #使用动量优化法:使用NAG优化器
  2. train_step=tf.compat.v1.train.MomentumOptimizer(learning_rate=0.2,momentum=0.5,use_nesterov=True).minimize(loss)
  3. # Iter 0,Testing Accuracy 0.8483
  4. # Iter 1,Testing Accuracy 0.8606
  5. # Iter 2,Testing Accuracy 0.953
  6. # Iter 3,Testing Accuracy 0.9558
  7. # Iter 4,Testing Accuracy 0.9601
  8. # Iter 5,Testing Accuracy 0.9657
  9. # Iter 6,Testing Accuracy 0.9666
  10. # Iter 7,Testing Accuracy 0.9683
  11. # Iter 8,Testing Accuracy 0.9721
  12. # Iter 9,Testing Accuracy 0.9721
  13. # Iter 10,Testing Accuracy 0.9717

NAG在Tensorflow中与Momentum合并在同一函数tf.train.MomentumOptimizer中,可以通过参数配置启用。

综上,比较来说AdaGrad优化器和Momentum优化器相对来说比较好

Tensorflow-各种优化器总结与比较的更多相关文章

  1. TensorFlow从0到1之TensorFlow优化器(13)

    高中数学学过,函数在一阶导数为零的地方达到其最大值和最小值.梯度下降算法基于相同的原理,即调整系数(权重和偏置)使损失函数的梯度下降. 在回归中,使用梯度下降来优化损失函数并获得系数.本节将介绍如何使 ...

  2. tensorflow优化器-【老鱼学tensorflow】

    tensorflow中的优化器主要是各种求解方程的方法,我们知道求解非线性方程有各种方法,比如二分法.牛顿法.割线法等,类似的,tensorflow中的优化器也只是在求解方程时的各种方法. 比较常用的 ...

  3. DNN网络(三)python下用Tensorflow实现DNN网络以及Adagrad优化器

    摘自: https://www.kaggle.com/zoupet/neural-network-model-for-house-prices-tensorflow 一.实现功能简介: 本文摘自Kag ...

  4. Tensorflow 中的优化器解析

    Tensorflow:1.6.0 优化器(reference:https://blog.csdn.net/weixin_40170902/article/details/80092628) I:  t ...

  5. tensorflow的几种优化器

    最近自己用CNN跑了下MINIST,准确率很低(迭代过程中),跑了几个epoch,我就直接stop了,感觉哪有问题,随即排查了下,同时查阅了网上其他人的blog,并没有发现什么问题 之后copy了一篇 ...

  6. 莫烦大大TensorFlow学习笔记(8)----优化器

    一.TensorFlow中的优化器 tf.train.GradientDescentOptimizer:梯度下降算法 tf.train.AdadeltaOptimizer tf.train.Adagr ...

  7. TensorFlow使用记录 (六): 优化器

    0. tf.train.Optimizer tensorflow 里提供了丰富的优化器,这些优化器都继承与 Optimizer 这个类.class Optimizer 有一些方法,这里简单介绍下: 0 ...

  8. TensorFlow优化器及用法

    TensorFlow优化器及用法 函数在一阶导数为零的地方达到其最大值和最小值.梯度下降算法基于相同的原理,即调整系数(权重和偏置)使损失函数的梯度下降. 在回归中,使用梯度下降来优化损失函数并获得系 ...

  9. Tensorflow 2.0 深度学习实战 —— 详细介绍损失函数、优化器、激活函数、多层感知机的实现原理

    前言 AI 人工智能包含了机器学习与深度学习,在前几篇文章曾经介绍过机器学习的基础知识,包括了监督学习和无监督学习,有兴趣的朋友可以阅读< Python 机器学习实战 >.而深度学习开始只 ...

  10. TensorFlow优化器浅析

    本文基于tensorflow-v1.15分支,简单分析下TensorFlow中的优化器. optimizer = tf.train.GradientDescentOptimizer(learning_ ...

随机推荐

  1. 通过`RestTemplate`上传文件(InputStreamResource详解)

    通过RestTemplate上传文件 1.上传文件File 碰到一个需求,在代码中通过HTTP方式做一个验证的请求,请求的参数包含了文件类型.想想其实很简单,直接使用定义好的MultiValueMap ...

  2. 关于客户和供应商预制凭证添加WBS字段

    客户和供应商的预制凭证的对应标准屏幕SAPLF0400301和SAPLF0400302并没有提供WBS字段,有的需求需要增强WBS字段到屏幕上,本文会介绍增强WBS字段的步骤,也请读者多多指教.为了不 ...

  3. 【Redis】内部数据结构自顶向下梳理

    本博客将顺着自顶向下的思路梳理一下Redis的数据结构体系,从数据库到对象体系,再到底层数据结构.我将基于我的一个项目的代码来进行介绍:daredis.该项目中,使用Java实现了Redis中所有的数 ...

  4. Future.get(并发之从任务中产生返回值)

    import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java ...

  5. 对CAS中atomicInteger实现的思考

    p.p1 { margin: 0; font: 11px Monaco } span.s1 { color: rgba(147, 26, 104, 1) } span.s2 { color: rgba ...

  6. Yaml spring boot 二维数组写法

    Yaml channel: info: - channel-ip: 192.168.1.40 channel-no: 5182001001 - channel-ip: 192.168.1.10 cha ...

  7. flume集成kafka(kafka开启kerberos)配置

    根据flume官网:当kafka涉及kerberos认证: 涉及两点配置,如下: 配置一:见下实例中红色部分 配置conf实例: [root@gz237-107 conf]# cat flume_sl ...

  8. 最开始的总结——JAVA

    <最开始的总结> 回答自己几个问题:为什么去学它?学它有什么用?怎样去学它?自己目前目标是什么?估计自己会花多长时间去学习这些? 一.为什么学习Java,它有什么用? 答:我看中的是Jav ...

  9. 温故而知新--day1

    温故而知新--day1 变量类型 变量是计算机存储数据的内存空间,由于计算机可以处理不同的数据,不同的数据就要定义不同的数据类型.python的数据类型很多,还可以自定义数据类型,常用的一般数据类型有 ...

  10. NOIP初赛篇——04计算机软件系统

    计算机软件是指计算机系统中的程序及其文档,也是用户与硬件之间的接口,用户主要通过软件与计算机进行交流,软件是计算机的灵魂.没有安装软件的计算机称为"裸机",无法完成任何工作.一般软 ...