多目标推荐:MMOE

【阅读笔记】多任务学习之MMoE(含代码实现) 本文作为自己阅读论文后的总结和思考,不涉及论文翻译和模型解读,适合大家阅读完论文后交流想法,文末含MMoE的Pytorch实现及Synthetic Data的生成代码。 阅读详情

论文直达

Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts | Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining

原理架构说明

如图是作者给出一个架构图,其中的c就是本文提到的MMOE。

  • a)为共享参数的模型架构

  • b)为OMOE模型架构

  • c)在OMOE的基础上,为每一个任务分贝设置一个gate,对不同的任务使用不同的gate与共享参数进行点乘,作为不同任务的基础输出。

作为2018年的论文,gate更加像是一种attention机制的雏形,论文相对简单。在任务相关度很低的情况下,则OMoE的效果相对于MMoE明显下降,说明MMoE中的multi-gate的结构对于任务差异带来的冲突有一定的缓解作用

代码部分

模型整体
'''
# Time   : 2021/12/9 14:47
# Authur : junchaoli
# File   : model.py
'''

from layer import mmoe_layer, tower_layer

import tensorflow as tf
from tensorflow.keras import Model

class MMOE(Model):
    def __init__(self, mmoe_hidden_units, num_experts, num_tasks,
                 tower_hidden_units, output_dim, activation='relu',
                 use_expert_bias=True, use_gate_bias=True,
                 **kwargs):

        super(MMOE, self).__init__()
        self.mmoe_layer = mmoe_layer(mmoe_hidden_units,
                                     num_experts,
                                     num_tasks,
                                     use_expert_bias,
                                     use_gate_bias)

        # 每个任务对应一个tower_layer
        self.tower_layer = [
            tower_layer(tower_hidden_units, output_dim, activation)
            for _ in range(num_tasks)
        ]

    def call(self, inputs):
        mmoe_outputs = self.mmoe_layer(inputs)  # list: num_tasks x [None, hidden_units]

        outputs = []
        for i, layer in enumerate(self.tower_layer):
            out = layer(mmoe_outputs[i])
            outputs.append(out)

        return outputs  # list: num_tasks x [None, output_dim]
layer部分
import tensorflow as tf
from tensorflow.keras.layers import Layer
from tensorflow.keras.layers import Dense
import tensorflow.keras.backend as K


