多任务学习、多场景学习相关论文阅读笔记(1)

716 阅读6分钟

多任务学习(Multi-Task Learning,MTL)是一种机器学习方法,其对多个不同类型的任务进行联合学习,相比于对多个任务分别单独建模进行学习,多任务学习可以通过共享模型参数减少整体参数量,并将模型挖掘的知识在多个任务之间进行迁移,提升整体性能。在计算广告领域,多任务学习的应用场景包括对广告展现样本点击率和转化率预估的联合学习等。相对于多任务学习,多场景学习(Multi-Domain Learning,MDL)则可以被认为是另一种机器学习方法。两者的主要区别是,多任务学习是对同一样本数据集的多个不同类型的任务进行联合学习,而多场景学习是对多个不同场景样本数据集的同一类任务进行联合学习。在计算广告领域,多场景学习的应用场景包括对不同媒体流量(例如信息流、搜索、短视频等)下、不同转化类型(例如商品购买、游戏付费、表单提交等)的转化率预估的联合学习

本文是多任务学习和多场景学习数篇相关论文的阅读笔记,如有不足之处,请指正。

多任务学习之ESMM

概述

《Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate》是阿里妈妈广告算法团队于2018年发表的一篇论文,如标题所示,论文提出了ESMM模型(Entire Space Multi-Task Model),基于用户行为序列和多任务学习思想有效解决广告转化率(Conversion Rate,CVR)预估的样本选择偏差(Sample Selection Bias,SSB)和数据稀疏(Data Sparsity,DS)问题,并在淘宝推荐广告的公开和线上数据集上取得了当时最好的效果

问题

广告的用户行为序列包括展现、点击和转化(比如购买)。过去广告出价方式以按点击出价为主,广告主设置点击出价,广告系统在线投放广告时,会预估广告点击率,并按以下公式计算eCPM:

eCPM=bidclick×pCTR\text{eCPM}=\text{bid}_{\text{click}} \times \text{pCTR}

最后基于eCPM对广告进行排序,选取靠前的广告进行投放。目前广告出价方式已逐步过渡到以按转化出价为主,广告主设置转化出价,广告系统在线投放广告时,会同时预估广告点击率和点击后的转化率,并按以下公式计算eCPM:

eCPM=bidconversion×pCTR×pCVR\text{eCPM}=\text{bid}_{\text{conversion}} \times \text{pCTR} \times \text{pCVR}

在预估点击后的转化率时,传统的预估模型仅使用有点击的展现作为训练样本,其中有点击、有转化的作为正样本,有点击、无转化的作为负样本,而在推理阶段则对所有展现的点击后转化率(即使这个展现后续不会有点击)进行预估,从而导致样本选择偏置(Sample Selection Bias,SSB)问题,如图1所示。

图1 传统点击后转化率预估模型的样本选择偏置问题

另外,转化率预估模型仅使用有点击的展现作为训练样本(在论文所使用的数据集中,有点击的展现仅占所有展现的4%),从而导致数据稀疏问题,转化率预估模型较难基于已有训练数据进行充分地学习。

方案

令广告的用户行为序列数据集S=(xi,yizi)i=1N\mathcal{S}={(x_i,y_i \rightarrow z_i)}|_{i=1}^{N},其中每个样本(x,yz)(x,y \rightarrow z)表示一次展现下的用户行为序列,xx表示一次展现的特征向量,一般包括用户特征和广告特征两部分,yyzz为二值标量分别表示是否发生点击和转化,值为1表示发生点击或转化,值为0表示未发生点击或转化。

传统的基于深度学习的pCVR模型如图2的左半边所示,论文使用其作为基线模型,其结构从下往上分为以下各层:

  • 输入层,输入用户和广告特征;
  • Embedding层,将用户和广告特征通过Embedding转化为低纬稠密向量,论文中Embedding后的向量维度为18;
  • 池化层,将Embedding层输出的向量按特征进行加和池化并拼接在一起;
  • MLP层,多层全连接网络,论文中各层维度为360×200×80×2360 \times 200 \times 80 \times 2,且每层中神经元的激活函数采用ReLU函数;
  • 输出层,输出0、1之间的概率值。

传统的pCVR模型只使用被点击的展现作为训练样本,即Sc={(xj,zj)yj=1}j=1M\mathcal{S}_c=\{(x_j,z_j)|y_j=1\}|_{j=1}^{M},其中,MM是点击数,Sc\mathcal{S}_cS\mathcal{S}的子集,从而导致样本选择偏置和数据稀疏问题。

论文的解决方案首先考虑pCTR(展现发生点击的概率)、pCVR(点击发生转化的概率)和pCTCVR(展现发生点击、转化的概率)的三者关系,可用以下公式表示:

p(y=1,z=1x)pCTCVR=p(y=1x)pCTR×p(z=1y=1,x)pCVR\underbrace{p(y=1,z=1|x)}_{\text{pCTCVR}}=\underbrace{p(y=1|x)}_{\text{pCTR}}\times \underbrace{p(z=1|y=1,x)}_{\text{pCVR}}

pCVR可以通过pCTCVR除以pCTR得到,而pCTCVR和pCTR分别表示展现发生点击的概率和展现发生点击、转化的概率,可以分别使用所有的展现进行训练和推理,从而避免样本选择偏置问题,因此一个方案是采用和基线模型相同的模型结构分别训练pCTCVR模型和pCTR模型,推理时分别得到pCTCVR和pCTR,再相除得到pCVR,论文中将这个方案称为DIVISION。

论文中对这个方案进行了实验,AUC相对基线模型和其他论文中的方案,有一定提升,但由于pCTR值偏小,作为除数时,会导致计算出的pCVR不稳定,甚至会出现大于1的情况。因此进一步,论文基于多任务学习思想设计了如图2的双塔结构,左塔即基线模型,将其输出作为整个模型的中间变量表示pCVR,右塔和左塔模型结构相同,将其输出表示pCTR,将左、右塔的输出相乘表示pCTCVR。模型训练时,分pCTR和pCTCVR两个任务同时训练。训练前首先按如下步骤构建训练数据集:

  • 所有的展现均作为样本;
  • 对于pCTR任务,将有点击的展现打标为y=1y=1,无点击的展现打标为y=0y=0
  • 对于pCTCVR任务,将有点击、有转化的展现打标为y&z=1y\& z=1,其他的展现打标为y&z=0y\&z=0

