【问题标题】:Learning rate and weight decay schedule in Tensorflow SGDW optimizerTensorflow SGDW 优化器中的学习率和权重衰减时间表
【发布时间】:2020-07-16 18:07:27
【问题描述】:

我正在尝试使用 TensorFlow 重现 this paper 的一部分,问题是作者使用带有权重衰减的 SGD,每 30 个 epoch 将学习率降低到 1/10。

TensorFlow documentation 这么说

当对学习率应用衰减时,请务必手动将衰减应用于 weight_decay

所以我尝试了

schedule = keras.optimizers.schedules.ExponentialDecay(initial_learning_rate = 0.003,
                                                   decay_rate = 0.1,
                                                   decay_steps = steps_per_epoch*30,
                                                   staircase = True
)
optimizer = tfa.optimizers.SGDW(learning_rate = schedule,
                            weight_decay = schedule,
                            momentum = 0.9
)

(steps_per_epoch 之前已初始化)
就像我对 Keras SGD 所做的那样,这不起作用,并且会为 decay_weight 参数引发“TypeError:Expected float32”。实现目标行为的正确方法是什么?

【问题讨论】:

    标签: python tensorflow machine-learning keras hyperparameters


    【解决方案1】:

    您收到错误是因为您在 tensorflow 附加优化器 SGDW 中使用了 keras ExponentialDecay。

    根据论文的超参数是

    1. 权重衰减 0.001
    2. 0.9 的动量
    3. 起始学习率为 0.003,在 30 个 epoch 后降低了 10 倍

    那么为什么不使用LearningRateScheduler 将其减少到 10 evey 30 epochs

    示例代码

    model = tf.keras.Sequential([
        tf.keras.layers.Dense(8, input_shape=(10,)),
        tf.keras.layers.Dense(4, activation='relu'),
        tf.keras.layers.Dense(3, activation='softmax'),
    ])
    
    X = np.random.randn(10,10)
    y = np.random.randint(0,4,(10,3))
    
    model.compile(
        optimizer=tfa.optimizers.SGDW(
            weight_decay=0.001,
            momentum=0.9,
            learning_rate=0.003),
          loss=tf.keras.losses.categorical_crossentropy)
    
    def scheduler(epoch, lr):
      if epoch  % 30 == 0:
        lr = lr*0.1  
      return lr
    
    callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
    model.fit(X, y, callbacks=[callback], epochs=100)
    

    【讨论】:

    • 我关心的主要是我引用的“手动将衰减应用于 weight_decay”行,因为通过 ExponentialDecay 对象的学习率参数工作得很好。但是我认为自定义回调可以完成工作。
    • 我不确定文档,它令人困惑。权重衰减不依赖于学习率。可能是该行特定于使用extend_with_decoupled_weight_decay
    • 我明白,我正在深入研究实现,因为它听起来有点不对劲,但我认为我有错,因为我是 ML 的初学者。我还阅读了this answer。
    • 更新:我在this issue找到了该行的原因
    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2019-09-03
    • 1970-01-01
    相关资源
    最近更新 更多