在 PyTorch 中,是否可以通过系数冻结模块?

问题描述 投票:0回答:1

在我的实验中,我想先训练一个低级模型(L),然后在更高级别的任务(H)中重用它。通常我会在训练 H 时冻结模型 L。但是有没有可能不完全冻结 L,而是通过一个系数冻结它,有点像。

如果这听起来在数学上不正确,我很抱歉,但如果我们假设在非冻结模型的情况下,它受到 1.0 比例梯度的影响,而当它被冻结时,它受到 0.0 的影响,我很乐意成为能够改变这个系数,所以我可能没有完全冻结的模块(0.0),但仍然部分受到梯度下降的影响(例如,0.1)。但仍然重要的是,模型L完全影响H的结果。或者说,它以1.0的尺度影响结果,但在反向传播阶段,它受到0.1的影响。

这背后的主要思想是让模型 L 稍微调整 w.r.t.到高级任务。

我用谷歌搜索了这个问题,但我最好想出了这两个问题,我相信这可能包含对我的问题的提示,但我仍然无法弄清楚如何为前向和后向传递设置单独的“权重” :

  1. https://discuss.pytorch.org/t/multiply-a-model-by-trainable-scalar/76308
  2. https://discuss.pytorch.org/t/different-forward-and-backward-weights/52800/10 这个似乎回答了这个问题,但它似乎太老套了,而且可能已经过时了。也许有更成熟和实际的方法来做到这一点?
python deep-learning pytorch
1个回答
1
投票

据我了解,您正在尝试为模型的不同部分指定不同的学习率。 Pytorch 优化器直接支持该选项

optim.SGD([
              {'params': model.base.parameters()},
              {'params': model.L.parameters(), 'lr': 1e-3}
            ], lr=1e-2, momentum=0.9)

从那里,您可以像往常一样运行训练循环。

© www.soinside.com 2019 - 2024. All rights reserved.