Skip to content

下游任务微调

zhezhaoa edited this page Aug 12, 2023 · 10 revisions

TencentPretrain支持多种下游任务,包括文本分类(classification)、文本对分类(pair classification)、基于文档的问答(document-based question answering)、序列标注(sequence labeling)、机器阅读理解(machine reading comprehension)等。注意到下游任务使用的模型信息(配置文件和命令行设置)需要与预训练阶段的信息一致。本章节用到的预训练模型可以在预训练模型仓库章节中下载。本章节用到的数据集可以在下游任务数据集章节中下载。

分类

run_classifier.py 在编码器上接两层前向神经网络。 run_classifier.py文本分类使用示例:

python3 finetune/run_classifier.py --pretrained_model_path models/google_zh_model.bin --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/bert/base_config.json \
                                   --train_path datasets/book_review/train.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --epochs_num 3 --batch_size 64 \
                                   --embedding word pos seg --encoder transformer --mask fully_visible

默认使用CLS位置向量进行预测(--pooling first)。

run_classifier.py 文本对分类使用示例:

python3 finetune/run_classifier.py --pretrained_model_path models/google_zh_model.bin --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/bert/base_config.json \
                                   --train_path datasets/lcqmc/train.tsv \
                                   --dev_path datasets/lcqmc/dev.tsv \
                                   --test_path datasets/lcqmc/test.tsv \
                                   --epochs_num 3 --batch_size 64 \
                                   --embedding word pos seg --encoder transformer --mask fully_visible

可以从下游任务数据集章节中下载LCQMC数据集并把它放到 datasets 文件夹下。

inference/run_classifier_infer.py文本分类推理(预测)使用示例:

python3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin --vocab_path models/google_zh_vocab.txt \
                                          --config_path models/bert/base_config.json \
                                          --test_path datasets/book_review/test_nolabel.tsv \
                                          --prediction_path datasets/book_review/prediction.tsv \
                                          --seq_length 128 --labels_num 2 --output_logits --output_prob \
                                          --embedding word pos seg --encoder transformer --mask fully_visible

对于分类数据集,模型会对text_a列的文本进行预测。对于文本对分类数据集,模型会对text_a列和text_b列的文本进行预测。 --labels_num 指定分类任务标签的个数。由于待预测文件中不包括标签,因此需要给出标签个数的信息。 --output_logits 指定输出模型预测的logits,列名为logits。 --output_prob 指定输出模型预测的概率,列名为prob。 --seq_length 指定序列长度,推荐和训练时保持一致。

注意到BERT模型和RoBERTa模型的网络结构相同,因此加载BERT和RoBERTa的方式没有区别。 由于配置文件中已经给出了模型的模块类型信息,因此我们可以不在命令行中进行指定:

python3 finetune/run_classifier.py --pretrained_model_path models/google_zh_model.bin --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/bert/base_config.json \
                                   --train_path datasets/book_review/train.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --epochs_num 3 --batch_size 64

python3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin --vocab_path models/google_zh_vocab.txt \
                                          --config_path models/bert/base_config.json \
                                          --test_path datasets/book_review/test_nolabel.tsv \
                                          --prediction_path datasets/book_review/prediction.tsv \
                                          --seq_length 128 --labels_num 2 --output_logits --output_prob

在后面的示例中,我们不在命令行中显式的指定模型的模块类型信息。

使用ALBERT模型进行分类任务示例:

python3 finetune/run_classifier.py --pretrained_model_path models/google_zh_albert_base_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/albert/base_config.json \
                                   --train_path datasets/book_review/train.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --learning_rate 4e-5 --epochs_num 5 --batch_size 32

ALBERT的效果对学习率、训练轮数等超参数比较敏感,有时需要多次尝试。在ALBERT预训练阶段,dropout是被关掉的(参见 models/albert/base_config.json)。推荐在微调阶段将配置文件中的dropout设置为0.1。 使用在下游任务上微调后的ALBERT模型进行预测:

python3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin \
                                          --vocab_path models/google_zh_vocab.txt \
                                          --config_path models/albert/base_config.json \
                                          --test_path datasets/book_review/test_nolabel.tsv \
                                          --prediction_path datasets/book_review/prediction.tsv \
                                          --labels_num 2

使用GPT-2预训练模型进行分类任务微调和推理示例:

