很多CVPR的论文都是用SGD或者SGD+Momentum方法优化网络，而不是理论上最吊的Adam，转载博客：

https://blog.csdn.net/u014381600/article/details/72867109


展开全文
        自动调参的Adam方法已经非常给力了，不过这主要流行于工程界，在大多数科学实验室中，模型调参依然使用了传统的SGD方法，在SGD基础上增加各类学习率的主动控制，以达到对复杂模型的精细调参，以达到刷出最高的分数。

参考文章：GD优化算法总结--，可见每一步公式的更新都来之不易。

按章节翻译的中文版-DLBook中文版：https://github.com/exacity/deeplearningbook-chinese

先上结论：

2.动量直接并入梯度一阶矩估计中（指数加权）

4.学习率建议为0.001

再看算法：其实就是Momentum+RMSProp的结合，然后再修正其偏差。

文中各大优化算法的学习率：

会议评论：On the Convergence of Adam and Beyond ； 论文：https://openreview.net/pdf?id=ryQu7f-RZ 。

With the problem setup in the previous section, we discuss fundamental flaw in the current exponential moving average methods like ADAM. We show that ADAM can fail to converge to an optimal solution even in simple one-dimensional convex settings. These examples of non-convergence contradict the claim of convergence in (Kingma & Ba, 2015), and the main issue lies in the following quantity of interest:
(2)
This quantity essentially measures the change in the inverse of learning rate of the adaptive method with respect to time. One key observation is that for SGD and ADAGRAD, -t 0 for all t 2 [T]. This simply follows from update rules of SGD and ADAGRAD in the previous section. Inparticular, update rules for these algorithms lead to “non-increasing” learning rates. However, this is not necessarily the case for exponential moving average variants like ADAM and RMSPROP i.e., -t can potentially be indefinite for t 2 [T] . We show that this violation of positive definiteness can  lead to undesirable convergence behavior for ADAM and RMSPROP. Consider the following simple sequence of linear functions for F = [-1，1]:

where C > 2. For this function sequence, it is easy to see that the point x = -1 provides the minimum regret. Suppose 1 = 0 and 2 = 1=(1 + C2). We show that ADAM converges to a highly suboptimal solution of x = +1 for this setting. Intuitively, the reasoning is as follows. The algorithm obtains the large gradient C once every 3 steps, and while the other 2 steps it observes the gradient -1, which moves the algorithm in the wrong direction. The large gradient C is unable to counteract this effect since it is scaled down by a factor of almost C for the given value of 2, and hence the algorithm converges to 1 rather than -1. We formalize this intuition in the result below.Theorem 1. There is an online convex optimization problem where ADAM has non-zero average regret i.e., RT =T 9 0 as T ! 1.
We relegate all proofs to the appendix.

以F = [−1, 1]的简单分段线性函数为例：  。当C > 2，在这个函数中，我们很轻松就能看出它应收敛于x = −1。但如果用Adam，它的二阶动量超参数分别是β1 = 0，β2 = 1/(1 + C2)，算法会收敛在x = +1这个点。我们直观推理下：该算法每3步计算一次梯度和，如果其中两步得出的结论是x = -1，而一次得出的结论是C，那么计算指数移动平均值后，算法就会偏离正确收敛方向。因为对于给定的超参数β2，大梯度C没法控制自己带来的不良影响。

2.来看一个各个优化算法在最优解和鞍点附近的迭代求解图。

图片来源：http://imgur.com/a/Hqolp

自适应优化算法训练出来的结果通常都不如SGD，尽管这些自适应优化算法在训练时表现的看起来更好。 使用者应当慎重使用自适应优化算法。自适应算法类似于过学习的效果，生成的模型面对整体分布时是过拟合的。

作者这样阐述：our experimental evidence demonstrates that adaptive methods are not advantageous for machine learning, the Adam algorithm remains incredibly popular. We are not sure exactly as to why, but hope that our step-size tuning suggestions make it easier for practitioners to use standard stochastic gradient methods in their research.这一点貌似不是主要的Adam的缺点。

For the first part, we modify these algorithms to satisfy this additional constraint. Later on, we also explore an alternative approach where -t can be made positive semi-definite by using values of 1 and 2 that change with t.

