本专栏文章会在本博客和知乎专栏——Sunny.Xia的深度学习同步更新,对于评论博主若未能够及时回复的,可以知乎私信。未经本人允许,请勿转载,谢谢。

一、什么是MMOE?

三张图分别是多任务模型的不同结构,具体介绍可以参见多任务学习之MMOE模型,该文章里也提供了一个简单的demo助于读者了解,很详细就不过多赘述了。

论文地址:https://github.com/ruozhichen/deep_learning_papers/tree/master/pctr

模型(c)即是本文所要介绍的MMOE模型,图中的三个Expert可以理解为相互独立的三个子网络,Tower A和Tower B即为两个任务。三个Expert的结果会通过加权和作为Tower的输入,而权重则是由Gate来提供。相比图(b)区别就在于,这里每个任务都有自己的Gate,输出各个Expert的权重大小。整个模型表达式如下所示:

其中k表示有k个任务,表示第k个Tower的网络;n为Expert的个数,为第i个Expert输出的结果;为第k个gate中,第i个Expert对应的权重。

可以看到,Gate网络输出的结果是一个softmax,也就意味着n个Expert对应的权重加起来之和为1。

二、实战演练

本文代码地址:https://github.com/ruozhichen/deep_learning/blob/master/model/MMOE.py (master分支)

tensorflow-gpu: 1.14 python: 3.7  直接python MMOE.py运行即可。

2.1参数初始化

    # experts# feature_dim * experts_units * experts_numexperts_weight = tf.get_variable(name='experts_weight',dtype=tf.float32,shape=(input_layer.get_shape()[1], experts_units, experts_num),initializer=tf.contrib.layers.xavier_initializer())experts_bias = tf.get_variable(name='expert_bias',dtype=tf.float32,shape=(experts_units, experts_num),initializer=tf.contrib.layers.xavier_initializer())# gates# tasks_num * experts_units * experts_numgate_weights = [tf.get_variable(name='gate%d_weight' % i,dtype=tf.float32,shape=(input_layer.get_shape()[1], experts_num),initializer=tf.contrib.layers.xavier_initializer())for i in range(FLAGS.tasks_num)]# tasks_num * experts_numgate_biases = [tf.get_variable(name='gate%d_bias' % i,dtype=tf.float32,shape=(experts_num,),initializer=tf.contrib.layers.xavier_initializer())for i in range(FLAGS.tasks_num)]

input_layer为特征向量,大小为N * feature_dim,N为样本个数。

experts_units为隐含层的维度,可以理解为最终每个Task的输入的维度就是experts_units。

experts_num为experts的个数。

另外注意的是这里gate_weights和gate_biases是一个数组,对于每一个task都初始化了相应的gate网络参数。

2.2 expert_outputs

    with tf.variable_scope("MMOE-part"):# axes=k 表示取a的后k维跟b的前k维进行矩阵相乘experts_output = tf.tensordot(a=input_layer, b=experts_weight, axes=1) # N * experts_units * experts_numif use_experts_bias:experts_output = tf.add(experts_output, experts_bias)

input_layer的大小是N * feature_dim,experts_weight的大小是feature_dim * experts_units * experts_num。

experts_output中的每一个元素,其实就是对某个样本的feature_dim个值进行加权求和得到的,这样的加权求和进行了experts_units * experts_num次。

再加上有N个样本,因此最后的大小就是N * experts_units * experts_num。

2.2 gate_outputs

        gates_output = []for i in range(FLAGS.tasks_num):# N * experts_numres = tf.matmul(input_layer, gate_weights[i])if use_gate_bias:res = tf.add(res, gate_biases[i])gates_output.append(res)# tasks_num * N * experts_numgate_outputs = tf.nn.softmax(gates_output)

gate_outputs即对应每一个task,生成每个样本在各个Experts的权重。这里gate_outputs是一个list,每个元素的大小为N * experts_num。

2.3 final_results

        final_outputs = []for i in range(FLAGS.tasks_num):# N * 1 * experts_numexpanded_gate_output = tf.expand_dims(gate_outputs[i], axis=1)# N * experts_units * experts_numweighted_expert_output = tf.multiply(experts_output, expanded_gate_output)# N * experts_unitstask_output = tf.reduce_sum(weighted_expert_output, axis=2)final_outputs.append(task_output)# 本项目提供的数据不支持多任务学习,故这里将多任务输出的结果进行拼接后,作为DNN的输入。deep_inputs = tf.concat(final_outputs, axis=1)  # N * ( 2 * experts_unit)

这里weighted_expert_output和task_output两步实现的就是对Experts的结果进行加权求和,最终大小为N * experts_units,然后作为每个task的输入。

由于本代码的测试样例不适合多任务学习,所以最后实际上是将这几个task_output进行了拼接,最后送到DNN网络中去。

测试样例的构造可以参考Sunny.Xia的深度学习(一)DeepFM附代码实战讲解。

