在我的实验中,我想先训练一个低级模型(L),然后在更高级别的任务(H)中重用它。通常我会在训练 H 时冻结模型 L。但是有没有可能不完全冻结 L,而是通过一个系数冻结它,有点像。
如果这听起来在数学上不正确,我很抱歉,但如果我们假设在非冻结模型的情况下,它受到 1.0 比例梯度的影响,而当它被冻结时,它受到 0.0 的影响,我很乐意成为能够改变这个系数,所以我可能没有完全冻结的模块(0.0),但仍然部分受到梯度下降的影响(例如,0.1)。但仍然重要的是,模型L完全影响H的结果。或者说,它以1.0的尺度影响结果,但在反向传播阶段,它受到0.1的影响。
这背后的主要思想是让模型 L 稍微调整 w.r.t.到高级任务。
我用谷歌搜索了这个问题,但我最好想出了这两个问题,我相信这可能包含对我的问题的提示,但我仍然无法弄清楚如何为前向和后向传递设置单独的“权重” :
据我了解,您正在尝试为模型的不同部分指定不同的学习率。 Pytorch 优化器直接支持该选项:
optim.SGD([
{'params': model.base.parameters()},
{'params': model.L.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
从那里,您可以像往常一样运行训练循环。