README.md 21.3 KB
Newer Older
0
0YuanZhang0 已提交
1
# 对话自动评估模块ADE
Y
Yibing Liu 已提交
2

0
0YuanZhang0 已提交
3 4 5 6 7 8 9 10 11
- [**1、模型简介**](#1、模型简介)

- [**2、快速开始**](#2、快速开始)

- [**3、进阶使用**](#3、进阶使用)

- [**4、参考论文**](#4、参考论文)

- [**5、版本更新**](#5、版本更新)
Y
Yibing Liu 已提交
12

0
0YuanZhang0 已提交
13
## 1、模型简介
0
0YuanZhang0 已提交
14

0
0YuanZhang0 已提交
15
    对话自动评估(Auto Dialogue Evaluation)评估开放领域对话系统的回复质量,能够帮助企业或个人快速评估对话系统的回复质量,减少人工评估成本。
0
0YuanZhang0 已提交
16 17 18 19

    1. 在无标注数据的情况下,利用负采样训练匹配模型作为评估工具,实现对多个对话系统回复质量排序;

    2. 利用少量标注数据(特定对话系统或场景的人工打分),在匹配模型基础上进行微调,可以显著提高该对话系统或场景的评估效果。
Y
Yibing Liu 已提交
20

0
0YuanZhang0 已提交
21
## 2、快速开始
Y
Yibing Liu 已提交
22 23

### 安装说明
Y
Yibing Liu 已提交
24

0
0YuanZhang0 已提交
25 26 27 28 29 30
####   a、环境依赖
- Python >= 2.7
- cuda >= 9.0
- cudnn >= 7.0
- pandas >= 0.20.1
- PaddlePaddle >= 1.3.1,请参考[安装指南](http://www.paddlepaddle.org/#quick-start)进行安装, 本模块使用bert作为pretrain model进行模型的finetuning训练,训练速度较慢,建议安装GPU版本的PaddlePaddle
Y
Yibing Liu 已提交
31

0
0YuanZhang0 已提交
32 33
  注意:使用Windows GPU环境的用户,需要将示例代码中的[fluid.ParallelExecutor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#parallelexecutor)替换为[fluid.Executor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#executor)

0
0YuanZhang0 已提交
34
####   b、下载代码
0
0YuanZhang0 已提交
35

0
0YuanZhang0 已提交
36
    克隆数据集代码库到本地
0
0YuanZhang0 已提交
37 38 39 40 41
    
```
git clone https://github.com/PaddlePaddle/models.git
cd models/PaddleNLP/dialogue_model_toolkit/auto_dialogue_evaluation
```
Y
Yibing Liu 已提交
42

0
0YuanZhang0 已提交
43
### 任务简介
0
0YuanZhang0 已提交
44 45 46

    本模块内模型训练主要包括两个阶段:

0
0YuanZhang0 已提交
47 48
    1)第一阶段:训练一个匹配模型作为评估工具,可用于待评估对话系统内的回复内容进行排序;(matching任务)
          模型结构: 输入为context和response, 对两个输入学习embedding表示, 学习到的表示经过lstm学习高阶表示, context和response的高阶表示计算双线性张量积logits, logits和label计算sigmoid_cross_entropy_with_logits loss;
0
0YuanZhang0 已提交
49 50

    2)第二阶段:利用少量的对话系统的标记数据,对第一阶段训练的匹配模型进行finetuning, 可以提高评估效果(包含human,keywords,seq2seq_att,seq2seq_naive,4个finetuning任务);
0
0YuanZhang0 已提交
51
          模型结构: finetuning阶段学习表示到计算logits部分和第一阶段模型结构相同,区别在于finetuning阶段计算square_error_cost loss;
0
0YuanZhang0 已提交
52

0
0YuanZhang0 已提交
53
    用于第二阶段fine-tuning的对话系统包括下面四部分:
0
0YuanZhang0 已提交
54 55 56 57 58 59 60 61
    
```
human: 人工模拟的对话系统;
keywords:seq2seq keywords对话系统;
seq2seq_att:seq2seq attention model 对话系统;
seq2seq_naive:naive seq2seq model对话系统;
```

62 63
注意: 目前ade模块内提供的训练好的官方模型及效果, 均是在GPU单卡上面训练和预测得到的, 用户如需复线效果, 可使用单卡相同的配置.

0
0YuanZhang0 已提交
64 65 66
### 数据准备
    数据集说明:本模块内只提供训练方法,真实涉及的匹配数据及4个对话系统的数据只开源测试集数据,仅提供样例,用户如有自动化评估对话系统的需求,可自行准备业务数据集按照文档提供流程进行训练;
    
0
0YuanZhang0 已提交
67 68 69 70 71 72 73 74 75 76 77
```
unlabel_data(第一阶段训练匹配数据集)

label_data(第二阶段finetuning数据集)
1、human: 人工对话系统产出的标注数据;
2、keywords:关键词对话系统产出的标注数据;
3、seq2seq_att:seq2seq attention model产出的标注对话数据;
4、seq2seq_naive:传统seq2seq model产出的标注对话数据;
```

    数据集、相关模型下载:
0
0YuanZhang0 已提交
78
    
0
0YuanZhang0 已提交
79 80 81 82
```
cd ade && bash prepare_data_and_model.sh
```

0
0YuanZhang0 已提交
83 84
    数据路径:data/input/data/   
    模型路径:data/saved_models/trained_models/
0
0YuanZhang0 已提交
85
    下载经过预处理的数据,运行该脚本之后,data目录下会存在unlabel_data(train.ids/val.ids/test.ids),lable_data: human、keywords、seq2seq_att、seq2seq_naive(四个任务数据train.ids/val.ids/test.ids),以及word2ids.
Y
Yibing Liu 已提交
86

0
0YuanZhang0 已提交
87
### 单机训练
0
0YuanZhang0 已提交
88 89 90
#### 1、第一阶段matching模型的训练:
####     方式一: 推荐直接使用模块内脚本训练

0
0YuanZhang0 已提交
91
```
0
0YuanZhang0 已提交
92
bash run.sh matching train
0
0YuanZhang0 已提交
93
```
0
0YuanZhang0 已提交
94

0
0YuanZhang0 已提交
95
    如果为CPU训练: 
0
0YuanZhang0 已提交
96

0
0YuanZhang0 已提交
97 98 99 100
```
请将run.sh内参数设置为: 
1、export CUDA_VISIBLE_DEVICES=
```
0
0YuanZhang0 已提交
101

0
0YuanZhang0 已提交
102
    如果为GPU训练: 
Y
Yibing Liu 已提交
103

0
0YuanZhang0 已提交
104 105 106 107 108 109 110
```
请将run.sh内参数设置为: 
1、如果为单卡训练(用户指定空闲的单卡):
export CUDA_VISIBLE_DEVICES=0 
2、如果为多卡训练(用户指定空闲的多张卡):
export CUDA_VISIBLE_DEVICES=0,1,2,3
```
0
0YuanZhang0 已提交
111 112 113

####     方式二: 执行训练相关的代码:

0
0YuanZhang0 已提交
114 115 116 117 118 119
```
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1  #开启显存优化

export CUDA_VISIBLE_DEVICES=0  #GPU单卡训练
#export CUDA_VISIBLE_DEVICES=0,1,2,3  #GPU多卡训练
0
0YuanZhang0 已提交
120

0
0YuanZhang0 已提交
121
#export CUDA_VISIBLE_DEVICES=  #CPU训练
0
0YuanZhang0 已提交
122
#export CPU_NUM=1 #CPU训练时指定CPU number
0
0YuanZhang0 已提交
123 124 125 126 127 128 129 130 131

if  [ ! "$CUDA_VISIBLE_DEVICES" ]
then
    use_cuda=false
else
    use_cuda=true
fi

pretrain_model_path="data/saved_models/matching_pretrained"
0
0YuanZhang0 已提交
132 133 134 135 136 137

if [ -f ${pretrain_model_path} ]
then
    rm ${pretrain_model_path}
fi

0
0YuanZhang0 已提交
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
if [ ! -d ${pretrain_model_path} ]
then
     mkdir ${pretrain_model_path}
fi

python -u main.py \
      --do_train=true \
      --use_cuda=${use_cuda} \
      --loss_type="CLS" \
      --max_seq_len=50 \
      --save_model_path="data/saved_models/matching_pretrained" \
      --save_param="params" \
      --training_file="data/input/data/unlabel_data/train.ids" \
      --epoch=20 \
      --print_step=1 \
      --save_step=400 \
      --batch_size=256 \
      --hidden_size=256 \
      --emb_size=256 \
      --vocab_size=484016 \
      --learning_rate=0.001 \
0
0YuanZhang0 已提交
159
      --sample_pro=0.1 
0
0YuanZhang0 已提交
160
```
Y
Yibing Liu 已提交
161

162 163
注意: 用户进行模型训练、预测、评估等, 可通过修改data/config/ade.yaml配置文件或者从命令行传入来进行参数配置, 优先推荐命令行参数传入;

0
0YuanZhang0 已提交
164 165 166
#### 2、第二阶段finetuning模型的训练:
####     方式一: 推荐直接使用模块内脚本训练

0
0YuanZhang0 已提交
167
```
0
0YuanZhang0 已提交
168
bash run.sh task_name task_type
0
0YuanZhang0 已提交
169 170 171
参数说明:
task_name: seq2seq_naive、seq2seq_att、keywords、human,选择4个任务中任意一项;
task_type: train、predict、evaluate、inference, 选择4个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model;
Y
Yibing Liu 已提交
172

0
0YuanZhang0 已提交
173
训练示例: bash run.sh human train
0
0YuanZhang0 已提交
174
```
Y
Yibing Liu 已提交
175

0
0YuanZhang0 已提交
176 177 178 179
    CPU和GPU使用方式如单机训练1中所示;

####     方式二: 执行训练相关的代码:

0
0YuanZhang0 已提交
180 181 182 183 184 185
```
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1  #开启显存优化

export CUDA_VISIBLE_DEVICES=0  #GPU单卡训练
#export CUDA_VISIBLE_DEVICES=0,1,2,3  #GPU多卡训练
0
0YuanZhang0 已提交
186

0
0YuanZhang0 已提交
187
#export CUDA_VISIBLE_DEVICES=  #CPU训练
0
0YuanZhang0 已提交
188
#export CPU_NUM=1 #CPU训练时指定CPU number
0
0YuanZhang0 已提交
189 190 191 192 193 194 195 196 197

if  [ ! "$CUDA_VISIBLE_DEVICES" ]
then
    use_cuda=false
else
    use_cuda=true
fi

save_model_path="data/saved_models/human_finetuned"
0
0YuanZhang0 已提交
198 199 200 201 202 203

if [ -f ${save_model_path} ]
then
    rm ${save_model_path}
fi

0
0YuanZhang0 已提交
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
if [ ! -d ${save_model_path} ]
then
    mkdir ${save_model_path}
fi

python -u main.py \
      --do_train=true \
      --use_cuda=${use_cuda} \
      --loss_type="L2" \
      --max_seq_len=50 \
      --init_from_pretrain_model="data/saved_models/trained_models/matching_pretrained/params" \
      --save_model_path="data/saved_models/human_finetuned" \
      --save_param="params" \
      --training_file="data/input/data/label_data/human/train.ids" \
      --epoch=50 \
      --print_step=1 \
      --save_step=400 \
      --batch_size=256 \
      --hidden_size=256 \
      --emb_size=256 \
      --vocab_size=484016 \
      --learning_rate=0.001 \
0
0YuanZhang0 已提交
226
      --sample_pro=0.1
0
0YuanZhang0 已提交
227
```
Y
Yibing Liu 已提交
228

0
0YuanZhang0 已提交
229
### 模型预测
0
0YuanZhang0 已提交
230 231 232
#### 1、第一阶段matching模型的预测:

####     方式一: 推荐直接使用模块内脚本预测
Y
Yibing Liu 已提交
233

0
0YuanZhang0 已提交
234
```
0
0YuanZhang0 已提交
235
bash run.sh matching predict
0
0YuanZhang0 已提交
236
```
0
0YuanZhang0 已提交
237

0
0YuanZhang0 已提交
238
    如果为CPU预测: 
0
0YuanZhang0 已提交
239

0
0YuanZhang0 已提交
240 241
```
请将run.sh内参数设置为: 
0
0YuanZhang0 已提交
242
export CUDA_VISIBLE_DEVICES=
0
0YuanZhang0 已提交
243
```
0
0YuanZhang0 已提交
244

0
0YuanZhang0 已提交
245
    如果为GPU预测: 
0
0YuanZhang0 已提交
246

0
0YuanZhang0 已提交
247 248 249 250 251 252
```
请将run.sh内参数设置为: 
单卡预测:
export CUDA_VISIBLE_DEVICES=0 #用户可自行指定空闲的卡
```
注:预测时,如采用方式一,用户可通过修改run.sh中init_from_params参数来指定自己需要预测的模型,目前代码中默认预测本模块提供的训练好的模型;
L
lilu 已提交
253

0
0YuanZhang0 已提交
254 255
####     方式二: 执行预测相关的代码:

0
0YuanZhang0 已提交
256 257 258 259 260 261
```
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1  #开启显存优化

export CUDA_VISIBLE_DEVICES=0  #单卡预测
#export CUDA_VISIBLE_DEVICES=  #CPU预测
0
0YuanZhang0 已提交
262
#export CPU_NUM=1 #CPU训练时指定CPU number
0
0YuanZhang0 已提交
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283

if  [ ! "$CUDA_VISIBLE_DEVICES" ]
then
    use_cuda=false
else
    use_cuda=true
fi

python -u main.py \
      --do_predict=true \
      --use_cuda=${use_cuda} \
      --predict_file="data/input/data/unlabel_data/test.ids" \
      --init_from_params="data/saved_models/trained_models/matching_pretrained/params" \
      --loss_type="CLS" \
      --output_prediction_file="data/output/pretrain_matching_predict" \
      --max_seq_len=50 \
      --batch_size=256 \
      --hidden_size=256 \
      --emb_size=256 \
      --vocab_size=484016
```
0
0YuanZhang0 已提交
284

0
0YuanZhang0 已提交
285
注:采用方式二时,模型预测过程可参考run.sh内具体任务的参数设置
0
0YuanZhang0 已提交
286 287 288 289 290

#### 2、第二阶段finetuning模型的预测:

####     方式一: 推荐直接使用模块内脚本预测

0
0YuanZhang0 已提交
291
```
0
0YuanZhang0 已提交
292
bash run.sh task_name task_type
0
0YuanZhang0 已提交
293 294 295
参数说明:
task_name: seq2seq_naive、seq2seq_att、keywords、human,选择4个任务中任意一项;
task_type: train、predict、evaluate、inference, 选择4个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model;
Y
Yibing Liu 已提交
296

0
0YuanZhang0 已提交
297
预测示例: bash run.sh human predict
0
0YuanZhang0 已提交
298
```
Y
Yibing Liu 已提交
299

0
0YuanZhang0 已提交
300 301 302 303
    指定CPU或者GPU方法同上模型预测1中所示;

####     方式二: 执行预测相关的代码:

0
0YuanZhang0 已提交
304 305 306 307 308 309
```
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1  #开启显存优化

export CUDA_VISIBLE_DEVICES=0  #单卡预测
#export CUDA_VISIBLE_DEVICES=  #CPU预测
0
0YuanZhang0 已提交
310
#export CPU_NUM=1 #CPU训练时指定CPU number
0
0YuanZhang0 已提交
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331

if  [ ! "$CUDA_VISIBLE_DEVICES" ]
then
    use_cuda=false
else
    use_cuda=true
fi

python -u main.py \
      --do_predict=true \
      --use_cuda=${use_cuda} \
      --predict_file="data/input/data/label_data/human/test.ids" \
      --init_from_params="data/saved_models/trained_models/human_finetuned/params" \
      --loss_type="L2" \
      --output_prediction_file="data/output/finetuning_human_predict" \
      --max_seq_len=50 \
      --batch_size=256 \
      --hidden_size=256 \
      --emb_size=256 \
      --vocab_size=484016
```
L
lilu 已提交
332

0
0YuanZhang0 已提交
333 334
### 模型评估

0
0YuanZhang0 已提交
335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
    模块中5个任务,各任务支持计算的评估指标内容如下:
    
```
第一阶段:
matching: 使用R1@2, R1@10, R2@10, R5@10四个指标进行评估排序模型的效果;

第二阶段:
human: 使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
keywords:使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
seq2seq_att:使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
seq2seq_naive:使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
```

    效果上,以四个不同的对话系统(seq2seq\_naive/seq2seq\_att/keywords/human)为例,使用对话自动评估工具进行自动评估。

    1. 无标注数据情况下,直接使用预训练好的评估工具进行评估;
    
0
0YuanZhang0 已提交
352
        在四个对话系统上,自动评估打分和人工评估打分spearman相关系数,如下:
353

0
0YuanZhang0 已提交
354 355 356
   ||seq2seq\_naive|seq2seq\_att|keywords|human|
   |--|:--:|--:|:--:|--:|
   |cor|0.361|0.343|0.324|0.288|
0
0YuanZhang0 已提交
357

0
0YuanZhang0 已提交
358
        对四个系统平均得分排序:
0
0YuanZhang0 已提交
359

0
0YuanZhang0 已提交
360 361 362
   |人工评估|k(0.591)<n(0.847)<a(1.116)<h(1.240)|
   |--|--:|
   |自动评估|k(0.625)<n(0.909)<a(1.399)<h(1.683)|
363

0
0YuanZhang0 已提交
364 365
&ensp;&ensp;&ensp;&ensp;2. 利用少量标注数据微调后,自动评估打分和人工打分spearman相关系数,如下:

0
0YuanZhang0 已提交
366 367 368
   ||seq2seq\_naive|seq2seq\_att|keywords|human|
   |--|:--:|--:|:--:|--:|
   |cor|0.474|0.477|0.443|0.378|
0
0YuanZhang0 已提交
369 370 371

#### 1、第一阶段matching模型的评估:
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本评估
0
0YuanZhang0 已提交
372 373

```
0
0YuanZhang0 已提交
374
bash run.sh matching evaluate
0
0YuanZhang0 已提交
375
```
0
0YuanZhang0 已提交
376

0
0YuanZhang0 已提交
377 378
注:评估计算ground_truth和predict_label之间的打分,默认CPU计算即可;

0
0YuanZhang0 已提交
379 380
#### &ensp;&ensp;&ensp;&ensp;方式二: 执行评估相关的代码: 

0
0YuanZhang0 已提交
381 382
```
export CUDA_VISIBLE_DEVICES=  #指默认CPU评估
0
0YuanZhang0 已提交
383
export CPU_NUM=1 #CPU训练时指定CPU number
0
0YuanZhang0 已提交
384 385 386 387 388 389 390 391

python -u main.py \
      --do_eval=true \
      --use_cuda=false \
      --evaluation_file="data/input/data/unlabel_data/test.ids" \
      --output_prediction_file="data/output/pretrain_matching_predict" \
      --loss_type="CLS"
```
0
0YuanZhang0 已提交
392 393 394 395

#### 2、第二阶段finetuning模型的评估:
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本评估

0
0YuanZhang0 已提交
396
```
0
0YuanZhang0 已提交
397
bash run.sh task_name task_type
0
0YuanZhang0 已提交
398 399 400 401
参数说明:
task_name: seq2seq_naive、seq2seq_att、keywords、human,选择4个任务中任意一项;
task_type: train、predict、evaluate、inference, 选择4个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model;

0
0YuanZhang0 已提交
402
评估示例: bash run.sh human evaluate
0
0YuanZhang0 已提交
403
```
0
0YuanZhang0 已提交
404 405 406

#### &ensp;&ensp;&ensp;&ensp;方式二: 执行评估相关的代码: 

0
0YuanZhang0 已提交
407 408
```
export CUDA_VISIBLE_DEVICES=  #指默认CPU评估
0
0YuanZhang0 已提交
409
export CPU_NUM=1 #CPU训练时指定CPU number
0
0YuanZhang0 已提交
410 411 412 413 414 415 416 417

python -u main.py \
      --do_eval=true \
      --use_cuda=false \
      --evaluation_file="data/input/data/label_data/human/test.ids" \
      --output_prediction_file="data/output/finetuning_human_predict" \
      --loss_type="L2"
```
Y
Yibing Liu 已提交
418

0
0YuanZhang0 已提交
419
### 模型推断
0
0YuanZhang0 已提交
420 421 422
#### 1、第一阶段matching模型的推断:
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本保存inference model

0
0YuanZhang0 已提交
423
```
0
0YuanZhang0 已提交
424
bash run.sh matching inference
0
0YuanZhang0 已提交
425
```
0
0YuanZhang0 已提交
426

0
0YuanZhang0 已提交
427
&ensp;&ensp;&ensp;&ensp;如果为CPU执行inference model过程: 
0
0YuanZhang0 已提交
428

0
0YuanZhang0 已提交
429 430
```
请将run.sh内参数设置为: 
0
0YuanZhang0 已提交
431
export CUDA_VISIBLE_DEVICES=
0
0YuanZhang0 已提交
432
```
0
0YuanZhang0 已提交
433

0
0YuanZhang0 已提交
434
&ensp;&ensp;&ensp;&ensp;如果为GPU执行inference model过程:
0
0YuanZhang0 已提交
435

0
0YuanZhang0 已提交
436 437 438 439 440
```
请将run.sh内参数设置为: 
单卡推断(用户指定空闲的单卡):
export CUDA_VISIBLE_DEVICES=0
```
0
0YuanZhang0 已提交
441 442 443

#### &ensp;&ensp;&ensp;&ensp;方式二: 执行inference model相关的代码: 

0
0YuanZhang0 已提交
444 445 446
```
export CUDA_VISIBLE_DEVICES=0  # 指GPU单卡推断
#export CUDA_VISIBLE_DEVICES=  #CPU推断
0
0YuanZhang0 已提交
447
#export CPU_NUM=1 #CPU训练时指定CPU number
0
0YuanZhang0 已提交
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462

if  [ ! "$CUDA_VISIBLE_DEVICES" ]
then
    use_cuda=false
else
    use_cuda=true
fi

python -u main.py \
      --do_save_inference_model=true \
      --use_cuda=${use_cuda} \
      --init_from_params="data/saved_models/trained_models/matching_pretrained/params" \
      --inference_model_dir="data/inference_models/matching_inference_model"
```

0
0YuanZhang0 已提交
463 464
#### 2、第二阶段finetuning模型的推断:
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本保存inference model
0
0YuanZhang0 已提交
465 466
 
```
0
0YuanZhang0 已提交
467
bash run.sh task_name task_type
0
0YuanZhang0 已提交
468 469 470
参数说明:
task_name: seq2seq_naive、seq2seq_att、keywords、human,选择4个任务中任意一项;
task_type: train、predict、evaluate、inference, 选择4个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model;
Y
Yibing Liu 已提交
471

0
0YuanZhang0 已提交
472
评估示例: bash run.sh human inference
0
0YuanZhang0 已提交
473 474
```

0
0YuanZhang0 已提交
475 476 477 478
&ensp;&ensp;&ensp;&ensp;CPU和GPU指定方式同模型推断1中所示;

#### &ensp;&ensp;&ensp;&ensp;方式二: 执行inference model相关的代码: 

0
0YuanZhang0 已提交
479 480 481
```
export CUDA_VISIBLE_DEVICES=0  # 指GPU单卡推断
#export CUDA_VISIBLE_DEVICES=  #CPU推断
0
0YuanZhang0 已提交
482
#export CPU_NUM=1 #CPU训练时指定CPU number
0
0YuanZhang0 已提交
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498

if  [ ! "$CUDA_VISIBLE_DEVICES" ]
then
    use_cuda=false
else
    use_cuda=true
fi

python -u main.py \
      --do_save_inference_model=true \
      --use_cuda=${use_cuda} \
      --init_from_params="data/saved_models/trained_models/human_finetuned/params" \
      --inference_model_dir="data/inference_models/human_inference_model"
```

### 服务部署
0
0YuanZhang0 已提交
499 500
&ensp;&ensp;&ensp;&ensp;模块内提供已训练好6个对话任务的inference_model模型,用户可根据自身业务情况进行下载使用。

0
0YuanZhang0 已提交
501
#### 服务器部署
0
0YuanZhang0 已提交
502
&ensp;&ensp;&ensp;&ensp;请参考PaddlePaddle官方提供的[服务器端部署](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/deploy/inference/index_cn.html)文档进行部署上线。
0
0YuanZhang0 已提交
503 504 505 506

## 3、进阶使用

### 背景介绍
0
0YuanZhang0 已提交
507
&ensp;&ensp;&ensp;&ensp;对话自动评估任务输入是文本对(上文,回复),输出是回复质量得分,匹配任务(预测上下文是否匹配)和自动评估任务有天然的联系,该项目利用匹配任务作为自动评估的预训练,利用少量标注数据,在匹配模型基础上微调。
0
0YuanZhang0 已提交
508 509 510

### 模型概览

0
0YuanZhang0 已提交
511 512 513 514 515 516 517 518
&ensp;&ensp;&ensp;&ensp;本模块内提供的模型为:

&ensp;&ensp;&ensp;&ensp;1)匹配模型:context和response作为输入,使用lstm学习两个句子的表示,在计算两个线性张量的积作为logits,然后sigmoid_cross_entropy_with_logits作为loss, 最终用来评估相似程度;

&ensp;&ensp;&ensp;&ensp;2)finetuing模型:在匹配模型的基础上,将sigmoid_cross_entropy_with_logits loss优化成平方损失loss,来进行训练;

&ensp;&ensp;&ensp;&ensp;模型中所需数据格式如下:

0
0YuanZhang0 已提交
519
&ensp;&ensp;&ensp;&ensp;训练、预测、评估使用的数据示例如下,数据由三列组成,以制表符('\t')分隔,第一列是以空格分开的上文id(即context),第二列是以空格分开的回复id(即response),第三列是标签(标签含义:2-完全匹配,1-部分匹配,0-不匹配)。
0
0YuanZhang0 已提交
520

L
lilu 已提交
521 522 523 524
```
723 236 7823 12 8     887 13 77 4       2
8474 13 44 34         2 87 91 23       0
```
Y
Yibing Liu 已提交
525

0
0YuanZhang0 已提交
526 527 528 529 530 531 532 533 534 535 536
## 4、参考论文
1、Anjuli Kannan and Oriol Vinyals. 2017. Adversarial evaluation of dialogue models. arXiv preprint arXiv:1701.08198.
2、Ryan Lowe, Michael Noseworthy, Iulian V Serban, Nicolas Angelard-Gontier, Yoshua Bengio, and Joelle Pineau. 2017. Towards an automatic turing test: Learning to evaluate dialogue responses. arXiv preprint arXiv:1708.07149.
3、Sebastian M¨oller, Roman Englert, Klaus Engelbrecht, Verena Hafner, Anthony Jameson, Antti Oulasvirta, Alexander Raake, and Norbert Reithinger. 2006. Memo: towards automatic usability evaluation of spoken dialogue services by user error simulations. In Ninth International Conference on Spoken Language Processing.
4、Kishore Papineni, Salim Roukos, ToddWard, andWei-Jing Zhu. 2002. Bleu: a method for automatic evaluation
of machine translation. In Proceedings of the 40th annual meeting on association for computational linguistics, pages 311–318. Association for Computational Linguistics.
5、Chongyang Tao, Lili Mou, Dongyan Zhao, and Rui Yan. 2017. Ruber: An unsupervised method for automatic evaluation of open-domain dialog systems. arXiv preprint arXiv:1701.03079.
6、Marilyn AWalker, Diane J Litman, Candace A Kamm, and Alicia Abella. 1997. Paradise: A framework for evaluating spoken dialogue agents. In Proceedings of the eighth conference on European chapter of the Association for Computational Linguistics, pages 271–280. Association for Computational Linguistics.
7、Zhao Yan, Nan Duan, Junwei Bao, Peng Chen, Ming Zhou, Zhoujun Li, and Jianshe Zhou. 2016. Docchat: An information retrieval approach for chatbot engines using unstructured documents. In Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers), volume 1, pages 516–525.
8、Chia-Wei Liu, Ryan Lowe, Iulian V Serban, Michael Noseworthy, Laurent Charlin, and Joelle Pineau. 2016. How not to evaluate your dialogue system: An empirical study of unsupervised evaluation metrics for dialogue response generation. arXiv preprint arXiv:1603.08023.
9、Chin-Yew Lin. 2004. Rouge: A package for automatic evaluation of summaries. Text Summarization Branches Out.
Y
Yibing Liu 已提交
537

0
0YuanZhang0 已提交
538
## 5、版本更新
Y
Yibing Liu 已提交
539

0
0YuanZhang0 已提交
540 541
第一版:PaddlePaddle 1.4.0版本
主要功能:支持4个不同对话系统数据上训练、预测和系统性能评估
Y
Yibing Liu 已提交
542

0
0YuanZhang0 已提交
543 544
第二版:PaddlePaddle 1.6.0版本
更新功能:在第一版的基础上,根据PaddlePaddle的模型规范化标准,对模块内训练、预测、评估等代码进行了重构,提高易用性;
Y
Yibing Liu 已提交
545

0
0YuanZhang0 已提交
546
## 作者
Y
Yibing Liu 已提交
547

0
0YuanZhang0 已提交
548
zhangxiyuan01@baidu.com
0
0YuanZhang0 已提交
549

0
0YuanZhang0 已提交
550
zhouxiangyang@baidu.com
Y
Yibing Liu 已提交
551

0
0YuanZhang0 已提交
552
lilu12@baidu.com
Y
Yibing Liu 已提交
553

0
0YuanZhang0 已提交
554
## 如何贡献代码
Y
Yibing Liu 已提交
555

0
0YuanZhang0 已提交
556
&ensp;&ensp;&ensp;&ensp;如果你可以修复某个issue或者增加一个新功能,欢迎给我们提交PR。如果对应的PR被接受了,我们将根据贡献的质量和难度进行打分(0-5分,越高越好)。如果你累计获得了10分,可以联系我们获得面试机会或者为你写推荐信。