AMSGRAD uses a smaller learning rate in comparison to ADAM and yet incorporates the intuition of slowly decaying the effect of past gradients on the learning rate as long as -t is positive semidefinite.

实验结果

多种方法结合


展开全文
• SGD系列 1）Batch gradient descent(批量梯度下降)   在整个数据集上   每更新一次权重，要遍历所有的样本，由于样本集过大，无法保存在内存中，无法线上更新模型。对于损失函数的凸曲面，可以收敛到全局最小值...
SGD系列
在整个数据集上
每更新一次权重，要遍历所有的样本，由于样本集过大，无法保存在内存中，无法线上更新模型。对于损失函数的凸曲面，可以收敛到全局最小值，对于非凸曲面，收敛到局部最小值。
随机梯度下降（SGD）和批量梯度下降（BGD）的区别。SGD 从数据集中拿出一个样本，并计算相关的误差梯度，而批量梯度下降使用所有样本的整体误差：「关键是，在更新中没有随机或扩散性的行为。」
可以在线学习，收敛的更快，可以收敛到更精确的最小值。但是梯度更新太快，而且会产生梯度震荡，使收敛不稳定。
随机梯度下降（SGD）和批量梯度下降（BGD）的区别。SGD 从数据集中拿出一个样本，并计算相关的误差梯度，而批量梯度下降使用所有样本的整体误差：「关键是，在更新中没有随机或扩散性的行为。」
批量梯度下降算法和随机梯度下降算法的结合体。两方面好处：一是减少更新的次数，使得收敛更稳定；二是利用矩阵优化方法更有效。
当训练集有很多冗余时（类似的样本出现多次），batch方法收敛更快。
以一个极端情况为例，若训练集前一半和后一半梯度相同。那么如果前一半作为一个batch，后一半作为另一个batch，那么在一次遍历训练集时，batch的方法向最优解前进两个step，而整体的方法只前进一个step。
三种SGD的对比
随机梯度下降法SGD：
最后可以总结为：

M 等于 N时（就是用了所有的样本）， 就是所谓的batch GD
M 等于 1时 （就是用了其中的一个样本）， 就是所谓的SGD
M 大于1， 小于 N时， 就是 mini-batch GD.
所以从expected loss的角度看， 其实batch GD, mini-batch GD, SGD都可以看成SGD的范畴， 只不过区别在于每次取多少的样本了。

梯度下降优化算法（非SGD系列）
参考资料：http://blog.csdn.net/luo123n/article/details/48239963
1）Momentum
一般，动量项取0.9附近，学习率取0.01。
作用是使收敛更快，减少震荡。梯度方向不变时，收敛更快，梯度方向改变时，减小震荡。收敛更稳定。
SGD方法的一个缺点是，其更新方向完全依赖于当前的batch，因而其更新十分不稳定。解决这一问题的一个简单的做法便是引入momentum。
公式：Δx_t=ρ*Δx_(t-1)−η*g_t

ρ 即momentum，表示要在多大程度上保留原来的更新方向，这个值在0-1之间，在训练开始时，由于梯度可能会很大，所以初始值一般选为0.5；当梯度不那么大时，改为0.9。
即Nesterov Momentum
一般动量项取0.9附近，学习率取0.01。
Nesterov提出的加速的梯度下降方法，这是对传统momentum方法的一项改进。这种基于预测的更新方法，使我们避免过快地前进，并提高了算法地响应能力（responsiveness），大大改进了 RNN 在一些任务上的表现 。
首先，按照原来的更新方向更新一步（棕色线），然后在该位置计算梯度值（红色线），然后用这个梯度值修正最终的更新方向（绿色线）。图中描述了两步的更新示意图，其中蓝色线是标准momentum更新路径。

自适应地为各个参数分配不同学习率的算法。
优点：赋予更新频繁的梯度以较小的学习率，赋予更新不频繁的梯度以较大的学习率。尤其对于大型网络，可以提高SGD的鲁棒性。
缺点：由于梯度平方和随着时间的会越来越大，造成训练后期的学习率会非常小，学习的提前停止。
5） RMSprop
建议学习率 取0.001为好。
计算效率较高，能够适应较大的数据集，能够较好的处理稀疏集。
偏差修正项 很重要，尤其是当 β2趋近于1时，可以防止步长变得过大。

