Multi-task多任务模型在推荐算法中应用总结1

导读:我们在优化推荐效果的时候,很多时候不仅仅需要关注CTR指标,同时还需要优化例如CVR(转化率)、视频播放时长、用户停留时长、用户翻页深度、关注率、点赞率这些指标。那么一种做法是对每个任务单独使用一个模型来优化,但是这样做的缺点显而易见,需要花费很多人力。其实很多任务之间都是存在关联性的,比如CTR和CVR。那么能不能使用一个模型来同时优化两个或多个任务呢?其实这就是Multi-task多任务的定义。本文主要总结了近两年工业界关于Multi-task模型在推荐场景的一些应用和工作。

  1. 阿里ESMM:Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate

CVR是指从点击到购买的转化,传统的CVR预估会存在两个问题:样本选择偏差和稀疏数据

样本选择偏差是指模型用的是用户点击的样本来训练,但是预测却用的是整个样本空间。数据稀疏问题是指用户点击到购买的样本太少。因此阿里提出了ESMM模型来解决上述两个问题:主要借鉴多任务学习的思路,引入两个辅助学习任务,分别用来拟合pCTR和pCTCVR。

ESMM模型由两个子网络组成,左边的子网络用来拟合pCVR,右边的子网络用来拟合pCTR,同时,两个子网络的输出相乘之后可以得到pCTCVR。因此,该网络结构共有三个子任务,分别用于输出pCTR、pCVR和pCTCVR。假设用x表示feature(即impression),y表示点击,z表示转化,那么根据pCTCVR = pCTR * pCVR,可以得到:

则pCVR的计算为:

由上面的式子可知,pCVR可由pCTR和pCTCVR推导出来,那这样我们只需关注pCTR和pCTCVR这两个任务即可,并且pCTR和pCTCVR都可从整个样本空间进行训练。这句话怎么理解?因为对于pCTR可将有点击行为的曝光事件作为正样本,没有点击行为的曝光事件作为负样本,对于pCTCVR来说,可将同时有点击行为和购买行为的曝光事件作为正样本,其他作为负样本。模型的loss函数:

另外这两个子网络的embedding层是共享的,由于CTR任务的训练样本量要远超过CVR任务的训练样本量,ESMM模型中embedding层共享的机制能够使得CVR子任务也能够从只有曝光没有点击的样本中学习,从而也能够缓解训练数据稀疏性问题。

2. 阿里DUPN:Perceive Your Users in Depth: Learning Universal User Representations from Multiple E-commerce Tasks

多任务学习的优势:可共享一部分网络结构,比如多个任务共享embedding参数。学习到的用户、商品embedding向量可迁移到其它任务中。本文提出了一种多任务模型DUPN:

模型分为行为序列层、Embedding层、LSTM层、Attention层、下游多任务层。

  • 行为序列层:输入用户的行为序列x = {x1,x2,...,xN},其中每个行为都有两部分组成,分别是item和property项。item包括商品id和一些side-information比如店铺id、brand等。其实很多场景都用了side-information,我理解主要原因有两点:1. side-information的embedding量级要比商品id小很多,这样用side-information来近似替代item_id,训练起来更容易;2. 可一定程度上解决商品的冷启动问题,因为虽然很多时候拿不到item id,但是还是能获得一些属性信息的。property项表示此次行为的属性,比如场景(搜索、推荐等场景)时间、类型(点击、购买、加购等)。
  • Embedding层,主要多item和property的特征做处理。
  • LSTM层:得到每一个行为的Embedding表示之后,首先通过一个LSTM层,把序列信息考虑进来。
  • Attention层:区分不同用户行为的重要程度,经过attention层得到128维向量,拼接上128维的用户向量,最终得到一个256维向量作为用户的表达。
  • 下游多任务层:CTR、L2R(Learning to Rank)、用户达人偏好FIFP、用户购买力度量PPP等。

另外,文中也提到了两点多任务模型的使用技巧:

  • 天级更新模型:随着时间和用户兴趣的变化,ID特征的Embedding需要不断更新,但每次都全量训练模型的话,需要耗费很长的时间。通常的做法是每天使用前一天的数据做增量学习,这样一方面能使训练时间大幅下降;另一方面可以让模型更贴近近期数据。
  • 模型拆分:由于CTR任务是point-wise的,如果有1w个物品的话,需要计算1w次结果,如果每次都调用整个模型的话,其耗费是十分巨大的。其实User Reprentation只需要计算一次就好。因此我们会将模型进行一个拆解,使得红色部分只计算一次,而蓝色部分可以反复调用红色部分的结果进行多次计算。

3. 美团“猜你喜欢”深度学习排序模型

根据业务目标,将点击率和下单率拆分出来,形成两个独立的训练目标,分别建立各自的Loss Function,作为对模型训练的监督和指导。DNN网络的前几层作为共享层,点击任务和下单任务共享其表达,并在BP阶段根据两个任务算出的梯度共同进行参数更新。网络在最后一个全连接层进行拆分,单独学习对应Loss的参数,从而更好地专注于拟合各自Label的分布。

这里有两个技巧可借鉴下:

  • Missing Value Layer:缺失的特征可根据对应特征的分布去自适应的学习出一个合理的取值。
  • KL-divergence Bound:通过物理意义将有关系的Label关联起来,比如p(点击) * p(转化) = p(下单)。加入一个KL散度的Bound,使得预测出来的p(点击) * p(转化)更接近于p(下单)。但由于KL散度是非对称的,即KL(p||q) != KL(q||p),因此真正使用的时候,优化的是KL(p||q) + KL(q||p)。

4. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts

  • 模型(a)最为常见,两个任务直接共享模型的bottom部分,只在最后处理时做区分,图(a)中使用了Tower A和Tower B,然后分别接损失函数。
  • 模型(b)是常见的多任务学习模型。将input分别输入给三个Expert,但三个Expert并不共享参数。同时将input输出给Gate,Gate输出每个Expert被选择的概率,然后将三个Expert的输出加权求和,输出给Tower,有点attention的感觉。
  • 模型(c)是作者新提出的方法,对于不同的任务,模型的权重选择是不同的,所以作者为每个任务都配备一个Gate模型。对于不同的任务,特定的Gate k的输出表示不同的Expert被选择的概率,将多个Expert加权求和,得到f^{k}(x),并输出给特定的Tower模型,用于最终的输出。

其中g(x)表示gate门的输出,为多层感知机模型,简单的线性变换加softmax层。

参考文献:

编辑于 2019-12-30

文章被以下专栏收录