模型训练采用的损失函数如下所示:

L(θcvr,θctr)=i=1Nl(yi,f(xi;θctr))+i=1Nl(yi&zi,f(xi;θctr)×f(xi;θcvr))L(\theta_{cvr},\theta_{ctr})=\sum_{i=1}^{N}{l(y_i,f(x_i;\theta_{ctr}))}+\sum_{i=1}^{N}{l(y_i \& z_i,f(x_i;\theta_{ctr})\times f(x_i;\theta_{cvr}))}

其中,θcvr\theta_{cvr}θctr\theta_{ctr}分别是左塔和右塔的模型参数,l()l(\cdot)是交叉熵损失函数,即将pCTR和pCTCVR两个任务的交叉熵损失函数加和在一起。推理时,直接使用模型左塔的输出作为pCVR,避免相除操作导致的结果不稳定,论文将这个方案称为ESMM-NS。

再进一步,由于Embedding层的模型参数较多,需要较多的样本进行学习,而左、右塔的输入相同,均为用户和广告的特征,因此,论文在这里将左、右塔共享一个Embedding层,即使用同一个Lookup Table用于Embedding计算,这样既减少模型参数量,也能够将右塔在大量展现、点击样本学习的深度信息迁移到左塔上,从而进一步解决数据稀疏问题,论文将叠加共享Embedding层的这个方案称为最终的ESMM

图2 ESMM结构

效果

实验所用的数据集来自淘宝推荐广告的线上日志,将其作为线上数据集,并对其进行采样后对外公开,作为公共数据集,两个数据集的统计信息如图3所示,线上数据集包含近5千万用户、2千万商品的近90亿展现、3亿点击和近200万转化,公共开数据集量级为线上数据集的1%。每个数据集中,一半数据用于训练,一半数据用于测试。

图3 线上数据集和公共数据集统计

作为对比,论文除了使用了上述提到的基线模型、DIVISION、ESMM-NS和ESMM外,还使用了其他论文中的模型,包括AMAN(负样本采样方案)、OVERSAMPLING(正样本复制方案)等,进行实验。在线上数据集的AUC结果如图4所示,DIVISION、ESMM-NS、ESMM的AUC最高,且逐个提升,这三个方案均解决了样本选择偏置问题,ESMM-NS相比DIVISION,解决了除法不稳定问题,ESMM相比ESMM-NS,更进一步解决了数据稀疏问题。

图4 线上数据集的AUC结果

公开数据集的AUC结果如图5所示,也是ESMM的AUC最高,论证了ESMM在转化率预估上的有效性。

图5 公开数据集的AUC结果

多任务学习之MMoE

概述

上一节介绍的ESMM算法对点击率和转化率预估进行联合学习,其多任务学习的核心思想是共享Embedding层,而在Embedding层之上构建两个网络分别用于点击率和转化率预估。这类共享底层网络层的多任务学习算法被统称为“Share Bottom”算法,即多个任务共享底层的网络层,而在共享的网络层之上每个任务有各自的网络塔和输出,由于共享底层的网络层,因此每个任务挖掘的信息可以在底层网络层实现相互之间的迁移,而每个任务各自的网络塔则保留各自特有的信息。基于“Shared Bottom”的ESMM算法在点击率和转化率预估这两个相关性较强的任务上进行联合学习并取得较好的效果,而对于相关性较弱的多个任务如何进行联合学习

Google于2018年在KDD上发表了论文《Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts》,其中提出了MMoE算法用于多任务学习。和“Shared Bottom”算法相同的是,MMoE算法中每个任务也有各自的网络塔和输出,而和“Shared Bottom”算法不同的是,MMoE并没有简单采用共享的底层网络层,而是采用多个专家网络对各任务的知识进行挖掘和共享,并对每个任务设计其专有的门控网络,每个任务的门控网络对各专家网络的输出进行加权求和作为该任务专有网络塔的输入。论文在实验中构造了不同相关性的多任务,论证了对于不同相关性的多任务,MMoE相比“Shared Bottom”算法均取得更好的效果。

准备

基于“Shared Bottom”的多任务学习模型

论文首先对基于“Shared Bottom”的多任务学习模型进行形式化地表达。令共有KK个任务,所有任务共享一个底层网络层,令函数ff表示该共享网络层,每个任务有各自的网络塔和输出,令函数hkh^k表示任务kk专有的网络塔,令xx表示输入的样本,xRdx\in\mathbb{R}^dyky_k表示任务kk输出的结果,则yky_k可由下式计算:

yk=hk(f(x))y_k=h^k(f(x))

基于“Shared Bottom”的多任务学习模型的网络结构示意如图6左侧所示。基于“Shared Bottom”的多任务学习模型在训练时,每个任务除了更新各自网络塔的参数,还会更新共享网络层的参数,因此共享网络层会同时拥有多个任务的知识,从而实现知识在多个任务中的迁移,但是也可能存在跷跷板效应,即共享底层网络层时,某些任务的效果相比单独构建模型进行学习更好,而某些任务的效果相比单独构建模型进行学习更差。

图6 多任务学习数种实现方式的网络结构

不同相关性的任务构造

由于多任务学习的效果依赖任务之间的相关性,因此论文构造了不同相关性的任务。论文按照以下步骤构造数据集:

  1. 给定输入的样本特征维度为dd,生成两个正交的单位向量u1,u2Rdu_1,u_2\in\mathbb{R}^d,即u1,u2u_1,u_2满足:
u1Tu2=0,u12=1,u22=1u_1^Tu_2=0,\lVert u_1\rVert_2=1,\lVert u_2\rVert_2=1
  1. 给定缩放常量cc和相关性得分1p1-1\le p\le 1,基于u1,u2u_1,u_2生成权重向量w1,w2w_1,w_2
w1=cu1,w2=c(pu1+(1p2)u2)w_1=cu_1,w_2=c\left(pu_1+\sqrt{(1-p^2)}u_2\right)
  1. 随机采样生成dd维向量xRdx\in\mathbb{R}^d作为输入的样本向量,xx中的每个元素从正态分布N(0,1)\mathcal{N}(0,1)中采样;
  2. 基于w1,w2w_1,w_2为向量xx生成两个任务标记y1,y2y_1,y_2,如下所示,其中,αi,βi,i=1,2,,m\alpha_i,\beta_i,i=1,2,\dots,m为控制正弦函数形状的给定参数,ϵ1,ϵ2i.i.dN(0,0.01)\epsilon_1,\epsilon_2\overset{\text{i.i.d}}{\sim}\mathcal{N}(0,0.01)为随机扰动值:
y1=w1Tx+i=1msin(αiw1T+βi)+ϵ1y_1=w_1^Tx+\sum_{i=1}^m{\sin\left(\alpha_iw_1^T+\beta_i\right)}+\epsilon_1
y1=w2Tx+i=1msin(αiw2T+βi)+ϵ2y_1=w_2^Tx+\sum_{i=1}^m{\sin\left(\alpha_iw_2^T+\beta_i\right)}+\epsilon_2
  1. 重复执行3、4两步,生成足够的输入样本向量和输出任务标记,从而构造包含两个任务标记的数据集,两个任务均为回归任务,即根据样本向量xx分别预估标记y1y_1y2y_2

论文通过计算标记y1y_1y2y_2的皮尔逊相关系数(Pearson Correlation)对两个任务的相关性进行定量分析。根据权重向量w1,w2w_1,w_2的定义,可知两者的余弦相似度为pp,如下所示:

cos(w1,w2)=w1w2w1×w2=c2pc×c=p\begin{align} \cos(w_1,w_2)&=\frac{w_1\cdot w_2}{\|w_1\|\times\|w_2\|} \\ &=\frac{c^2p}{c\times c} \\ &=p \end{align}

通过调节pp的大小,即调节w1,w2w_1,w_2的余弦相似度,可以控制所生成数据集两个任务的相关性。任务标记y1,y2y_1,y_2的皮尔逊相关系数和w1,w2w_1,w_2的余弦相似度的关系如图7所示,从中可以看出,任务标记的皮尔逊相关系数和权重向量的余弦相似度正相关,即权重向量越相似,余弦相似度越大,任务标记的皮尔逊相关系数也越大,任务相关性越高,因此,论文后续直接使用权重向量的余弦相似度指代任务的相关性。

图7 任务标记的皮尔逊相关系数和权重向量的余弦相似度的关系

任务相关性的影响

论文基于上一节构造的不同相关性的任务,对基于“Shared Bottom”的多任务学习模型进行实验,以评估任务相关性对模型性能的影响。在三种相关性的任务下,模型的损失函数值随训练步数的变化如图8所示,从中可以看出,任务的相关性对基于“Shared Bottom”的多任务学习模型的性能有影响,且相关性越高,模型的损失函数值越小,性能越好,也就是说,基于“Shared Bottom”的多任务学习模型比较适用于相关性较高的多任务。

图8 在三种相关性的任务下,模型的损失函数值随训练步数的变化

模型

基于上述的数据准备和实验分析,论文论证了任务的相关性对基于“Shared Bottom”的多任务学习模型的性能的影响。论文进一步提出了多个门控网络的混合专家网络(Multi-gate Mixture-of-Experts,MMoE),采用多个专家网络对各任务的知识进行挖掘和共享,并对每个任务设计其专有的门控网络,每个任务的门控网络对各专家网络的输出进行加权求和作为该任务专有网络塔的输入。论文论证了对于不同相关性的多任务,MMoE相比“Shared Bottom”算法均取得更好的效果。

混合专家网络(Mixture of Expert,MoE)

论文首先介绍混合专家网络(Mixture of Expert,MoE),其可由下式表达:

y=i=1ng(x)ifi(x)y=\sum_{i=1}^n{g(x)_if_i(x)}

其中,i=1ng(x)i=1\sum_{i=1}^n{g(x)_i}=1fif_i表示第ii个专家网络,gg表示门控网络,对于输入样本xx,第ii个专家网络的输出为fi(x)f_i(x),第ii个专家网络的输出权重为g(x)ig(x)_i。MoE对于所有专家网络的输出进行加权求和得到最终的输出yy

多个门控网络的混合专家网络(Multi-gate Mixture-of-Experts,MMoE)

论文在“Shared Bottom”的基础上,使用MoE替换其中的底层共享网络,从而提出多个门控网络的混合专家网络(Multi-gate Mixture-of-Experts,MMoE),如图6右侧所示,其可由下式表达:

yk=hk(fk(x))y_k=h^k(f^k(x))
where fk(x)=i=1ngk(x)ifi(x)\text{where }f^k(x)=\sum_{i=1}^n{g^k(x)_if_i(x)}

其中,共有KK个任务,nn个专家网络,对于每一个任务,例如任务kk,其拥有专有的门控网络gkg^k,该门控网络的结构为线性映射加Softmax函数,即对于dd维向量的输入样本xx,任务kk的门控网络gkg^k通过可训练的参数矩阵WgkRn×dW_{gk}\in\mathbb{R}^{n\times d}将输入样本xx线性映射为nn维向量,该nn维向量再通过Softmax函数得到nn个权重值,也就是每个专家网络输出的权重。门控网络gkg^k可由下式表示:

gk(x)=softmax(Wgkx)g^k(x)=\text{softmax}(W_{gk}x)

对于任务kk和输入样本xx,再基于门控网络gkg^k输出的权重对各专家网络的输出进行加权求和,得到整体专家网络的输出fk(x)f^k(x),最后再将该输出作为任务kk专有网络塔hkh^k(网络塔的结构为多层感知机,其中激活函数采用ReLU函数)的输入,最终由hkh^k输出任务kk的预估结果yky_k

和“Shared Bottom”相比,MMoE只是额外增加多个门控网络,而门控网络的结构仅为线性映射加Softmax函数,因此其增加的参数量相比“Shared Bottom”较小,但通过多个门控网络,可以灵活控制每个样本下、每个专家网络对各个任务的权重,而“Shared Bottom”中,底层共享网络对每个任务专有网络塔的权重和输入相同,不够灵活。如果多任务之间的相关性不高,通过训练,MMoE中各任务的门控网络可能倾向于选择特定的专家网络,对其赋值较高的权重,从而减少各任务知识在各专家网络中的共享,每个专家网络主要拥有特定的若干任务的知识,服务于特定的若干任务。

