【问题标题】:How does a decaying learning rate schedule with AdamW influence the weight decay parameter?使用 AdamW 的衰减学习率计划如何影响权重衰减参数?
【发布时间】:2022-01-26 03:57:34
【问题描述】:

根据 Pytorch 文档

https://pytorch.org/docs/stable/generated/torch.optim.AdamW.html

AdamW 优化器在每一步计算学习率 gamma 和权重衰减系数 lambda 的乘积。产品

gamma*lambda =: p

然后用作权重衰减步骤的实际权重。要了解这一点,请考虑 AdamW 算法中 for 循环中的第二行:

但是,如果学习率 lambda 在每个 epoch 后由于我们使用(比如说)指数学习率衰减时间表而缩小怎么办? p 是否始终使用 initial 学习率 lambda 计算,因此 p 在整个训练过程中保持不变?还是由于与学习率衰减计划的隐式交互,p 会随着 lambda 的收缩而动态收缩?

谢谢!

【问题讨论】:

    标签: python optimization deep-learning pytorch gradient-descent


    【解决方案1】:

    函数torch.optim._functional.adamw在您每次使用优化器的当前参数执行优化器时被调用(该调用发生在torch/optim/adamw.py:145)。这是实际更新模型参数值的函数。因此,在学习率调度器更改优化器参数后,后续步骤将使用这些参数,而不是初始参数。

    为了验证这一点,在torch/optim/_functional.py:137 的代码中的每一步都重新计算了乘积。

    【讨论】:

    • 感谢您的回答,我认为这是正确的。但是请注意,optimiser.state_dict() 表明优化器有一个“lr”参数以及一个“initial_lr”参数,并且这两个参数在整个训练过程中都可以访问(因此只有“lr”在每个 epoch 由于到学习率衰减时间表)。您确定 torch.optim._functional.adamw 调用的是“lr”而不是“initial_lr”吗?
    • 我同意您发送的代码表明调用了“lr”而不是“initial_lr”。但是,您是否同意这意味着不可能同时具有衰减的学习率和恒定的权重衰减系数是很不公平的?无论如何,感谢您的帮助!
    • 在 AdamW 优化器中每个组只有一个 lr。我知道的唯一可能包含initial_lr 的状态字典是学习率调度程序的状态字典(在调度程序初始化期间设置here)。这是必需的,因为通常在特定时间步长的学习率更容易计算为原始函数。
    • 如果您打印AdamW([torch.nn.Parameter(torch.zeros(1))],lr=0.1).state_dict(),您应该只会在优化器状态字典中看到lr。初始值没有被存储,因为它不用于优化器本身的任何内容。
    • @Joker123 啊,是的。我错过了我之前链接的与initial_lr 相关的代码。调度器实际上将initial_lr 存储在优化器的状态字典中,而不是它自己的。我不确定这个决定的动机,IMO 将这些信息存储在调度程序的状态字典中会更有意义。尽管如此,优化器本身并不使用该信息,它仅可能被调度程序用于更新学习率。
    【解决方案2】:

    纯粹基于发布的 gamma 和 lambda 算法,因此它们的乘积 p 也是恒定的。

    【讨论】:

    • 但是该算法将学习率 lambda 作为输入,并且只描述了一次梯度更新期间发生的情况。我不清楚给定算法中的 lambda 是初始(因此是固定的)学习率还是衰减(因此是动态的)学习率。
    • 如果它正在衰减,它不会作为一行包含在算法中吗?考虑到它不是我认为它是固定的,但我以前错了......
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多