【问题标题】:Why doesn't the Adadelta optimizer decay the learning rate?为什么 Adadelta 优化器不会降低学习率?
【发布时间】:2020-08-22 17:25:12
【问题描述】:

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

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

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

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

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

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

我在初始化时做错了吗?学习率可能会改变,但我打印的不是正确的吗?

【问题讨论】:

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


    【解决方案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))
    

    正如 herehere 所解释的。其实具体的代码sn-p那里建议的,即

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

    直接来自底层 Keras source code for Adadelta

    从链接源代码的检查中可以清楚地看出,这里用于衰减学习率的参数是decay,而不是rho;尽管在 documentation 中也使用术语“衰减”来描述 rho,但它是一种不同的衰减,与学习率没有任何关系:

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

    【讨论】:

    • 我看到了这个 Github 帖子,但是用户 yuyang-huang 没有提供任何来源来支持他们的说法。
    • @nim.py 查看更新的答案;请注意该用户的 cmets 中的 contributor 指示,这意味着他们是 Keras 代码的积极贡献者。
    • 这是一个很好的观点。对,所以如果我理解正确(通过快速查看the original paper),Adadelta 甚至不打算与非零 decay 参数一起使用(即使 Keras 支持它,它的默认值是 0)。
    • @nim.py 很可能是这样;另请注意,尽管您可以使用decay,但它不包含在文档中描述的“标准”参数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2019-07-28
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多