在pytorch中,是否存在一种有效的方法来反向传播渐变,但不更新其相应变量?似乎在更新期间每次都复制权重太昂贵了。但是no_grad
和set_grad_enabled
不允许反向传播。
例如以下内容似乎花费太多时间,因为每次权重更新时都需要复制模型:
def __init__():
…
self.model = MyModel()
self.func1 = FuncModel1()
self.func2 = FuncModel2()
…
def trainstep(input):
f1 = self.func1(input)
f2 = self.func2(input)
…
# want to update weights in model & f1 with respect to loss1
loss1 = my_loss(model(f1), y1)
# don’t want to update weights in self.model with respect to loss2
# but want to update weights in f2 for loss2
copy_model = MyModel()
copy_model.load_state_dict(self.model.state_dict())
loss2 = my_loss(copy_model(f2), y2)
total_loss = loss1 + loss2
…
total_loss.backward()
optimizer.step()
loss.backward()
pytorch在整个计算图中传播梯度时。但是,backward()
函数本身不会更新任何权重,它只会计算梯度。通过optimizer.step()
中的优化器完成更新。如果要从更新中排除f1
和f2
的权重,则可以-初始化optimizer
,不带f1
和f2
的参数。-将f1
和f2
的学习率设置为零。