上下文:
在pytorch中,任何Parameter
是Tensor
的一种特殊类型。将Parameter
分配为模块的parameters()
方法时将其自动注册为属性。
在培训期间,我会将m.parameters()
传递给Optimizer
实例,以便可以对其进行更新。
问题:对于内置的pytorch模块,如何防止某些参数被优化程序修改?
s = Sequential(
nn.Linear(2,2),
nn.Linear(2,3), # I want this one's .weight and .bias to be constant
nn.Linear(3,1)
)
s.parameters()
中吗?答案 0 :(得分:0)
可以通过设置参数的属性requires_grad=False
将其设为静态。
在我的示例中:
params = list(s.parameters()) # .parameters() returns a generator
# Each linear layer has 2 parameters (.weight and .bias),
# Skipping first layer's parameters (indices 0, 1):
params[2].requires_grad = False
params[3].requires_grad = False
使用requires_grad=True
和requires_grad=False
张量的混合进行计算时,结果继承requires_grad=True
。
根据PyTorch autograd mechanics documentation:
如果一个操作的单个输入需要渐变,则其输出也将需要渐变。相反,仅当所有输入都不需要渐变时,输出也才不需要渐变。在所有张量都不要求渐变的子图中,永远不会执行向后计算。
我担心的是,如果我禁用中间层的渐变跟踪,则第一层将不会接收反向传播的渐变。这是错误的理解。
边缘案例:如果我在模块中为 all 参数禁用了渐变并尝试进行训练,那么优化器将引发异常。因为没有单个张量要应用backward()
传递。
这种极端情况是为什么我遇到错误。我试图用单个requires_grad=False
层在模块的参数上测试nn.Linear
。这意味着我禁用了对 all 参数的跟踪,这导致优化程序抱怨。