class mmoe_layer(Layer):
    def __init__(self, hidden_units, num_experts, num_tasks,
                 use_expert_bias=True, use_gate_bias=True,
                 **kwargs):
        
        super(mmoe_layer, self).__init__()
        self.hidden_units = hidden_units  # expert输出维度
        self.num_experts = num_experts  # expert数量
        self.num_tasks = num_tasks  # task数量
        self.use_expert_bias = use_expert_bias
        self.use_gate_bias = use_gate_bias


    def build(self, input_shape):
        if len(input_shape) != 2:
            raise ValueError("The dim of inputs should be 2, not %d" % (len(input_shape)))


        # expert 网络, 形状为 [input_shape[-1], hidden_units, num_experts]
        # 每个 expert 将输入维度从 input_shape[-1] 映射到 hidden_units
        self.expert_matrix = self.add_weight(
            name='expert_matrix',
            shape=(input_shape[-1], self.hidden_units, self.num_experts),
            trainable=True,
            initializer=tf.random_normal_initializer(),
            regularizer=tf.keras.regularizers.l2(1e-4)
        )


        # expert网络偏置项, 形状为 [hidden_units, num_experts]
        if self.use_expert_bias:
            self.expert_bias = self.add_weight(
                name='expert_bias',
                shape=(self.hidden_units, self.num_experts),
                trainable=True,
                initializer=tf.random_normal_initializer(),
                regularizer=tf.keras.regularizers.l2(1e-4)
            )


        # gate网络, 每个gate形状为[input_shape[-1], num_experts]
        # 总共num_tasks个gate,每个对应一个任务
        self.gate_matrix = [self.add_weight(
            name='gate_matrix'+str(i),
            shape=(input_shape[-1], self.num_experts),
            trainable=True,
            initializer=tf.random_normal_initializer(),
            regularizer=tf.keras.regularizers.l2(1e-4)
        ) for i in range(self.num_tasks)]


        # gate网络偏置项,形状为[num_experts],总共num_tasks个
        if self.use_gate_bias:
            self.gate_bias = [self.add_weight(
                name='gate_bias'+str(i),
                shape=(self.num_experts,),
                trainable=True,
                initializer=tf.random_normal_initializer(),
                regularizer=tf.keras.regularizers.l2(1e-4)
            ) for i in range(self.num_tasks)]


    def call(self, inputs, **kwargs):
        if K.ndim(inputs) != 2:
            raise ValueError("The dim of inputs should be 2, not %d" % (K.ndim(inputs)))

        # inputs x expert = [None,input_shape[-1]] x [input_shape[-1],hidden_units,num_experts]
        # 得到[None, hidden_units, num_experts]
        expert_output = []
        for i in range(self.num_experts):
            expert_out = tf.matmul(inputs, self.expert_matrix[:, :, i])  # [None, hidden_units]
            expert_output.append(expert_out)
        expert_output = tf.transpose(tf.convert_to_tensor(expert_output),
                                     [1, 2, 0])  # [None, hidden_units, num_experts]


        # 加偏置,形状保持不变
        if self.use_expert_bias:
            expert_output += self.expert_bias
        expert_output = tf.nn.relu(expert_output)


        # inputs x gate = [None,input_shape[-1]] x [input_shape[-1],num_experts]
        # num_tasks个gate得到输出列表 num_tasks x [None, num_experts]
        gate_outputs = []
        for i, gate in enumerate(self.gate_matrix):
            gate_out = tf.matmul(inputs, gate)  # [None, num_experts]
            if self.use_gate_bias:
                gate_out += self.gate_bias[i]
            gate_out = tf.nn.softmax(gate_out)

            gate_outputs.append(gate_out)  # list: num_tasks x [None, num_experts]


        # gate与expert的输出相乘
        outputs = []
        for gate_out in gate_outputs:
            gate_out = tf.expand_dims(gate_out, axis=1)  # 维度扩展 [None, 1, num_experts]
            gate_out = tf.tile(gate_out, [1, self.hidden_units, 1])  # 维度复制 [None, hidden_units, num_experts]

            out = tf.multiply(gate_out, expert_output)  # 元素乘 [None, hidden_units, num_experts]
            out = tf.reduce_sum(out, axis=-1)  # 取平均 [None, hidden_units]
            outputs.append(out)

        return outputs  # list: num_tasks x [None, hidden_units]


class tower_layer(Layer):
    def __init__(self, hidden_units, output_dim, activation='relu'):
        super(tower_layer, self).__init__()
        self.hidden_layer = [Dense(i, activation=activation) for i in hidden_units]
        self.output_layer = Dense(output_dim, activation=None)

    def call(self, inputs, **kwargs):
        if K.ndim(inputs) != 2:
            raise ValueError("The dim of inputs should be 2, not %d" % (K.ndim(inputs)))

        x = inputs
        for layer in self.hidden_layer:
            x = layer(x)
        output = self.output_layer(x)
        return output

多任务学习模型-MMoE MMoE(Multi-gate Mixture-of-Experts)是一种多任务学习模型,由Google的研究团队提出。该模型的核心贡献在于其创新的结构设计,它通过引入多个专家网络(Experts)和门控网络(Gates)来显式地建模不同任务之间的关系,并优化每个任务的表现。 阅读详情

相关推荐

【推荐系统】谷歌MMoE(Multi-gate Mixture-of-Experts)模型原理[附基于Pytorch的代码实现]

推荐系统-谷歌MMoE(Multi-gate Mixture-of-Experts)模型

qq_57161038的博客 1390

深度学习 - 45.MMOE && Gate 简单实现 By Keras

Keras 实现 Multi-gate Mixture-of-Experts [MMoE] 简易结构。

BITDDD小栈 2475

MVKE双塔模型实战:如何用MMoE+Attention优化用户画像与多目标推荐

