在 PyTorch 中设置随机权重平均的学习率

Moh*_*mba 5 python optimization machine-learning pytorch

以下是 Pytorch 中随机权重平均的一个小工作代码,取自此处

loader, optimizer, model, loss_fn = ...
swa_model = torch.optim.swa_utils.AveragedModel(model)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=300)
swa_start = 160
swa_scheduler = SWALR(optimizer, swa_lr=0.05)

for epoch in range(300):
    for input, target in loader:
        optimizer.zero_grad()
        loss_fn(model(input), target).backward()
        optimizer.step()
        if epoch > swa_start:
            swa_model.update_parameters(model)
            swa_scheduler.step()
        else:
            scheduler.step()

    # Update bn statistics for the swa_model at the end
    torch.optim.swa_utils.update_bn(loader, swa_model)
    # Use swa_model to make predictions on test data
    preds = swa_model(test_input)
Run Code Online (Sandbox Code Playgroud)

在此代码中,第 160 个纪元之后,swa_scheduler使用 代替通常的scheduler。意味着什么swa_lr?文件

通常,在 SWA 中,学习率被设置为一个较高的恒定值。SWALR 是一个学习率调度器,它将学习率退火到固定值,然后保持恒定。

  1. 那么第 160 个 epoch 之后的学习率会发生什么变化呢optimizer
  2. swa_lr影响学习率吗optimizer

假设在代码开始时 的学习率为optimizer初始化。那么上面的代码是否意味着前 160 个 epoch 的训练学习率为,然后剩余的 epoch 的学习率为?如果是,那么也定义为是个好主意吗?ADAM1e-41e-4swa_lr=0.05swa_lr1e-4

Iva*_*van 8

  • 上面的代码是否意味着前160 个时期的训练学习率为1e-4

    不,它不会等于1e-4,在前 160 个时期内,学习率由第一个调度程序管理scheduler。这是一个初始化为torch.optim.lr_scheduler.CosineAnnealingLR. 学习率将遵循这条曲线:

    在此输入图像描述


  • 对于剩余的纪元数,它将是swa_lr=0.05

    这部分是正确的,在第二部分(从 epoch 160开始)期间,优化器的学习率将由第二个调度程序处理swa_scheduler。这个被初始化为torch.optim.swa_utils.SWALR. 您可以在文档页面上阅读:

    SWALR 是一个学习率调度器,它将学习率退火到固定值 [ swa_lr],然后保持恒定

    默认情况下(参见源代码),退火前的纪元数等于10因此,从 epoch 170到 epoch 300的学习率将等于swa_lr并将保持这种状态。第二部分是:

    在此输入图像描述

    这个完整的配置文件,两个部分:

    在此输入图像描述


  • swa_lr如果是,那么也定义为是个好主意吗?1e-4

    文档中提到:

    通常,在 SWA 中,学习率被设置为一个较高的恒定值。

    设置swa_lr1e-4将产生以下学习率配置文件:

    在此输入图像描述