常见的监督学习包括:

  • 回归:预测值为连续值,如销售额;
  • 二分类:预测值为离散值,且只有两种取值,如性别,要么是男,要么是女;
  • 多分类:预测值为离散值,且多于两种取值,如动物分类,可能有猫、狗、狮子等等;
  • 还有另外一种,也是本文的主角:多任务学习(Multi Task Learning)

MTL介绍

首先,介绍什么是多任务学习,例如之前文章提到的微信视频场景,同时包含多个学习目标(task):是否转发、是否点赞、是否关注等。

微信大数据挑战赛

以往的做法可能会对不同的task分别建立对应的模型,但这样会导致几个问题

  1. 模型的数量会随着task的数量增加而增加,模型维护成本高;
  2. 生产环境中,需要同时多个模型进行计算,才能完成多个task的预估,存在性能问题;
  3. 忽略了不同task之间的关联。

那么,多任务学习就是为了解决这些问题,建立一个模型,同时对不同的task进行学习。

另外,多任务学习还有一个优点:

经常存在某个task的样本数量比较少的情况,导致模型的学习难度较高。多任务学习过程中多个task的样本数据是共享的,一定程度上减缓这个问题。

Shared-Bottom模型

原生的MTL框架,也是最简单的,如下图:

请添加图片描述

  1. ID特征经过embedding层和其他dense特征拼接,作为输入层;
  2. 接着,是共享网络层share-bottom,一般称为硬参数共享(hard parameter sharing)。这是通过底层的共享网络来实现不同task信息之间的共享;
  3. 然后,是专家网络层,即每个task有自己独立的网络层;
  4. 最后,每个task的专家网络层输出对应的预测值。

但是,原生的MTL模型存在以下几个问题:

  1. 实践中,原生MTL模型往往无法比task单独建模的效果好;
  2. 对task之间的数据分布差异和相关性很敏感;
  3. 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之间的相关性影响,这篇论文就证明了这个结论:

  1. 大体的思路是控制两个回归task的label(y1、y2)的相关性为p,生成一批输入数据x;

  2. 然后使用Shared-bottom模型来拟合,对比不同p之下的效果;

  3. 对比不同p之下的情况:两个task的相关性越小,模型的效果越差。

请添加图片描述

模型结构

请添加图片描述

上图c就很清晰的描述了MMoE的结构:

  1. 模型输入会通过映射到所有task共享的多个Expert,一个Expert就是ReLU激活函数的全连接层,称为Mixture-of-Experts;
  2. 同时,模型输入还会映射到多个Gate,一个task独立拥有一个Gate,论文中Gate就是一个没有bias和激活函数的全连接层,然后接softmax,称为Multi-gate;
  3. 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;
  4. 通过task对应的Gate来得到多个Expert的加权平均,然后输入到task对应的Tower层(MLP网络层);
  5. 最后,通过对应task的Tower层输出,计算得到task的预测值。
    请添加图片描述
    请添加图片描述

总结:

  1. 对比Shared-Bottom模型,MMoE将底层的共享网络层拆分为多个共享的Expert,并且通过引入Gate来学习每个Expert对不同task的贡献程度;
  2. 对应不同相关性的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

  1. 所有task共享的expert(如上图Experts Shared)、每个task自己的expert(如上图task A的Experts A),跟MMoE一样,Expert也是模型输入Input映射而来:ReLU激活函数的全连接层;
  2. 每个task通过Input映射为自己的Gate:一个没有bias和激活函数的全连接层,然后接softmax,即图中的Gating Network;
  3. 每个task会选择共享的Experts和task自己的Experts进行融合:通过task自己的Gate来得到多个Expert的加权平均,通过gate来控制每个Expert的信息贡献程度,然后输入到task对应的Tower层(MLP网络层);
  4. 最后,通过对应task的Tower层输出,计算得到task的预测值。

PLE

请添加图片描述

上面也提到,PLE其实可以认为是多层的CGC:

  1. 由多个Extraction Network组成,每个Extraction Network就是CGC网络层,做法与CGC一致;
  2. 第一层Extraction Network的输入是原生模型输入Input;
  3. 但后面的Extraction Network,输入就不再是Input,而是上一层的Experts与Gate的加权平均的融合,仍然是通过gate来控制每个Expert的信息贡献程度,每个task是选择自己的Specific Experts与共享Experts进行融合(如上图的左右),而共享这一路则是融合了所有的Experts(如上图的中间蓝色部分),gate的数量则是等同融合的Experts数量;
  4. 最后一层Extraction Network中则无需再融合共享这一路,因为这里其实就是每个task的Extraction Network的输出了,会输入到最后每个task的Tower层。

Multi-level MTL

按照PLE的思路,其实MMoE也是衍生出多层的MMoE,如下图的结构:

请添加图片描述

代码实现

torch版本的代码实现:GitHub

tensorflow1.x版本的代码实现:GitHub

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