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