文 | 小伟
编 | 小轶
说到多任务学习,大家都不陌生,不管是在学术界还是工业界都已经有了很多成熟的探索与应用。在理想的多任务学习中,各个任务对彼此应当是有益的,所有任务相互促进,从而达到超过单任务学习的效果。
但理想归理想,实际情况却并非如此。简单的把一堆任务堆积在一起往往会降低模型最终的性能,所以在多任务学习中,如何去有效地识别哪些任务在训练时结合在一起可以对彼此有益 成为了很关键的问题。
显而易见,我们可以直接搜索所有任务组合在一起构成的参数空间(N个任务对应2^N-1种可能性),但指数级的复杂度实在是让人无法接受。Google最近的这篇文章就对这个问题做出了比较好的解答。它提出了一种在多任务学习中高效决定哪些任务应当划分到一组进行训练的方法,在大规模的 Taskonomy 计算机视觉数据集上,不仅可以把测试集的 loss 降低10.0%,训练速度也是之前任务分组 SOTA 的 11.6 倍。
论文标题:
Efficiently Identifying Task Groupings for Multi-Task Learning
论文链接:
https://arxiv.org/abs/2109.04617
总体来看,训练可以分为四个部分:
第一部分与第四部分很容易理解,下面我们来具体看一下第二部分以及第三部分。
整个算法中最最关键的概念就是这个“任务间亲和度”了。任务间亲和度(Inter-Task Affinity),直白一点的讲的话,就可以理解为:在多任务学习中,用一个值来量化一个任务 对另一个任务 的正面或者负面影响。
那具体怎么衡量呢?在本文中,作者提出:用任务 对共享参数的梯度更新对另一个任务 的 loss 影响的程度 来衡量两个任务的亲和度。
形式化地表达就是:考虑任务集合 , 共享参数 ,以及任务 的参数 , 其中 对于一个batch的训练数据 , 整体的训练loss
其中 是任务 对应的loss 那么对于在训练时刻 的一个batch的训练数据 , 当我们用某个任务 的loss对共享参数 进行一次梯度更新后,得到新的共享参数
然后我们就可以用新的共享参数 , 训练数据 以及另一个任务 的参数 来计算共享参数更新之后任务 的新loss
与共享参数更新之前任务 的旧loss 进行比较,就可以得到任务 对任务 的亲和度
如果亲和度大于0,说明任务 对共享参数的此次梯度更新会降低另一个任务 的loss,对应着正面影响; 相反如果小于0,说明 对共享参数的更新会提高 的loss,对应着负面影响。
这样,我们对训练数据进行一次迭代,就可以获得最终所有任务 两两之间的亲和度。
不要忘记我们最终的目标是——把任务进行分组。在得到任务两两之间的亲和度之后,我们要怎么对任务进行分组呢?
我们先定义两个概念:
这样,分组问题就转化为:把所有任务划分为 组,使得所有目标任务的任务亲和度之和最大。文中提出我们可以通过利用分支定界法或者0-1整数规划来解决该问题。
然而很悲伤的是,这是一个NP-hard问题。当任务数量较多时,时间复杂度会非常高。
实验结果非常给力(TAG是本文方法),总结一下的话主要有一下两点:
本文提出了一种只需要对训练数据进行一次迭代就可以计算出任务间亲和度的方法,利用该亲和度来衡量任务间的相互影响并进行任务组的划分,在多任务学习的效果以及效率上都超过了之前方法很多。作者同时也希望这篇文章可以给多任务学习中任务组的划分带来更多的关注,希望可以在这一方向上有更多的探索与发展。
虽然多任务学习不管是在学术界还是工业界都已经有了比较成熟的应用,但现在多任务学习还是比较依赖于充足的先验知识,很多情况下都需要人事先判断任务之间是不是可以相互促进的。然而人的知识毕竟是有限的,所以很多情况下并不能做出很准确的判断以及划分,从而对多任务学习的性能造成负面的影响。所以如果能有一种可以简易快捷的判断几个任务是不是应该结合在一起学习的方法,相信会给多任务学习带来质的提高,它的应用也会更加的广泛与方便。
从刚才的介绍我们也可以看出,虽然本文的方法只需要对训练数据进行一次迭代就可以对任务进行分组,但复杂度还是蛮高的(亲和度计算以及组的划分),所以感觉如何把复杂度再降低一些将会是非常有前景的未来研究方向。
后台回复关键词【入群】
加入卖萌屋NLP/IR/Rec与求职讨论群
后台回复关键词【顶会】
获取ACL、CIKM等各大顶会论文集!