【问题标题】:Detach intermediate module in Pytorch with regard to part of the loss分离 Pytorch 中关于部分损失的中间模块
【发布时间】:2018-11-08 01:25:19
【问题描述】:

假设我有以下前向传递,导致两个单独的损失:

forward(self, input)
    x = self.layer1(input)

    y = self.layer2(x)

    z = self.layer3(y)

    return y, z

然后我们计算 loss1(y) 和 loss2(z)。然后我们可以用一个优化器优化loss = loss1 + loss2

但我有两个注意事项:(1) 我希望仅针对 layer2 计算 d_loss1(没有 layer1),以及 (2) 我希望针对 layer3 和 layer1 计算 d_loss2 - 没有 layer2。 本质上,我想用单独的损失分别训练网络的非连续部分。

我相信我可以通过在 layer2 的输入中引入停止梯度来解决 (1),如下所示:

forward(self, input)
    x = self.layer1(input)

    y = self.layer2(x)
    y_stop_gradient = self.layer2(Variable(x.data))

    z = self.layer3(y)

    return y_stop_gradient, z

但是我该如何解决(2)? 换句话说,我希望 loss2 的梯度能够“跳过” layer2 同时保持 layer2 可针对 loss1 进行训练。

【问题讨论】:

    标签: deep-learning pytorch gradient-descent


    【解决方案1】:

    在等待正确答案的过程中,我找到了自己的答案,尽管它的效率非常低,我希望其他人能提出更好的解决方案。

    我的解决方案如下所示:

    import copy
    forward(self, input)
        x = self.layer1(input)
    
        y = copy.deepcopy(self.layer2)(x)  # create a full copy of the layer
        y_stop_gradient = self.layer2(Variable(x.data))
    
        z = self.layer3(y)
    
        return y_stop_gradient, z
    

    这个解决方案效率低下,因为 (1) 我认为深拷贝对于我正在尝试做的事情来说太过分了,而且成本太高,并且 (2) layer2 相对于 z 的梯度仍在计算中,它们只是未使用。

    【讨论】:

      猜你喜欢
      • 2019-03-16
      • 2021-07-30
      • 2020-02-25
      • 1970-01-01
      • 2023-03-22
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多