推荐模型复现(四):多任务模型ESMM、MMOE
多任务模型:ESMM、MMOE
本章为推荐模型复现第四章,使用torch_rechub框架进行模型搭建,主要介绍推荐系统召多任务模型ESMM、MMOE,包括结构讲解与代码实战,参考其他文章。
推荐方向资料推荐:
1.RecHub Wiki
2. FunRec
1 ESMM
1.1 ESMM产生背景
- 样本选择偏差:构建的训练样本集的分布采样不准确
- 稀疏数据:点击样本占曝光样本的比例很小
1.2 ESMM原理
- 解决思路:基于多任务学习,引入CTR、CTCVR消除样本选择偏差和稀疏数据
- 三个预测任务:
- pCTR:点击率预估模型
- pCVR:转化率预估模型
- pCTCVR: 点击和转化率预估模型
\underbrace{p(y=1, z=1 | x)}_{pCTCVR}=\underbrace{p(y=1 | x)}_{pCTR} \times \underbrace{p(z=1 | y=1, x)}_{pCVR}pCTCVRp(y=1,z=1∣x)=pCTRp(y=1∣x)×pCVRp(z=1∣y=1,x)
其中xx表示曝光,yy表示点击,zz表示转化
主任务和辅助任务共享特征,并利用CTCVR和CTR的
label
构造损失函数:\begin{aligned} L(\theta_{c v r}, \theta_{c t r}) &= \sum_{i=1}^{N} l(y_{i}, f(\boldsymbol{x}_{i} ; \theta_{c t r})) \\ &+ \sum_{i=1}^{N} l(y_{i} \& z_{i}, f(\boldsymbol{x}_{i} ; \theta_{c t r}) \times f(\boldsymbol{x}_{i} ; \theta_{c v r})) \end{aligned}L(θcvr,θctr)=i=1∑Nl(yi,f(xi;θctr))+i=1∑Nl(yi&zi,f(xi;θctr)×f(xi;θcvr))
解决样本选择偏差:在训练过程中,模型只需要预测pCTCVR和pCTR,即可更新参数,由于pCTCVR和pCTR的数据是基于完整样本空间提取的,故根据公式,可以解决pCVR的样本选择偏差
解决数据稀疏:使用共享的embedding层,使得CVR子任务也能够从只展示没点击的样本中学习,可以缓解训练数据稀疏的问题
1.3 ESSM模型的优化1.3 ESSM模型的优化1.3 ESSM模型的优化
- 论文中,子任务独立的Tower网络是纯MLP模型,可以根据自身特点设置不一样的模型,例如使用DeepFM、DIN等
- 引入动态加权的学习机制,优化loss
- 可构建更长的序列依赖模型,例如美团AITM信用卡业务,用户转换过程是曝光->点击->申请->核卡->激活
1.4 ESSM模型代码实现1.4 ESSM模型代码实现1.4 ESSM模型代码实现
import torch
import torch.nn.functional as F
from torch_rechub.basic.layers import MLP, EmbeddingLayer
from tqdm import tqdmclass ESMM(torch.nn.Module):def __init__(self, user_features, item_features, cvr_params, ctr_params):super().__init__()self.user_features = user_featuresself.item_features = item_featuresself.embedding = EmbeddingLayer(user_features + item_features)self.tower_dims = user_features[0].embed_dim + item_features[0].embed_dim# 构建CVR和CTR的双塔self.tower_cvr = MLP(self.tower_dims, **cvr_params)self.tower_ctr = MLP(self.tower_dims, **ctr_params)def forward(self, x):embed_user_features = self.embedding(x, self.user_features, squeeze_dim=False).sum(dim=1) embed_item_features = self.embedding(x, self.item_features, squeeze_dim=False).sum(dim=1)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 = torch.sigmoid(cvr_logit)ctr_pred = torch.sigmoid(ctr_logit)# 计算pCTCVR = pCTR * pCVRctcvr_pred = torch.mul(cvr_pred, cvr_pred)ys = [cvr_pred, ctr_pred, ctcvr_pred]return torch.cat(ys, dim=1)
2 MMOE
2.1 MMOE产生背景
- 多任务模型:在不同任务之间学习共性以及差异性,能够提高建模的质量以及效率。
- 多任务模型设计模式:
- Hard Parameter Sharing方法:底层是共享的隐藏层,学习各个任务的共同模式,上层用一些特定的全连接层学习特定任务模式
- Soft Parameter Sharing方法:底层不使用共享的shared bottom,而是有多个tower,给不同的tower分配不同的权重
- 任务序列依赖关系建模:这种适合于不同任务之间有一定的序列依赖关系
2.2 MOE模型和MMOE模型原理
2.2.1 MOE模型(混合专家模型)
- 模型原理:基于多个
Expert
汇总输出,通过门控网络机制(注意力网络)得到每个Expert
的权重 - 特性:模型集成、注意力机制、multi-head机制
2.2.2 MMOE模型
- 基于OMOE模型,每个
Expert
任务都有一个门控网络 - 特性:
- 避免任务冲突,根据不同的门控进行调整,选择出对当前任务有帮助的
Expert
组合 - 建立任务之间的关系
- 参数共享灵活
- 训练时模型能够快速收敛
- 避免任务冲突,根据不同的门控进行调整,选择出对当前任务有帮助的
import torch
import torch.nn as nnfrom torch_rechub.basic.layers import MLP, EmbeddingLayer, PredictionLayerclass MMOE(torch.nn.Module):def __init__(self, features, task_types, n_expert, expert_params, tower_params_list):super().__init__()self.features = featuresself.task_types = task_types# 任务数量self.n_task = len(task_types)self.n_expert = n_expertself.embedding = EmbeddingLayer(features)self.input_dims = sum([fea.embed_dim for fea in features])# 每个Expert对应一个门控self.experts = nn.ModuleList(MLP(self.input_dims, output_layer=False, **expert_params) for i in range(self.n_expert))self.gates = nn.ModuleList(MLP(self.input_dims, output_layer=False, **{"dims": [self.n_expert],"activation": "softmax"}) for i in range(self.n_task))# 双塔self.towers = nn.ModuleList(MLP(expert_params["dims"][-1], **tower_params_list[i]) for i in range(self.n_task))self.predict_layers = nn.ModuleList(PredictionLayer(task_type) for task_type in task_types)def forward(self, x):embed_x = self.embedding(x, self.features, squeeze_dim=True)expert_outs = [expert(embed_x).unsqueeze(1) for expert in self.experts] expert_outs = torch.cat(expert_outs, dim=1) gate_outs = [gate(embed_x).unsqueeze(-1) for gate in self.gates]ys = []for gate_out, tower, predict_layer in zip(gate_outs, self.towers, self.predict_layers):expert_weight = torch.mul(gate_out, expert_outs) expert_pooling = torch.sum(expert_weight, dim=1) # 计算双塔tower_out = tower(expert_pooling)# logit -> probay = predict_layer(tower_out)ys.append(y)return torch.cat(ys, dim=1)
3 总结
本次任务,主要介绍了ESSM和MMOE的多任务学习模型原理和代码实践:
- ESSM模型:主要引入CTR和CTCVR的辅助任务,解决样本选择偏差和稀疏数据问题,基于双塔模型,并可根据自身特点设置两个塔的不同模型,子网络支持任意替换
- MMOE模型:主要基于OMOE模型,其中每个
Expert
任务都有一个门控网络,下层是MOE基本模型,上层是双塔模型,满足各个任务在Expert
组合选择上的解耦性,具备灵活的参数共享、训练快速收敛等特点。
本文参考:
我的组队学习
推荐模型复现(四):多任务模型ESMM、MMOE相关推荐
- 【统计学习系列】多元线性回归模型(四)——模型的参数估计II:区间估计
文章目录 1. 前文回顾 2. ***β*** 的区间估计 2.1 t统计量的构造 2.2 估计区间 3. *σ* 的区间估计 3.1 卡方统计量的构造 3.2 估计区间 4. ***y*** 的区间 ...
- 推荐系统(十四)多任务学习:阿里ESMM(完整空间多任务模型)
推荐系统(十四)多任务学习:阿里ESMM(完整空间多任务模型) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR模型 推荐系统(三)Factorization Mach ...
- 推荐模型复现(一):熟悉Torch-RecHub框架与使用
本系列为推荐模型第一章,主要用PyTorch复现推荐模型,熟悉Torch-RecHub框架与使用. 1 Torch-RecHub框架 Torch-RecHub是一个轻量级的pytorch推荐模型框架 ...
- MMOE - 经典多任务模型(谷歌)
文章目录 1.动机: 2.模型结构: Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Exp ...
- 李沐团队新作Gluon,复现CV经典模型到BERT,简单好用 | 强烈推荐
参加 2019 Python开发者日,请扫码咨询 ↑↑↑ 责编 | Jane 出品 | AI科技大本营(公众号id:rgznai100) [导语]上周,李沐老师公布 GluonNLP0.6 版本,借助 ...
- 推荐算法(四)——经典模型 DeepFM 模型详解及代码实践
目录 1 介绍 2 模型结构 3 实验结果 4 总结 5 代码实践 1 介绍 DeepFM 是华为诺亚方舟实验室在 2017 年提出的模型. 论文传送门: A Factorization-Machin ...
- 【CTR排序】多任务学习之MMOE模型
学习总结 常见的多任务模型有三种范式: hard parameter sharing:底部有shared bottom,然后上层用全连接层分别学习特定任务模式,但是当两个任务相关性没那么好(比如排序中 ...
- [Python人工智能] 三十四.Bert模型 (3)keras-bert库构建Bert模型实现微博情感分析
从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章开启了新的内容--Bert,首先介绍Keras-bert库安装及基础用法及文本分类工作.这篇文章将通过keras- ...
- 使用图生成多任务模型缩小基于靶标和基于细胞的药物发现之间的差异
本文介绍的是由中国科学院深圳先进技术研究所的Fan Hu.Dongqi Wang等人发表在arXiv上的预印文章<Bridging the gap between target-based an ...
最新文章
- 一文教你如何用Python预测股票价格,程序员学以致用
- python 函数 默认参数
- 小程序分享到朋友圈功能_来啦!小程序支持分享朋友圈
- Ubuntu Server如何配置SFTP
- 角色操作-查询所有角色代码实现
- 并查集入门三连:HDU1213 POJ1611 POJ2236
- 同为程序员 为什么我的工资最低
- matlab求傅里叶级数展开式_傅里叶级数:从向量的角度看函数
- logstash grok插件语法介绍
- 虚拟化—用新的视角看IT
- Android studio3.5读取项目资源文件的图片
- Dreamweaver8 V8.0.0.2766
- 人人开源vue无法启动
- Snipaste贴图软件使用方法及快捷键
- html实现好看的年会抽奖(附源码)
- 一文详解 implementation api embed
- Relatively Prime Graph CodeForces - 1009D
- 基于可见光通信的移动机器人室内定位及物联网应用
- Windows系统上的软件(如:爱奇艺万能播放器)固定任务栏图标后,打开后出现新任务栏图标
- 语音转文字转换器怎么用,免费的语音转文字方法介绍
热门文章
- Arco Pro最佳实践,路由与菜单
- MySQL 中的 ibdata1
- Windows下Nginx的常用命令
- python输出保留字_[Python]标识符,保留字,变量
- 将字符串转化为指定长度的字符串
- 布隆的盾能挡机器人的q吗_没有属性加成的技能,蒙多的Q,机器人的W,布隆的E,那R呢?...
- 无刷电机DRV8313芯片原理图
- 大数据分析与应用的8个场景
- linux随堂笔记_day01_linux基础以及常见命令
- 图片无损放大软件Topaz Gigapixel AI 5.5.2 win mac 汉化 mac只有英文版