使用 Adam 时有一些很好的初始值可供尝试。它最好以 0.9 的 β_1 和 0.999 的 β_2 开头。
SGD算法详解
SGD是保证收敛的！
我们试过一些其他方法，但是我们发现好像都和SGD差不多。在多机训练场景下，SGD会更加方便实现。
一个代码上的细节，就是caffe的代码实现上选取一个batch的时候似乎是按着数据库的图片顺序选取输入图片的，所以在生成数据库的时候切记要shuffle一下图片顺序~
caffe中ImageDataLayer有shuffle参数，生成lmdb时也有shuffle参数不必手动。

优化SGD的其他策略
1）每个迭代周期完成后，打乱数据集的顺序（Shuffling and Curriculum Learning）
为了使得学习过程更加无偏，应该在每次迭代中随机打乱训练集中的样本。
另一方面，在很多情况下，我们是逐步解决问题的，而将训练集按照某个有意义的顺序排列会提高模型的性能和SGD的收敛性，如何将训练集建立一个有意义的排列被称为Curriculum Learning。
Zaremba与Sutskever在使用Curriculum Learning来训练LSTMs以解决一些简单的问题中，表明一个相结合的策略或者混合策略比对训练集按照按照训练难度进行递增排序要好。
2）Batch normalization；
3）提前停止；
4）在训练后期适当减小动量值能够使网络更稳定的收敛。
5）在梯度更新时，给梯度添加噪音可以增加网络的泛化能力。即每次迭代计算梯度中加上一个高斯分布N(0,σ2t)的随机误差，高斯误差的方差需要进行退火。
对梯度增加随机误差会增加模型的鲁棒性，即使初始参数值选择地不好，并适合对特别深层次的负责的网络进行训练。其原因在于增加随机噪声会有更多的可能性跳过局部极值点并去寻找一个更好的局部极值点，这种可能性在深层次的网络中更常见。

梯度下降的使用（指导性思路）
2）现在有论文不用梯度下降优化算法来训练神经网络；例如《Training Deep Neural Networks via Optimization Over Graphs》
4）异步SGD方法。
如果你处理的数据集非常大，并且有机器集群可以利用，那么并行或分布式SGD是一个非常好的选择，因为可以大大地提高速度。SGD算法的本质决定其是串行的(step-by-step)。因此如何进行异步处理便是一个问题。虽然串行能够保证收敛，但是如果训练集大，速度便是一个瓶颈。如果进行异步更新，那么可能会导致不收敛。下面将讨论如何进行并行或分布式SGD，并行一般是指在同一机器上进行多核并行，分布式是指集群处理。比如1-bit。
5）各大算法孰优孰劣并无定论。如果是刚入门，优先考虑 SGD+Nesterov Momentum或者Adam.（Standford 231n : The two recommended updates to use are either SGD+Nesterov Momentum or Adam）
6）选择你熟悉的算法——这样你可以更加熟练地利用你的经验进行调参。
7）充分了解你的数据——如果模型是非常稀疏的，那么优先考虑自适应学习率的算法。
9）先用小数据集进行实验。有论文研究指出，随机梯度下降算法的收敛速度和数据集的大小的关系不大。（The mathematics of stochastic gradient descent are amazingly independent of the training set size. In particular, the asymptotic SGD convergence rates are independent from the sample size.）因此可以先用一个具有代表性的小数据集进行实验，测试一下最好的优化算法，并通过参数搜索来寻找最优的训练参数。
11）数据集一定要充分的打散（shuffle）。这样在使用自适应学习率算法的时候，可以避免某些特征集中出现，而导致的有时学习过度、有时学习不足，使得下降方向出现偏差的问题。
12）训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练——下降方向正确，且学习率足够高；对验证数据的监控是为了避免出现过拟合。
13）制定一个合适的学习率衰减策略。可以使用定期衰减策略，比如每过多少个epoch就衰减一次；或者利用精度或者AUC等性能指标来监控，当测试集上的指标不变或者下跌时，就降低学习率。
14）在一些特定任务上，比SGD好的比比皆是。

