我一直在使用以下代码为我的trainable_model在Adam()优化器中打印lr_t learning_rate。
if(np.random.uniform()*100 < 3 and self.training):
model = self.trainable_model
_lr = tf.to_float(model.optimizer.lr, name='ToFloat')
_decay = tf.to_float(model.optimizer.decay, name='ToFloat')
_beta1 = tf.to_float(model.optimizer.beta_1, name='ToFloat')
_beta2 = tf.to_float(model.optimizer.beta_2, name='ToFloat')
_iterations = tf.to_float(model.optimizer.iterations, name='ToFloat')
t = K.cast(_iterations, K.floatx()) + 1
_lr_t = lr * (K.sqrt(1. - K.pow(_beta2, t)) / (1. - K.pow(_beta1, t)))
print(" - LR_T: "+str(K.eval(_lr_t)))
我不明白的是,这种学习速度正在提高。 (默认值为0时衰减)。
如果我们查看亚当中的learning_rate方程,就会发现:
lr_t = lr * (K.sqrt(1. - K.pow(self.beta_2, t)) /
(1. - K.pow(self.beta_1, t)))
与等式相对应(具有参数的默认值):
= 0.001*sqrt(1-0.999^x)/(1-0.99^x)
清楚地表明,学习率随时间呈指数增长(因为t从1开始)
有人可以解释为什么会这样吗?我到处都读到,我们应该使用一个学习率,它会随着时间的推移而衰减,而不是增加。
这是否意味着随着Adam的learning_rate的增加,我的神经网络会随时间进行更大的更新?
答案 0 :(得分:1)
查看Keras中Adam优化器的源代码,看起来实际的“衰减”是在this line处执行的。您报告的代码仅在衰减之后执行,而不是衰减本身。
如果问题是“为什么会这样”,我建议您阅读一些关于亚当的理论,例如the original paper。
编辑
应该清楚的是,亚当优化器的更新方程式并不
本身包括一个衰减。衰减应单独应用。