【推荐系统】多任务学习之ESMM模型(更新ing)
学习总结
- ESMM首创了利用用户行为序列数据在完整样本空间建模,并提出利用学习CTR和CTCVR的辅助任务,迂回学习CVR,避免了传统CVR模型经常遭遇的样本选择偏差和训练数据稀疏的问题,取得了显著的效果。
- 下一篇MMOE还在补中。
文章目录
一、多任务模型
多任务学习模型默认是multi-label 多标签 / 目标学习模型。
1.1 背景与动机
在推荐系统的精排模块,多任务学习的模型结构已成业界的主流。多任务学习(multi-task learning),本质上是希望使用一个模型完成多个任务的建模。在推荐系统中,多任务学习一般即指多目标学习(multi-label learning,如上图所示),不同目标输入相同的feature进行联合训练,是迁移学习的一种。他们之间的关系如图:
下面我们先讨论三个问题
(1)使用多任务学习的原因
(1)很多业界推荐的业务,就是一个多目标的建模场景,需要多目标共同优化。以vx视频号推荐为例,打开一个视频,(如下图)首页上:
- 由于视频自动播放带来的“播放时长”、“完播率”(用户播放时长占视频长度的比例)目标
- 大量的互动标签,例如“点击好友头像”、“进入主页”、“关注”、“收藏”、“分享”、“点赞”、“评论”等。
如果要用一个词来概括所有各式各样的推荐系统的终极目标,那就是“用户满意度”,但我们无法找到一个显示的指标量化用户满意度。业界一般使用“DAU”、“用户日均使用时长”、“留存率”来作为客观的间接的“用户满意度”(或者说算法工程师绩效)评价指标。
而这些指标都是难以通过单一目标建模的,以使用时长为例,长视频播放长度天然大于短视频。所幸的是,虽然没有显式的用户满意度评价指标,但是现在的app都存在类似上述视频号推荐场景的丰富具体的隐式反馈。但这些独立的隐式反馈也存在一些挑战:
- 目标偏差:点赞、分享表达的满意度可能比播放要高
- 物品偏差:不同视频的播放时长体现的满意度不一样,有的视频可能哄骗用户看到尾部(类似新闻推荐中的标题党)
- 用户偏差:有的用户表达满意喜欢用点赞,有的用户可能喜欢用收藏
因此我们需要使用多任务学习模型针对多个目标进行预测,并在线上融合多目标的预测结果进行排序。多任务学习也不能直接表达用户满意度,但是可以最大限度利用能得到的用户反馈信息进行充分的表征学习,并且可建模业务之间的关系,从而高效协同学习具体任务。
(2)工程便利,不用针对不同的任务训练不同的模型。一般推荐系统中排序模块延时需求在40ms左右,如果分别对每个任务单独训练一个模型,难以满足需求。出于控制成本的目的,需要将部分模型进行合并。合并之后,能更高效的利用训练资源和进行模型的迭代升级。
(2)为什么多任务学习有效?
当把业务独立建模变成多任务联合建模之后,有可能带来四种结果:
多任务学习的优势在于通过部分参数共享,联合训练,能在保证“还不错”的前提下,实现多目标共同提升。原因有以下几种:
- 任务互助:对于某个任务难学到的特征,可通过其他任务学习
- 隐式数据增强:不同任务有不同的噪声,一起学习可抵消部分噪声
- 学到通用表达,提高泛化能力:模型学到的是对所有任务都偏好的权重,有助于推广到未来的新任务
- 正则化:对于一个任务而言,其他任务的学习对该任务有正则化效果
(3)多任务学习的主要研究问题
多任务的核心优势在于通过不同任务的网络参数共享,实现1+1>2的提升,因此多任务学习的一大主流研究方向便是如何设计有效的网络结构。多个label的引入自然带来了多个loss,那么如何在联合训练中共同优化多个loss则是关键问题。
- 网络结构设计:主要研究哪些参数共享、在什么位置共享、如何共享。这一方向我们认为可以分为两大类:
- 第一类是在设计网络结构时,考虑目标间的显式关系(例如淘宝中,点击之后才有购买行为发生),以阿里提出的ESMM为代表;
- 另一类是目标间没有显式关系(例如短视频中的收藏与分享),在设计模型时不考虑label之间的量化关系,以谷歌提出的MMOE为代表。
- 多loss的优化策略:主要解决loss数值有大有小、学习速度有快有慢、更新方向时而相反的问题。最经典的两个工作有UWL(Uncertainty Weight):
- 通过自动学习任务的uncertainty,给uncertainty大的任务小权重,uncertainty小的任务大权重;
- GradNorm:结合任务梯度的二范数和loss下降梯度,引入带权重的损失函数Gradient Loss,并通过梯度下降更新该权重。
1.2 loss加权融合
一种最简单的实现多任务学习的方式是对不同任务的loss进行加权。例如谷歌的Youtube DNN论文中提到的一种加权交叉熵:
Weighted CE Loss = − ∑ i [ T i y i log p i + ( 1 − y i ) log ( 1 − p i ) ] \text { Weighted CE Loss }=-\sum_{i}\left[T_{i} y_{i} \log p_{i}+\left(1-y_{i}\right) \log \left(1-p_{i}\right)\right] Weighted CE Loss =−i∑[Tiyilogpi+(1−yi)log(1−pi)]
- 其中 T i T_{i} Ti 为观看时长。在原始训练数据中,正样本是视频展示后用户点击了该视频,负样本则是展示后未点击,这个一个标准的CTR预估问题。该loss通过改变训练样本的权重,让所有负样本的权重都为 1,而正样本的权重为点击后的视频观看时长 T i T_{i} Ti 。
- 作者认为按点击率排序会倾向于把诱惑用户点击(用户未必真感兴趣)的视频排前面,而观看时长能更好地反映出用户对视频的兴趣,通过重新设计loss使得该模型在保证主目标点击的同时,将视频观看时长转化为样本的权重,达到优化平均观看时长的效果。
另一种更为简单粗暴的加权方式是人工手动调整权重,例如 0.3*L(点击)+0.7*L*(视频完播)
这种loss加权的方式优点如下:
- 模型简单,仅在训练时通过梯度乘以样本权重实现对其它目标的加权
- 模型上线简单,和base完全相同,不需要额外开销
缺点:
- 本质上并不是多目标建模,而是将不同的目标转化为同一个目标。样本的加权权重需要根据AB测试才能确定。
1.3 Shared-Bottom
多目标建模目前业内有两种模式:
- 一种叫Shared-Bottom模式;
- 另一种叫MOE模式,MOE又包含MMOE和OMOE两种。MMOE也是Google提出的一套多目标学习算法结果,被应用到了Google的内部推荐系统中。如下图所示:
最早的多任务学习模型是底层共享结构(Shared-Bottom)
Shared-Bottom的思路就是多个目标底层共用一套共享layer,在这之上基于不同的目标构建不同的Tower。这样的好处就是底层的layer复用,减少计算量,同时也可以防止过拟合的情况出现。
- Shared-Bottom 优点:降低overfit风险,利用任务之间的关联性使模型学习效果更强
- Shared-Bottom 缺点:任务之间的相关性将严重影响模型效果。假如任务之间相关性较低,模型的效果相对会较差。
通过共享底层模块,学习任务间通用的特征表征,再往上针对每一个任务设置一个Tower网络,每个Tower网络的参数由自身对应的任务目标进行学习。Shared Bottom可以根据自身数据特点,使用MLP、DeepFM、DCN、DIN等,Tower网络一般使用简单的MLP。
代码如下,共享特征embedding,共享底层DNN网络,任务输出层独立,loss直接使用多个任务的loss值之和。
def Shared_Bottom(dnn_feature_columns, num_tasks=None, task_types=None, task_names=None,
bottom_dnn_units=[128, 128], tower_dnn_units_lists=[[64,32], [64,32]],
l2_reg_embedding=0.00001, l2_reg_dnn=0, seed=1024,dnn_dropout=0,
dnn_activation='relu', dnn_use_bn=False):
features = build_input_features(dnn_feature_columns)
inputs_list = list(features.values())
sparse_embedding_list, dense_value_list = input_from_feature_columns(features, dnn_feature_columns, l2_reg_embedding,seed)
#共享输入特征
dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list)
#共享底层网络
shared_bottom_output = DNN(bottom_dnn_units, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input)
#任务输出层
tasks_output = []
for task_type, task_name, tower_dnn in zip(task_types, task_names, tower_dnn_units_lists):
tower_output = DNN(tower_dnn, dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed, name='tower_'+task_name)(shared_bottom_output)
logit = tf.keras.layers.Dense(1, use_bias=False, activation=None)(tower_output)
output = PredictionLayer(task_type, name=task_name)(logit)
tasks_output.append(output)
model = tf.keras.models.Model(inputs=inputs_list, outputs=tasks_output)
return model
- 优点:浅层参数共享,互相补充学习,任务相关性越高,模型loss优化效果越明显,也可以加速训练。
- 缺点:任务不相关甚至优化目标相反时(例如新闻的点击与阅读时长),可能会带来负收益,多个任务性能一起下降。
一般把Shared-Bottom的结构称作“参数硬共享”,多任务学习网络结构设计的发展方向便是如何设计更灵活的共享机制,从而实现“参数软共享”。
二、ESMM模型
paper: (SIGIR’2018) Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate
url: https://arxiv.org/abs/1804.07931
解决传统CVR任务的2个问题:样本选择偏差和稀疏数据。
注:CVR是一个衡量CPA广告效果的指标,是用户点击广告到成为一个有效激活或者注册甚至付费用户的转化率。
公式是CVR=(转化量/点击量)*100%,因此0≤CVR≤100%。比如说电商行业,某一产品投了广告,点进去看广告的人数有1000人,下单的人数有50人,那么CVR=(50/1000)*100%=5%
CVR一般作为衡量广告商的用户是否真实,是否优质的重要标准。
不同的目标由于业务逻辑,有显式的依赖关系,例如曝光→点击→转化。用户必然是在商品曝光界面中,先点击了商品,才有可能购买转化。阿里提出了ESMM(Entire Space Multi-Task Model)网络,显式建模具有依赖关系的任务联合训练。该模型虽然为多任务学习模型,但ESMM本质上是以CVR为主任务,引入CTR和CTCVR作为辅助任务,解决CVR预估的挑战。
2.1 传统CVR中的SSB和DS问题
传统的CVR预估问题存在着两个主要的问题:样本选择偏差(sample selection bias,SSB)和稀疏数据。下图的白色背景是曝光数据,灰色背景是点击行为数据,黑色背景是购买行为数据。传统CVR预估使用的训练样本仅为灰色和黑色的数据。
这会导致两个问题:
- 样本选择偏差(sample selection bias,SSB):如图所示,CVR模型的正负样本集合={点击后未转化的负样本+点击后转化的正样本},但是线上预测的时候是样本一旦曝光,就需要预测出CVR和CTR以排序,样本集合={曝光的样本}。构建的训练样本集相当于是从一个与真实分布不一致的分布中采样得到的,这一定程度上违背了机器学习中训练数据和测试数据独立同分布的假设。
- 训练数据稀疏(data sparsity,DS):点击样本只占整个曝光样本的很小一部分,而转化样本又只占点击样本的很小一部分。如果只用点击后的数据训练CVR模型,可用的样本将极其稀疏。
2.2 解决方案(引入CTR和CTCVR任务)
阿里妈妈团队提出ESMM,借鉴多任务学习的思路,引入两个辅助任务CTR、CTCVR(已点击然后转化),同时消除以上两个问题。
三个预测任务如下:
- pCTR:p(click=1 | impression);
- pCVR: p(conversion=1 | click=1,impression);
- pCTCVR: p(conversion=1, click=1 | impression) = p(click=1 | impression) * p(conversion=1 | click=1, impression);
注意:其中只有CTR和CVR的label都同时为1时,CTCVR的label才是正样本1。如果出现CTR=0,CVR=1的样本,则为不合法样本,需删除。
pCTCVR是指,当用户已经点击的前提下,用户会购买的概率;pCVR是指如果用户点击了,会购买的概率。
三个任务之间的关系为:
p ( y = 1 , z = 1 ∣ x ) ⏟ p C T C V R = p ( y = 1 ∣ x ) ⏟ p C T R × p ( z = 1 ∣ y = 1 , x ) ⏟ p C V R . \underbrace{p(y=1, z=1 \mid x)}_{p C T C V R}=\underbrace{p(y=1 \mid x)}_{p C T R} \times \underbrace{p(z=1 \mid y=1, x)}_{p C V R} . pCTCVR p(y=1,z=1∣x)=pCTR p(y=1∣x)×pCVR p(z=1∣y=1,x).
其中x表示曝光,y表示点击,z表示转化。针对这三个任务,设计了如下图所示的模型结构,其中左边是主任务,右边是辅助任务:
如图,主任务和辅助任务共享特征,不同任务输出层使用不同的网络,将cvr的预测值*ctr的预测值作为ctcvr任务的预测值,利用ctcvr和ctr的label构造损失函数:
L ( θ c v r , θ c t r ) = ∑ i = 1 N l ( y i , f ( x i ; θ c t r ) ) + ∑ N l ( y i & z i , f ( x i ; θ c t r ) × f ( x i ; θ c v r ) ) , \begin{aligned} L\left(\theta_{c v r}, \theta_{c t r}\right) &=\sum_{i=1}^{N} l\left(y_{i}, f\left(x_{i} ; \theta_{c t r}\right)\right) \\ &+\sum^{N} l\left(y_{i} \& z_{i}, f\left(x_{i} ; \theta_{c t r}\right) \times f\left(x_{i} ; \theta_{c v r}\right)\right), \end{aligned} L(θcvr,θctr)=i=1∑Nl(yi,f(xi;θctr))+∑Nl(yi&zi,f(xi;θctr)×f(xi;θcvr)),
该架构具有两大特点,分别给出上述两个问题的解决方案:
- 帮助CVR模型在完整样本空间建模(即曝光空间X)。
p ( z = 1 ∣ y = 1 , x ) = p ( y = 1 , z = 1 ∣ x ) p ( y = 1 ∣ x ) p(z=1 \mid y=1, x)=\frac{p(y=1, z=1 \mid x)}{p(y=1 \mid x)} p(z=1∣y=1,x)=p(y=1∣x)p(y=1,z=1∣x)
从公式中可以看出,pCVR 可以由pCTR 和pCTCVR推导出。从原理上来说,相当于分别单独训练两个模型拟合出pCTR 和pCTCVR,再通过pCTCVR 除以pCTR 得到最终的拟合目标pCVR 。在训练过程中,模型只需要预测pCTCVR和pCTR,利用两种相加组成的联合loss更新参数。pCVR 只是一个中间变量。而pCTCVR和pCTR的数据是在完整样本空间中提取的,从而相当于pCVR也是在整个曝光样本空间中建模。
- 提供特征表达的迁移学习(embedding层共享)。CVR和CTR任务的两个子网络共享embedding层,网络的embedding层把大规模稀疏的输入数据映射到低维的表示向量,该层的参数占了整个网络参数的绝大部分,需要大量的训练样本才能充分学习得到。
- 由于CTR任务的训练样本量要大大超过CVR任务的训练样本量,ESMM模型中特征表示共享的机制能够使得CVR子任务也能够从只有展现没有点击的样本中学习,从而能够极大地有利于缓解训练数据稀疏性问题。
模型训练完成后,可以同时预测cvr、ctr、ctcvr三个指标,线上根据实际需求进行融合或者只采用此模型得到的cvr预估值。
2.3 总结与拓展
可以思考以下几个问题
- 能不能将乘法换成除法?
即分别训练CTR和CTCVR模型,两者相除得到pCVR。论文提供了消融实验的结果,表中的DIVISION模型,比起BASE模型直接建模CTCVRR和CVR,有显著提高,但低于ESMM。原因是pCTR 通常很小,除以一个很小的浮点数容易引起数值不稳定问题。
-
网络结构优化,Tower模型更换?两个塔不一致?
原论文中的子任务独立的Tower网络是纯MLP模型,事实上业界在使用过程中一般会采用更为先进的模型(例如DeepFM、DIN等),两个塔也完全可以根据自身特点设置不一样的模型。这也是ESMM框架的优势,子网络可以任意替换,非常容易与其他学习模型集成。 -
比loss直接相加更好的方式?
原论文是将两个loss直接相加,还可以引入动态加权的学习机制。 -
更长的序列依赖建模?
有些业务的依赖关系不止有曝光-点击-转化三层,后续的改进模型提出了更深层次的任务依赖关系建模。比如:
(1)阿里的ESMM2: 在点击到购买之前,用户还有可能产生加入购物车(Cart)、加入心愿单(Wish)等行为。
相较于直接学习 click->buy (稀疏度约2.6%),可以通过Action路径将目标分解,以Cart为例:click->cart (稀疏 度为10%),cart->buy(稀疏度为12%),通过分解路径,建立多任务学习模型来分步求解CVR模型,缓解稀疏问题,该模型同样也引入了特征共享机制。
(2)美团的AITM:信用卡业务中,用户转化通常是一个曝光->点击->申请->核卡->激活的过程,具有5层的链路。
美团提出了一种自适应信息迁移多任务(Adaptive Information Transfer Multi-task,AITM)框架,该框架通过自适应信息迁移(AIT)模块对用户多步转化之间的序列依赖进行建模。AIT模块可以自适应地学习在不同的转化阶段需要迁移什么和迁移多少信息。
总结:ESMM首创了利用用户行为序列数据在完整样本空间建模,并提出利用学习CTR和CTCVR的辅助任务,迂回学习CVR,避免了传统CVR模型经常遭遇的样本选择偏差和训练数据稀疏的问题,取得了显著的效果。
三、ESMM代码详解
本次的多任务模型的任务是预测点击和购买标签,是推荐系统中典型的CTR和CVR预测任务。
数据集介绍:Ali-CCP数据集官网:https://tianchi.aliyun.com/dataset/dataDetail?dataId=408
-
原始数据:原始数据采集自手机淘宝移动客户端的推荐系统日志,一共有23个sparse特征,8个dense特征,包含“点击”、“购买”两个标签,各特征列的含义参考学习材料中的Ali-CCP数据集官网上的详细描述
-
全量数据:已经完成对原始数据集的处理,包括对sparse特征进行Lable Encode,dense特征采用归一化处理等。预处理脚本见torch-rechub/examples/ranking/data/ali-ccp/preprocess_ali_ccp.py
-
采样数据:从全量数据集采样的小数据集
3.1 模型结构
定义一个模型需要指定模型结构参数,需要哪些参数可查看对应模型的定义部分。
对于ESMM而言,主要参数如下:
- user_features指用户侧的特征,只能传入sparse类型(论文中需要分别对user和item侧的特征进行sum_pooling操作)
- item_features指用item侧的特征,只能传入sparse类型
- cvr_params指定CVR Tower中MLP层的参数
- ctr_params指定CTR Tower中MLP层的参数
如下是torch rechub中的ESMM模型代码:
import torch
import torch.nn as nn
from ...basic.layers import MLP, EmbeddingLayer
class ESMM(nn.Module):
"""Entire Space Multi-Task Model
Args:
user_features (list): the list of `Feature Class`, training by shared bottom and tower module. It means the user features.
item_features (list): the list of `Feature Class`, training by shared bottom and tower module. It means the item features.
cvr_params (dict): the params of the CVR Tower module, keys include:`{"dims":list, "activation":str, "dropout":float`}
ctr_params (dict): the params of the CTR Tower module, keys include:`{"dims":list, "activation":str, "dropout":float`}
"""
def __init__(self, user_features, item_features, cvr_params, ctr_params):
super().__init__()
self.user_features = user_features
self.item_features = item_features
self.embedding = EmbeddingLayer(user_features + item_features)
self.tower_dims = user_features[0].embed_dim + item_features[0].embed_dim
self.tower_cvr = MLP(self.tower_dims, **cvr_params)
self.tower_ctr = MLP(self.tower_dims, **ctr_params)
def forward(self, x):
#Field-wise Pooling Layer for user and item
embed_user_features = self.embedding(x, self.user_features,
squeeze_dim=False).sum(dim=1) #[batch_size, embed_dim]
embed_item_features = self.embedding(x, self.item_features,
squeeze_dim=False).sum(dim=1) #[batch_size, embed_dim]
input_tower = torch.cat((embed_user_features, embed_item_features), dim=1)
cvr_logit = self.tower_cvr(input_tower)
ctr_logit = self.tower_ctr(input_tower)
# cvr_pred_prediction_result
cvr_pred = torch.sigmoid(cvr_logit)
ctr_pred = torch.sigmoid(ctr_logit)
ctcvr_pred = torch.mul(cvr_pred, cvr_pred)
ys = [cvr_pred, ctr_pred, ctcvr_pred]
return torch.cat(ys, dim=1)
3.2 模型训练
与Shared-Bottom同样的共享底层机制,之后两个独立的Tower网络,分别输出CVR和CTR,计算loss时只利用CTR与CTCVR的loss。CVR Tower完成自身网络更新,CTR Tower同时完成自身网络和Embedding参数更新。在评估模型性能时,重点是评估主任务CVR的auc。
如下版本是TensorFlow版的ESMM:
def ESSM(dnn_feature_columns, task_type='binary', task_names=['ctr', 'ctcvr'],
tower_dnn_units_lists=[[128, 128],[128, 128]], l2_reg_embedding=0.00001, l2_reg_dnn=0,
seed=1024, dnn_dropout=0,dnn_activation='relu', dnn_use_bn=False):
features = build_input_features(dnn_feature_columns)
inputs_list = list(features.values())
sparse_embedding_list, dense_value_list = input_from_feature_columns(features, dnn_feature_columns, l2_reg_embedding,seed)
dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list)
ctr_output = DNN(tower_dnn_units_lists[0], dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input)
cvr_output = DNN(tower_dnn_units_lists[1], dnn_activation, l2_reg_dnn, dnn_dropout, dnn_use_bn, seed=seed)(dnn_input)
ctr_logit = tf.keras.layers.Dense(1, use_bias=False, activation=None)(ctr_output)
cvr_logit = tf.keras.layers.Dense(1, use_bias=False, activation=None)(cvr_output)
ctr_pred = PredictionLayer(task_type, name=task_names[0])(ctr_logit)
cvr_pred = PredictionLayer(task_type)(cvr_logit)
ctcvr_pred = tf.keras.layers.Multiply(name=task_names[1])([ctr_pred, cvr_pred])#CTCVR = CTR * CVR
model = tf.keras.models.Model(inputs=inputs_list, outputs=[ctr_pred, cvr_pred, ctcvr_pred])
return model
测试数据集:
adult:https://archive.ics.uci.edu/ml/datasets/census+income
将里面两个特征转为label,完成两个任务的预测:
- 任务1预测该用户收入是否大于50K,
- 任务2预测该用户的婚姻是否未婚。
以上两个任务均为二分类任务,使用交叉熵作为损失函数。在ESMM框架下,我们把任务1作为CTR任务,任务2作为CVR任务,两者label相乘得到CTCVR任务的标签。
除ESSM之外,之后的MMOE、PLE模型都使用这个adult数据集做测试。
注意上述代码,并未实现论文模型图中提到的field element-wise +模块。该模块实现较为简单,即分别把用户、商品相关特征的embedding求和再拼接,然后输入Tower网络。我们使用数据不具有该属性,暂未区分。
Reference
[1] https://datawhalechina.github.io/fun-rec/#/ch02/ch2.2/ch2.2.5/ESMM
[2] 推荐系统中的多任务学习
[3] Ali-CCP dataset: Alibaba Click and Conversion Prediction
[4] 阿里:多任务学习模型之 ESMM 介绍与实现
[5] 快速了解推荐系统多任务学习
[6] funrec ESMM notebook
[7] 深度学习中Batch Normalization和Dice激活函数
[8] CTR与CVR的区别与业务分析
[9] 推荐系统(十四)多任务学习:阿里ESMM(完整空间多任务模型)
[10] https://developer.aliyun.com/article/793252
[11] 多目标学习在推荐系统的应用(MMOE/ESMM/PLE)
[12] Gradnorm: Gradient normalization for adaptive loss balancing in deep multitask networks (ICML’2018)
[13] UWL: Multi-task learning using uncertainty to weigh losses for scene geometry and semantics (CVPR’2018)
[14] YoutubeDNN: Deep neural networks for youtube recommendations (RecSys’2016)
[15] ESMM模型是如何提高cvr的?
[16] CVR预估的新思路:完整空间多任务模型
[17] 美团:https://cloud.tencent.com/developer/article/1868117
[18] Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate (SIGIR’2018)
[19] https://github.com/datawhalechina/torch-rechub/blob/main/tutorials/Multi_Task.ipynb
[20] 多任务学习中各loss权重应该如何设计
[21] 构建分布式Tensorflow模型系列:CVR预估之ESMM
文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。
原文链接:andyguo.blog.csdn.net/article/details/125447794
- 点赞
- 收藏
- 关注作者
评论(0)