为什么Adadelta优化程序不会降低学习率?

时间:2020-05-07 12:07:07

标签: python tensorflow machine-learning keras deep-learning

我已经在Keras中初始化了Adadelta优化器(使用Tensorflow后端)并将其分配给模型:

my_adadelta = keras.optimizers.Adadelta(learning_rate=0.01, rho=0.95)
my_model.compile(optimizer=my_adadelta, loss="binary_crossentropy")

在培训期间,我使用回调在每个时期后打印学习率:

class LRPrintCallback(Callback):
    def on_epoch_end(self, epoch, logs=None):
        lr = self.model.optimizer.lr
        print(K.eval(lr))

但是,这会在每个时期后打印出相同的(初始)学习率。 如果我像这样初始化优化器,也会发生同样的事情:

my_adadelta = keras.optimizers.Adadelta(learning_rate=0.01, decay=0.95)

我在初始化时做错什么了吗?学习率可能会改变,但是我没有打印正确的东西吗?

1 个答案:

答案 0 :(得分:1)

如相关Github thread中所讨论的,衰减不影响变量lr本身,变量lr_with_decay仅用于存储学习速率的初始值。为了打印衰减后的值,您需要自己显式计算并将其存储在单独的变量class MyCallback(Callback): def on_epoch_end(self, epoch, logs=None): lr = self.model.optimizer.lr decay = self.model.optimizer.decay iterations = self.model.optimizer.iterations lr_with_decay = lr / (1. + decay * K.cast(iterations, K.dtype(decay))) print(K.eval(lr_with_decay)) 中;您可以使用以下回调进行操作:

lr = self.lr
if self.initial_decay > 0:
    lr *= (1. / (1. + self.decay * K.cast(self.iterations, K.dtype(self.decay))))

herehere所述。实际上,此处显示了具体的代码段,即

decay

直接来自基础Keras source code for Adadelta

从检查链接的源代码可以清楚地看出,此处用于降低学习率的感兴趣参数为rho,而不是rho;尽管documentation中也使用了“衰减”一词来描述df = pd.DataFrame({ 'A': ['0','0','0','8.020833015','8.009259224','8.003472328','8.020833015','0','0','5','4.994213104','0','0','0','8.012152672','8.009259224','0'], 'Step_ID': ['Step_1','Step_1','Step_1','Step_2','Step_2','Step_2','Step_2','Step_3','Step_3','Step_4','Step_4','Step_5','Step_5','Step_5','Step_6','Step_6','Step_7']}) print (df) ,但这是与学习率无关的另一种衰减:

rho :浮点> =0。Adadelta衰减因子,对应于每个时间步长要保留的梯度分数。