【问题标题】:Can I specify kernel-weight specific learning rates in PyTorch?我可以在Pytorch中指定内核重量特定学习率吗?
【发布时间】:2020-03-19 22:24:01
【问题描述】:

我想在每个参数的最低级别设置特定的学习率。 IE。内核权重和偏差中的每个值都应该有自己的学习率。

我可以像这样指定过滤器学习率:

optim = torch.optim.SGD([{'params': model.conv1.weight, 'lr': 0.1},], lr=0.01)

但是当我想降低一个级别时,像这样:

optim = torch.optim.SGD([{'params': model.conv1.weight[0, 0, 0, 0], 'lr': 0.1},], lr=0.01)

我收到一个错误:ValueError: can't optimize a non-leaf Tensor 我还尝试指定一个与过滤器形状相同的学习率,例如'lr': torch.ones_like(model.conv1.weight),但这也没有成功。

有没有办法使用torch.optim 做到这一点?

【问题讨论】:

    标签: python deep-learning pytorch learning-rate


    【解决方案1】:

    我可能已经找到了解决方案。由于只能输入 Conv Layer 的全部权重和偏差,我们需要插入一个与权重/偏差张量形状相同的学习率。

    这里是一个使用torch.optim.Adam的例子:

    torch.optim.CustomAdam([{'params': param, 'lr': torch.ones_like(param, requires_grad=False) * lr} 
        for name, param in model.named_parameters()])
    

    然后我们必须在优化器本身中更改一行。为此,我创建了一个自定义优化器:

    class CustomAdam(torch.optim.Adam):
       def step(self, closure=None):
           ...
           # change the last line: p.data.addcdiv_(-step_size, exp_avg, denom) to
           p.data.add_((-step_size * (exp_avg / denom)))
    

    【讨论】:

      【解决方案2】:

      一个简单的技巧是创建一个名为learning_rate 的新张量,其大小与模型相同。然后在应用渐变时,将 gradients 张量与 learning_rate 张量相乘。请让我知道这是否适合您。

      【讨论】:

      • 这是非常有限的,例如你不能指定调度器
      • 这可能行得通,但我想我找到了一个更简单的解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2021-12-03
      • 2020-03-19
      • 2010-09-12
      • 2018-07-23
      • 2011-04-27
      相关资源
      最近更新 更多