README.md 5.6 KB
Newer Older
O
overlordmax 已提交
1
# MMOE
Z
zhang wenhui 已提交
2

O
overlordmax 已提交
3
 以下是本例的简要目录结构及说明: 
Z
zhang wenhui 已提交
4

O
overlordmax 已提交
5 6
```
├── README.md            # 文档
O
overlordmax 已提交
7
├── requirements.txt     # 需要的安装包
O
overlordmax 已提交
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
├── mmoe_train.py        # mmoe模型脚本
├── utils                # 通用函数
├── args                 # 参数脚本
├── create_data.sh       # 生成训练数据脚本
├── data_preparation.py  # 数据预处理脚本
├── train_gpu.sh		 # gpu训练脚本
├── train_cpu.sh		 # cpu训练脚本
```

## 简介

多任务模型通过学习不同任务的联系和差异,可提高每个任务的学习效率和质量。多任务学习的的框架广泛采用shared-bottom的结构,不同任务间共用底部的隐层。这种结构本质上可以减少过拟合的风险,但是效果上可能受到任务差异和数据分布带来的影响。  论文[《Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts》]( https://www.kdd.org/kdd2018/accepted-papers/view/modeling-task-relationships-in-multi-task-learning-with-multi-gate-mixture- )中提出了一个Multi-gate Mixture-of-Experts(MMOE)的多任务学习结构。MMOE模型刻画了任务相关性,基于共享表示来学习特定任务的函数,避免了明显增加参数的缺点。 

我们在Paddlepaddle定义MMOE的网络结构,在开源数据集Census-income Data上验证模型效果,两个任务的auc分别为:

1.income

O
overlordmax 已提交
25
> max_mmoe_test_auc_income:0.94937
O
overlordmax 已提交
26
>
O
overlordmax 已提交
27
> mean_mmoe_test_auc_income:0.94465
O
overlordmax 已提交
28 29 30

2.marital

O
overlordmax 已提交
31
> max_mmoe_test_auc_marital:0.99419
O
overlordmax 已提交
32
>
O
overlordmax 已提交
33
> mean_mmoe_test_auc_marital:0.99324
Z
zhang wenhui 已提交
34

O
overlordmax 已提交
35
本项目支持GPU和CPU两种单机训练环境。
Z
zhang wenhui 已提交
36 37


Z
zhang wenhui 已提交
38

O
overlordmax 已提交
39
## 数据下载及预处理
Z
zhang wenhui 已提交
40

O
overlordmax 已提交
41
数据地址: [Census-income Data](https://archive.ics.uci.edu/ml/machine-learning-databases/census-income-mld/census.tar.gz )
Z
zhang wenhui 已提交
42

O
overlordmax 已提交
43
数据解压后, 在create_data.sh脚本文件中添加文件的路径,并运行脚本。
Z
zhang wenhui 已提交
44

O
overlordmax 已提交
45
```sh
O
overlordmax 已提交
46 47 48 49 50 51 52
mkdir train_data
mkdir test_data
mkdir data
train_path="data/census-income.data"
test_path="data/census-income.test"
train_data_path="train_data/"
test_data_path="test_data/"
O
overlordmax 已提交
53

O
overlordmax 已提交
54 55
wget -P data/ https://archive.ics.uci.edu/ml/machine-learning-databases/census-income-mld/census.tar.gz
tar -zxvf data/census.tar.gz -C data/
O
overlordmax 已提交
56 57 58 59

python data_preparation.py --train_path ${train_path} \
                           --test_path ${test_path} \
                           --train_data_path ${train_data_path}\
O
overlordmax 已提交
60 61
                           --test_data_path ${test_data_path}

Z
zhang wenhui 已提交
62
```
O
overlordmax 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76

## 环境

 PaddlePaddle 1.7.0 

 python3.7 

## 单机训练

GPU环境

在train_gpu.sh脚本文件中设置好数据路径、参数。

```sh
O
overlordmax 已提交
77
CUDA_VISIBLE_DEVICES=0 python train_mmoe.py  --use_gpu 1 \  #使用gpu训练
O
overlordmax 已提交
78 79 80 81 82 83 84 85 86 87
                                    --train_data_path 'train_data'\  #训练数据路径
                                    --test_data_path 'test_data'\  #测试数据路径
                                    --model_dir 'model_dir'\  #模型保存地址
                                    --feature_size 499\  #设置特征的维度
                                    --batch_size 32\  #设置batch_size大小
                                    --expert_num 8\  #设置expert数量
                                    --gate_num 2\  #设置gate数量
                                    --expert_size 16\  #设置expert网络大小
                                    --tower_size 8\  #设置tower网络大小
                                    --epochs 400 #设置epoch轮次
Z
zhang wenhui 已提交
88 89
```

O
overlordmax 已提交
90 91 92 93 94 95 96 97 98 99 100
修改脚本的可执行权限并运行

```
./train_gpu.sh
```

CPU环境

在train_cpu.sh脚本文件中设置好数据路径、参数。

```sh
O
overlordmax 已提交
101
python train_mmoe.py  --use_gpu 0 \  #使用cpu训练
O
overlordmax 已提交
102 103 104 105 106 107 108 109 110 111
                    --train_data_path 'train_data'\  #训练数据路径
                    --test_data_path 'test_data'\  #测试数据路径
                    --model_dir 'model_dir'\  #模型保存地址
                    --feature_size 499\  #设置特征的维度
                    --batch_size 32\  #设置batch_size大小
                    --expert_num 8\  #设置expert数量
                    --gate_num 2\  #设置gate数量
                    --expert_size 16\  #设置expert网络大小
                    --tower_size 8\  #设置tower网络大小
                    --epochs 400 #设置epoch轮次
O
overlordmax 已提交
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
```

修改脚本的可执行权限并运行

```
./train_cpu.sh
```



## 预测

本模型训练和预测交替进行,运行train_mmoe.py 即可得到预测结果

## 模型效果

epoch设置为100的训练和测试效果如下:
Z
zhang wenhui 已提交
129

O
overlordmax 已提交
130 131 132 133 134 135 136 137 138 139
```text
batch_size:[32],feature_size:[499],expert_num:[8],gate_num[2],expert_size[16],tower_size[8],epochs:[100]
2020-04-16 11:28:06,- INFO - epoch_id: 0,epoch_time: 129.17434 s,loss: 0.62215,train_auc_income: 0.86302,train_auc_marital: 0.92316,test_auc_income: 0.84525,test_auc_marital: 0.98269
2020-04-16 11:30:36,- INFO - epoch_id: 1,epoch_time: 149.79017 s,loss: 0.42484,train_auc_income: 0.90634,train_auc_marital: 0.98418,test_auc_income: 
......
2020-04-16 15:31:23,- INFO - epoch_id: 97,epoch_time: 147.07304 s,loss: 0.30267,train_auc_income: 0.94743,train_auc_marital: 0.99430,test_auc_income: 0.94905,test_auc_marital: 0.99414
2020-04-16 15:33:51,- INFO - epoch_id: 98,epoch_time: 148.34412 s,loss: 0.29688,train_auc_income: 0.94736,train_auc_marital: 0.99433,test_auc_income: 0.94846,test_auc_marital: 0.99409
2020-04-16 15:36:21,- INFO - epoch_id: 99,epoch_time: 149.91047 s,loss: 0.31330,train_auc_income: 0.94732,train_auc_marital: 0.99403,test_auc_income: 0.94881,test_auc_marital: 0.99386
2020-04-16 15:36:21,- INFO - mean_mmoe_test_auc_income: 0.94465,mean_mmoe_test_auc_marital 0.99324,max_mmoe_test_auc_income: 0.94937,max_mmoe_test_auc_marital 0.99419
```