为了分析多个门控网络的效果,论文另外还提出单个门控网络的混合专家网络(One-gate Mixture-of-Experts,OMoE),如图6中间所示,其和MMoE相比,主要是将每个任务拥有专有的门控网络,修改成所有任务共享一个门控网络,其他和MMoE保持一致。

关于MMoE的代码实现,可参考LibMTL,其中包含了多个常用多任务学习算法的实现。关于MMoE的代码实现和笔者注释如下所示:

class MMoE(AbsArchitecture):

    def __init__(self, task_name, encoder_class, decoders, rep_grad, multi_input, device, **kwargs):
        super(MMoE, self).__init__(task_name, encoder_class, decoders, rep_grad, multi_input, device, **kwargs)
        
        self.img_size = self.kwargs['img_size']
        self.input_size = np.array(self.img_size, dtype=int).prod()
        self.num_experts = self.kwargs['num_experts'][0]
        # 定义n个专家网络
        self.experts_shared = nn.ModuleList([encoder_class() for _ in range(self.num_experts)])
        # 定义每个任务专有的门控网络,每个门控网络为线性映射+Softmax函数
        self.gate_specific = nn.ModuleDict({task: nn.Sequential(nn.Linear(self.input_size, self.num_experts),
                                                                nn.Softmax(dim=-1)) for task in self.task_name})
        
    def forward(self, inputs, task_name=None):
        # 定义前向传播流程
        # 定义输入样本通过各专家网络后的输出
        experts_shared_rep = torch.stack([e(inputs) for e in self.experts_shared])
        out = {}
        # 处理每个任务
        for task in self.task_name:
            if task_name is not None and task != task_name:
                continue
            # 对于当前任务,由其门控网络根据输入样本输出各专家网络的权重
            selector = self.gate_specific[task](torch.flatten(inputs, start_dim=1))
            # 对于当前任务,对于每个样本,基于门控网络输出的各专家网络权重对各专家网络输出进行加权求和,得到每个样本通过整体专家网络后的输出
            gate_rep = torch.einsum('ij..., ji -> j...', experts_shared_rep, selector)
            gate_rep = self._prepare_rep(gate_rep, task, same_rep=False)
            # 对于当前任务,将整体专家网络的输出作为任务专有塔的输入,由任务专有塔输出任务的预估结果
            out[task] = self.decoders[task](gate_rep)
        return out

效果

基于构造的不同相关性的任务

论文基于构造的不同相关性的任务测试、比较“Shared Bottom”、OMoE、MMoE在不同任务相关性下的性能。在模型的具体结构上,输入样本的特征维度为100,MMoE共有8个专家网络,每个专家网络仅包含一层全连接网络,网络的宽度为16,则8个专家网络的参数总量为100×16×8100\times 16\times 8,MMoE共有2个任务,每个任务的专有网络塔也仅包含一层全连接网络,网络的宽度为8,各任务网络塔的输入是各专家网络输出的加权和,即任务网络塔输入的维度为16,则2个任务网络塔的参数总量为16×8×216\times 8 \times 2,所以MMoE的参数总量为100×16×8+16×8×2=13056100\times 16\times 8+16\times 8 \times 2=13056。作为基线模型的“Shared Bottom”,2个任务的专有网络塔和MMoE一致,也仅包含一层全连接网络,网络的宽度为8,令“Shared Bottom”的底层共享网络也仅包含一层全连接神经网络,其网络的宽度为ww,若基线模型和MMoE的参数总量保持一致,则100×w+w×8×2=13056100\times w +w\times 8 \times 2=13056,可求得w113w\approx 113

图9 在三种相关性的多任务下,“Shared Bottom”、OMoE、MMoE的损失函数值随训练步数的变化

在三种相关性的多任务下,“Shared Bottom”、OMoE、MMoE的损失函数值随训练步数的变化如图9所示,其中三张图分别对应两个任务的相关性为0.5、0.9和1(为1时两个任务即同一个任务),每张图的横坐标为训练步数,纵坐标为损失函数值,从上述图中可以得出以下结论:

  • 对于“Shared Bottom”、OMoE和MMoE,两个任务的相关性越高,各模型的效果均越好,模型训练的损失值越小;
  • 对于MMoE和OMoE,其在不同的任务相关性下,模型训练的损失值均小于“Shared Bottom”,论证了混合专家网络(MoE)在多任务学习中的有效性;
  • 对于MMoE,其在不同的任务相关性下,模型训练的损失值变化不大,相比“Shared Bottom”和OMoE,均是最小,即上述三张图中的红色曲线,说明MMoE受任务相关性的影响最小,论证了多门控网络在多任务学习中的有效性;

基于真实数据集

论文进一步在真实数据集上进行实验。首先在基线模型上,除“Shared Bottom”外,论文还使用了以下几种多任务学习方案:

  • L2约束项(L2-Constrained),该方案并不直接在两个任务上进行参数共享,而是在两个任务联合训练的损失函数上增加L2约束项间接进行参数共享,令yky_k为任务kkk1,2k\in 1,2)的标记真实值,而任务kk的模型预估值可由下式表示:y^k=f(x;θk)\hat{y}_k=f(x;\theta_k),其中,θk\theta_k为任务kk的模型参数,则两个任务联合训练的损失函数可由下式表示:
EL(y1,f(x;θ1))+EL(y2,f(x;θ2))+αθ1θ222\mathbb{E}L(y_1,f(x;\theta_1))+\mathbb{E}L(y_2,f(x;\theta_2))+\alpha\parallel\theta_1-\theta_2\parallel_2^2
  • Cross-Stitch,该方案在《Cross-stitch Networks for Multi-task Learning》这篇论文中被提出,其对两个任务中间层的输出x1ix_1^ix2ix_2^i通过可学习的参数矩阵进行线性映射,从而得到新的中间层输出x˜1i\~{x}_1^ix˜2i\~{x}_2^i,再将新输出分别输入到两个任务后续的网络层,从而实现知识在两个任务中的共享,上述操作被称为“Cross-Stitch”,其可由下式表示:
