我正在研究 TensorFlow 以及如何使用它,即使我不是神经网络和深度学习(只是基础知识)的专家。
按照教程,我不理解三个优化器之间的实际和实际差异。我看一下API,我理解原则,但我的问题是:
1。何时优先使用一个而不是其他?
2。是否存在重要差异?
答案 0 :(得分:168)
根据我的理解,这是一个简短的解释:
Adam 或自适应动量是一种类似于AdaDelta的算法。但除了存储每个参数的学习率之外,它还分别存储每个参数的动量变化。
我想说SGD,Momentum和Nesterov都不如过去3年。
答案 1 :(得分:8)
Salvador Dali's answer已经解释了一些流行方法(例如优化程序)之间的区别,但是我会尝试详细说明它们。
(请注意,我们的回答在某些方面存在分歧,尤其是关于ADAGRAD。)
(主要基于On the importance of initialization and momentum in deep learning号文件第2节。)
CM和NAG中的每个步骤实际上都由两个子步骤组成:
[0.9,1)
范围内)。CM首先采取梯度子步骤,而NAG首先采取动量子步骤。
这是an answer about intuition for CM and NAG的演示:
所以NAG似乎更好(至少在图像中如此),但是为什么呢?
要注意的重要一点是,动量子步骤何时出现并不重要-两种方法都相同。因此,如果动量子步骤已经采取,我们也可能会表现出来。
因此,问题实际上是:假设梯度子步骤是在动量子步骤之后进行的,我们是否应该计算梯度子步骤,就像它在采取动量子步骤之前或之后的位置开始一样?
“之后”似乎是正确的答案,通常来说,在某个点θ
处的渐变大致将您指向从θ
到最小值(幅度相对正确)的方向,而另一点的渐变不太可能使您指向θ
到最小值(幅度相对正确)的方向。
这是一个演示(来自下面的gif):
请注意,关于NAG为何更好的论点与算法是否接近最小值无关。
通常,NAG和CM都经常积聚更多的动力而不是对他们有益,因此,每当他们改变方向时,它们都有一个尴尬的“响应时间”。我们所解释的NAG相对于CM的优势并不能解决问题,而只是使NAG的“响应时间”减少了尴尬(但仍然令人尴尬)。
Alec Radford(出现在Salvador Dali's answer中的gif很好地展示了这个“响应时间”问题:
(主要基于ADADELTA: An Adaptive Learning Rate Method(原始ADADELTA论文)中的2.2.2节,因为我发现它比Adaptive Subgradient Methods for Online Learning and Stochastic Optimization(原始ADAGRAD论文)更易于访问。)
< / p>
在SGD中,该步由- learning_rate * gradient
给出,而learning_rate
是一个超参数。
ADAGRAD还具有一个learning_rate
超参数,但是该梯度的每个分量的实际学习率都是单独计算的。
第i
步的第t
步由下式给出:
learning_rate
- --------------------------------------- * gradient_i_t
norm((gradient_i_1, ..., gradient_i_t))
同时:
gradient_i_k
是第i
步中梯度的第k
步(gradient_i_1, ..., gradient_i_t)
是具有t
个分量的向量。 (至少对我来说)构造这样的向量不是很直观(但这对我来说),但这就是算法(从概念上)所做的。norm(vector)
是l2
的{{3}}(又称vector
规范),这是我们对vector
长度的直观理解。gradient_i_t
(在这种情况下为learning_rate / norm(...)
)的表达式通常称为“学习率”(实际上,我在上一段中将其称为“实际学习率”。我猜这是因为在Eucldiean norm中,learning_rate
超参数与该表达式是相同的。例如如果:
i
个分量是1.15
i
个分量是1.35
i
个分量是0.9
然后(1.15, 1.35, 0.9)
的范数是黄线的长度,即:
sqrt(1.15^2 + 1.35^2 + 0.9^2) = 1.989
。
因此,第三步的第i
个组件是:- learning_rate / 1.989 * 0.9
请注意有关该步骤的第i
个组件的两件事:
learning_rate
成比例。这意味着ADAGRAD对超参数learning_rate
的选择很敏感。
另外,可能是步骤过了一段时间之后,ADAGRAD实际上陷入了困境。
本文提出的想法源自ADAGRAD,以改善两个主要缺点 的方法:1)学习率的持续下降 整个培训过程中; 2)需要手动选择 全球学习率。
然后,本文解释了旨在解决第一个缺点的改进:
而不是累计所有梯度的平方和 时间,我们限制了过去累积的渐变的窗口 为固定大小
w
[...]。这样可以确保学习继续 即使经过多次更新,也可以取得进步 完成了。
由于存储w
个先前的平方梯度效率很低, 我们的方法以指数形式实现了这种积累 平方梯度的衰减平均值。
通过“平方梯度的指数衰减平均值”,本文意味着,对于每个i
,我们计算所有梯度的所有平方i
的所有分量的加权平均值。
每个平方i
的分量的权重大于上一步中平方i
的分量的权重。
这是一个w
大小的窗口的近似值,因为前面步骤中的权重很小。
((当我想到指数衰减的平均值时,我想像一条ADADELTA paper踪迹,随着离彗星越来越远,它变得越来越暗:
如果仅对ADAGRAD进行此更改,则将获得RMSProp,这是Geoff Hinton在中提出的方法。
因此在RMSProp中,第i
步的第t
步由下式给出:
learning_rate
- ------------------------------------------------ * gradient_i_t
sqrt(exp_decay_avg_of_squared_grads_i + epsilon)
同时:
epsilon
是一个超参数,可防止被零除。exp_decay_avg_of_squared_grads_i
是所计算的所有梯度(包括i
)的第gradient_i_t
平方分量的指数衰减平均值。但是如上所述,ADADELTA还旨在摆脱learning_rate
超参数,因此其中必须包含更多内容。
在ADADELTA中,第i
步的第t
步的组成为:
sqrt(exp_decay_avg_of_squared_steps_i + epsilon)
- ------------------------------------------------ * gradient_i_t
sqrt(exp_decay_avg_of_squared_grads_i + epsilon)
而exp_decay_avg_of_squared_steps_i
是计算出的所有步骤(直到第i
步)的第t-1
平方平方的指数衰减平均值。
sqrt(exp_decay_avg_of_squared_steps_i + epsilon)
有点类似于动量,根据Lecture 6e of his Coursera Class,它“充当加速项”。 (该文件还提供了添加该文件的另一个原因,但是我的回答已经太长了,因此,如果您很好奇,请参阅第3.2节。)
(主要基于亚当的原始论文the paper。)
Adam是Adaptive Moment Estimation的缩写(有关名称的说明,请参见Adam: A Method for Stochastic Optimization)。
第i
步的第t
步由下式给出:
learning_rate
- ------------------------------------------------ * exp_decay_avg_of_grads_i
sqrt(exp_decay_avg_of_squared_grads_i) + epsilon
同时:
exp_decay_avg_of_grads_i
是所有计算出的梯度(包括i
)中第gradient_i_t
个分量的指数衰减平均值。exp_decay_avg_of_grads_i
和exp_decay_avg_of_squared_grads_i
均已得到修正,以解决对0
的偏见(有关更多信息,请参见this answer中的第3节,以及{ {3}})。请注意,Adam使用梯度的第i
个分量的指数衰减平均值,其中大多数the paper方法使用当前梯度的第i
个分量。正如论文an answer in stats.stackexchange所述,这导致亚当的行为就像“一个沉重的摩擦球”。
有关亚当的类似动量的行为与通常的类似动量的行为有何不同,请参见SGD。
答案 2 :(得分:1)
我们将其归结为一个简单的问题:
哪个优化程序会给我最好的结果/准确性?
没有银弹。一些针对您的任务的优化器可能会比其他优化器更好。没有办法事先告诉您,您必须尝试一些才能找到最好的。好消息是,不同优化器的结果可能彼此接近。不过,您必须为您选择的任何单个优化器找到最佳的超参数。
我现在应该使用哪个优化程序?
也许,请使用AdamOptimizer并以learning_rate 0.001和0.0001运行它。如果您想要更好的结果,请尝试以其他学习速度运行。或尝试使用其他优化器并调整其超参数。
选择优化器时需要考虑以下几个方面:
普通SGD 是可以做到的最低要求:只需将梯度乘以学习率,然后将结果加到权重即可。 SGD具有许多出色的品质:只有1个超参数;它不需要任何额外的内存;它对训练的其他部分影响很小。它也有两个缺点:它可能对学习率的选择过于敏感,并且训练可能比其他方法花费更长的时间。
从普通SGD的这些缺点中,我们可以看到更复杂的更新规则(优化器)的用途是:我们牺牲了一部分内存以实现更快的训练,并可能简化了超参数的选择。
内存开销通常不重要,可以忽略。除非模型非常大,或者您正在使用GTX760进行培训,或者正在争夺ImageNet的领导地位。动量或Nesterov加速梯度等较简单的方法需要模型大小(模型超参数的大小)为1.0或更小。二阶方法(亚当,可能需要两倍的内存和计算量。
收敛速度-几乎任何东西都比SGD更好,而其他任何东西都很难比较。一个注意事项可能是AdamOptimizer擅长几乎立即开始训练,而无需热身。
我认为易于使用是选择优化器时最重要的。不同的优化器具有不同数量的超参数,并且对它们的敏感性不同。我认为亚当是所有现有的最简单的。通常,您需要检查0.001
和0.0001
之间的2-4个学习率,以确定模型是否收敛良好。为了比较SGD(和动力),我通常尝试[0.1, 0.01, ... 10e-5]
。亚当还有另外2个无需更改的超参数。
优化器与培训其他部分之间的关系。超参数调整通常涉及同时选择{learning_rate, weight_decay, batch_size, droupout_rate}
。它们都是相互关联的,每个都可以看作是模型正则化的一种形式。例如,如果正好使用weight_decay或L2-norm并可能选择AdamWOptimizer
而不是AdamOptimizer
,则必须密切注意。