【问题标题】:Torch: backpropagate gradients without updating variablesTorch:反向传播梯度而不更新变量
【发布时间】:2020-07-01 06:11:25
【问题描述】:

在 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()

【问题讨论】:

  • 什么是 f1 和 f2?请显示您的完整模型定义
  • 这不是真正的代码:我正在举一个例子。 f1 和 f2 是使用我要更新的权重计算的张量。

标签: pytorch gradient torch backpropagation


【解决方案1】:

loss.backward() pytorch 将梯度传播到整个计算图时。
但是,backward() 函数本身不会更新任何权重,它只会计算梯度。
更新是通过optimizer.step() 中的优化器完成的。如果您想从更新中排除f1f2 的权重,您可以简单地
- 初始化optimizer,不带f1f2的参数。
- 将f1f2 的学习率设置为零。

【讨论】:

  • 如果我想更新“模型”中关于 loss1 的权重,但不想更新关于 loss2 的权重怎么办?我还想更新 f1 和 f2 中关于损失的权重
  • @ssssay 那么你将不得不对优化器、参数和反向传播进行一些调整。您有不同的方法:require_gradno_grad 和优化器中的参数。明智地使用这些工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2021-01-15
  • 1970-01-01
相关资源
最近更新 更多