在 Pytorch 中优化具有多任务目标的神经网络

问题描述 投票:0回答:2

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

我了解如何构建前向传递,例如用于分类任务 (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

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

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

python deep-learning pytorch
2个回答
7
投票

就简单多了,你可以同时优化所有变量,没有问题。只需使用各自的标准计算两个损失,然后将它们添加到单个变量中即可:

total_loss = loss_1 + loss_2

并在这个总损失(仍然是张量)上调用

.backward()
,对于两者来说都非常有效。您还可以权衡损失,更加重视其中一个而不是另一个。

查看 PyTorch 论坛 了解更多信息。


0
投票

也许问题已得到解答,但在这里我试图给出我的提示。

在多任务学习中,目标是同时在多个任务上训练单个模型。这可以提高泛化能力和效率,特别是当任务本质上相关时。您的问题涉及如何优化这样的模型,特别是在处理不同任务的损失函数方面。

以下是典型方法的细分:

合并损失:

  • 总结损失:组合多个损失的最简单方法是将它们相加。这种方法假设所有任务都同等重要。然后将组合损失用于反向传播。

  • 加权和:如果任务不是同等重要,或者如果您希望网络出于任何原因更快地学习其中一项任务(相对于其他任务),则可以使用损失的加权和。这涉及到将每个任务的损失乘以权重,然后再求和。权重通常是超参数,您可以根据每个任务的相对重要性进行调整,尽管您也可以将它们设为可学习的参数,但据我所知,这不是常见的方法。

  • 动态权重:更先进的技术涉及在训练期间根据模型在每项任务上的表现动态调整权重。为此,您可以使用类似于权重衰减的方法。

  • 不确定性加权:此方法涉及通过该任务中模型的不确定性对每个任务的损失进行加权,通常使用模型输出来计算。它实际上有点复杂,需要学习权重作为模型参数的一部分。

反向传播:

当您有一个组合损失时,您可以对此损失执行反向传播。这会更新网络中的所有共享参数。

单独的优化器:

对不同层或任务使用单独的优化器在多任务学习中不太常见,主要是因为它使训练过程变得复杂。然而,在任务非常不同并且可能需要不同的学习率或优化策略的情况下,这可能是有益的。在这种情况下,您将单独处理损失,并对网络的不同部分使用不同的优化器。

© www.soinside.com 2019 - 2024. All rights reserved.