python3 finetune/run_classifier.py --pretrained_model_path models/cluecorpussmall_gpt2_seq1024_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/gpt2/config.json \
                                   --train_path datasets/book_review/train.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --epochs_num 3 --batch_size 32 \
                                   --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/gpt2/config.json \
                                          --test_path datasets/book_review/test_nolabel.tsv \
                                          --prediction_path datasets/book_review/prediction.tsv \
                                          --labels_num 2 --pooling mean

这里我们使用了 --pooling mean 。同样我们还可以使用 --pooling max--pooling last 。但是由于这里使用了语言模型(--mask causal),--pooling first (CLS位置向量)是不能使用的。

使用LSTM预训练模型进行分类任务微调和推理示例:

python3 finetune/run_classifier.py --pretrained_model_path models/cluecorpussmall_lstm_lm_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/rnn/lstm_config.json \
                                   --train_path datasets/book_review/train.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --learning_rate 1e-3 --epochs_num 5 --batch_size 64 \
                                   --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/lstm_config.json \
                                          --test_path datasets/book_review/test_nolabel.tsv \
                                          --prediction_path datasets/book_review/prediction.tsv \
                                          --labels_num 2 --pooling mean

使用ELMo预训练模型进行分类任务微调和推理示例:

python3 finetune/run_classifier.py --pretrained_model_path models/cluecorpussmall_elmo_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/rnn/bilstm_config.json \
                                   --train_path datasets/book_review/train.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --learning_rate 5e-4 --epochs_num 5 --batch_size 64 --seq_length 192 \
                                   --pooling max

python3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin \
                                          --vocab_path models/google_zh_vocab.txt \
                                          --config_path models/rnn/bilstm_config.json \
                                          --test_path datasets/book_review/test_nolabel.tsv \
                                          --prediction_path datasets/book_review/prediction.tsv \
                                          --seq_length 192 --labels_num 2 \
                                          --pooling max

使用GatedCNN预训练模型进行分类任务微调和推理示例:

python3 finetune/run_classifier.py --pretrained_model_path models/cluecorpussmall_gatedcnn_lm_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/cnn/gatedcnn_9_config.json \
                                   --train_path datasets/book_review/train.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --learning_rate 5e-5 --epochs_num 5  --batch_size 64 \
                                   --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/cnn/gatedcnn_9_config.json \
                                          --test_path datasets/book_review/test_nolabel.tsv \
                                          --prediction_path datasets/book_review/prediction.tsv \
                                          --labels_num 2 --pooling mean

TencentPretrain支持对分类任务进行多任务学习,模型共享词向量层和编码层。 同时对两个情感分类数据集进行微调示例:

python3 finetune/run_classifier_mt.py --pretrained_model_path models/google_zh_model.bin --vocab_path models/google_zh_vocab.txt \
                                      --config_path models/bert/base_config.json \
                                      --dataset_path_list datasets/book_review/ datasets/chnsenticorp/ \
                                      --epochs_num 1 --batch_size 64

--dataset_path_list 指定多任务数据集文件夹路径。每个文件夹需要包括训练集 train.tsv 和验证集 dev.tsv

多任务分类器推理(预测)使用示例:

python3 inference/run_classifier_mt_infer.py --load_model_path models/multitask_classifier_model.bin --vocab_path models/google_zh_vocab.txt \
                                             --config_path models/bert/base_config.json \
                                             --test_path datasets/book_review/test_nolabel.tsv \
                                             --prediction_path datasets/book_review/prediction.tsv \
                                             --labels_num_list 2 2 \
                                             --batch_size 64 --output_logits --output_prob

--test_path 指定需要预测的文件。 --prediction_path 指定预测结果的文件。其包括3列,label、logits、prob。后两列通过 --output_logits--output_prob 指定。多任务的结果用符号 | 进行分隔。预测结果(包含两个任务的分类器)示例:

label    logits    prob
1|0	 1.5531 2.6371|3.2732 -3.3976	  0.2527 0.7473|0.9987 0.0013
0|0	 4.6869 -2.2779|1.9069 -2.2426	  0.9990 0.0009|0.9845 0.0155

TencentPretrain支持对分类任务进行网格搜索:

python3 finetune/run_classifier_grid.py --pretrained_model_path models/cluecorpussmall_roberta_tiny_seq512_model.bin \
                                        --vocab_path models/google_zh_vocab.txt \
                                        --config_path models/bert/tiny_config.json \
                                        --train_path datasets/book_review/train.tsv \
                                        --dev_path datasets/book_review/dev.tsv \
                                        --learning_rate_list 3e-5 1e-4 3e-4 --epochs_num_list 3 5 8 --batch_size_list 32 64