梯度下降的使用（具体参数设置）
1）原文中输入的batch数目是256，应该Alex经过调节后的结果，我实际用到的机器性能比较低，内存8G，显存4G，所以不得不就将batch数目往下调到64，以免产生out of memory的错误。这样就需要调节其他的参数来保证数据的收敛。原因是batch比较小，导致本文开篇提到的样本覆盖面过低，产生了非常多的局部极小点，在步长和方向的共同作用下，导致数据产生了震荡，导致了不收敛。
2）在这种情况下，把learning rate调节到了0.02，相当于加大了步长，这样可以在一定程度上避免震荡，可以越过局部极小点往比较大的极值点行走。
3）对于每一层的bias从1设置为了0.1，在一定程度上限制了激活的大小，这样就限制了某一过大的误差的影响，这样可以避免迭代方向出现过大的变化。
4）经过1）和2）后，系统终于收敛了，但带来的不良后果就是整个收敛速度变慢，因此还需要增加最大迭代次数，经过测试迭代次数成了从45w修改成了70w。
5）在整个运行过程中，出现了几次平稳点，20w以及40w左右的时候，因此迭代的learning rate应该随着迭代的接近平稳点的时候有意的减小一些，目前是以每10w次减小为1/10，调参数用了5天，最后运行时间为15天。
6）关于调参策略，上面只是按照一些简单的理解设置的，如果没有一个合理的解释，调参就变成了一个很low的工作。还好发现了好几篇关于调参的论文，主要是优化算法理论方面的，学习完再回来测试一下。
1）针对AlexNet这种网络结构相对简单的网络，在epoch相同的情形下，SGD和其他算法的时间没有太多差别，但是SGD和NAG算法比其他算法收敛的要快，精度也要高。建议选择SGD算法。
3）建议参数设置（batchsize可以根据情况选择28，64和128）
  SGD：     学习率,  动量，学习规则设为step就好;
NAG:      学习率，动量，学习规则设为step就好;
RMSprop：学习率=0.001，   学习规则 INV or poly
adam：   学习率=0.001，   学习规则 INV or poly, sgmoid

6）在训练网络时，建议先选择参数默认值，和step学习规则进行尝试，然后根据训练结果调整参数。
RMSprop算法对学习率十分敏感，比较难收敛，建议少用；
当训练网络不稳定时，建议第一次epoch先用较小的学习率，然后再调大学习率；
学习率的设置不仅要考虑网络结构，还要考虑batchsize的大小，batchsize变小，学习率相应要减小一点（论文中有这种变化，没有试验，不一定都是这样），随着硬件的提高，一般选择128和256；
从论文来看，采用SGD时一般训练中会采用两个学习率的值，学习率变化太频繁可能也会对网络精度造成一定的影响；
对于动量和weight-decay一般都为0.9和0.0005,，很少有实验改动这两个值；
Alex就在2012年的AlexNet中，把所有Tanh/Logistic全换成了ReLu（卷积+隐层，Softmax要取概率没办法）
对于使用ImageNet训练AlexNet模型，每个GPU的最佳批量大小为512。
实际地用alexnet和VGG16训练
both AlexNet and VGG16 variants are trained for 30 epochs using the Adam optimizer with momentum of β1 = 0.9, β2 = 0.999, and weight decay of 0.0005. The learning rate is 0.0001 and is held constant during the pre-training stage.


展开全文

千次阅读 2019-07-10 19:07:39
按吴恩达老师所说的，梯度下降（Gradient Descent）就好比一...SGD基本公式 动量(Momentum) 参考链接：https://distill.pub/2017/momentum/ 基本的mini-batch SGD优化算法在深度学习取得很多不错的成...
按吴恩达老师所说的，梯度下降（Gradient Descent）就好比一个人想从高山上奔跑到山谷最低点，用最快的方式（steepest）奔向最低的位置（minimum）。

SGD基本公式

动量(Momentum)

参考链接：https://distill.pub/2017/momentum/

基本的mini-batch SGD优化算法在深度学习取得很多不错的成绩。然而也存在一些问题需解决：

1. 选择恰当的初始学习率很困难。

2. 学习率调整策略受限于预先指定的调整规则。

3. 相同的学习率被应用于各个参数。

4. 高度非凸的误差函数的优化过程，如何避免陷入大量的局部次优解或鞍点。

Moment Estimation，即梯度的未中心化的方差）进行综合考虑，计算出更新步长。

主要包含以下几个显著的优点：

