为什么要用多任务学习,有什么好处?为什么多任务学习是有效的?
通常业务本身包含很多目标,难以采用单一目标建模(比如通常没有显式的用户满意度评价指标)。
在CV、NLP中采用多任务损失函数是比较常见的事情,在推荐领域也可以采用多任务学习,并且能够切合实际的应用场景。例如,电商场景的优化目标不仅仅包括CTR,还需要考虑收藏、加购物车、购买等指标,并且这些任务之间是有关联的。采用一个模型来进行多任务学习,不仅节省数据处理、训练、部署的成本,还能提升学习效率和预测准确性。
Multi-objective recommendation (MOR) 的目标还可能有:多样性、用户活跃度、转化率、长尾结果、公平性、时效性、相关性(diversity, user activeness, conversion, long-tail result, fairness, recency, relevancy)。
多任务学习的优势在于通过部分参数共享,联合训练,实现多目标共同提升。简单来说是引入了归纳偏置(inductive bias),有两个效果:
优势总结
理论上:
工程上:
需要注意的点:
ctr*cvr
的交互,损失反向传播互相独立,导致不一致。ESMM 对于点击率的更新,只训练pctr这个塔;对于ctcvr的更新,由于转化的前提是点击,所以反向传播时会同时更新ctr的塔和cvr的塔。如何缓解跷跷板现象(seesaw phenomenon)?
根源在于模型没有充分捕捉到任务间的差异性。
MOE & MMOE :Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts(Google,KDD2018)
MOE采用门控机制对若干个专家模型进行reweight (softmax),出自谷歌论文 Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer.arXiv:1701.06538,2017
。
MOE提出稀疏门控混合专家层,该网络由n个专家(Expert)和一个决定激活哪位专家工作的门网络组成。每位专家网络均由一个简单的前馈神经网络构成,架构相同、参数彼独立;门网络由一个全连接层和一个softmax层组成。
在相同参数规模下要比share-bottom有明显的提升,对于相关性低的任务联合训练MMoE效果更加明显。
MMOE通过门控网络自主选择任务特有与共享的专家,让各个任务联合地更好一些,能缓解跷跷板问题(相比于ESMM模型),但相比PLE的显示划分独有与共享专家的方式可能更难学习一些。
MMOE主要思想:
门控网络采用普通的MLP,得到专家个输出作为每个专家的权重,把每个专家的输出加权组合得到每个子目标的tower输入。
同样出自谷歌的Inception网络结构采用加宽的方式,而MOE混合专家也是罗列加宽模型,有点相似之处,但MOE的特别之处是加入了门控(注意力机制)来控制宽模型的各个子专家的权重。
后续提出的类似MMOE的方法有:
Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations(腾讯,RecSys2020)
MMOE中引入的专家子网络是在多任务间完全共享的,CGC(Customized Gate Control)模型中每个任务同时有共享的专家和独有的专家,作者认为这样可以拟合任务间复杂的相关性。
在CGC的基础上,PLE(Progressive Layered Extraction)考虑了不同任务的Expert之间的交互,在CGC的专家网络层之前插入多层汇聚层,汇聚所有专家的信息作为上层的共享专家层,和MMOE的完全共享层在细节上差别,只是形式上类似多层的ML-MMOE。只要底层的Extraction网络中完全共享,上层的专家网络和CGC一样分独有与共享。PLE旨在更好地解决跷跷板效应。
CGC与MMOE最大的不同就是将expert部分进行了重构,将其显式的区分成共享部分和任务独享部分,而如果MMOE的门控参数学习的比较好,二者是能达到同样效果的,所以CGC的结构设计更像是一个trick,手动的将独享expert的门控权重置为1或0。
PLE模型,包含Extraction Network和CGC模块,多层的Extraction Network层次化地抽取任务间的共享和差异表示,CGC模块将任务间共享和差异的表示进行融合,用于后续预测输出。
其中的gate网络单元通过softmax取得权重,加权输出。每个任务的输入是该任务的专家集合和共享的专家集合,共享部分的输入是所有的专家集合。
训练方式:多任务损失加权,采用多任务数据的并集进行训练,数据落在哪个任务空间内就计算哪个loss,其它loss置0。在loss权重设计上采用了一种技巧,设置初始权重,然后随着迭代轮数修改权重,让某些任务在后期逐渐增加比重:
QA:专家的参数如何设置? PLE模型存在的超参数较多,其中专家和门控网络都有两种类型。一般来说,task-specific expert每个任务1-2个,shared expert个数在任务个数的1倍以上。原论文中的gate网络采用的单层FC。
参考:
ESMM:Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate(阿里,SIGIR2018)
ESMM是为了解决CVR预估面临的数据稀疏(DS)以及样本选择偏差(SSB)的问题。
ESMM 考虑目标间的显式关系,曝光(impression)–>点击(click)–>转换(conversion),通过用户行为序列模式对CVR建模。
模型结构上,ESMM只共享了底部的embedding层。
ESMM 以CVR为主任务,引入CTR和CTCVR作为辅助任务。将 pCVR 作为一个中间变量,并将其乘以 pCTR 得到 pCTCVR,而不是直接基于有偏的点击样本子集进行 CVR 模型训练。pCTCVR 和 pCTR 是在全空间中以所有展现样本估计的,因此衍生的 pCVR 也适用于全空间并且缓解了样本选择偏差问题。
由于embedding层共享,使得CVR子任务也能够从只有展现没有点击的样本中学习,从而能够缓解训练数据稀疏性问题。注意这里embedding层参数的更新仅通过CTR Tower进行更新。
pCVR是隐式学习出来的,并没有显式的监督信号,具体体现在损失函数上。这里有个问题是是否可以直接用 \(p_{CVR} = \frac{p_{CTCVR}}{p_{CTR}}\) 除法来计算CVR的预估值而不是用CVR tower的输出,理论上是没问题的,但由于pCTR 通常很小,作为被除数容易引起数值不稳定问题。
pCVR是主要的学习任务,用于最终的item排序。当然线上可根据实际需求对cvr、ctr、ctcvr进行融合。
损失函数:CTR 和 CTCVR 联合任务损失相加
在训练时如果要查看CVR指标,需要注意mask掉曝光未点击的数据。
缺点:实验发现,ESMM的跷跷板现象较为明显,CTR与CVR任务的效果较难同时提升。
参考:
MMOE、PLE 等多目标模型在损失函数上均做了条件独立性假设(但仅仅是损失函数的设计上是条件独立性假设,因为有share-bottom,所以还是有联动的),Deep Bayesian Multi-Target Learning for Recommender Systems (阿里淘宝,2019),属于ESMM从双目标向多目标的推广。
DBMTL构建了预测目标之间的贝叶斯网络,显式建模了目标间可能存在的因果关系。因为在实际业务中,用户的很多行为往往存在明显的序列先后依赖关系,例如在信息流场景,用户要先点进图文详情页,才会进行后续的 浏览/评论/转发/收藏 等操作;视频、直播推荐场景是浏览=>点击=>观看时长。
概率模型结构如下:
DBMTL示意图:
贝叶斯公式的应用如下:
修改成按权相加:
target状态转移(f1, f2, f3)通过全连接层/MLP来实现,每个目标级联其依赖的目标的输出作为输入。
与其它多目标模型对比:
参考:多任务学习模型之DBMTL介绍与实现
首先说下最简单的融合为单目标的思路,权重作为超参数固定不变的“硬融合”的目标融合方式有:
超参选取,一般使用启发式的搜参算法,比如:遗传算法、PSO算法等。
这里的“硬融合”方式可以用于损失函数,也可用于ctr、cvr等目标值,用于最终的排序,比如:
动态调权的多任务loss融合机制:解决loss数值有大有小、学习速度有快有慢、更新方向时而相反的问题。主要从底层优化器的角度来解决多目标融合时存在的跷跷板问题。
最经典的两个工作,也是简单实用的方法:GrandNorm和UWL。
参考论文:
Gradient Surgery for Multi-Task Learning (NeurIPS 2020) 提出了一种不采用多任务损失直接加权融合方式的训练技巧,其另辟蹊径,从约束各任务梯度的方向使其互相靠拢的角度来做优化。
代码链接:PCGrad
PCGrad(projecting conflicting gradients)是一种针对多目标优化的通用的梯度优化技巧,它将一个任务的梯度投影到任何其他具有梯度方向冲突的任务的梯度的法向量上,在多种多任务学习和多任务强化学习领域中实现了效率和性能的显著提高。其判断梯度方向冲突的方式也比较简单,判断cosine是否小于0,对于大于0的梯度不做修改。
跟帕累托比较,相当于提前解决了冲突,而不是非得的等到最后任务前向传播算一个结果值发现不在执行域的时候再重新算,提前在梯度传播的时候就保证了步调一致,这样总的多任务收敛会更快。
这种优化技巧与网络结构无关,可以适配前边提到的典型多目标结构,只需要给每个任务单独设计损失函数,不需要设计加权融合公式。
核心算法:
其中的投射公式也比较简单:\(\cos \theta = {g_i\cdot g_j \over \|g_i\|\|g_j\|}, g_i=g_i + \|g_i\|\cos\theta\cdot {g_j \over \|g_j\|} = g_i - {g_ig_j \over \|g_j\|^2} g_j\).
在两个梯度向量冲突(呈钝角)时,涉及将i投射到j还是将j投射到i的问题,并且在任务数量比较多时还需要两两任务之间进行比较,因此涉及到顺序的问题。PCGrad采用了随机抽样的方式,将i投射到j之后,后边还可能会将j投射到修改后的i。
参考:多目标优化(四)跷跷板问题的底层神器优化器
GrandNorm的核心思想是希望每个任务loss的量级或者参数的梯度量级要尽量接近, 希望不同的任务以相似的速度学习。
多任务损失加权公式如下,在每一个时间步t动态调整:
定义如下变量:
为了实现动态的调整任务权重 \(w_i\),定义了一个损失函数,称为 gradient loss:
这个损失利用了原网络的损失函数的梯度,专用于调整任务损失的比重,相当于独立出来的一个分叉,在每一个时间步分别更新网络参数和任务loss权重。其中 \(\alpha\) 是超参数(比如取0.5),\(\bar{G}_{W}(t) \times\left[r_{i}(t)\right]^{\alpha}\) 是目标常数。可以不必每个batch都更新loss权重,比如一个epoch更新一次或者若干个batch更新一次,避免因为batch差异较大引起的NaN问题。当然NaN问题有时难以避免,可以通过数值检查是否是nan来重置权重为1.
此外,在更新参数后还需要renormalize归一化一下,使得任务权重之和等于任务数量: \(\sum_i w_i(t+1)=T\), 权重均初始化为1,所以初始的权重之和也是T。如果不进行归一化,权重绝对值不受限制,可能导致训练困难。这也是一种控制变量法,如果不受限制,损失变得很小时说不清是因为权重变小还是真正的各任务损失在变小。
思路跟梯度标准化类似:
其中,\(r_i(t-1) = \frac{L_i(t-1)}{L_i(t-2)}\)
可以看出训练速度越快,loss权重越小。
动态任务优先级:任务越难学,权重越大。
其中\(k_i(t)\)表示任务的学习难度,比如可以用准确率等来衡量。
背景知识
帕累托最优是经济学的概念,参考帕累托最优---维基百科:
帕累托最优是指资源分配的一种理想状态。给定固有的一群人和可分配的资源,如果从一种分配状态到另一种状态的变化中,在没有使任何人情况变坏的前提下,使得至少一个人变得更好,这就是帕累托改善。帕累托最适的状态就是不可能再有更多的帕雷托改善的状态。
功利主义:理想的状态是使人们的福利的总和最大化的状态,而财富转移被视作是一种改善。
帕累托最优(Pareto efficiency或Pareto Optimality)代表了一种多目标优化任务中的理想状态。在帕累托最优下,多目标中的任何一个目标都不可能在不损害其他目标的前提下进行优化。而多目标优化和求最优解在诸多领域都有应用,这里只为了应用到推荐系统中。
几种重要术语
参考:
帕累托优化就是以帕累托最优为目标的训练过程,包括两种方法:
但是,目前绝大多数推荐中的帕累托多目标优化算法使用的是一套所有用户共用的objective weights,忽略了用户对于不同目标的不同偏好度。比如用户A更加关注视频的时长指标,而用户B更加关注碎片化阅读的点击指标,因此在帕累托优化中考虑用户的目标级别的个性化需求,有利于提供更加优质的个性化推荐结果。
强化学习Reinforcement learning (RL)在推荐系统中的应用:通常用于建模ctr之外的非直接或者长期的回报,比如user
activeness, long-term accuracy, diversity, negative feedbacks, page-wise rewards 。在强化学习中使用帕累托最优的概念很常见。
论文《Personalized Approximate Pareto-Efficient Recommendation》(WWW'21,微信看一看),基于帕累托最优的多目标推荐 提出了一种基于帕累托最优的个性化多目标融合方法。
论文基于已有的方法,针对“不同用户应该有不同的目标权重”这一点做了设计,提出了用于多目标推荐系统的 Personalized Approximate Pareto-Efficient Recommendation (PAPERec) 框架。用户的目标权重利用了强化学习来进行调整,直接使用了MGDA中提出的最小化问题——多目标梯度导数加权和的二范数,作为Pareto-oriented RL的reward,用以迭代更新生成objective weights的相关参数。
针对用户个性化的多目标scalarization加权损失设计为:
其中K是任务数,每个目标权重由 Pareto-oriented reinforcement learning 模块生成。PAPERec包括了两个单目标模型(single-objective model),分别优化CTR和DT。整体的训练范式如下:
在每个batch下,
(1)single-objective models模块计算各个单目标的loss;
(2)基于当前各个单目标的loss,计算Pareto-oriented RL的loss,并以此更新Pareto-oriented RL;
(3)基于更新后的Pareto-oriented RL,计算新的objective weights;
(4)基于新的objective weights更新所有single-objective models。PAPERec通过这种迭代式地更新,使得模型近似逼近帕累托最优。
这篇论文需要结合 A Pareto-Eficient Algorithm for Multiple Objective Optimization in E-Commerce Recommendation (Alibaba,RecSys 2019)来看,其中提出的PE-LTR方法,对于多目标scalarization加权损失中权重的调整采用了近似的二次规划问题求解方式。
具体地,也是用MGDA中提出的最小化问题——多目标梯度导数加权和的二范数:
其中 \(c_i\) 表示目标i权重的下界,在二次规划问题中一般需要会重写为:
其中,\(\hat{\omega}_i=\omega_i-c_i\),这使得不等式约束一侧变为0: \(\hat{\omega}_i \geq 0\).
然而,这个问题的二次规划形式(quadratic programming form)并不容易求解,论文将其转成一个relaxed problem求近似解。第一步只考虑等式约束,去除不等式约束进行QP求解,得到\(\hat{\omega}^*\);第二步再利用不等式约束,采用如下的QP形式求解\(\tilde{\omega}\), 这是一个典型的非负最小二乘问题,使用active set method比较容易求解。
有了任务权重更新的求解方法,PE-LTR的训练方式就比较简单了:
参考:
对于网络结构的不同部分可以用不同的优化器分别进行优化,以设置不同的学习率、优化方法。例如Wide&Deep中对于wide部分采用FTRL,对于Deep部分使用AdaGrad。
比如对于ESMM模型,可以采用两个FTRL优化器,分别优化ctr/cvr的参数(MLP),AdaDeltaW优化器优化share参数(embedding和attention参数)。
Désidéri J A. Multiple-gradient descent algorithm (MGDA) for multiobjective optimization[J]. Comptes Rendus Mathematique, 2012, 350(5-6): 313-318. ↩︎