[x˜1ix˜2i]=[α11α12α21α22][x1ix2i]\begin{bmatrix} \~{x}_1^i \\ \~{x}_2^i \end{bmatrix} = \begin{bmatrix} \alpha_{11} & \alpha_{12} \\ \alpha_{21} & \alpha_{22} \end{bmatrix} \begin{bmatrix} x_1^i \\ x_2^i \end{bmatrix}
  • 张量分解(Tensor-Factorization),该方案对共享网络层中的参数针对不同的任务设置不同的值得到参数张量以实现知识在不同任务中的共享,并进一步使用张量分解(张量分解具体实现采用Tucker分解)将参数张量的学习转化为较低维张量、矩阵的学习,令共享网络层的输入维度为mm,输出维度为nn,任务数为kk,则共享网络层中的参数张量W\mathcal{W}为3阶张量(形状为m×n×km\times n\times k),该张量可进一步采用Tucker分解进行张量分解,得到可学习的较低维3阶张量SS(形状为r1×r2×r3r_1\times r_2\times r_3r1,r2,r3r_1,r_2,r_3为超参)、矩阵U1U_1(形状为m×r1m\times r_1)、矩阵U2U_2(形状为n×r2n\times r_2)和矩阵U3U_3(形状为k×r3k\times r_3),如下式所示:
W=i1r1i2r2i3r3S(i1,i2,i3)U1(:,i1)U2(:,i2)U3(:,i3)\mathcal{W}=\sum_{i_1}^{r_1}{\sum_{i_2}^{r_2}{\sum_{i_3}^{r_3}{S(i_1,i_2,i_3)\cdot U_1(:,i_1)\circ U_2(:,i_2)\circ U_3(:,i_3)}}}

论文中的真实数据集使用美国人口普查收入数据集(UCI census-income dataset),其中包含近30万位美国成人的个人信息,每位成人的个人信息包含40个特征。

论文构造了两组多任务学习任务对个人信息中的某些特征进行预测,第一组多任务学习任务包含两个任务,分别是预测个人收入是否超过5万美元和预测个人婚姻状态是否未婚,这两个任务标记的皮尔逊相关系数为0.1768,第二组多任务学习任务也包含两个任务,分别是预测个人学历是否至少大学本科和预测个人婚姻状态是否未婚。这两个任务标记的皮尔逊相关系数为0.2373。

因为两组多任务学习任务的各个任务均为二分类任务,所以论文采用AUC衡量各个任务的效果。论文将两组多任务学习任务中的预测个人收入是否超过5万美元和预测个人学历是否至少大学本科作为主要任务,将两组多任务学习任务中的预测个人婚姻状态是否未婚作为辅助任务,对OMoE、MMoE和上述基线模型在两组多任务学习任务中分别进行超参微调,最终各模型选定的超参能够满足各模型在主要任务的验证集上取得最高的AUC。

论文在选定超参后,对OMoE、MMoE和上述基线模型在两组多任务学习任务中,基于随机初始化的参数分别训练400次,最终各模型在第一组多任务学习任务中的各任务的最高AUC和平均AUC如图10所示,各模型在第二组多任务学习任务中的各任务的最高AUC和平均AUC如图11所示。从中可以看出,张量分解(Tensor-Factorization)因对共享网络层中的参数进行泛化处理,效果最差,“Shared Bottom”对每个任务共享相同的参数,效果比张量分解稍好,L2约束项和Cross-Stitch在每个任务拥有各自参数的基础上进行间接或直接的共享,效果比“Shared Bottom”稍好,而MMoE通过多个门控网络,可以灵活控制每个样本下、每个专家网络对各个任务的权重,效果最好。

图10 各模型在第一组多任务学习任务中的效果

图11 各模型在第二组多任务学习任务中的效果

基于内容推荐系统

论文最后还基于Google的内容推荐系统进行了线下和线上实验。内容推荐系统在排序阶段,会综合考虑用户点击率和点赞率作为排序指标,如果分别训练点击率和点赞率预测模型,则会导致较大的计算量,因此,论文指出Google之前已采用基于“Shared Bottom”的多任务学习方案进行点击率和点赞率预测的联合学习,以减少计算量。 论文在线下实验中,比较了OMoE、MMoE和上述基线模型在内容推荐系统点击率预测上的效果,结果如图12所示,从中可以看出,MMoE相比其他模型,效果也最好。 图12 线下实验,各模型在内容推荐系统点击率预测上的效果

多任务学习之PLE

概述

上一节介绍的MMoE采用多个专家网络对各任务的知识进行挖掘和共享,并对每个任务设计其专有的门控网络,每个任务的门控网络对各专家网络的输出进行加权求和作为该任务专有网络塔的输入。

腾讯于2020年在RecSys上发表了论文《Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations》,其中提出了PLE算法用于多任务学习。论文提出多任务学习在推荐系统中已有较多应用,但受限于推荐系统不同任务之间复杂的相关性,原有的多任务学习方案存在负迁移和跷跷板问题,负迁移问题指多任务学习相比对各任务分别单独建模进行学习,所有任务的效果未提升或更差,跷跷板问题指多任务学习相比对各任务分别单独建模进行学习,有的任务的效果提升,有的任务的效果下降。为了解决上述问题,论文首先提出了CGC网络,其针对MMoE中仅通过门控网络隐式地控制各专家网络在任务专有和共享中比重的问题,显式地将专家网络划分为各任务专有的专家网络和所有任务共享的专家网络,并对于每个任务,使用和MMoE类似的门控网络将该任务专有的专家网络和共享的专家网络的输出表征进行加权求和,进而得到任务塔的输入。论文接着提出了PLE网络,其在CGC的基础上进行扩展,包含多层抽取网络,且每层抽取网络的结构和CGC网络类似,从而实现各任务专有信息和所有任务共享信息的逐层抽取和深层挖掘。论文最终通过在腾讯视频推荐系统和公开数据集上的实验,证明了PLE能够有效解决多任务学习中的负迁移和跷跷板问题,并在效果上取得SOTA

相关工作

图13 已有的多任务学习方案

论文首先介绍了已有的多任务学习方案,如图13所示,这些多任务学习方案的基本思路是上层每个任务有各自专有的网络塔,下层是各种结构的共享网络,对多任务共享的知识进行挖掘,图中蓝色方块表示共享网络层,绿色和粉色方块表示各任务专有的网络塔,蓝色圆形表示共享门控网络,绿色和粉色圆形表示各任务专有的门控网络。论文根据共享网络层数的不同将已有的多任务学习方案划分为两大类,一类是单层共享的多任务学习方案,另一类是多层共享的多任务学习方案。

