1. 多任务学习(Multi-task learning)的概念
单任务学习:一个 Loss,一个任务。例如 NLP 的情感分类。
多任务学习:简单来说就有多个目标函数同时学习。例如抖音向你推荐视频的时候,通常要预测你对这个视频是否感兴趣,看多久,点不点赞,转不转发等多个维度的信息。这么多的预测任务既可以为每一个任务设计一个模型学习,也可以使用一个模型进行多任务学习从而一次性搞定。
这里需要注意区分:多目标优化和多任务学习。
多任务学习 | 多目标优化 | |
---|---|---|
核心关注点 | 如何让一个模型学好多个任务。 | 如何在多个互相冲突的目标间做取舍。 |
目标关系 | 任务通常是相关的、互补的。希望任务间互助共享。 | 目标通常是互相矛盾、竞争的。需要权衡妥协。 |
最终目的 | 提升模型在所有任务上的综合性能。 | 找到满足多个目标的最佳折中方案集合。 |
比喻 | 一个学生同时学数学和物理,知识互相促进。 | 设计师造车,在省油、快、便宜、安全之间找平衡。 |
简单来说:
多任务学习: 是 “一脑多用,互相帮忙”。解决的是模型能力复用和效率提升的问题。重点在学习过程和模型共享。
多目标优化: 是 “鱼与熊掌,如何兼得?”。解决的是目标冲突下的决策问题。重点在评估方案和权衡选择。
2. 为什么多任务学习活跃在各个 AI 领域
多任务学习活跃在各个 AI 领域:CV,NLP,推荐系统、强化学习等。在工业界基于神经网络的多任务学习在推荐等场景业务应用广泛,比如在推荐系统中对用户推荐物品时,不仅要推荐用户感兴趣的物品,还要尽可能地促进转化和购买,因此要对用户评分和购买两种目标同时建模。阿里之前提出的 ESSM 模型属于同时对点击率和转换率进行建模
2.1 为什么适用于多个领域
对于有监督深度学习/机器学习而言,基本流程都是通过输入数据,模型根据输入数据来预测结果,训练阶段根据预测和监督信号之间的损失来修正模型的参数,让模型参数尽可能可能符合数据的分布。多任务学习这个框架可以将多个基本训练流程放在一起,因此不管是 CV、NLP 还是推荐系统,都是适合这个框架的。
既然多个任务可以通过拆解为多个子任务来学习,为什么还需要这个多任务学习呢?
2.2 为什么需要?
一句话:模型统一、方便高效效果好。
1)方便:一次搞定多个任务,这点对工业界来说十分友好。假设要用 kkk 个模型预测 kkk 个任务,那么 kkk 个模型预测的时间成本、计算成本、存储成本、甚至还有模型的维护成本都是大于一个模型的。除非多任务学习的效果远远低于单任务学习,我们不使用多任务学习。
2)效果更好:针对很多数据集比较稀疏的任务,比如短视频转发,大部分人看了一个短视频是不会进行转发这个操作的,这么稀疏的行为,模型是很难学好的(过拟合问题严重),那我们把预测用户是否转发这个稀疏的事情和用户是否点击观看这个经常发生事情放在一起学,一定程度上会缓解模型的过拟合,提高了模型的泛化能力。
3)数据增强:不同任务有不同的噪声,假设不同任务噪声趋向于不同的方向,放一起学习一定程度上会抵消部分噪声,使得学习效果更好,模型也能更鲁棒。NLP 和 CV 中经常通过数据增强的方式来提升单个模型效果,多任务学习通过引入不同任务的数据,自然而言有类似的效果。
4)任务互助:某些任务所需的参数可以被其他任务辅助训练的更好,比如任务 A 由于各种限制始终学不好 W1W_1W1,但是任务 B 却可以轻松将 W1W_1W1 拟合到适合任务 A 所需的状态,A 和 B 搭配,干活儿不累~。
当然另一种机器学习角度的理解:多任务学习通过提供某种先验假设来提升模型效果,这种先验假设通过增加辅助任务(具体表现为增加一个loss)来提供。
3. 多任务学习基本框架
多任务学习通常分为:硬参数(hard parameter sharing)和软参数共享(soft parameter sharing)。
硬参数共享就是多个任务完全共享底层参数,仅在最上层使用任务特定的输出层。这种方法常用在人脸识别(身份识别+表情识别),自动驾驶(物体检测+道路分割)。当任务高度相关且数据分布相似时效果最佳。它能够大幅度减少参数量,防止过拟合。
软参数共享就是每个任务有独立参数,但通过正则化约束使参数相似。它的特点就是每个任务有完整独立的网络,然后通过正则化强制参数相似,参数距离损失来引导知识迁移。常用在多语言处理(英语NER+法语NER(同时进行英语和法语两种语言的识别)),跨模态学习(图像描述+视觉问答)。当任务相关但数据分布不同时效果最佳。它能够灵活处理人物之间的差异,减少任务冲突,更好地任务定制化。
而现在研究重点是倾向于软参数共享。比如谷歌提出的 MMoE 模型,如下图所示。
和最左边(a)的 hard sharing 相比,(b)和(c)都是先对 Expert0-2(每个 expert 理解为一个隐层神经网络就可以了)进行加权求和之后再送入Tower A 和 B(还是一个隐层神经网络),通过 Gate(还是一个隐藏层)来决定到底加权是多少。
4. 多任务学习改进的方向在哪里?
1)模型结构设计:哪些参数共享,哪些参数不共享?
2) 多任务学习的目标 loss 设计和优化改进(根据任务的 Uncertainty 对权重进行计算)。
3)直接设计更合理的辅助任务。只要任务找的好,辅助 loss 直接加上去,人为设计一下权重调个超参数,模型结构几乎不变都有可能效果更好的!对于相关任务不太好找的场景可以尝试一下对抗任务,比如学习下如何区分不同的 domain 的内容。
多任务学习注意事项:如果多任务学习中有个别任务数据十分稀疏,可以直接尝试一下何凯明大神的 Focal loss!一种用于解决机器学习中目标检测类不平衡问题的损失函数。通过调整调制因子和权重因子,Focal Loss 聚焦于难区分样本,提升模型在复杂场景下的性能。