多任务学习推荐模型ESMM原理与实现

2022 年 6 月 10 日 机器学习与推荐算法
嘿,记得给“机器学习与推荐算法”添加星标

文章作者:高悦 阿里巴巴

内容来源:阿里灵杰@知乎

导读:本文介绍的是阿里巴巴团队发表在 SIGIR2018 的论文《Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate》。文章基于 Multi-Task Learning (MTL) 的思路,提出一种名为ESMM的CVR预估模型,有效解决了真实场景中CVR预估面临的数据稀疏以及样本选择偏差这两个关键问题。后续还会陆续介绍MMoE,PLE,DBMTL等多任务学习模型。

01

多任务学习背景

目前工业中使用的推荐算法已不只局限在单目标(ctr)任务上,还需要关注后续的转换链路,如是否评论、收藏、加购、购买、观看时长等目标。

本文介绍的是阿里巴巴团队发表在 SIGIR2018 的论文:

Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate

链接:https://arxiv.org/abs/1804.07931

文章基于 Multi-Task Learning (MTL) 的思路,提出一种名为ESMM的CVR预估模型,有效解决了真实场景中CVR预估面临的数据稀疏以及样本选择偏差这两个关键问题。

02

论文介绍
CVR预估面临两个关键问题:
1. Sample Selection Bias (SSB)

转化是在点击之后才“有可能”发生的动作,传统CVR模型通常以点击数据为训练集,其中点击未转化为负例,点击并转化为正例。但是训练好的模型实际使用时,则是对整个空间的样本进行预估,而非只对点击样本进行预估。即训练数据与实际要预测的数据来自不同分布,这个偏差对模型的泛化能力构成了很大挑战,导致模型上线后,线上业务效果往往一般。

2. Data Sparsity (DS)

CVR预估任务的使用的训练数据(即点击样本)远小于CTR预估训练使用的曝光样本。仅使用数量较小的样本进行训练,会导致深度模型拟合困难。

一些策略可以缓解这两个问题,例如从曝光集中对unclicked样本抽样做负例缓解SSB,对转化样本过采样缓解DS等。但无论哪种方法,都没有从实质上解决上面任一个问题。

由于点击=>转化,本身是两个强相关的连续行为,作者希望在模型结构中显示考虑这种“行为链关系”,从而可以在整个空间上进行训练及预测。这涉及到CTR与CVR两个任务,因此使用多任务学习(MTL)是一个自然的选择,论文的关键亮点正在于“如何搭建”这个MTL。

首先需要重点区分下,CVR预估任务与CTCVR预估任务。

  • CVR = 转化数/点击数。是预测“假设item被点击,那么它被转化”的概率。CVR预估任务,与CTR没有绝对的关系。一个item的ctr高,cvr不一定同样会高,如标题党文章的浏览时长往往较低。这也是不能直接使用全部样本训练CVR模型的原因,因为无法确定那些曝光未点击的样本,假设他们被点击了,是否会被转化。如果直接使用0作为它们的label,会很大程度上误导CVR模型的学习。

  • CTCVR = 转换数/曝光数。是预测“item被点击,然后被转化”的概率。

其中x,y,z分别表示曝光,点击,转换。注意到,在全部样本空间中,CTR对应的label为click,而CTCVR对应的label为click & conversion,这两个任务是可以使用全部样本的。因此,ESMM通过学习CTR,CTCVR两个任务,再根据上式隐式地学习CVR任务。具体结构如下:

网络结构上有两点值得强调:

  • 共享EmbeddingCVR-task和CTR-task使用相同的特征和特征embedding,即两者从Concatenate之后才学习各自独享的参数;

  • 隐式学习pCVR这里pCVR 仅是网络中的一个variable,没有显示的监督信号。

具体地,反映在目标函数中:

03

代码实现

基于EasyRec推荐算法框架,我们实现了ESMM算法,具体实现可移步至github:EasyRec-ESMM。

EasyRec 链接:

https://github.com/Alibaba/EasyRec

EasyRec-ESMM链接:

https://github.com/alibaba/EasyRec/blob/master/easy_rec/python/model/esmm.py

EasyRec介绍:EasyRec是阿里云计算平台机器学习PAI团队开源的大规模分布式推荐算法框架,EasyRec 正如其名字一样,简单易用,集成了诸多优秀前沿的推荐系统论文思想,并且有在实际工业落地中取得优良效果的特征工程方法,集成训练、评估、部署,与阿里云产品无缝衔接,可以借助 EasyRec 在短时间内搭建起一套前沿的推荐系统。作为阿里云的拳头产品,现已稳定服务于数百个企业客户。

04