1. 实现简单，计算高效，对内存需求少

2. 参数的更新不受梯度的伸缩变换影响

3. 超参数具有很好的解释性，且通常无需调整或仅需很少的微调

4. 更新的步长能够被限制在大致的范围内（初始学习率）

5. 能自然地实现步长退火过程（自动调整学习率）

6. 很适合应用于大规模的数据及参数的场景

7. 适用于不稳定目标函数

8. 适用于梯度稀疏或梯度存在很大噪声的问题

算法伪代码：

计算t时间步的梯度：

首先，计算梯度的指数移动平均数，m0 初始化为0。

类似于Momentum算法，综合考虑之前时间步的梯度动量。

β1 系数为指数衰减率，控制权重分配（动量与当前梯度），通常取接近于1的值。

默认为0.9

下图简单展示出时间步1~20时，各个时间步的梯度随着时间的累积占比情况。

其次，计算梯度平方的指数移动平均数，v0初始化为0。

β2 系数为指数衰减率，控制之前的梯度平方的影响情况。

类似于RMSProp算法，对梯度平方进行加权均值。

默认为0.999

第三，由于m0初始化为0，会导致mt偏向于0，尤其在训练初期阶段。

所以，此处需要对梯度均值mt进行偏差纠正，降低偏差对训练初期的影响。

第四，与m0 类似，因为v0初始化为0导致训练初始阶段vt偏向0，对其进行纠正。

第五，更新参数，初始的学习率α乘以梯度均值与梯度方差的平方根之比。

其中默认学习率α=0.001

ε=10^-8，避免除数变为0。

由表达式可以看出，对更新的步长计算，能够从梯度均值及梯度平方两个角度进行自适应地调节，而不是直接由当前梯度决定。

作者：Emerson_G
链接：https://www.jianshu.com/p/aebcaf8af76e
来源：简书
简书著作权归作者所有，任何形式的转载都请联系作者获得授权并注明出处。

展开全文
• 本文转载自「机器学习炼丹记」，搜索「julius-ai」即可关注。 原文链接：小象 （一）一个框架看懂优化算法 机器学习界有一群炼丹师，他们每天的日常是： 拿来药材（数据），架起八卦炉（模型），点着六味真火...
• 拿来药材（数据），架起八卦炉（模型），点着六味真火（优化算法），就摇着蒲扇等着丹药出炉了。 不过，当过厨子的都知道，同样的食材，同样的菜谱，但火候不一样了，这出来的口味可是千差万别。...
• 前言 这里讨论的优化问题指的是，给定目标函数f(x)，我们需要找到一组参数x，使得f(x)的值最小。 本文以下内容假设读者已经了解机器学习基本知识，和梯度下降的原理。 Batch gradient descent ...
• 本文转载自「机器学习炼丹记」，搜索「julius-ai」即可关注。 原文链接：小象（一）一个框架看懂优化算法机器学习界有一群炼丹师，他们每天的日常是：拿来药材（数据），架起八卦炉（模型），点着六味真火（优化...
• 文章链接：Deep Learning 最优化方法之SGD 72615436本文是Deep Learning 之 最优化方法系列文章 整个优化系列文章列表： Deep Learning 之 最优化方法 Deep Learning 最优化方法之SGD Deep Learning 最优化方法之...
• 请参见这篇博客，分析的很细，而且有原始数学公式。 http://www.cnblogs.com/fourmi/p/9938477.html
• 训练逻辑回归的方法有：SGD和L-BFGS,两者的区别为： SGD:随机从训练集选取数据训练，不归一化数据，需要专门在外面进行归一化，支持L1,L2正则化，不支持多分类。 L-BFGS:所有的数据都会参与训练，算法融入方差归一...
• 在 ICLR 2018 的高分论文中，有研究者表明因为历史梯度平方的滑动平均值，Adam 等算法并不能收敛到最优解，因此它在泛化误差上可能要比 SGD 等方法差。最近 Salesforce 的研究者提出了一种转换机制，他们...
• 转载地址：https://zhuanlan.zhihu.com/p/32488889优化算法框架：计算目标函数关于当前参数的梯度： 根据历史梯度计算一阶动量和二阶动量： 计算当前时刻的下降梯度： 根据下降梯度进行更新： 最核心的区别就是第三...