这里对不同的大小的学习率,训练轮数, batch size 进行网格搜索。

TencentPretrain支持对分类任务进行蒸馏。 首先训练teacher模型。这里使用24层的RoBERTa-WWM-large模型。可在本项目中下载中文RoBERTa-WWM-large预训练模型并在其基础上进行训练,使用示例:

python3 finetune/run_classifier.py --pretrained_model_path models/cluecorpussmall_roberta_wwm_large_seq512_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/bert/large_config.json \
                                   --output_model_path models/teacher_classifier_model.bin \
                                   --train_path datasets/book_review/train.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --epochs_num 3 --batch_size 32

然后使用teacher模型进行预测,生成伪标签以及logits:

python3 inference/run_classifier_infer.py --load_model_path models/teacher_classifier_model.bin \
                                          --vocab_path models/google_zh_vocab.txt \
                                          --config_path models/bert/large_config.json \
                                          --test_path text.tsv \
                                          --prediction_path label_logits.tsv \
                                          --labels_num 2 --output_logits

输入文件 text.tsv 包括文本,即包括text_a列(对于文本对分类,则包括text_a和text_b列)。text.tsv 可以是下游任务数据集的训练集/验证集/测试集,比如,可以把 datasets/book_review/train.tsv 作为输入( --test_path )。但更推荐使用和下游任务数据集相似的大规模外部数据,比如对于情感分类数据集,可以从网络中爬取大规模的评论文本。更多的数据通常能为蒸馏带来更好的效果。 Teacher模型输出的预测结果 label_logits.tsv 包括label列和logits列。 然后将预测结果 label_logits.tsv 和原始文本 text.tsv 合并为 text_label_logits.tsv 。这个文件包括text_a列(对于文本对分类,则包括text_a和text_b列)、label列(硬标签)、和logits列(软标签)。 这里,student模型为BERT-tiny模型。可在本项目中下载BERT-tiny预训练模型并在其基础上进行训练。 我们让BERT-tiny模型同时学习BERT-large模型预测的硬标签和软标签:

python3 finetune/run_classifier.py --pretrained_model_path models/cluecorpussmall_roberta_tiny_seq512_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/bert/tiny_config.json \
                                   --train_path text_label_logits.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --epochs_num 3 --batch_size 64 --soft_targets --soft_alpha 0.5

--soft_targets 指定模型读取logits列进行训练,这里使用mean-squared-error(MSE)损失函数。 --soft_alpha 指定软标签loss的权重。训练的loss为硬标签损失cross-entropy(CE)和软标签损失mean-squared-error(MSE)的加权平均。

TencentPretrain支持使用对抗训练对下游任务进行微调:

python3 finetune/run_classifier.py --pretrained_model_path models/google_zh_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/bert/base_config.json \
                                   --train_path datasets/book_review/train.tsv \
                                   --dev_path datasets/book_review/dev.tsv \
                                   --test_path datasets/book_review/test.tsv \
                                   --epochs_num 3 --batch_size 64 \
                                   --use_adv --adv_type fgm

TencentPretrain支持使用孪生网络对下游分类任务进行微调。两个网络分别处理两个文本,然后在上层进行交互,对文本对进行预测。使用基于Transformer编码器的孪生网络在OCNLI任务上微调和推理示例:

python3 finetune/run_classifier_siamese.py --pretrained_model_path models/google_zh_model.bin \
                                           --vocab_path models/google_zh_vocab.txt \
                                           --config_path models/sbert/base_config.json \
                                           --train_path datasets/ocnli/train_50k.tsv \
                                           --dev_path datasets/ocnli/dev.tsv \
                                           --epochs_num 3 --batch_size 32

python3 inference/run_classifier_siamese_infer.py --load_model_path models/finetuned_model.bin \
                                                  --vocab_path models/google_zh_vocab.txt \
                                                  --config_path models/sbert/base_config.json \
                                                  --test_path datasets/ocnli/test_nolabel.tsv \
                                                  --prediction_path datasets/ocnli/prediction.tsv \
                                                  --labels_num 3

使用基于LSTM编码器的孪生网络在OCNLI任务上微调和推理示例:

python3 finetune/run_classifier_siamese.py --vocab_path models/google_zh_vocab.txt \
                                           --config_path models/rnn/siamese_lstm_config.json \
                                           --train_path datasets/ocnli/train_50k.tsv \
                                           --dev_path datasets/ocnli/dev.tsv \
                                           --learning_rate 1e-4 --epochs_num 3 --batch_size 32

python3 inference/run_classifier_siamese_infer.py --load_model_path models/finetuned_model.bin \
                                                  --vocab_path models/google_zh_vocab.txt \
                                                  --config_path models/rnn/siamese_lstm_config.json \
                                                  --test_path datasets/ocnli/test_nolabel.tsv \
                                                  --prediction_path datasets/ocnli/prediction.tsv \
                                                  --labels_num 3

TencentPretrain支持基于模板进行分类任务的微调和推理。

使用基于字的模型进行微调和推理示例:

python3 finetune/run_classifier_prompt.py --pretrained_model_path models/google_zh_model.bin \
                                          --vocab_path models/google_zh_vocab.txt \
                                          --config_path models/bert/base_config.json \
                                          --train_path datasets/chnsenticorp/train.tsv \
                                          --dev_path datasets/chnsenticorp/dev.tsv \
                                          --test_path datasets/chnsenticorp/test.tsv \
                                          --prompt_path models/prompts.json --prompt_id chnsenticorp_char \
                                          --learning_rate 3e-5 --epochs_num 3 --batch_size 64

python3 inference/run_classifier_prompt_infer.py --load_model_path models/finetuned_model.bin \
                                                 --vocab_path models/google_zh_vocab.txt \
                                                 --config_path models/bert/base_config.json \
                                                 --test_path datasets/chnsenticorp/test_nolabel.tsv \
                                                 --prediction_path datasets/chnsenticorp/prediction.tsv \
                                                 --prompt_path models/prompts.json --prompt_id chnsenticorp_char

使用基于词的模型进行微调和推理示例:

python3 finetune/run_classifier_prompt.py --pretrained_model_path models/cluecorpussmall_roberta_word_base_seq512_model.bin \
                                          --spm_model_path models/cluecorpussmall_spm.model \
                                          --config_path models/bert/base_config.json \
                                          --train_path datasets/chnsenticorp/train.tsv \
                                          --dev_path datasets/chnsenticorp/dev.tsv \
                                          --test_path datasets/chnsenticorp/test.tsv \
                                          --prompt_path models/prompts.json --prompt_id chnsenticorp_word \
                                          --learning_rate 3e-5 --epochs_num 3 --batch_size 64

python3 inference/run_classifier_prompt_infer.py --load_model_path models/finetuned_model.bin \
                                                 --spm_model_path models/cluecorpussmall_spm.model \
                                                 --config_path models/bert/base_config.json \
                                                 --test_path datasets/chnsenticorp/test_nolabel.tsv \
                                                 --prediction_path datasets/chnsenticorp/prediction.tsv \
                                                 --prompt_path models/prompts.json --prompt_id chnsenticorp_word

使用基于字和基于词的模型进行零样本学习示例:

python3 finetune/run_classifier_prompt.py --pretrained_model_path models/google_zh_model.bin \
                                          --vocab_path models/google_zh_vocab.txt \
                                          --config_path models/bert/base_config.json \
                                          --train_path datasets/chnsenticorp/train.tsv \
                                          --dev_path datasets/chnsenticorp/dev.tsv \
                                          --test_path datasets/chnsenticorp/test.tsv \
                                          --prompt_path models/prompts.json --prompt_id chnsenticorp_char \
                                          --epochs_num 0

python3 finetune/run_classifier_prompt.py --pretrained_model_path models/cluecorpussmall_roberta_word_base_seq512_model.bin \
                                          --spm_model_path models/cluecorpussmall_spm.model \
                                          --config_path models/bert/base_config.json \
                                          --train_path datasets/chnsenticorp/train.tsv \
                                          --dev_path datasets/chnsenticorp/dev.tsv \
                                          --test_path datasets/chnsenticorp/test.tsv \
                                          --prompt_path models/prompts.json --prompt_id chnsenticorp_word \
                                          --epochs_num 0

--epochs_num 0 表明我们不使用训练样本。

TencentPretrain支持multi-label分类任务的微调和推理。一条样本可能有多个标签。这里使用 Toxic Comment Classification Challenge 英文数据集。使用BERT在Toxic Comment Classification Challenge(TencentPretrain支持的格式)数据集上微调和推理示例:

python3 finetune/run_classifier_multi_label.py --pretrained_model_path models/bert_base_en_uncased_model.bin \
                                               --vocab_path models/google_uncased_en_vocab.txt \
                                               --config_path models/bert/base_config.json \
                                               --train_path datasets/toxic_comment/train.tsv \
                                               --dev_path datasets/toxic_comment/dev.tsv \
                                               --epochs_num 3 --batch_size 64 --seq_length 128

python3 inference/run_classifier_multi_label_infer.py --load_model_path models/finetuned_model.bin \
                                                      --vocab_path models/google_uncased_en_vocab.txt \
                                                      --config_path models/bert/base_config.json \
                                                      --test_path datasets/toxic_comment/dev.tsv \
                                                      --prediction_path datasets/toxic_comment/prediction.tsv \
                                                      --seq_length 128 --labels_num 7

基于文档的问答

run_dbqa.py 使用和 run_classifier.py 相同的网络结构。 基于文档的问答任务可以转换为文本对分类任务,text_a列为问题,text_b列包含可能存在答案的句子。 run_dbqa.py 使用示例:

python3 finetune/run_dbqa.py --pretrained_model_path models/google_zh_model.bin \
                             --vocab_path models/google_zh_vocab.txt \
                             --config_path models/bert/base_config.json \
                             --train_path datasets/nlpcc-dbqa/train.tsv \
                             --dev_path datasets/nlpcc-dbqa/dev.tsv \
                             --test_path datasets/nlpcc-dbqa/test.tsv \
                             --epochs_num 3 --batch_size 64

inference/run_classifier_infer.py 基于文档的问答任务预测使用示例:

python3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin \
                                          --vocab_path models/google_zh_vocab.txt \
                                          --config_path models/bert/base_config.json \
                                          --test_path datasets/nlpcc-dbqa/test.tsv \
                                          --prediction_path datasets/nlpcc-dbqa/prediction.tsv \
                                          --labels_num 2 --output_logits --output_prob

使用ALBERT模型进行基于文档的问答任务示例:

python3 finetune/run_dbqa.py --pretrained_model_path models/google_zh_albert_base_model.bin \
                             --vocab_path models/google_zh_vocab.txt \
                             --config_path models/albert/base_config.json \
                             --train_path datasets/nlpcc-dbqa/train.tsv \
                             --dev_path datasets/nlpcc-dbqa/dev.tsv \
                             --test_path datasets/nlpcc-dbqa/test.tsv \
                             --epochs_num 3 --batch_size 64

使用微调后的ALBERT模型进行预测示例:

python3 inference/run_classifier_infer.py --load_model_path models/finetuned_model.bin \
                                          --vocab_path models/google_zh_vocab.txt \
                                          --config_path models/albert/base_config.json \
                                          --test_path datasets/nlpcc-dbqa/test.tsv \
                                          --prediction_path datasets/nlpcc-dbqa/prediction.tsv \
                                          --labels_num 2

回归

run_regression.py 在英文回归任务STS-B(GLUE)上使用示例:

python3 finetune/run_regression.py --pretrained_model_path models/bert_base_en_uncased_model.bin \
                                   --vocab_path models/google_uncased_en_vocab.txt \
                                   --config_path models/bert/base_config.json \
                                   --train_path datasets/STS-B/train.tsv \
                                   --dev_path datasets/STS-B/dev.tsv \
                                   --epochs_num 3 --batch_size 64

inference/run_regression_infer.py 回归任务预测使用示例:

python3 inference/run_regression_infer.py --load_model_path models/finetuned_model.bin \
                                          --vocab_path models/google_uncased_en_vocab.txt \
                                          --config_path models/bert/base_config.json \
                                          --test_path datasets/STS-B/test_nolabel.tsv \
                                          --prediction_path datasets/STS-B/prediction.tsv

序列标注

run_ner.py 在编码器上接一层前向神经网络。 run_ner.py 序列标注使用示例:

python3 finetune/run_ner.py --pretrained_model_path models/google_zh_model.bin --vocab_path models/google_zh_vocab.txt \
                            --config_path models/bert/base_config.json \
                            --train_path datasets/msra_ner/train.tsv \
                            --dev_path datasets/msra_ner/dev.tsv \
                            --test_path datasets/msra_ner/test.tsv \
                            --label2id_path datasets/msra_ner/label2id.json \
                            --epochs_num 5 --batch_size 16

预测示例:

python3 inference/run_ner_infer.py --load_model_path models/finetuned_model.bin --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/bert/base_config.json \
                                   --test_path datasets/msra_ner/test_nolabel.tsv \
                                   --prediction_path datasets/msra_ner/prediction.tsv \
                                   --label2id_path datasets/msra_ner/label2id.json

使用ALBERT模型进行序列标注示例:

python3 finetune/run_ner.py --pretrained_model_path models/google_zh_albert_base_model.bin \
                            --vocab_path models/google_zh_vocab.txt \
                            --config_path models/albert/base_config.json \
                            --train_path datasets/msra_ner/train.tsv \
                            --dev_path datasets/msra_ner/dev.tsv \
                            --test_path datasets/msra_ner/test.tsv \
                            --label2id_path datasets/msra_ner/label2id.json \
                            --learning_rate 1e-4 --epochs_num 5 --batch_size 16

python3 inference/run_ner_infer.py --load_model_path models/finetuned_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/albert/base_config.json \
                                   --test_path datasets/msra_ner/test_nolabel.tsv \
                                   --prediction_path datasets/msra_ner/prediction.tsv \
                                   --label2id_path datasets/msra_ner/label2id.json

使用ELMo模型进行序列标注示例:

python3 finetune/run_ner.py --pretrained_model_path models/cluecorpussmall_elmo_model.bin \
                            --vocab_path models/google_zh_vocab.txt \
                            --config_path models/rnn/bilstm_config.json \
                            --train_path datasets/msra_ner/train.tsv \
                            --dev_path datasets/msra_ner/dev.tsv \
                            --test_path datasets/msra_ner/test.tsv \
                            --label2id_path datasets/msra_ner/label2id.json \
                            --learning_rate 5e-4 --epochs_num 5  --batch_size 16

python3 inference/run_ner_infer.py --load_model_path models/finetuned_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/rnn/bilstm_config.json \
                                   --test_path datasets/msra_ner/test_nolabel.tsv \
                                   --prediction_path datasets/msra_ner/prediction.tsv \
                                   --label2id_path datasets/msra_ner/label2id.json

可以通过 --crf_target 指定在序列标注下游任务中使用CRF。注意到当使用CRF时,只能使用单GPU进行训练和推理:

CUDA_VISIBLE_DEVICES=0 python3 finetune/run_ner.py --pretrained_model_path models/cluecorpussmall_elmo_model.bin \
                                                   --vocab_path models/google_zh_vocab.txt \
                                                   --config_path models/rnn/bilstm_config.json \
                                                   --train_path datasets/msra_ner/train.tsv \
                                                   --dev_path datasets/msra_ner/dev.tsv \
                                                   --test_path datasets/msra_ner/test.tsv \
                                                   --label2id_path datasets/msra_ner/label2id.json \
                                                   --learning_rate 5e-4 --epochs_num 5 --batch_size 16 \
                                                   --crf_target

CUDA_VISIBLE_DEVICES=0 python3 inference/run_ner_infer.py --load_model_path models/finetuned_model.bin \
                                                          --vocab_path models/google_zh_vocab.txt \
                                                          --config_path models/rnn/bilstm_config.json \
                                                          --test_path datasets/msra_ner/test_nolabel.tsv \
                                                          --prediction_path datasets/msra_ner/prediction.tsv \
                                                          --label2id_path datasets/msra_ner/label2id.json \
                                                          --crf_target

机器阅读理解

run_cmrc.py 在编码器上接一层前向神经网络。 run_cmrc.py 抽取式阅读理解使用示例:

python3 finetune/run_cmrc.py --pretrained_model_path models/google_zh_model.bin \
                             --vocab_path models/google_zh_vocab.txt \
                             --config_path models/bert/base_config.json \
                             --train_path datasets/cmrc2018/train.json \
                             --dev_path datasets/cmrc2018/dev.json \
                             --epochs_num 2 --batch_size 8 --seq_length 512

其中 train.jsondev.json 文件是squad类型格式。CMRC2018数据集的测试集答案没有公开,因此这里没有指定 --test_path

预测示例:

python3  inference/run_cmrc_infer.py --load_model_path models/finetuned_model.bin \
                                     --vocab_path models/google_zh_vocab.txt \
                                     --config_path models/bert/base_config.json \
                                     --test_path datasets/cmrc2018/test.json \
                                     --prediction_path datasets/cmrc2018/prediction.json \
                                     --seq_length 512