模型前馈网络
def build_predict_graph(self):    """Forward function.
Returns: self._prediction_dict: Prediction result of two tasks. """ # 此处从Concatenate后的tensor(all_fea)开始,省略其生成逻辑
cvr_tower_name = self._cvr_tower_cfg.tower_name dnn_model = dnn.DNN( self._cvr_tower_cfg.dnn, self._l2_reg, name=cvr_tower_name, is_training=self._is_training) cvr_tower_output = dnn_model(all_fea) cvr_tower_output = tf.layers.dense( inputs=cvr_tower_output, units=1, kernel_regularizer=self._l2_reg, name='%s/dnn_output' % cvr_tower_name)
ctr_tower_name = self._ctr_tower_cfg.tower_name dnn_model = dnn.DNN( self._ctr_tower_cfg.dnn, self._l2_reg, name=ctr_tower_name, is_training=self._is_training) ctr_tower_output = dnn_model(all_fea) ctr_tower_output = tf.layers.dense( inputs=ctr_tower_output, units=1, kernel_regularizer=self._l2_reg, name='%s/dnn_output' % ctr_tower_name)
tower_outputs = { cvr_tower_name: cvr_tower_output, ctr_tower_name: ctr_tower_output } self._add_to_prediction_dict(tower_outputs) return self._prediction_dict

1. loss计算

注意:计算CVR的指标时需要mask掉曝光数据。

def build_loss_graph(self):    """Build loss graph.
Returns: self._loss_dict: Weighted loss of ctr and cvr. """ cvr_tower_name = self._cvr_tower_cfg.tower_name ctr_tower_name = self._ctr_tower_cfg.tower_name cvr_label_name = self._label_name_dict[cvr_tower_name] ctr_label_name = self._label_name_dict[ctr_tower_name]
ctcvr_label = tf.cast( self._labels[cvr_label_name] * self._labels[ctr_label_name], tf.float32) cvr_loss = tf.keras.backend.binary_crossentropy( ctcvr_label, self._prediction_dict['probs_ctcvr']) cvr_loss = tf.reduce_sum(cvr_losses, name="ctcvr_loss")
# The weight defaults to 1. self._loss_dict['weighted_cross_entropy_loss_%s' % cvr_tower_name] = self._cvr_tower_cfg.weight * cvr_loss
ctr_loss = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits( labels=tf.cast(self._labels[ctr_label_name], tf.float32), logits=self._prediction_dict['logits_%s' % ctr_tower_name] ), name="ctr_loss")
self._loss_dict['weighted_cross_entropy_loss_%s' % ctr_tower_name] = self._ctr_tower_cfg.weight * ctr_loss return self._loss_dict

note: 这里loss是 weighted_cross_entropy_loss_ctr + weighted_cross_entropy_loss_cvr, EasyRec框架会自动对self._loss_dict中的内容进行加和。

2. metric计算

注意:计算CVR的指标时需要mask掉曝光数据。

def build_metric_graph(self, eval_config):    """Build metric graph.
Args: eval_config: Evaluation configuration.
Returns: metric_dict: Calculate AUC of ctr, cvr and ctrvr. """ metric_dict = {}
cvr_tower_name = self._cvr_tower_cfg.tower_name ctr_tower_name = self._ctr_tower_cfg.tower_name cvr_label_name = self._label_name_dict[cvr_tower_name] ctr_label_name = self._label_name_dict[ctr_tower_name] for metric in self._cvr_tower_cfg.metrics_set: # CTCVR metric ctcvr_label_name = cvr_label_name + '_ctcvr' cvr_dtype = self._labels[cvr_label_name].dtype self._labels[ctcvr_label_name] = self._labels[cvr_label_name] * tf.cast( self._labels[ctr_label_name], cvr_dtype) metric_dict.update( self._build_metric_impl( metric, loss_type=self._cvr_tower_cfg.loss_type, label_name=ctcvr_label_name, num_class=self._cvr_tower_cfg.num_class, suffix='_ctcvr'))
# CVR metric cvr_label_masked_name = cvr_label_name + '_masked' ctr_mask = self._labels[ctr_label_name] > 0 self._labels[cvr_label_masked_name] = tf.boolean_mask( self._labels[cvr_label_name], ctr_mask) pred_prefix = 'probs' if self._cvr_tower_cfg.loss_type == LossType.CLASSIFICATION else 'y' pred_name = '%s_%s' % (pred_prefix, cvr_tower_name) self._prediction_dict[pred_name + '_masked'] = tf.boolean_mask( self._prediction_dict[pred_name], ctr_mask) metric_dict.update( self._build_metric_impl( metric, loss_type=self._cvr_tower_cfg.loss_type, label_name=cvr_label_masked_name, num_class=self._cvr_tower_cfg.num_class, suffix='_%s_masked' % cvr_tower_name))
for metric in self._ctr_tower_cfg.metrics_set: # CTR metric metric_dict.update( self._build_metric_impl( metric, loss_type=self._ctr_tower_cfg.loss_type, label_name=ctr_label_name, num_class=self._ctr_tower_cfg.num_class, suffix='_%s' % ctr_tower_name)) return metric_dict

05

经验及不足

我们基于开源AliCCP数据进行了大量实验,实验部分请期待下一篇文章。实验发现,ESMM的跷跷板现象较为明显,CTR与CVR任务的效果较难同时提升。

链接:

https://tianchi.aliyun.com/dataset/dataDetail?dataId=408&userId=1

06

参考文献

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

https://arxiv.org/abs/1804.07931

2. 阿里CVR预估模型之ESMM

https://easyrec.readthedocs.io/en/latest/models/esmm.html

