Optimization 计划学习率

Optimization 计划学习率,optimization,pytorch,learning-rate,Optimization,Pytorch,Learning Rate,我试图重新实施一篇论文,其中建议调整学习率如下: 学习率降低了回归值的因子,耐心期为10,变化值为0.0001 我是否应该使用torch.optim.lr\u调度程序.ReduceLROnPlateau() 我不确定应该传递给每个参数什么值 语句中的更改值是否表示参数阈值 语句中的因子是否表示为参数因子 torch.optim.lr_scheduler.reducelronplatflation确实是您想要的。我为你总结了所有重要的东西 mode=min:当监控数量停止减少时,lr将减少 系

我试图重新实施一篇论文,其中建议调整学习率如下:

学习率降低了回归值的因子,耐心期为10,变化值为0.0001

我是否应该使用
torch.optim.lr\u调度程序.ReduceLROnPlateau()

我不确定应该传递给每个参数什么值

  • 语句中的更改值是否表示参数阈值

  • 语句中的因子是否表示为参数因子


  • torch.optim.lr_scheduler.reducelronplatflation
    确实是您想要的。我为你总结了所有重要的东西

    mode=min
    :当监控数量停止减少时,lr将减少

    系数
    :降低学习率的系数

    耐心
    :没有改善的时期数,之后学习率将降低

    threshold
    :测量新最佳值的阈值,仅关注重大变化(变化值)。假设我们的
    阈值=0.0001
    ,如果在第n个历元上损失为18.0,在第n+1个历元上损失为17.9999,则我们满足了将当前学习率乘以
    因子的标准

    criterion = torch.nn.MSELoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min',
        factor=0.1, patience=10, threshold=0.0001, threshold_mode='abs')
    
    for epoch in range(20):
        # training loop stuff
        loss = criterion(...)
        scheduler.step(loss)
    

    您可以查看文档中的更多详细信息:

    Pytorch有许多方法可以降低学习率。这里有很好的解释:

    @安东尼诺·迪马吉奥很好地解释了这个问题。我只是想补充一下对@Yan JenHuang评论的回答:


    是否可以通过减去一个常量值而不是一个系数来降低学习率

    首先,你应该非常小心地避免lr的负值!其次,减去学习率的值不是常见的做法。但无论如何

    您必须首先创建一个自定义lr调度程序(我修改了LambdaLR的代码):

    你可以在训练中使用它

     lambda1 = lambda epoch: e-4 # constant to subtract from lr
     scheduler = SubtractLR(optimizer, lr_lambda=[lambda1])
     for epoch in range(100):
         train(...)
         validate(...)
         scheduler.step()
    

    您还可以修改
    reducelRonplation
    的代码,以减去学习率,而不是将其乘以整数。您应该将此行
    new\u lr=max(old\u lr*self.factor,self.min\u lrs[i])
    更改为类似
    new\u lr=max(old\u lr-self.factor,self.min\u lrs[i])
    。您可以自己查看代码:

    作为上述ReducelRonPlatform答案的补充,threshold在pytorch的lr scheduler中也有模式(rel | abs)(至少对于vesions>=1.6),默认值为“rel”,这意味着如果您的损失为18,它将至少更改为18*0.0001=0.0018,以确认为改进。因此,也要注意阈值模式。

    是否可以通过减去一个常量值而不是一个系数来降低学习率?对于
    模式
    正在监控的数量,优化器会进行优化?还是损失函数?
     lambda1 = lambda epoch: e-4 # constant to subtract from lr
     scheduler = SubtractLR(optimizer, lr_lambda=[lambda1])
     for epoch in range(100):
         train(...)
         validate(...)
         scheduler.step()
    
     lambda1 = lambda epoch: epoch * e-6 # increases the value to subtract lr proportionally to the epoch
     scheduler = SubtractLR(optimizer, lr_lambda=[lambda1])
     for epoch in range(100):
         train(...)
         validate(...)
         scheduler.step()