本文深入解析了MVKE双塔模型在推荐系统中的实战应用,重点阐述了如何通过融合MMoE结构和注意力机制来优化用户画像与多目标推荐。MVKE模型通过在用户塔内部构建“隐式全局兴趣向量”作为桥梁,实现了用户与物料特征的早期间接交叉,从而生成动态、精准的用户表征,有效提升了点击率和转化率等多目标预测性能。

weixin_29195217的博客 59

推荐系统20---MMOE(多任务学习系列1)

写完推荐系统8之后,直接来到了推荐系统20,因为工作需要,最近需要先了解多任务方面的文章。那就先从这里开始吧。中间缺的这些,后面慢慢补。下面言归正传,开始引入多任务学习的背景知识:3,排序学习:通过预测两两物品之间相对顺序,或者物品序列之间顺序来解决多目标学习的问题。比如,视频推荐为例,用户观看很长的i视频,点击了j 视频,在假设观看比点击更重要的前提下:假设u代表用户的偏好,则Ui>Uj。有了相对顺序,就可以使用排序学习的方式,融合多个目标,不需要训练多个模型。1,优点:模型简单。

weixin_41403341的博客 825

从ESMM到MMoE:当推荐系统多目标‘闹矛盾’时,Google的‘多门控专家’怎么当和事佬?

本文深入探讨了Google提出的MMoE模型如何解决推荐系统中多任务学习(MTL)的目标冲突问题。通过对比ESMM、OMoE等模型,详细解析了MMoE的多门控专家机制及其在任务相关性不确定时的优势,为推荐系统设计提供了实践指导。

weixin_42525264的博客 333

告别‘一锅炖’:用MMoE模型搞定推荐系统中的多目标优化难题

本文深入探讨了MMoE(多门专家混合)模型在推荐系统多目标优化中的应用。通过分析传统多任务学习的局限性,详细解析MMoE模型的智能分工机制,包括专家网络、门控调度系统和目标专属决策流程。文章还提供了工业级实现的关键技术细节和TensorFlow实战代码,帮助开发者有效解决CTR、观看时长和满意度等多目标冲突问题。

weixin_42519733的博客 338

推荐业务多目标建模算法介绍:MMOE、OMOE、Shared-Bottom

在推荐业务中经常有“既要、也要、还要”的场景,比如做视频推荐业务的时候既要提升用户对于视频的点击率,也希望同时提升用户观看视频的时长。面对这样的诉求,通常需要在推荐系统中使用多目标建模算法。 多目标建模目前业内有两种模式,一种叫Shared-Bottom模式,另一种叫MOE,MOE又包含MMOE和OMOE两种。MMOE也是Google提出的一套多目标学习算法结果,被应用到了Google的内部推荐系统中,接下来分别介绍下这些多目标算法的结构。 算法结构介绍 上图基本能把Shared-Bottom、O

Garvin的专栏 7053

多目标建模算法实战解析:从Shared-Bottom到MMOE的演进与选型

本文深入解析了推荐系统中多目标建模算法的演进与实战选型。从基础的Shared-Bottom模型,到引入专家机制的MOE/OMOE,再到当前工业界主流的MMOE模型,文章详细阐述了其核心思想、优缺点及适用场景。重点分析了如何根据目标任务相关性进行模型选型,并提供了MMOE的实战调优指南,包括网络结构设计、损失函数平衡等关键细节,旨在帮助开发者高效解决“既要又要还要”的业务挑战。

weixin_28292761的博客 307

从LR到MMOE:得物社区推荐精排模型演进与多目标优化实践

