【问题标题】:Optimizing a neural network with a multi-task objective in Pytorch在 Pytorch 中优化具有多任务目标的神经网络
【发布时间】:2020-03-17 13:02:53
【问题描述】:

在深度学习中,您通常有一个希望优化的目标(例如图像识别)。不过,在我的领域(自然语言处理)中,我们看到了多任务训练的兴起。例如,在单个系统中进行下一句预测和句子分类。

我了解如何构建前向传球,例如用于分类任务(obj1)和回归任务(obj2)

class Net(nn.Module):
    def __init__():
        super().__init__()
        self.linear = Linear(300, 200)
        self.obj1 = Linear(200, 5)
        self.obj2 = Linear(200, 1)

    def forward(inputs):
        out = self.linear(inputs)
        out_obj1 = self.obj1(out)
        out_obj2 = self.obj2(out)
        return out_obj1, out_obj2

但是问题就变成了,如何优化这个。您是否分别对这两种损失进行了反向传递?或者你是否将它们减少到一个单一的损失(例如总和,平均)?是否有通常用于多任务学习的方法?

接下来,也许有人甚至会争辩说,不同层的参数需要不同的优化器。在这种情况下,我认为损失必须单独处理。

【问题讨论】:

  • 不为obj1克隆对象“out”有什么影响。即out_obj1 = self.obj1(out.clone())

标签: python deep-learning pytorch


【解决方案1】:

它更简单,您可以毫无问题地同时优化所有变量。只需使用各自的标准计算两个损失,将它们添加到一个变量中:

total_loss = loss_1 + loss_2

并在这个总损失上调用.backward()(仍然是张量),对两者都非常有效。您还可以对损失进行加权,以更重视其中一个而不是另一个。

查看PyTorch forums了解更多信息。

【讨论】:

  • 但是这样做很可能是您正在针对一个问题进行优化,对吗?可能 loss_2 的损失减少了很多,但是 loss_1 的损失增加了(但少了一点),然后你的系统没有对它们进行同样的优化。
  • 可能是这样,这就是我建议加权和的原因。但是,如果这两个任务是相关的并且可以通过一起训练来改进,那么两者都可能会减少他们的损失。此外,请确保两个损失的幅度相同,否则可能会发生您所要求的情况,即较大的“抵消”较小的任何可能的变化。
  • @Bram Vanroy 请记住,在损失总和上向后一次在数学上相当于向后两次,每次损失一次。
  • @Bram Vanroy 对于总和情况,假设您有损失 L = L1 + L2。考虑权重 W 的梯度。通过微分的线性,您显然有 gradW = dL/dW = dL1/dW + dL2/dW。相反,如果你首先计算 L1 的梯度,那么你有 gradW = dL1/dW,然后在 L2 上进行额外的反向传递,它将 L2 的梯度累积到现有梯度之上,从而得到 gradW = gradW + dL2/dW = dL1/ dW + dL2/dW = dL/dW。这与 sum 情况相同,但代价是额外的反向传递。
  • 无耻插件:我写了一个小助手库,可以更轻松地组合多任务层和损失并将它们组合起来。随时查看:torchMTL.
猜你喜欢
  • 1970-01-01
  • 2019-11-24
  • 2018-12-16
  • 1970-01-01
  • 2021-06-25
  • 2017-01-24
  • 1970-01-01
  • 2018-01-13
  • 2021-03-11
相关资源
最近更新 更多