具有指数衰减的Adam优化器


53

在大多数Tensorflow代码中,我已经看到Adam Optimizer的学习率恒定1e-4(即0.0001)。该代码通常如下所示:

...build the model...
# Add the optimizer
train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)

我想知道,使用亚当优化器时使用指数衰减是否有用,即使用以下代码:

...build the model...
# Add the optimizer
step = tf.Variable(0, trainable=False)
rate = tf.train.exponential_decay(0.15, step, 1, 0.9999)
optimizer = tf.train.AdamOptimizer(rate).minimize(cross_entropy, global_step=step)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)

通常,人们使用某种学习率衰减,对于亚当看来并不常见。有任何理论上的原因吗?将Adam优化器与衰减结合使用是否有用?


您如何获得变量Variable每次迭代进行更新?
perrohunter

@perrohunter:使用的global_step参数minimize。参见编辑。
查尔斯·斯塔斯

9
注意:1e-4= 0.0001,不是0.0004
Cliff AB'9

我看到您分配了“ global_step = step”,但看不到“ step”变量的更新方式...请您澄清一下吗?
迭戈

@Diego:较晚的答案,但是:传递step变量以使其最小化,因为它是global_step参数,每次调用最小化时,minimumize函数都会增加global_step参数。请参阅文档以最小化。请注意,这意味着在进行迷你批处理时,将针对每个迷你批处理(而不只是针对每个时期)更新step变量。
dimpol

Answers:


37

从经验上讲:一定要尝试一下,您可能会发现一些非常有用的训练启发式方法,在这种情况下,请务必分享!

通常人们使用某种衰减,对于亚当来说似乎并不常见。有任何理论上的原因吗?将Adam优化器与衰减结合使用是否有用?

我还没有看到足够多的使用ADAM优化器的人的代码来说明这是否成立。如果是真的,那可能是因为ADAM相对较新,而且学习率下降的“最佳实践”尚未建立。

αŤ=α/Ť

简而言之:我不认为使用ADAM的学习率衰减规则会阻止理论上的任何事情。我已经看到人们使用ADAM报告了一些良好的结果,并且发现一些良好的训练启发式方法将非常有价值。


12

大多数人不使用Adam的学习率衰减的原因是该算法本身通过以下方式进行学习率衰减:

t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)

t0初始时间步长在哪里,lr_t新的学习率在哪里?


4
我不确定是否是这种情况。该因子sqrt(1 - beta2^t) / (1 - beta1^t)不会衰减。似乎补偿了第一和第二力矩估计的初始化。
Thijs

25
这个答案是不正确的。当t趋于无穷大时,该系数接近1.0。旁注:此处的learning_rate是固定的。这不是在时间t-1的学习率。
2013年

8

Adam会根据原始论文的术语使用初始学习率或步长,同时自适应地计算更新。步长还给出了更新的近似范围。在这方面,我认为在培训结束时减小步长是一个好主意。NIPS 2017的最新工作也支持了这一点:自适应梯度方法在机器学习中的边际价值

第4节:深度学习实验的最后一行说

尽管传统观点认为Adam不需要调整,但我们发现在所有情况下,针对Adam的初始学习速率和衰减方案进行调整都会比其默认设置产生重大改进。

最后但并非最不重要的一点是,本文建议我们仍然使用SGD。


2

我同意@Indie AI的意见,在此我提供了其他一些信息:

CS231n

...这些方法中的许多方法可能仍需要其他超参数设置,但是有理由认为,对于比原始学习率更大的超参数值范围,它们的行为是正确的。...

以及从论文《重新思考计算机视觉的初始体系结构》的第8节中:

...而我们的最佳模型是使用RMSProp [21]获得的,精确度为0.9,ε= 1.0。我们使用的学习率为0.045,每两个时期使用0.94的指数衰减。...


2

我用真正简单的数据训练了一个数据集,无论一个人是否肥胖,身高和体重-创建计算bmi的数据,如果年龄超过27,则该人就是肥胖。因此非常简单的基本数据。当使用Adam作为优化器时,学习率为0.001时,准确度只能使我在5个epoc左右达到85%,在测试了100多个epoc时最多可以达到90%。

但是,当再次以85%的速度加载并且学习率为0.0001时,准确率将超过3个epocs达到95%,再增加10个epocs则约为98-99%。不确定学习率是否可以低于4位数0.0001,但是当再次加载模型并使用0.00001时,主管将徘徊在99.20-100%左右并且不会低于该数字。再次,不确定学习率是否会被认为是0,但是无论如何,这就是我得到的...

所有这些都使用categorical_crossentropy,但是使用这种方法,mean_square也可以将其提高到99-100%。仅作说明,AdaDelta,AdaGrad和Nesterov的准确率无法达到65%以上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.