推荐系统作为内容分发的核心技术,其核心原理是通过算法模型预测用户对内容的偏好,实现个性化信息匹配。从早期的逻辑回归(LR)模型依赖人工特征工程,到深度因子分解机(DeepFM)自动学习特征交互,技术演进大幅提升了点击率预估的准确性。然而,单一CTR优化易导致“标题党”泛滥,损害用户体验与平台长期价值。为此,多目标建模(如MMOE)成为关键,它能同时优化点击、点赞、收藏、完播率等多个目标,动态权衡短期流量与长期用户满意度。在得物社区等潮流内容平台中,结合序列建模捕捉动态兴趣,并融入多模态内容理解(如视觉美学特

weixin_33402252的博客 1014

MMoE 多目标排序模型实战:PyTorch 实现与极化问题 3 种解决方案

本文深入探讨了MMoE多目标排序模型在推荐系统中的应用,详细解析了PyTorch实现过程及极化问题的3种解决方案。通过专家Dropout、门控权重正则化和初始化技巧等实战方法,有效解决了模型退化问题,提升多任务学习效果。这些方案均经过工业级验证,可直接应用于推荐系统、排序等实际场景。

weixin_33624741的博客 297

mixture-of-experts:Noam Shazeer等人的“稀疏门控专家混合物层”的PyTorch重新实现。 https

PyTorch专家层的稀疏门控混合物 该存储库包含对PyTorch的《 描述的稀疏门控MoE层的PyTorch重新实现。 from moe import MoE # instantiate the MoE layer model = MoE ( input_size = 1000 , num_classes = 20 , num_experts = 10 , hidden_size = 66 , k = 4 , noisy_gating = True ) # forward y_hat , aux_loss = model ( X ) 要求 此示例在CPU上使用Torch v1.0.0和Python v3.6.1进行了测试。 要安装需求,请运行: pip install -r requirements.py 虚拟示例 文件example.py包含一个最小的工作示例,该示例说明了如

告别推荐系统‘内耗’:用MMoE模型搞定多目标优化(附PyTorch实战代码)

本文深入解析了MMoE(多门专家混合)模型在推荐系统多目标优化中的应用,通过动态组合专家网络有效解决了点击率、观看时长和点赞率等指标间的冲突问题。文章包含PyTorch实战代码,详细展示了如何构建电影推荐MMoE模型,并验证其相比传统方法提升15-20%的综合收益。

weixin_42647395的博客 332

python多目标MODE算法

【python】多目标MODE算法 【python】多目标MODE算法 【python】多目标MODE算法 【python】多目标MODE算法

【学习笔记】推荐系统 (5.排序:多目标模型、MMoE、融合预估分数、视频播放建模)

「汝将自掘坟墓,焚毁于叛逆的熔炉。」——《崩坏:星穹铁道》荒笛

xhyu61的博客 684

BLDC方波控制双闭环Simulink仿真模型

无刷直流电机方波控制双闭环Simulink仿真模型搭建详细教程,包括速度PI环、电流PI环、换向逻辑和受控电压源,仿真结果良好。

m0_57458432的博客 6869

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1091

Torch-RecHub多任务学习指南:MMOE、PLE、ESMM模型实践,提升推荐系统多目标优化能力

在当今推荐系统中,单一目标优化已难以满足复杂业务需求。无论是电商平台同时优化点击率(CTR)和转化率(CVR),还是内容平台兼顾用户点击与停留时长,多任务学习(MTL)都成为提升推荐效果的核心技术。Torch-RecHub作为一款基于PyTorch的推荐系统框架,提供了MMOE、PLE、ESMM等主流多任务模型的开箱即用实现,帮助开发者快速构建高效的多目标推荐系统。 ## 多任务学习在推荐系统中

gitblog_00331的博客 1205

PLC控制气缸与电磁阀:从原理到实战编程详解

在工业自动化领域,很多工程师都能编写PLC程序控制电机启停,但当涉及到气缸和电磁阀的精确控制时,却常常遇到动作不协调、响应延迟甚至设备损坏的问题。这背后的关键不在于PLC编程本身,而在于对气动元件特性和控制逻辑的深入理解。 本文将从实际工程问题出发,深入解析气缸与电磁阀的工作原理、PLC控制逻辑设计、常见故障排查方法,并通过完整的梯形图实例,帮助读者掌握气动系统自动化编程的核心要点。无论你是刚接触PLC的初学者,还是希望提升气动控制技能的工程师,都能从中获得实用的技术指导。 1. 气缸与电磁阀在自动化控制中

weixin_42522374的博客 336

MMoE-学习笔记

本文介绍了多任务学习模型在电商推荐系统中的应用与演进。首先分析了样本加权方法的局限性,然后详细阐述了Shared-Bottom、MoE、MMoE等模型结构的特点和数学原理。其中,Shared-Bottom通过参数共享提升效率,MoE引入专家网络解决任务冲突,MMoE为每个任务配备专属门控网络。接着介绍了阿里ESMM模型通过概率乘法公式解决样本偏差问题,以及腾讯PLE模型通过任务专属专家和渐进分层提取来优化负迁移问题。这些方法逐步解决了多任务学习中的样本稀疏、任务冲突和负迁移等核心挑战,为电商推荐系统的点击率

数据挖掘 | 机器学习 | 深度学习 387

面向网络攻击行为可视化分析系统实现【WebSocket + 可视化】

本系统主要应用于网站运维管理,它解决了网站运维人员排查网络攻击行为复杂且繁琐等问题,提高了运维人员网络安全分析的效率和准确性。

oNew_Lifeo的博客 1620

matebookego win11 arm 系统安装安卓子系统

一般的x86电脑如果安装android子系统,运行安卓子系统,由于要将android arm代码转译为x86代码,所以效率不一定高,但是如果电脑是arm架构的,通过安卓子系统运行android的程序执行效率就会 高不少,本文参考,都是在win11 home版本下的。两者跑分在cpu上差不太多了,大约是枭龙855的水平了,这个水平的子系统就有一定的实用性了,玩个一般游戏,刷个抖音都很流畅的。启动子系统后,点击左上角的设置,启用 “开发人员模式”。然后就可以再通运运行华为应用商店来进行安装其它应用了。

babytiger的专栏 1万+

推荐系统中的bias&&debias(二):position bias的消偏

前面提到过position bias,即用户倾向于点击排在前面的结果,这使得“优势位置”的item会获得更高的后验点击率。 这本质上是和用户的注意力,用户对item的情绪有关,而和用户的真实兴趣无关,这显然是不利用推荐模型的学习的。 关于position bias的消偏,主要有以下几种: 方法一:将位置信息作为特征加入到模型的输入中 这是最简单的一种消偏方式,在训练时把位置信息作为特征,online infer时,由于无法获取位置特征,模型会自动取一个默认值,比如0,这个值可以借助AB实验来调整,作为一个

贝壳er的博客 2657

自动驾驶算法/规划决策控制算法面经汇总、学习路线、面经心得

自动驾驶算法学习路线,面试求职大全

qq_41667348的博客 1万+

MMOE(Multi-gate Mixture-of-Experts)

即底层不是使用共享的一个shared bottom,而是有多个tower,称为多个专家,而是有多个tower,称为多个专家,然后往往再有一个gating netwokrs在多任务学习时,给不同的tower分配不同的权重,那么这样对于不同的任务,可以允许使用底层不同的专家组合去进行预测,相较于上面所有任务共享底层,这个方式显得更加灵活。这种方法目前用的也有,比如美团的猜你喜欢,知乎推荐的ranking等,这种方法最大的优势是task越多,单任务更加不可能过拟合,即可以减少任务之间过拟合的风险。

futurewq的博客 1299

ATE Pin Electronics电路学习总结

PinElectronics(PE)是ATE测试机的核心模拟前端电路,负责ATE与芯片间的信号转换与交互。主要包含四大功能模块:Driver实现逻辑信号到模拟电平的转换(VIH/VIL可编程);Receiver对DUT输出进行采样比较(VOH/VOL判定);ActiveLoad施加可编程电流负载;PPMU进行精密电压/电流测量。PE的性能直接影响功能测试和直流参数测试的精度,需定期校准维护。关键参数包括:Driver电压精度(±5mV)、Receiver比较精度(±10-50mV)、PPMU测量精度(±1-

歌颂苦难的行为是无耻的; 464

Android 系统低内存lowmemorykiller关于阈值修改 minfreeAbsKbytes优化

在系统rom定制化开发中,在对于运行内存ram 1G和2G的设备中,对于内存使用高峰期时,minfreeAbsKbytes优化很关键 调整合理的minfree,让内存合理的使用很关键,接下来分析相关功能的实现

安卓兼职framework和app工程师的博客 521
上一篇: 使用anaconda 安装paddle gpu环境
下一篇: tensorflow 常见方法总结
会发paper的学渣
博客等级 码龄15年 171粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会发paper的学渣

您的鼓励和将是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值