在单层共享的多任务学习方案中,“Hard Parameter Sharing”即前面章节中已介绍的“Shared Bottom”,底层共享网络对每个任务输出相同的表征,不够灵活;“Asymmetry Sharing”在“Hard Parameter Sharing”的基础上稍做升级,底层除了共享网络,某个任务还会有自己的专有网络,对于该任务,将共享网络和其专有网络输出的表征通过拼接或池化处理得到新表征、再输入上层该任务专有的网络塔,而对于其他任务,则和“Hard Parameter Sharing”一致,将共享网络输出的表征输入任务专有的网络塔;“Customized Sharing”和“Hard Parameter Sharing”相比,则显式将底层网络划分为共享网络和每个任务专有网络,对于每个任务,将共享网络和其专有网络输出的表征通过拼接得到新表征、再输入上层该任务专有的网络塔;“MMoE”在前面章节中已介绍,采用多个专家网络对各任务的知识进行挖掘和共享,并对每个任务设计其专有的门控网络,每个任务的门控网络对各专家网络的输出进行加权求和作为该任务专有网络塔的输入;“CGC”则是论文所提出的单层共享的多任务学习方案,显式地将专家网络划分为各任务专有的专家网络和所有任务共享的专家网络,并对于每个任务,使用和MMoE类似的门控网络将该任务专有的专家网络和共享的专家网络的输出表征进行加权求和,进而得到任务塔的输入,后面会再详细介绍该网络结构。

图14 Sluice Network的网络结构

在多层共享的多任务学习方案中,“Cross-Stitch”在前面章节中已介绍,其对两个任务多层共享层中每个中间层的输出通过可学习的参数矩阵进行线性映射,从而得到新的中间层输出,再将新输出分别作为两个任务后续中间层的输入,从而实现知识在两个任务中的共享;“Sluice Network”于2017年在论文《Sluice networks: Learning what to share between loosely related tasks》中被提出,其结构如图14所示,在“Cross-Stitch”的基础上主要作了两处升级,第一处升级是将两个任务多层共享层中每层再分别拆分为两个子网络,然后对每层四个子网络的输出通过类似“Cross-Stitch”的参数矩阵进行线性映射,从而得到四个子网络新的输出,再对每个任务当前层两个子网络的输出进行合并得到该任务下一层的输入,第二处升级是最后再将每个任务各层输出进行线性映射得到新的输出,再作为该任务专有网络塔的输入;“Cross-Stitch”和“Sluice Network”虽然实现了知识共享,但线性映射的矩阵参数在训练完成后即被固定,无法根据样本的不同动态调整多层共享层中每个任务各自网络在任务专有和共享中的比重;“ML-MMoE”在“MMoE”的基础上进行多层改造,上一层的每个专家网络通过其专有的门控网络对下一层的多个专家网络的输出进行加权求和得到该专家网络的输入,而多层共享层的最上一层,各任务通过其专有的门控网络对该层多个专家网络的输出进行加权求和得到该任务专有塔的输入;“PLE”则是论文所提出的多层共享的多任务学习方案,其在“CGC”的基础上进行扩展,包含多层抽取网络,且每层抽取网络的结构和CGC网络类似,从而实现各任务专有信息和所有任务共享信息的逐层抽取和深层挖掘,后面会再详细介绍该网络结构。

问题

论文在这里介绍了多任务学习在腾讯视频推荐中的应用场景,以及所遇到的跷跷板问题。

图15 视频推荐中排序模块的系统架构

视频推荐中排序模块的系统架构如图15所示,离线环境中,排序模块收集、解析用户的访问日志,从中提取用户对视频的反馈行为(播放、点击、分享、点赞等),生成包含用户、视频和上下文特征以及行为标记的样本,然后基于样本训练能够预估多个业务指标的多任务学习模型,在线请求时,排序模块根据当前请求的特征,使用已训练的多任务学习模型对候选视频预估多个业务指标,然后汇总多个业务指标得到视频得分,再根据视频得分对视频进行排序,最后选择靠前的若干个视频推荐给用户。

视频得分的计算公式如下所示:

score=pVTRwVTR×pVCRwVCR×pSHRwSHR××pCMRwCMR×f(video_len)score=pVTR^{w_{VTR}}\times pVCR^{w_{VCR}}\times pSHR^{w_{SHR}}\times\cdots\times pCMR^{w_{CMR}}\times f(video\_len)

其中,pVTRpVTRpVCRpVCRpSHRpSHRpCMRpCMR等表示预估的各项业务指标,wVTRw_{VTR}wVCRw_{VCR}wSHRw_{SHR}wCMRw_{CMR}等表示各项业务指标相应的权重,f(video_len)f(video\_len)表示对视频时长采用非线性函数(如对数函数或Sigmoid函数)转换后得到的系数。各项业务指标的含义如下:

  • VCR,View Completion Ratio,视频完播率,指视频播放时长占视频时长的比例;
  • VTR,View-Through Rate,视频有效播放率,指播放视频且视频播放时长超过一定阈值占视频曝光的比例;
  • SHR,Share Rate,视频分享率,指分享视频占视频点击的比例;
  • CMR,Comment Rate,视频评论率,指评论视频占视频点击的比例。

论文指出,VCR和VTR作为两个比较重要的业务指标,分别对视频播放时长和有效播放进行衡量,VCR预估的值是视频播放时长占视频时长的比例,因此属于回归任务,损失函数可以采用MSE损失函数,VTR预估的值是是否播放视频且视频播放时长超过一定阈值,因此属于二分类任务,损失函数可以采用交叉熵损失函数,分类效果可以采用AUC衡量。

论文进一步指出,VCR和VTR的相关性比较复杂,一方面VTR同时由是否播放视频和视频播放时长是否超过一定阈值这两个因素决定,而视频播放时长是否超过一定阈值即VCR大于一定阈值,因此VTR和VCR相关,另一方面VTR和VCR的相关性强弱在不同场景下不同,当用户的网络环境为WIFI时,视频会自动播放,此时VTR和VCR强相关,而当用户的网络环境非WIFI时,视频则不会自动播放,此时VTR和VCR弱相关,VTR还受用户是否播放视频影响。由于VCR和VTR之间复杂的相关性,因此对VCR和VTR的预估进行多任务学习,存在跷跷板问题