使用ALBERT-xxlarge模型进行抽取式阅读理解示例:

python3 finetune/run_cmrc.py --pretrained_model_path models/google_zh_albert_xxlarge_model.bin \
                             --vocab_path models/google_zh_vocab.txt \
                             --config_path models/albert/xxlarge_config.json \
                             --train_path datasets/cmrc2018/train.json \
                             --dev_path datasets/cmrc2018/dev.json \
                             --learning_rate 1e-5 --epochs_num 2 --batch_size 8 --seq_length 512

使用微调后的ALBERT模型进行预测示例:

python3 inference/run_cmrc_infer.py --load_model_path models/finetuned_model.bin \
                                    --vocab_path models/google_zh_vocab.txt \
                                    --config_path models/albert/xxlarge_config.json \
                                    --test_path datasets/cmrc2018/test.json \
                                    --prediction_path datasets/cmrc2018/prediction.json \
                                    --seq_length 512

多选式阅读理解

C3数据集是一个多选式阅读理解数据集。给定上下文和问题,需要从4个候选答案中进行选择。run_c3.py 在编码器上接一层前向神经网络。 多选式阅读理解使用示例:

python3 finetune/run_c3.py --pretrained_model_path models/google_zh_model.bin \
                           --vocab_path models/google_zh_vocab.txt \
                           --config_path models/bert/base_config.json \
                           --train_path datasets/c3/train.json \
                           --dev_path datasets/c3/dev.json \
                           --epochs_num 8 --batch_size 8 --seq_length 512 --max_choices_num 4

C3数据集的测试集答案没有公开,因此这里没有指定 --test_path 。 模型实际的batch size大小为 --batch_size 乘以 --max_choices_num 。 C3数据集的阅读理解题,最多包括4个选项,因此 --max_choices_num 设置为4。 预测示例:

python3 inference/run_c3_infer.py --load_model_path models/finetuned_model.bin \
                                  --vocab_path models/google_zh_vocab.txt \
                                  --config_path models/bert/base_config.json \
                                  --test_path datasets/c3/test.json \
                                  --prediction_path datasets/c3/prediction.json \
                                  --max_choices_num 4 --seq_length 512

使用ALBERT-xlarge模型进行多选式阅读理解示例:

python3 finetune/run_c3.py --pretrained_model_path models/google_zh_albert_xlarge_model.bin \
                           --vocab_path models/google_zh_vocab.txt \
                           --config_path models/albert/xlarge_config.json \
                           --train_path datasets/c3/train.json \
                           --dev_path datasets/c3/dev.json \
                           --epochs_num 8 --batch_size 8 --seq_length 512 --max_choices_num 4

使用微调后的ALBERT模型进行预测示例:

python3  inference/run_c3_infer.py --load_model_path models/finetuned_model.bin \
                                   --vocab_path models/google_zh_vocab.txt \
                                   --config_path models/albert/xlarge_config.json \
                                   --test_path datasets/c3/test.json \
                                   --prediction_path datasets/c3/prediction.json \
                                   --max_choices_num 4 --seq_length 512

成语完形填空

ChID数据集是一个多选式完形填空数据集。给定上下文和候选成语,需要将合适的成语填入文本中。 run_cmrc.py 成语完形填空使用示例:

python3 finetune/run_chid.py --pretrained_model_path models/google_zh_model.bin \
                             --vocab_path models/google_zh_vocab.txt \
                             --config_path models/bert/base_config.json \
                             --train_path datasets/chid/train.json \
                             --train_answer_path datasets/chid/train_answer.json \
                             --dev_path datasets/chid/dev.json \
                             --dev_answer_path datasets/chid/dev_answer.json \
                             --batch_size 24 --seq_length 64 --max_choices_num 10

预测示例:

python3 inference/run_chid_infer.py --load_model_path models/finetuned_model.bin \
                                    --vocab_path models/google_zh_vocab.txt \
                                    --config_path models/bert/base_config.json \
                                    --test_path datasets/chid/test.json \
                                    --prediction_path datasets/chid/prediction.json \
                                    --seq_length 64 --max_choices_num 10

Text2text方式微调

T5提出使用seq2seq模型去统一处理自然语言理解和自然语言生成任务。run_text2text.py加载seq2seq模型,通过text2text的方式进行微调,也就是模型的输入和输出都是字符串。Text2text方式微调使用示例:

python3 finetune/run_text2text.py --pretrained_model_path models/cluecorpussmall_t5_small_seq512_model.bin \
                                  --vocab_path models/google_zh_with_sentinel_vocab.txt \
                                  --config_path models/t5/small_config.json \
                                  --train_path datasets/book_review_text2text/train.tsv \
                                  --dev_path datasets/book_review_text2text/dev.tsv \
                                  --learning_rate 3e-4 --epochs_num 3 --batch_size 32 --seq_length 128 --tgt_seq_length 8

我们下载预训练好的T5模型然后在上面微调。可以在这里下载text2text格式的书评情感分类数据集。 使用微调后的text2text模型进行预测示例:

python3 inference/run_text2text_infer.py --load_model_path models/finetuned_model.bin \
                                         --vocab_path models/google_zh_with_sentinel_vocab.txt \
                                         --config_path models/t5/small_config.json \
                                         --test_path datasets/book_review_text2text/test_nolabel.tsv \
                                         --prediction_path datasets/book_review_text2text/prediction.tsv \
                                         --seq_length 128 --tgt_seq_length 8

使用BART-large模型进行微调和推理示例:

python3 finetune/run_text2text.py --pretrained_model_path models/cluecorpussmall_bart_large_seq512_model.bin \
                                  --vocab_path models/google_zh_vocab.txt \
                                  --config_path models/bart/large_config.json \
                                  --train_path datasets/book_review_text2text/train.tsv \
                                  --dev_path datasets/book_review_text2text/dev.tsv \
                                  --learning_rate 1e-5 --epochs_num 3 --batch_size 32 --seq_length 128 --tgt_seq_length 8

python3 inference/run_text2text_infer.py --load_model_path models/finetuned_model.bin \
                                         --vocab_path models/google_zh_vocab.txt \
                                         --config_path models/bart/large_config.json \
                                         --test_path datasets/book_review_text2text/test_nolabel.tsv \
                                         --prediction_path datasets/book_review_text2text/prediction.tsv \
                                         --seq_length 128 --tgt_seq_length 8

使用PEGASUS-base模型进行微调和推理示例:

python3 finetune/run_text2text.py --pretrained_model_path models/cluecorpussmall_pegasus_base_seq512_model.bin \
                                  --vocab_path models/google_zh_vocab.txt \
                                  --config_path models/pegasus/base_config.json \
                                  --train_path datasets/book_review_text2text/train.tsv \
                                  --dev_path datasets/book_review_text2text/dev.tsv \
                                  --learning_rate 1e-5 --epochs_num 3 --batch_size 32 --seq_length 128 --tgt_seq_length 8

python3 inference/run_text2text_infer.py --load_model_path models/finetuned_model.bin \
                                         --vocab_path models/google_zh_vocab.txt \
                                         --config_path models/pegasus/base_config.json \
                                         --test_path datasets/book_review_text2text/test_nolabel.tsv \
                                         --prediction_path datasets/book_review_text2text/prediction.tsv \
                                         --seq_length 128 --tgt_seq_length 8

SimCSE无监督文本表示

SimCSE提出使用dropout方式构建正样本用于对比学习,从而提升无监督文本表示效果。SimCSE使用示例:

python3 finetune/run_simcse.py --pretrained_model_path models/bert_base_en_uncased_model.bin \
                               --vocab_path models/google_uncased_en_vocab.txt \
                               --config_path models/bert/base_config.json \
                               --train_path datasets/STS-B/train_unsup.tsv \
                               --dev_path datasets/STS-B/dev.tsv \
                               --learning_rate 1e-5 --epochs_num 1 --batch_size 64 --seq_length 64 \
                               --pooling first --temperature 0.05 --eval_steps 200

我们下载预训练好的英文BERT模型然后在上面微调。可以在下游任务数据集章节下载STS-B数据集。这里训练集为无标签的文本(--train_path datasets/STS-B/train_unsup.tsv)。验证集为文本对和它们的相似度分数(--dev_path datasets/STS-B/dev.tsv)。每隔200步会保存一次模型(--eval_steps 200)。

在微调后的SimCSE模型上抽取特征示例:

python3 scripts/extract_features.py --load_model_path models/finetuned_model.bin \
                                    --vocab_path models/google_uncased_en_vocab.txt \
                                    --config_path models/bert/base_config.json \
                                    --test_path datasets/tencent_profile.txt \
                                    --prediction_path features.pt \
                                    --pooling first
Clone this wiki locally