什么是多任务学习?

多任务学习(MTL)是机器学习中的一个活跃研究领域。它是一种学习范式,旨在通过利用任务之间的共同知识,联合学习多个相关任务,以提高它们的泛化性能。近年来,许多研究人员已成功将MTL应用于不同领域,如计算机视觉、自然语言处理、强化学习、推荐系统等。

最近的多任务学习(MTL)研究主要集中在两个视角,网络架构设计和损失权重。我们在LibMTL中实现了一些通用且有代表性的方法。

有关更多相关介绍,请参考 [1, 2, 3, 4]

网络架构

在网络架构设计中,最简单且最流行的方法是硬参数共享(HPS,LibMTL.architecture.HPS),如图1所示,其中一个编码器在所有任务之间共享,每个任务都有其特定的解码器。由于大多数参数在任务之间共享,当任务之间不够相关时,这种架构容易导致负面共享。为了更好地处理任务关系,已经提出了不同的多任务学习(MTL)架构。LibMTL支持几种最先进的架构,详情请参阅LibMTL.architecture

通常有两种类型的MTL问题:单输入问题和多输入问题。单输入问题,如图1左侧所示,意味着一个输入数据对每个任务都有一个输出,或者等效地,所有任务共享输入数据。NYUv2数据集就是这种问题的一个例子。多输入问题,如图1右侧所示,表示每个任务都有自己的输入数据。Office-31和Office-Home数据集属于这种问题。LibMTL已经在训练框架中统一了这两种情况,您只需要正确设置命令行参数multi_input

../../_images/multi_input.png

图1 单输入问题(左)和多输入问题(右)的示意图,以硬参数共享模式为例。

加权策略

平衡与多个任务对应的多个损失是处理任务关系的另一种方式,因为共享参数由所有任务损失更新。因此,已经提出了不同的方法来平衡损失或梯度。LibMTL支持几种最先进的加权策略,详情请参见LibMTL.weighting

一些梯度平衡方法,如MGDA (LibMTL.weighting.MGDA) 需要首先计算每个任务的梯度,然后以各种方式计算聚合梯度。为了减少计算成本,可以使用编码器后的表示梯度(简称为rep-grad)来近似共享参数的梯度(简称为param-grad)。

PyTorch 实现的 rep-grad 如 图 2 所示。我们需要通过 detach 操作将计算图分成两部分。LibMTL 已经在训练框架中统一了这两种情况,你只需要正确设置命令行参数 rep_grad。此外,参数 rep_gradmulti_input 并不冲突。

../../_images/rep_grad.png

图2 如何计算表示的梯度的示意图。

参考文献

[1]

张宇和杨强. 多任务学习综述. IEEE知识与数据工程汇刊, 2021.

[2]

Simon Vandenhende, Stamatios Georgoulis, Wouter Van Gansbeke, Marc Proesmans, Dengxin Dai, 和 Luc Van Gool. 密集预测任务的多任务学习:综述. IEEE模式分析与机器智能汇刊, 2021.

[3]

林柏炯, 叶飞扬, 和张宇. 多任务学习中损失加权的深入探讨. arXiv预印本 arXiv:2111.10603, 2021.

[4]

Michael Crawshaw. 使用深度神经网络的多任务学习:综述. arXiv预印本 arXiv:2009.09796, 2020.