论文使用相关工作中介绍的已有的多任务学习方案对VCR和VTR的预估进行多任务学习,最终的效果如图16所示,其中纵坐标为VCR预估的MSE值,从下到上递减,且越小越好,横坐标为VTR预估的AUC值,从左到右递增,且越大越好,中间蓝色圆点表示不使用多任务学习方案、对VCR和VTR预估分别单独建模进行学习的MSE和AUC值,以其为中心在图中划分出四个象限,左下角象限表示VCR和VTR预估均弱于单独建模,即发生负迁移问题,左上角象限表示VCR预估强于单独建模、VTR预估弱于单独建模,右下角象限表示VCR预估弱于单独建模、VTR预估强于单独建模,即发生跷跷板问题,右上角象限表示VCR和VTR预估均强于单独建模。

从图16中可以看出,Hard Sharing和Cross-Stitch均发生了负迁移问题,VCR预估的效果与单独建模持平的同时,VTR预估的效果弱于单独建模,Sluice Network发生了跷跷板问题,VCR预估的效果弱于单独建模,VTR预估的效果强于单独建模,VTR和VCR的相关性强弱在不同场景下不同,而Sluice Network中实现知识共享的矩阵参数无法根据样本动态调整,因此无法表达不同场景下不同的相关性,而MMoE可以通过门控网络控制不同样本下各专家网络输出的权重,从而表达不同场景下不同的相关性,因此在之前已有的方案中,MMoE的效果最好,而论文提出的PLE则通过进一步显式地将专家网络划分为不同类型、逐层抽取任务专有和共享信息,取得更好的效果,有效解决了对VCR和VTR预估进行多任务学习所发生的负迁移和跷跷板问题。

图16 使用已有的多任务学习方案对VCR和VTR的预估进行多任务学习

方案

具体方案上,论文首先提出了CGC网络,其针对MMoE中仅通过门控网络隐式地控制各专家网络在任务专有和共享中比重的问题,显式地将专家网络划分为各任务专有的专家网络和所有任务共享的专家网络,并对于每个任务,使用和MMoE类似的门控网络将该任务专有的专家网络和共享的专家网络的输出表征进行加权求和,进而得到任务塔的输入。论文接着提出了PLE网络,其在CGC的基础上进行扩展,包含多层抽取网络,且每层抽取网络的结构和CGC网络类似,从而实现各任务专有信息和所有任务共享信息的逐层抽取和深层挖掘。下面分别介绍CGC和PLE。

Customized Gate Control(CGC)

图17 CGC的网络结构

CGC的网络结构如图17所示,其上层是每个任务各自专有的网络塔,下层是多个专家网络。CGC将专家网络划分为多组,每个任务专有一组专家网络负责挖掘该任务专有的知识,同时所有任务共享一组专家网络负责挖掘所有任务共享的知识。对于任务kk,其通过该任务专有的门控网络合并该任务专有的专家网络组的输出和所有任务共享的专家网络组的输出。令原始输入为xx,任务kk专有的专家网络组的输出和所有任务共享的专家网络组的输出为Sk(x)S^k(x),则Sk(x)S^k(x)可表示为:

Sk(x)=[E(k,1)T,E(k,2)T,,E(k,mk)T,E(s,1)T,E(s,2)T,,E(s,ms)T]TS^k(x)=[E_{(k,1)}^T,E_{(k,2)}^T,\dots,E_{(k,m_k)}^T,E_{(s,1)}^T,E_{(s,2)}^T,\dots,E_{(s,m_s)}^T]^T

其中,任务kk专有的专家网络组共有mkm_k个专家网络,所有任务共享的专家网络组共有msm_s个专家网络。任务kk专有的门控网络的网络结构如图17中部黑框所示,其对原始输入进行线性映射后、再通过Softmax函数得到mk+msm_k+m_s个权重,该过程可表示为:

wk(x)=Softmax(Wgkx)w^k(x)=\text{Softmax}(W_g^kx)

其中,WgkR(mk+ms)×dW_g^k\in\mathbb{R}^{(m_k+m_s)\times d}。然后基于上述权重对各专家网络的输出进行加权求和,得到任务kk专有网络塔的输入:

gk(x)=wk(x)Sk(x)g^k(x)=w^k(x)S^k(x)

最终由任务kk专有网络塔tkt^k输出预估值:

yk(x)=tk(gk(x))y^k(x)=t^k(g^k(x))

LibMTL中包含CGC的代码实现。关于CGC的代码实现和笔者注释如下所示:

# 继承MMoE
class CGC(MMoE):

    def __init__(self, task_name, encoder_class, decoders, rep_grad, multi_input, device, **kwargs):
        super(CGC, self).__init__(task_name, encoder_class, decoders, rep_grad, multi_input, device, **kwargs)
        
        self.num_experts = {task: self.kwargs['num_experts'][tn+1] for tn, task in enumerate(self.task_name)}
        self.num_experts['share'] = self.kwargs['num_experts'][0]
        # 定义每个任务专有的专家网络,所有任务共享的专家网络已在父类MMoE中定义
        self.experts_specific = nn.ModuleDict({task: nn.ModuleList([encoder_class() for _ in range(self.num_experts[task])]) for task in self.task_name})
        # 定义每个任务专有的门控网络,每个门控网络为线性映射+Softmax函数
        self.gate_specific = nn.ModuleDict({task: nn.Sequential(nn.Linear(self.input_size,
                                                                          self.num_experts['share']+self.num_experts[task]),
                                                                nn.Softmax(dim=-1)) for task in self.task_name})
        
    def forward(self, inputs, task_name=None):
        # 定义前向传播流程
        # 定义输入样本通过共享的专家网络后的输出
        experts_shared_rep = torch.stack([e(inputs) for e in self.experts_shared])
        out = {}
        # 处理每个任务
        for task in self.task_name:
            if task_name is not None and task != task_name:
                continue
            # 定义输入样本通过该任务专有的专家网络后的输出
            experts_specific_rep = torch.stack([e(inputs) for e in self.experts_specific[task]])
            # 对于当前任务,由其门控网络根据输入样本输出各专家网络(该任务专有的专家网络+共享的专家网络)的权重
            selector = self.gate_specific[task](torch.flatten(inputs, start_dim=1))
            # 对于当前任务,对于每个样本,基于门控网络输出的各专家网络(该任务专有的专家网络+共享的专家网络)权重对各专家网络输出进行加权求和,得到每个样本通过整体专家网络后的输出
            gate_rep = torch.einsum('ij..., ji -> j...', 
                                    torch.cat([experts_shared_rep, experts_specific_rep], dim=0), 
                                    selector)
            gate_rep = self._prepare_rep(gate_rep, task, same_rep=False)
            # 对于当前任务,将整体专家网络的输出作为任务专有塔的输入,由任务专有塔输出任务的预估结果
            out[task] = self.decoders[task](gate_rep)
        return out   

