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