推荐模型复现(四):多任务模型ESMM、MMOE

简介: 样本选择偏差:构建的训练样本集的分布采样不准确稀疏数据:点击样本占曝光样本的比例很小

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表示转化

image.png


主任务和辅助任务共享特征,并利用CTCVR和CTR的label构造损失函数:

image.png

L(θcvr,θctr)=∑i=1Nl(yi,f(xi;θctr))+∑i=1Nl(yi&zi,f(xi;θctr)×f(xi;θcvr))

L(θcvr,θctr)=∑i=1Nl(yi,f(xi;θctr))+∑i=1Nl(yi&zi,f(xi;θctr)×f(xi;θcvr))

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模型的优化

论文中,子任务独立的Tower网络是纯MLP模型,可以根据自身特点设置不一样的模型,例如使用DeepFM、DIN等

引入动态加权的学习机制,优化loss

可构建更长的序列依赖模型,例如美团AITM信用卡业务,用户转换过程是曝光->点击->申请->核卡->激活


1.4 ESSM模型代码实现

import torch
import torch.nn.functional as F
from torch_rechub.basic.layers import MLP, EmbeddingLayer
from tqdm import tqdm
class ESMM(torch.nn.Module):
    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
        # 构建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 * pCVR
        ctcvr_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模型原理

image.png


2.2.1 MOE模型(混合专家模型)


模型原理:基于多个Expert汇总输出,通过门控网络机制(注意力网络)得到每个Expert的权重

特性:模型集成、注意力机制、multi-head机制


2.2.2 MMOE模型


基于OMOE模型,每个Expert任务都有一个门控网络

特性:

避免任务冲突,根据不同的门控进行调整,选择出对当前任务有帮助的Expert组合

建立任务之间的关系

参数共享灵活

训练时模型能够快速收敛

import torch
import torch.nn as nn
from torch_rechub.basic.layers import MLP, EmbeddingLayer, PredictionLayer
class MMOE(torch.nn.Module):
    def __init__(self, features, task_types, n_expert, expert_params, tower_params_list):
        super().__init__()
        self.features = features
        self.task_types = task_types
        # 任务数量
        self.n_task = len(task_types)
        self.n_expert = n_expert
        self.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 -> proba
            y = predict_layer(tower_out)
            ys.append(y)
        return torch.cat(ys, dim=1)


3 总结


 本次任务,主要介绍了ESSM和MMOE的多任务学习模型原理和代码实践:

ESSM模型:主要引入CTR和CTCVR的辅助任务,解决样本选择偏差和稀疏数据问题,基于双塔模型,并可根据自身特点设置两个塔的不同模型,子网络支持任意替换

MMOE模型:主要基于OMOE模型,其中每个Expert任务都有一个门控网络,下层是MOE基本模型,上层是双塔模型,满足各个任务在Expert组合选择上的解耦性,具备灵活的参数共享、训练快速收敛等特点。


目录
打赏
0
0
0
0
521
分享
相关文章
使用A10单卡24G复现DeepSeek R1强化学习过程
本文描述DeepSeek的三个模型的学习过程,其中DeepSeek-R1-Zero模型所涉及的强化学习算法,是DeepSeek最核心的部分之一会重点展示。
702 181
使用A10单卡24G复现DeepSeek R1强化学习过程
MotionBert论文解读及详细复现教程
MotionBert提出了一个统一视角来学习人体运动表示,并使用双流时空Transformer(DSTformer)网络作为运动编码器,能够全面、自适应地捕获骨骼关节之间的远程时空关系,实现在多个下游任务上的性能提升。
203 1
FoundationPose复现及Realsense应用
文章概述了FoundationPose项目,一个由Nvidia开发的用于新对象6D姿态估计和跟踪的统一模型,支持模型基础和无模型设置,通过合成数据和大型语言模型实现强泛化能力,并提供了复现和应用的详细步骤。
446 0
FoundationPose复现及Realsense应用
大模型的幻觉现象介绍
本文转载至赛尔实验室 ,作者哈工大SCIR,这篇文章很好的解释了大模型的幻觉问题,并且给出了一系列理论上能验证大模型幻觉现象的方式,是一篇很好的科普文章,针对于验证方式后期也可以采取对应的方式来优化此类幻觉现象,先码住好好学习一下哇嘎嘎嘎
Sora复现项目Mora发布
Lehigh大学LAIR实验室推出Mora项目,旨在复现并超越OpenAI的Sora视频生成模型。Mora采用多智能体框架,通过协同工作实现文本到视频的转换,打破了视频生成技术的闭源限制。利用GPT-4和先进视频模型,Mora在视频生成、编辑和内容创作上展现强大潜力,已在多个任务中超越开源模型。然而,面临视频数据集版权、生成质量与长度、复杂指令遵循等挑战。
112 2
Sora复现项目Mora发布
ModelScope评估二次训练模型报错如何解决
ModelScope模型报错是指在使用ModelScope平台进行模型训练或部署时遇到的错误和问题;本合集将收集ModelScope模型报错的常见情况和排查方法,帮助用户快速定位问题并采取有效措施。
552 0
MobileNetV3架构解析与代码复现
MobileNet模型基于深度可分离卷积,这是一种分解卷积的形式,将标准卷积分解为深度卷积和`1*1`的点卷积。对于MobileNet,深度卷积将单个滤波器应用于每个输入通道,然后,逐点卷积应用`1*1`卷积将输出与深度卷积相结合。
1283 0
MobileNetV3架构解析与代码复现
如何复现难以复现的缺陷
重现缺陷很容易陷入盲目的尝试,直到测试人员感到疲倦而放弃,也没有多少进展。提出错误猜测使得测试有明确的目标,在它的指引下测试人员可以自由发挥,而不会迷失方向。整个过程的特征是设定明确的目标、用实验去获得信息、根据新信息建立新目标。
202 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等