快速上手UER-py
1.前言
预训练已经成为自然语言处理任务的重要组成部分,为大量自然语言处理任务带来了显著提升。 UER-py(Universal Encoder Representations)是一个用于对通用语料进行预训练并对下游任务进行微调的工具包。UER-py遵循模块化的设计原则。通过模块的组合,用户能迅速精准复现已有的预训练模型,并利用已有的接口进一步开发更多的预训练模型。通过UER-py,我们建立了一个模型仓库,其中包含基于不同语料,编码器和目标任务的预训练模型。用户可以根据具体任务的要求,从中选择合适的预训练模型使用。
2.书评分类(BERT模型)
在书评语料上对模型进行预训练,首先对书评语料进行预处理,我们在UER-py-master目录下运行以下命令:
python3 preprocess.py --corpus_path corpora/book_review_bert.txt --vocab_path models/google_zh_vocab.txt --dataset_path dataset.pt \
--processes_num 8 --target bert
然后下载Google中文预训练模型google_zh_model.bin,并将其放在 models 文件夹中。接着加载Google中文预训练模型,在书评语料上对其进行增量预训练,假设我们有1个GPU的机器,world size 表示一共有几块GPU,gpu_ranks是gpu序号;
python3 pretrain.py --dataset_path dataset.pt --vocab_path models/google_zh_vocab.txt --pretrained_model_path models/google_zh_model.bin \
--output_model_path models/book_review_model.bin --world_size 1 --gpu_ranks 0 \ --batch_size 8
--total_steps 5000 --save_checkpoint_steps 1000 --embedding word_pos_seg --encoder transformer --mask fully_visible --target bert
pretrain.py输出的模型会带有记录训练步数的后缀,这里我们可以删除后缀以方便使用;
mv models/book_review_model.bin-5000 models/book_review_model.bin
然后,我们在下游分类数据集上微调预训练模型,我们可以用 google_zh_model.bin;
python3 run_classifier.py --pretrained_model_path models/google_zh_model.bin --vocab_path models/google_zh_vocab.txt \
--train_path datasets/douban_book_review/train.tsv --dev_path datasets/douban_book_review/dev.tsv --test_path datasets/douban_book_review/test.tsv \
--epochs_num 3 --batch_size 8 --embedding word_pos_seg --encoder transformer --mask fully_visible
实验结果表明,谷歌BERT模型在书评分类任务测试集上的准确率为87.3;
另外我们也可以使用 pretrain.py 的输出book_review_model.bin;
在models文件夹中生成finetuned_model.bin;
然后我们用它进行预测;
python3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin --vocab_path models/google_zh_vocab.txt \
--test_path datasets/douban_book_review/test_nolabel.tsv \
--prediction_path datasets/douban_book_review/prediction.tsv --labels_num 2 \
--embedding word_pos_seg --encoder transformer --mask fully_visible
在UER-py-master/datasets/douban_book_review文件夹中生成prediction.csv,–test_path 指定需要预测的文件;
–prediction_path 指定预测结果的文件;
选择使用遮罩语言模型(MLM)作为目标任务,BERT参数量大,计算较慢。我们希望加速模型运算的同时让模型仍然在下游任务上有好的表现。这里我们选择2层LSTM编码器来替代12层Transformer编码器。 我们首先下载2层LSTM编码器的预训练模型reviews_lstm_lm_model.bin。 然后在下游分类数据集上对其进行微调:
python3 run_classifier.py --pretrained_model_path models/reviews_lstm_lm_model.bin --vocab_path models/google_zh_vocab.txt --config_path models/rnn_config.json \
--train_path datasets/douban_book_review/train.tsv --dev_path datasets/douban_book_review/dev.tsv --test_path datasets/douban_book_review/test.tsv \
--epochs_num 5 --batch_size 8 --learning_rate 1e-3 --embedding word --encoder lstm --pooling mean
python3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin --vocab_path models/google_zh_vocab.txt \
--config_path models/rnn_config.json --test_path datasets/douban_book_review/test_nolabel.tsv \
--prediction_path datasets/douban_book_review/prediction.tsv \
--labels_num 2 --embedding word --encoder lstm --pooling mean
我们也可以去掉参数–pretrained_model_path models/reviews_lstm_lm_model.bin,不加载预训练模型,只能得到约81的准确率。
UER-py还支持更多的预训练模型。
在Chnsenticorp数据集上使用ELMo进行预训练和微调的示例。