多任务学习模型MTL: MMoE、PLE
作者:互联网
常见的监督学习包括:
- 回归:预测值为连续值,如销售额;
- 二分类:预测值为离散值,且只有两种取值,如性别,要么是男,要么是女;
- 多分类:预测值为离散值,且多于两种取值,如动物分类,可能有猫、狗、狮子等等;
- 还有另外一种,也是本文的主角:多任务学习(Multi Task Learning)。
MTL介绍
首先,介绍什么是多任务学习,例如之前文章提到的微信视频场景,同时包含多个学习目标(task):是否转发、是否点赞、是否关注等。
以往的做法可能会对不同的task分别建立对应的模型,但这样会导致几个问题
- 模型的数量会随着task的数量增加而增加,模型维护成本高;
- 生产环境中,需要同时多个模型进行计算,才能完成多个task的预估,存在性能问题;
- 忽略了不同task之间的关联。
那么,多任务学习就是为了解决这些问题,建立一个模型,同时对不同的task进行学习。
另外,多任务学习还有一个优点:
经常存在某个task的样本数量比较少的情况,导致模型的学习难度较高。多任务学习过程中多个task的样本数据是共享的,一定程度上减缓这个问题。
Shared-Bottom模型
原生的MTL框架,也是最简单的,如下图:
- ID特征经过embedding层和其他dense特征拼接,作为输入层;
- 接着,是共享网络层share-bottom,一般称为硬参数共享(hard parameter sharing)。这是通过底层的共享网络来实现不同task信息之间的共享;
- 然后,是专家网络层,即每个task有自己独立的网络层;
- 最后,每个task的专家网络层输出对应的预测值。
但是,原生的MTL模型存在以下几个问题:
- 实践中,原生MTL模型往往无法比task单独建模的效果好;
- 对task之间的数据分布差异和相关性很敏感;
- task之间固有的冲突会影响原声MTL模型的表现。
然而,以上几个的问题的本质都是由于底层网络参数的共享。
其实可以从这两个角度理解,
1、底层共享的参数容易偏向于某个task,或者说偏向于某个task的全局(局部)最优方向,如果task之间差异很大,那么不同task的模型参数的全局(局部)最优方向也会不同,那么其他task的效果肯定会大打折扣;
2、不同task的梯度冲突,存在参数撕扯,比如两个task的梯度是正负相反,那最终的梯度可能被抵消为0,导致共享参数更新缓慢。
MMoE
《Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts》
首先,上面我们提到Shared-bottom模型的效果受不同task之间的相关性影响,这篇论文就证明了这个结论:
-
大体的思路是控制两个回归task的label(y1、y2)的相关性为p,生成一批输入数据x;
-
然后使用Shared-bottom模型来拟合,对比不同p之下的效果;
-
对比不同p之下的情况:两个task的相关性越小,模型的效果越差。
模型结构
上图c就很清晰的描述了MMoE的结构:
- 模型输入会通过映射到所有task共享的多个Expert,一个Expert就是ReLU激活函数的全连接层,称为Mixture-of-Experts;
- 同时,模型输入还会映射到多个Gate,一个task独立拥有一个Gate,论文中Gate就是一个没有bias和激活函数的全连接层,然后接softmax,称为Multi-gate;
- Gate是一个概率分布,控制每个Expert对task的贡献程度,比如task A的gate为(0.1, 0.2, 0.7),则代表Expert 0、Expert 1、Expert 2对task A的贡献程度分别为0.1、0.2和0.7;
- 通过task对应的Gate来得到多个Expert的加权平均,然后输入到task对应的Tower层(MLP网络层);
- 最后,通过对应task的Tower层输出,计算得到task的预测值。
总结:
- 对比Shared-Bottom模型,MMoE将底层的共享网络层拆分为多个共享的Expert,并且通过引入Gate来学习每个Expert对不同task的贡献程度;
- 对应不同相关性的task,MMoE模型的效果比较稳定。这主要是因为相关性弱的task,可以通过Gate来利用不同的Expert。
Progressive Layered Extraction
《Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations》
MMoE在弱相关性task中表现地相对比较稳定,但由于底层的Expert仍然是共享的(虽然引入Gate来让task选择Expert),所以还是会存在**“跷跷板”**的情况:一个task的效果提升,会伴随着另一个task的效果降低。
腾讯在2020的论文中,就对MMoE进行改进,提出了CGC(Customized Gate Control)、PLE(Progressive Layered Extraction)
其实,从结构上来看,CGC可以认为是单层的PLE,而PLE就是多层的CGC。
CGC
从上面的结构图,容易看出跟MMoE的差别就在于:除了共享的Expert之外,还加入了每个task自己的Specific Expert
- 所有task共享的expert(如上图Experts Shared)、每个task自己的expert(如上图task A的Experts A),跟MMoE一样,Expert也是模型输入Input映射而来:ReLU激活函数的全连接层;
- 每个task通过Input映射为自己的Gate:一个没有bias和激活函数的全连接层,然后接softmax,即图中的Gating Network;
- 每个task选择共享的Experts和task自己的Experts,通过task自己的Gate来得到多个Expert的加权平均,然后输入到task对应的Tower层(MLP网络层);
- 最后,通过对应task的Tower层输出,计算得到task的预测值。
PLE
上面也提到,PLE其实可以认为是多层的CGC:
- 由多个Extraction Network组成,每个Extraction Network就是CGC网络层,做法与CGC一致;
- 第一层Extraction Network的输入是原生模型输入Input;
- 但后面的Extraction Network,输入就不再是Input,而是所有Gate与Experts的加权平均的融合,这里的融合一般做法包括:拼接、加法融合、乘法融合,或者这三种的组合;
- 最后一层Extraction Network中gate的数量等于task的数量,对应每个task的gate;
- 而前面层的Extraction Network中gate的数量是task的数量+1,这里其实就是对应每个task的gate,加上共享expert的gate。
Multi-level MTL
按照PLE的思路,其实MMoE也是衍生出多层的MMoE,如下图的结构:
代码实现
tensorflow1.x版本的代码实现:https://github.com/QunBB/DeepLearning/tree/main/MultiTaskLearning
标签:task,Expert,模型,PLE,MMoE,MTL,Gate,共享 来源: https://blog.csdn.net/sgyuanshi/article/details/120939816