多任务学习之深度学习部分(待续)
- 2021 年 4 月 6 日
- AI

下面就介绍一些重点,不重要的部分略过:
1、multi task learning=joint learning,=learning to learn=learning with auxiliary tasks
同一个东西的不同说法;
2、看loss损失函数,有多个项就是多任务学习,特别的,L1或L2正则化也可以看作一种简单的多任务学习,这个任务的目标是尽量让参数小并且不同参数保持在大致相同的量纲里,小参数稳定;
3、为啥用多任务:
(1)方便,不用一个任务一个model,一个model做所有任务
(2)提升泛化能力,
多任务的loss是多个loss的求和,这个求和可以是加权的也可以是其它的方式(这涉及到多目标优化,多目标优化不仅局限于多任务学习中的多个loss的权衡,多任务学习中多个loss的设计往往依赖于多目标优化中的一些理论和方法,二者关系是这样的),这样看来和加入正则项的形式很类似:

你看这个loss,是不是很像一个双任务学习的问题的形式。
所以,多任务在多个任务之间相关的时候,可以提高模型的泛化能力,这个提高泛化能力的说法有很多,不过我觉得从L1和L2正则化的角度考虑更好理解,简单来说就是引入了一些先验知识,并且这个先验知识对于model训练来说效果很不错,比如l1正则化强制让model认为他的参数应该满足拉普拉斯分布(至于让参数满足拉普拉斯分布是不是真的对下游任务能产生积极的效果,暂时没看到什么严谨地推导结果),多任务也是通过在loss中增加其它的loss从而引入先验知识,至于怎么引入好的辅助任务,靠人的经验(比如后bert时代,预训练任务的各种组合,nsp+mlm,sop+mlm,这个我们完全可以自己灵活的定义,甚至可以mlm+sop+下游的文本分类、文本匹配任务等等);
4、深度学习中的两种基本的multi task learning的实现

hard parameter share,这种最好实现,我们在输出的时候加多个任务层就行,torch写起来非常的方便快捷easy。

soft parameter sharing
这种实现起来也不复杂,不过会麻烦一点,首先根据n个不同任务独立构建n个结构相同的网络,然后对网络的参数进行限制,希望这些参数接近,这个时候,让参数接近的问题就变成了一个计算distance的问题,我们可以计算不同子网络的相同层之间的欧几里得距离,把这个距离作为损失函数放到loss里,比如cosineloss就是一种很经典的通过nn实现metric learning的例子,除此之外还有trace的方法,没了解过,先放着。
5、关于为啥MTL能够提升泛化能力的问题
1、隐式/显式数据增强
对于A任务,某些数据样本可能是噪声,则A任务训练的时候这些噪声样本起不到什么作用,
这里用噪声来指代这类样本感觉有点偏颇,我觉得更好的说法是对任务loss的优化贡献度不高的样本更恰当一些。
比如lightgbm中的goss tree或者是focal loss,前者删除当前任务中的小梯度样本,更快更好更迅速的收敛,但是这些小梯度样本可能在B任务中就不是小梯度的,这种处理方式隐式得减少了训练样本的数量,
后者,focol loss会对贡献度不高的样本降权,当权重特别小的时候,对应的样本其实也等同于被删除了,但是对另外一个任务这种样本可能就比较重要了。
除此之外,我觉得也会有显式的数据增强,例如nsp和mlm任务,虽然使用的是同一个语料,但是这两个任务实际上需要分别对原始数据进行两次改造,一次改造是对原始数据进行mask处理来对应mlm任务需要的input的数据形式,一次改造是直接以句子为单位改造成正负样本对,所以其实类似于对input进行改造从而得到更多类型的input。这个我在实现nsp+mlm任务的时候发现有这个问题,一个样本最终要拆成两种样本形式进入model去train。
2、帮模型注意更重要的特征
如果一个任务非常困难或数据有限,同时数据高维太高,那么一个模型可能很难区分相关的特征和不相关的特征。MTL可以帮助模型将注意力集中在那些实际上很重要的特征上,因为其他任务将为这些特征的相关性或不相关性提供额外的证据(这建立在多个任务对应的最好的特征大致相同的前提下)。
3、Eavesdropping
这个词翻译过来叫窃听。。感觉怪怪的。某些特征在A任务上难以学习,可能A对标的loss无法有效地利用这种特征,但在另一个任务B上就很好学习,任务B可以更好地把这些特征represent出来,举个不严谨地例子,比如组队打比赛,我对nlp熟悉,另一个队友对graph熟悉,那么他把GNN的model做好了提供一个输出的api,我直接用这个GNn的网络结构拼上nlp的一些网络结构一起输出来更好地完成任务
4、更大的假设空间
比如说对任务A来说,nn的适合的参数解可能就在某个固定的高维空间中的一块超立方体里,对于任务B来说,可能在另外一个立方体里,MTL迫使model在更大的不同的超立方体里寻找最合适的参数解,这样未来的新任务可能可以更好的让model去学习,前提是这个新任务的合适的参数解也在这么多超立方体构成的空间里。
5、正则化
前面说过了,不赘述。
MTL in non-neural models
这个上一篇已经大概介绍完了,这里不赘述了。
简单总结:
写到这边,我发现如果扩展来看,将hard share和soft share扩展为网络局部单元的share方式,现有的网络结构可以做一个归类
首先是单源input的情况
(1)单个input源+单个loss(任务)+没有share的概念,很常见了;
图片来源:

(2)单个input源,多个loss+no share,
典型的,multi-head机制的阉割版

把concat的部分化成不同任务的任务层即可。
上述都是不考虑share的网络结构,也是比较常见的网络结构,下面是引入share的概念之后的网络结构,个人认为hard share,soft share可以作为一种网络构建的机制灵活的应用于网络中的部分模块不一定要按照原文的架构来看。
(3)单个input源,多个loss+hard share/softshare/noshare,

如果hard share可以扩展来看,作为一种局部结构的话,这样其实还有更多的情况,比如input部分可以接n个子网络结构,这些子网络结构不进行任何形式的share,然后n个自网络的结果concat之后再进入shared layers。比如multi head attention的模型结构(看这个网络结构就好。。。)
concat之后就linear这层算是共享的


同样啊,我们也可以就对上图中,某两层进行softshare,最后一层不share或者concat做成no share或者concat之后再加两三层做hard share也可以。。。头痛
然后是多源input的情况:
多个input源的思路和单源类似,一个经典图:
下面是
一个多input源+单个loss+hard share(2 dense layers其实勉强算是做了一层的hard share,如果直接concat不接任何共享层则为no share的形式)
binary cross entropy部分换成多个任务层,则变成了 多input源+多loss+hard share
如果下图的三个dense之间做soft share

则变成 多input源+多个loss+hard/soft/no share 。。。脑子疼
包大人:Kaggle Avito赛后分享-多源异构数据的神经网络和迁移学习

nn中的新的一些MTL的架构方式
前面介绍了hard/soft的parameter sharing,后来,研究人员开始不满足于这些简单的MTL的设计,于是又开始折腾了,目前MTL的改进方向主要有三个方向:
1、从soft parameter sharing出发,soft share可以看作hard share和no share的一种中间情况。
简单来说就是从模型结构出发,去做模型结构的各种魔改,更简单来说就是想解决哪些参数共享,哪些参数不共享的问题
Take a rest~~~~~~~~~~~~~~~~~~~~~~~~~~
下面介绍了一些新一点的更复杂的架构方式。
1、Deep Relationship Networks
在计算机视觉的MTL中,方法通常共享卷积层,同时学习特定于任务的完全连接层。通过提出深度关系网络,改进了这些模型。除了共享层和任务特定层的结构,如图3中可以看到,它们还将矩阵先验放在全连接的层上,这允许模型学习任务之间的关系,类似于我们之前看到的一些贝叶斯模型。然而,这种方法仍然依赖于预定义的结构来共享,这可能足以解决充分研究的计算机视觉问题,但证明新任务容易出错。
对cv不是太了解,这里看图感觉像是对不同任务层的参数做了一些先验假设之类的。

2、完全自适应的特征共享

从另一个极端开始,提出了一种自下而上的方法,从一个见到那网络开始,并在训练期间使用促进类似任务分组的标准,贪婪地扩展它。动态创建分支的拓宽过程如上图所示。然而,贪婪方法可能无法发现全局最优的模型,而将每个分支分配给恰好一个任务并不允许模型学习任务之间更复杂的交互。
居然还能这么玩儿。。。这样问题挺明显,每一个round得到的最优model不一定在全局层面最优。
3、十字绣网络