README.md 5.9 KB
Newer Older
K
kinghuin 已提交
1
# ERNIE-Gen: An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation
Z
Zeyu Chen 已提交
2

K
kinghuin 已提交
3 4
## 1. 简介

K
kinghuin 已提交
5
ERNIE-GEN 是面向生成任务的预训练-微调框架,首次在预训练阶段加入**span-by-span 生成任务**,让模型每次能够生成一个语义完整的片段。在预训练和微调中通过**填充式生成机制****噪声感知机制**来缓解曝光偏差问题。此外, ERNIE-GEN 采样**多片段-多粒度目标文本采样策略**, 增强源文本和目标文本的关联性,加强了编码器和解码器的交互。
K
kinghuin 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18

![multi-flow-attention](https://github.com/PaddlePaddle/ERNIE/raw/repro/ernie-gen/.meta/multi-flow-attention.png)

## 2. 快速开始

### 2.1 环境配置

- Python >= 3.6

- paddlepaddle >= 2.0.0rc1,安装方式请参考 [快速安装](https://www.paddlepaddle.org.cn/install/quick)

- paddlenlp >= 2.0.0b, 安装方式:`pip install paddlenlp>=2.0.0b`

K
kinghuin 已提交
19 20
- tqdm,安装方式:`pip install tqdm`

K
kinghuin 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
### 2.2 数据准备

在本例中,我们提供了古诗词数据集,示例数据如下:

```text
画\002精\002禅\002室\002冷\002,\002方\002暑\002久\002徘\002徊\002。	不\002尽\002林\002端\002雪\002,\002长\002青\002石\002上\002苔\002。\002心\002闲\002对\002岩\002岫\002,\002目\002浄\002失\002尘\002埃\002。\002坐\002久\002清\002风\002至\002,\002疑\002从\002翠\002涧\002来\002。
```

每行数据都是由两列组成,以制表符分隔。第一列是输入的诗句前文,第二列是输出的诗句后文,所有文字都以 `\002` 分隔。

完整数据集可以通过以下命令下载并解压:

```bash
wget --no-check-certificate https://paddlenlp.bj.bcebos.com/datasets/poetry.tar.gz
tar xvf poetry.tar.gz
```

### 2.3 模型微调

模型训练支持 CPU 和 GPU,使用 GPU 之前应指定使用的显卡卡号:

```bash
export CUDA_VISIBLE_DEVICES=0,1,2 # 支持多卡训练
```

训练启动方式如下:

```bash
python -u ./train.py \
    --model_name_or_path ernie-1.0 \
    --max_encode_len 24 \
    --max_decode_len 72 \
    --batch_size 48  \
    --learning_rate 2e-5 \
    --num_epochs 12 \
    --logging_steps 1 \
    --save_steps 1000 \
    --output_dir ./tmp/ \
    --n_gpu 3 \
    # --init_checkpoint ./tmp/model_10000/model_state.pdparams
```

参数释义如下:
K
kinghuin 已提交
64
- `model_name_or_path` 指示了某种特定配置的模型,对应有其预训练模型和预训练时使用的 tokenizer,支持[PaadleNLP transformer类预训练模型](https://github.com/PaddlePaddle/models/blob/develop/PaddleNLP/docs/transformers.md)中的所有模型,但只有`ernie-gen-base-en, ernie-gen-large-en, ernie-gen-large-en-430g`三种模型会加载最后输出层的参数,其余模型只会加载transformer参数作热启动。若模型相关内容保存在本地,这里也可以提供相应目录地址。
K
kinghuin 已提交
65 66 67 68 69 70 71 72 73 74 75
- `max_encode_len` 表示最大输入句子长度,超过该长度将被截断。
- `max_decode_len` 表示最大输出句子长度,超过该长度将被截断。
- `batch_size` 表示每次迭代**每张卡**上的样本数目。
- `learning_rate` 表示基础学习率大小,将于learning rate scheduler产生的值相乘作为当前学习率。
- `num_epochs` 表示训练轮数。
- `logging_steps` 表示日志打印间隔。
- `save_steps` 表示模型保存及评估间隔。
- `output_dir` 表示模型保存路径。
- `n_gpu` 表示使用的 GPU 卡数。若希望使用多卡训练,将其设置为指定数目即可;若为0,则使用CPU。
- `init_checkpoint` 表示模型加载路径,通过设置此参数可以开启增量训练。

K
kinghuin 已提交
76 77
训练会持续很长的时间,为此我们提供了[微调后的模型](https://paddlenlp.bj.bcebos.com/models/transformers/ernie_gen_finetuned/ernie_1.0_poetry.pdparams)。您可以下载该模型并通过`init_checkpoint`加载其参数进行增量训练、评估或预测。

K
kinghuin 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
### 2.4 模型评估

通过加载训练保存的模型,可以对验证集数据进行验证,启动方式如下:

```bash
python -u ./eval.py \
    --model_name_or_path ernie-1.0 \
    --max_encode_len 24 \
    --max_decode_len 72 \
    --batch_size 48   \
    --init_checkpoint ./tmp/model_10000/model_state.pdparams \
    --use_gpu
```

参数释义如下:
K
kinghuin 已提交
93
- `model_name_or_path` 指示了某种特定配置的模型,对应有其预训练模型和预训练时使用的 tokenizer,支持[PaadleNLP transformer类预训练模型](https://github.com/PaddlePaddle/models/blob/develop/PaddleNLP/docs/transformers.md)中的所有模型,但只有`ernie-gen-base-en, ernie-gen-large-en, ernie-gen-large-en-430g`三种模型会加载最后输出层的参数,其余模型只会加载transformer参数作热启动。若模型相关内容保存在本地,这里也可以提供相应目录地址。
K
kinghuin 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
- `max_encode_len` 表示最大输入句子长度,超过该长度将被截断。
- `max_decode_len` 表示最大输出句子长度,超过该长度将被截断。
- `batch_size` 表示每次迭代**每张卡**上的样本数目。
- `init_checkpoint` 表示模型加载路径。
- `use_gpu` 表示使用GPU。

### 2.5 模型预测

对无标签数据可以启动模型预测:

```bash
python -u ./predict.py \
    --model_name_or_path ernie-1.0 \
    --max_encode_len 24 \
    --max_decode_len 72 \
    --batch_size 48   \
    --init_checkpoint ./tmp/model_10000/model_state.pdparams \
    --use_gpu
```

K
kinghuin 已提交
114

K
kinghuin 已提交
115 116 117 118 119 120 121 122 123 124 125 126
## 引用

您可以按下面的格式引用ERNIE-Gen论文:

```
@article{xiao2020ernie-gen,
  title={ERNIE-GEN: An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation},
  author={Xiao, Dongling and Zhang, Han and Li, Yukun and Sun, Yu and Tian, Hao and Wu, Hua and Wang, Haifeng},
  journal={arXiv preprint arXiv:2001.11314},
  year={2020}
}
```
K
kinghuin 已提交
127 128 129 130 131 132

## 线上教程体验

我们为诗歌文本生成提供了线上教程,欢迎体验:

* [使用PaddleNLP预训练模型ERNIE-GEN生成诗歌](https://aistudio.baidu.com/aistudio/projectdetail/1339888)