3. EasyRec-ESMM使用介绍多任务学习模型之ESMM介绍与实现

https://easyrec.readthedocs.io/en/latest/models/esmm.html

更多细节可以阅读原始论文。


欢迎干货投稿 \ 论文宣传 \ 合作交流

推荐阅读

SimpleX: 一个简单且有效的协同过滤框架
WWW2022 | Recommendation Unlearning
论文周报 | 推荐系统领域最新研究进展
入"坑"推荐系统,从Google这篇课程开始

由于公众号试行乱序推送,您可能不再准时收到机器学习与推荐算法的推送。为了第一时间收到本号的干货内容, 请将本号设为星标,以及常点文末右下角的“在看”。

喜欢的话点个在看吧👇
登录查看更多
0

相关内容

无量深度学习系统在腾讯推荐类业务的应用
专知会员服务
20+阅读 · 2022年7月9日
12篇顶会论文,深度学习时间序列预测经典方案汇总!
专知会员服务
51+阅读 · 2022年4月11日
WSDM 2022 | 基于图神经网络的协同过滤设计空间研究
专知会员服务
36+阅读 · 2022年1月3日
【微信@CIKM2021 】 强化学习推荐模型的知识蒸馏探索之路
【KDD2021】双重图强化神经推荐模型
专知会员服务
12+阅读 · 2021年11月10日
【KDD2020】 解决基于图神经网络的会话推荐中的信息损失
专知会员服务
31+阅读 · 2020年10月29日
专知会员服务
85+阅读 · 2020年1月20日
推荐系统用户反馈延迟新解法!阿里提出CVR无偏估计算法
夕小瑶的卖萌屋
0+阅读 · 2022年7月5日
一文梳理推荐系统中的多任务学习
机器学习与推荐算法
8+阅读 · 2022年6月15日
SIGIR2022 | ESCM^2: 升级版全空间多任务转化率预估
机器学习与推荐算法
0+阅读 · 2022年6月10日
[SIGIR'21] DMTL:召回场景基于蒸馏的多目标学习方案
基于双塔结构的推荐模型总结
机器学习与推荐算法
6+阅读 · 2021年11月22日
多任务多目标CTR预估技术
阿里技术
1+阅读 · 2021年10月11日
KDD21 | 一种使用真负样本的在线延迟反馈建模
图与推荐
0+阅读 · 2021年9月27日
最全推荐系统Embedding召回算法总结
凡人机器学习
30+阅读 · 2020年7月5日
推荐召回算法之深度召回模型串讲
AINLP
22+阅读 · 2019年6月14日
国家自然科学基金
1+阅读 · 2015年12月31日
国家自然科学基金
5+阅读 · 2013年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
2+阅读 · 2012年12月31日
国家自然科学基金
3+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
Arxiv
0+阅读 · 2022年7月28日
已删除
Arxiv
31+阅读 · 2020年3月23日
Arxiv
34+阅读 · 2020年1月2日
Domain Representation for Knowledge Graph Embedding
Arxiv
14+阅读 · 2019年9月11日
VIP会员
相关VIP内容
无量深度学习系统在腾讯推荐类业务的应用
专知会员服务
20+阅读 · 2022年7月9日
12篇顶会论文,深度学习时间序列预测经典方案汇总!
专知会员服务
51+阅读 · 2022年4月11日
WSDM 2022 | 基于图神经网络的协同过滤设计空间研究
专知会员服务
36+阅读 · 2022年1月3日
【微信@CIKM2021 】 强化学习推荐模型的知识蒸馏探索之路
【KDD2021】双重图强化神经推荐模型
专知会员服务
12+阅读 · 2021年11月10日
【KDD2020】 解决基于图神经网络的会话推荐中的信息损失
专知会员服务
31+阅读 · 2020年10月29日
专知会员服务
85+阅读 · 2020年1月20日
相关资讯
推荐系统用户反馈延迟新解法!阿里提出CVR无偏估计算法
夕小瑶的卖萌屋
0+阅读 · 2022年7月5日
一文梳理推荐系统中的多任务学习
机器学习与推荐算法
8+阅读 · 2022年6月15日
SIGIR2022 | ESCM^2: 升级版全空间多任务转化率预估
机器学习与推荐算法
0+阅读 · 2022年6月10日
[SIGIR'21] DMTL:召回场景基于蒸馏的多目标学习方案
基于双塔结构的推荐模型总结
机器学习与推荐算法
6+阅读 · 2021年11月22日
多任务多目标CTR预估技术
阿里技术
1+阅读 · 2021年10月11日
KDD21 | 一种使用真负样本的在线延迟反馈建模
图与推荐
0+阅读 · 2021年9月27日
最全推荐系统Embedding召回算法总结
凡人机器学习
30+阅读 · 2020年7月5日
推荐召回算法之深度召回模型串讲
AINLP
22+阅读 · 2019年6月14日
相关基金
国家自然科学基金
1+阅读 · 2015年12月31日
国家自然科学基金
5+阅读 · 2013年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
2+阅读 · 2012年12月31日
国家自然科学基金
3+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
相关论文
Top
微信扫码咨询专知VIP会员