Sunny.Xia的深度学习(四)MMOE多任务学习模型实战演练相关推荐

  1. 推荐系统(十四)多任务学习:阿里ESMM(完整空间多任务模型)

    推荐系统(十四)多任务学习:阿里ESMM(完整空间多任务模型) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR模型 推荐系统(三)Factorization Mach ...

  2. 深度学习中的多任务学习(一)

    任务学习-Multitask Learning概述 Reference https://blog.csdn.net/u010417185/article/details/83065506 1.单任务学 ...

  3. MMOE——多任务学习模型

    摘要 对于多任务学习,我们的目标是建立一个单一的模型,同时学习这些多个目标和任务.然而,常用的多任务模型的预测质量往往对任务之间的关系比较敏感.因此,研究任务特定目标和任务间关系之间的建模权衡是很重要 ...

  4. 深度学习核心技术精讲100篇(八)-keras 实战系列之深度学习中的多任务学习(Multi-task learning)

    多任务学习(Multi-task learning)简介 多任务学习(Multi-task learning)是迁移学习(Transfer Learning)的一种,而迁移学习指的是将从源领域的知识( ...

  5. 推荐系统(十五)多任务学习:谷歌MMoE(Multi-gate Mixture-of-Experts )

    推荐系统(十五)多任务学习:谷歌MMoE(Multi-gate Mixture-of-Experts ) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR模型 推荐系统 ...

  6. 深度学习 -- TensorFlow(项目)验证码生成与识别(多任务学习)

    目录 基础理论 一.生成验证码数据集 1.生成验证码训练集 1-0.判断文件夹是否为空 1-1.创建字符集(数字.大小写英文字母) 1-2.随机生成验证码(1000个,长度为4) 2.生成验证码测试集 ...

  7. 深度学习-多任务学习总结

    深度学习中多任务学习的方法和问题总结 为什么要做多任务学习 多任务学习的实现方法 介绍下ESSM 介绍下PLE 为什么要做多任务学习 多任务算法的应用场景还是很广泛的,只要是推荐技术涉及的业务,比如搜 ...

  8. [译]深度神经网络的多任务学习概览(An Overview of Multi-task Learning in Deep Neural Networks)...

    译自:http://sebastianruder.com/multi-task/ 1. 前言 在机器学习中,我们通常关心优化某一特定指标,不管这个指标是一个标准值,还是企业KPI.为了达到这个目标,我 ...

  9. 深度学习之----多任务学习

    介绍 在机器学习(ML)中,通常的关注点是对特定度量进行优化,度量有很多种,例如特定基准或商业 KPI 的分数.为了做到这一点,我们通常训练一个模型或模型组合来执行目标任务.然后,我们微调这些模型,直 ...

最新文章

  1. 深度学习也利用进化论!李飞飞谈创建具身智能体,学动物进化法则
  2. 在Spring中使用JTA事务管理
  3. 重磅!PyTorch 中文手册已开源!理论、实践、应用都有了!
  4. 深入剖析Redis系列(四) - Redis数据结构与全局命令概述
  5. 用Vue.js开发一个电影App的前端界面
  6. 前端笔试面试题之二(2015阿里前端笔试)
  7. SQL63 刷题通过的题目排名
  8. debian rabbitmq离线安装_Rabbitmq web-mqtt在debian上的安装
  9. 升级Win10后Markdown Pad2启动报错‘Awesomium.Windows.Controls.WebControl’解决方法
  10. discord android .apk,Discord语音交流app
  11. C#--图表控件(Chart)
  12. VSE++: Improving Visual-Semantic Embeddings with Hard Negatives------BMVC 2018
  13. dataGrid使用deleteRow删除数据时会出现 ‘id‘ of undefined
  14. python python中max()函数的用法
  15. c++中“ error C2953: “XXXXx”: 类模板已经定义”的另类方式错误
  16. MD文本编辑工具推荐-matktext
  17. 2022最新阿里云国际注册教程-不用绑定paypal注册
  18. 数据采集---自制上位机界面接收单片机uart数据
  19. 计算机专业申请ps怎么写,美国留学申请:个人陈述PS范文(计算机专业)
  20. matlab中将灰度图像转换为彩色图像

热门文章

  1. 开发java的准备--下载与安装Java的JDK—Java学习(1)
  2. 正一派道家奇门遁甲排盘算法python程序
  3. CCM5.0 应用实例(SIP X-lite)
  4. python网络安全设计_专为渗透测试人员设计的 Python 工具大合集
  5. Mybatis-Plus入门学习
  6. Pro-Level Photography for Graphic Designers 平面设计师专业摄影教程 Lynda课程中文字幕
  7. java 运行class_运行java的class文件方法详解
  8. Win11触控板如何关闭 Win11关闭触控板的方法
  9. 深度学习笔记(28) 残差网络
  10. 什么是顶级域名?有哪些分类?