Sunny.Xia的深度学习(四)MMOE多任务学习模型实战演练
本专栏文章会在本博客和知乎专栏——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多任务学习模型实战演练相关推荐
- 推荐系统(十四)多任务学习:阿里ESMM(完整空间多任务模型)
推荐系统(十四)多任务学习:阿里ESMM(完整空间多任务模型) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR模型 推荐系统(三)Factorization Mach ...
- 深度学习中的多任务学习(一)
任务学习-Multitask Learning概述 Reference https://blog.csdn.net/u010417185/article/details/83065506 1.单任务学 ...
- MMOE——多任务学习模型
摘要 对于多任务学习,我们的目标是建立一个单一的模型,同时学习这些多个目标和任务.然而,常用的多任务模型的预测质量往往对任务之间的关系比较敏感.因此,研究任务特定目标和任务间关系之间的建模权衡是很重要 ...
- 深度学习核心技术精讲100篇(八)-keras 实战系列之深度学习中的多任务学习(Multi-task learning)
多任务学习(Multi-task learning)简介 多任务学习(Multi-task learning)是迁移学习(Transfer Learning)的一种,而迁移学习指的是将从源领域的知识( ...
- 推荐系统(十五)多任务学习:谷歌MMoE(Multi-gate Mixture-of-Experts )
推荐系统(十五)多任务学习:谷歌MMoE(Multi-gate Mixture-of-Experts ) 推荐系统系列博客: 推荐系统(一)推荐系统整体概览 推荐系统(二)GBDT+LR模型 推荐系统 ...
- 深度学习 -- TensorFlow(项目)验证码生成与识别(多任务学习)
目录 基础理论 一.生成验证码数据集 1.生成验证码训练集 1-0.判断文件夹是否为空 1-1.创建字符集(数字.大小写英文字母) 1-2.随机生成验证码(1000个,长度为4) 2.生成验证码测试集 ...
- 深度学习-多任务学习总结
深度学习中多任务学习的方法和问题总结 为什么要做多任务学习 多任务学习的实现方法 介绍下ESSM 介绍下PLE 为什么要做多任务学习 多任务算法的应用场景还是很广泛的,只要是推荐技术涉及的业务,比如搜 ...
- [译]深度神经网络的多任务学习概览(An Overview of Multi-task Learning in Deep Neural Networks)...
译自:http://sebastianruder.com/multi-task/ 1. 前言 在机器学习中,我们通常关心优化某一特定指标,不管这个指标是一个标准值,还是企业KPI.为了达到这个目标,我 ...
- 深度学习之----多任务学习
介绍 在机器学习(ML)中,通常的关注点是对特定度量进行优化,度量有很多种,例如特定基准或商业 KPI 的分数.为了做到这一点,我们通常训练一个模型或模型组合来执行目标任务.然后,我们微调这些模型,直 ...
最新文章
- 深度学习也利用进化论!李飞飞谈创建具身智能体,学动物进化法则
- 在Spring中使用JTA事务管理
- 重磅!PyTorch 中文手册已开源!理论、实践、应用都有了!
- 深入剖析Redis系列(四) - Redis数据结构与全局命令概述
- 用Vue.js开发一个电影App的前端界面
- 前端笔试面试题之二(2015阿里前端笔试)
- SQL63 刷题通过的题目排名
- debian rabbitmq离线安装_Rabbitmq web-mqtt在debian上的安装
- 升级Win10后Markdown Pad2启动报错‘Awesomium.Windows.Controls.WebControl’解决方法
- discord android .apk,Discord语音交流app
- C#--图表控件(Chart)
- VSE++: Improving Visual-Semantic Embeddings with Hard Negatives------BMVC 2018
- dataGrid使用deleteRow删除数据时会出现 ‘id‘ of undefined
- python python中max()函数的用法
- c++中“ error C2953: “XXXXx”: 类模板已经定义”的另类方式错误
- MD文本编辑工具推荐-matktext
- 2022最新阿里云国际注册教程-不用绑定paypal注册
- 数据采集---自制上位机界面接收单片机uart数据
- 计算机专业申请ps怎么写,美国留学申请:个人陈述PS范文(计算机专业)
- matlab中将灰度图像转换为彩色图像
热门文章
- 开发java的准备--下载与安装Java的JDK—Java学习(1)
- 正一派道家奇门遁甲排盘算法python程序
- CCM5.0 应用实例(SIP X-lite)
- python网络安全设计_专为渗透测试人员设计的 Python 工具大合集
- Mybatis-Plus入门学习
- Pro-Level Photography for Graphic Designers 平面设计师专业摄影教程 Lynda课程中文字幕
- java 运行class_运行java的class文件方法详解
- Win11触控板如何关闭 Win11关闭触控板的方法
- 深度学习笔记(28) 残差网络
- 什么是顶级域名?有哪些分类?