Progressive Layered Extraction(PLE)

图18 PLE的网络结构

PLE的网络结构如图18所示,其在CGC的基础上构建NN层抽取网络(Extraction Network),除最后一层抽取网络的结构和CGC相同外,其他各层抽取网络的结构在CGC的基础上稍作改动。

其他各层抽取网络的结构和CGC相同的是,每个任务专有一组专家网络负责挖掘该任务专有的知识,同时所有任务共享一组专家网络负责挖掘所有任务共享的知识。对于第jj层抽取网络中的任务kk,其通过该任务专有的门控网络合并该任务专有的专家网络组的输出和所有任务共享的专家网络组的输出,得到当前层任务kk的输出,并作为下一层任务kk专有的专家网络组的输入,该过程可表示为:

gk,j(x)=wk,j(gk,j1(x))Sk,j(x)g^{k,j}(x)=w^{k,j}(g^{k,j-1}(x))S^{k,j}(x)

其他各层抽取网络的结构和CGC不同的是,每层抽取网络还有一个从该层所有专家网络进一步挖掘共享知识的共享门控网络。对于第jj层抽取网络中的共享门控网络,其合并该层所有专家网络(包括各任务专有的专家网络组和所有任务共享的专家网络组)的输出,得到当前层共享知识的输出,并作为下一层所有任务共享的专家网络组的输入,该过程可表示为:

gs,j(x)=ws,j(gs,j1(x))Ss,j(x)g^{s,j}(x)=w^{s,j}(g^{s,j-1}(x))S^{s,j}(x)

最后一层抽取网络的结构和CGC相同,输出各任务的表征,作为各任务专有塔的输入,最后由各任务专有塔输出预估结果,该过程可表示为:

yk(x)=tk(gk,N(x))y^k(x)=t^k(g^{k,N}(x))

综上,PLE构建多层抽取网络,在CGC网络区分任务专有专家网络和共享专家网络、分别挖掘专有和共享知识的基础上,进一步通过共享门控网络逐层从所有专家网络中抽取共享知识,从而实现各任务专有信息和所有任务共享信息的逐层抽取和深层挖掘

损失函数优化

论文进一步对多任务学习的损失函数进行优化。多任务学习中,常用损失函数为各任务损失函数的加权和,如下所示:

L(θ1,,θK,θs)=k=1KwkLk(θk,θs)L(\theta_1,\dots,\theta_K,\theta_s)=\sum_{k=1}^K{w_kL_k(\theta_k,\theta_s)}

其中,KK为任务数,Lk(θk,θs)L_k(\theta_k,\theta_s)为任务kk的损失函数,θk\theta_k为任务kk的损失函数中只和该任务相关的参数,θs\theta_s为任务kk的损失函数中被所有任务共享的参数,wkw_k为任务kk的损失函数的权重。

图19 视频推荐场景下各任务的样本空间

论文对上述损失函数进行优化以解决的第一个问题是多任务学习中不同任务的样本空间不同。以视频推荐场景下的多任务学习为例,其各任务的样本空间如图19所示,VTR和CTR预估的样本空间是视频曝光,VCR预估的样本空间是视频播放,SHR和CMR预估的样本空间是视频点击,而原损失函数并未考虑各任务样本空间的不同,使用视频空间下的样本作为所有任务的训练数据集,论文在各任务的损失函数中增加一个二值标量δki{0,1}\delta_k^i\in\{0,1\}δki\delta_k^i表示样本ii是否在任务kk的样本空间中,若在,则δki\delta_k^i的值为1,并控制样本ii可用于任务kk的损失函数计算,以解决不同任务样本空间不同的问题,增加δki\delta_k^i后,任务kk的损失函数可表示为:

Lk(θk,θs)=1iδkiiδkilossk(y^ki(θk,θs),yki)L_k(\theta_k,\theta_s)=\frac{1}{\sum_i{\delta_k^i}}\sum_i{\delta_k^iloss_k(\hat{y}_k^i(\theta_k,\theta_s),y_k^i)}

其中,y^ki\hat{y}_k^i是样本ii在任务kk中的预估值,ykiy_k^i是样本ii在任务kk中的真实值。

论文对上述损失函数进行优化以解决的第二个问题是如何选择各任务损失函数的权重以提升多任务学习的效果。论文采用动态权重,即对于每个任务,例如任务kk,设置初始权重wk,0w_{k,0},而在每个epoch,例如第tt个epoch,使用以下公式更新任务kk的权重:

wk(t)=wk,0×γktw_k^{(t)}=w_{k,0}\times\gamma_k^t

效果

基于视频推荐系统

前面已介绍多任务学习在腾讯视频推荐中的应用场景,并已介绍论文所提出的PLE在VCR和VTR预估的多任务学习中相比其他方案取得了最好的效果,有效解决了对VCR和VTR预估进行多任务学习所发生的负迁移和跷跷板问题。图20是各方案在VCR和VTR预估中的MSE和AUC值,图21是使用各多任务学习方案进行VCR和VTR预估、在线上进行AB实验时、相对单独建模在播放数和播放时长上的提升,其中PLE的提升幅度最大。

图20 各方案在VCR和VTR预估中的MSE和AUC值

图21 各多任务学习方案在线上相对单独建模在播放数和播放时长上的提升

基于公开数据集

论文也使用了MMoE中的方案,构造了不同相关性的多任务,评估PLE在不同相关性的多任务中的效果,如图22所示,从中可以看出,PLE相比Hard Parameter Sharing和MMoE,在不同相关性的多任务中均取得更好的效果。

图22 PLE在不同相关性的多任务中的效果

参考文献