于 2021 年 5 月 17 日从 https://github.com/huggingface/transformers/tree/86d5fb0b360e68de46d40265e7c707fe68c8015b/examples/pytorch/language-modeling 分叉。
微调(或从头开始训练)用于在 GPT、GPT-2、ALBERT、BERT、DistilBERT、RoBERTa、XLNet 的文本数据集上进行语言建模的库模型...GPT 和 GPT-2 使用以下方法进行训练或微调因果语言模型 (CLM) 损失,而 ALBERT、BERT、DistilBERT 和 RoBERTa 使用掩码语言模型 (MLM) 损失进行训练或微调。 XLNet 使用排列语言建模 (PLM),您可以在我们的模型摘要中找到有关这些目标之间差异的更多信息。
提供了两组脚本。第一组利用 Trainer API。后缀中带有no_trainer
的第二组使用自定义训练循环并利用 ?加快建库速度。两组都使用 ?数据集库。如果您需要对数据集进行额外处理,您可以根据需要轻松自定义它们。
注意:旧脚本run_language_modeling.py
仍然可用。
以下示例将在我们中心托管的数据集上运行,或使用您自己的文本文件进行训练和验证。我们在下面给出了两者的例子。
以下示例在 WikiText-2 上微调 GPT-2。我们使用原始 WikiText-2(在标记化之前没有替换任何标记)。这里的损失是因果语言建模的损失。
python run_clm.py
--model_name_or_path gpt2
--dataset_name wikitext
--dataset_config_name wikitext-2-raw-v1
--do_train
--do_eval
--output_dir /tmp/test-clm
在单个 K80 GPU 上训练大约需要半小时,运行评估大约需要一分钟。一旦对数据集进行微调,它的困惑度分数就会达到约 20。
要在您自己的训练和验证文件上运行,请使用以下命令:
python run_clm.py
--model_name_or_path gpt2
--train_file path_to_train_file
--validation_file path_to_validation_file
--do_train
--do_eval
--output_dir /tmp/test-clm
这使用内置的 HuggingFace Trainer
进行训练。如果您想使用自定义训练循环,您可以利用或改编run_clm_no_trainer.py
脚本。查看脚本以获取支持的参数列表。示例如下所示:
python run_clm_no_trainer.py
--dataset_name wikitext
--dataset_config_name wikitext-2-raw-v1
--model_name_or_path gpt2
--output_dir /tmp/test-clm
以下示例对 WikiText-2 上的 RoBERTa 进行微调。在这里,我们也使用原始的 WikiText-2。由于BERT/RoBERTa具有双向机制,损失不同;因此,我们使用与预训练期间使用的相同损失:掩码语言建模。
根据 RoBERTa 论文,我们使用动态掩码而不是静态掩码。因此,模型的收敛速度可能会稍慢(过度拟合需要更多的时间)。
python run_mlm.py
--model_name_or_path roberta-base
--dataset_name wikitext
--dataset_config_name wikitext-2-raw-v1
--do_train
--do_eval
--output_dir /tmp/test-mlm
要在您自己的训练和验证文件上运行,请使用以下命令:
python run_mlm.py
--model_name_or_path roberta-base
--train_file path_to_train_file
--validation_file path_to_validation_file
--do_train
--do_eval
--output_dir /tmp/test-mlm
如果您的数据集按每行一个样本进行组织,则可以使用--line_by_line
标志(否则脚本会连接所有文本,然后将它们拆分为相同长度的块)。
这使用内置的 HuggingFace Trainer
进行训练。如果您想使用自定义训练循环,您可以利用或改编run_mlm_no_trainer.py
脚本。查看脚本以获取支持的参数列表。示例如下所示:
python run_mlm_no_trainer.py
--dataset_name wikitext
--dataset_config_name wikitext-2-raw-v1
--model_name_or_path roberta-base
--output_dir /tmp/test-mlm
注意:在 TPU 上,您应该将--pad_to_max_length
标志与--line_by_line
标志结合使用,以确保所有批次具有相同的长度。
这部分已移至examples/research_projects/mlm_wwm
。
XLNet 使用不同的训练目标,即排列语言建模。它是一种自回归方法,通过最大化输入序列分解顺序的所有排列的预期似然来学习双向上下文。
我们使用--plm_probability
标志来定义屏蔽标记范围的长度与周围上下文长度的比率,以进行排列语言建模。
--max_span_length
标志还可用于限制用于排列语言建模的屏蔽标记的跨度的长度。
以下是如何在 wikitext-2 上微调 XLNet:
python run_plm.py
--model_name_or_path=xlnet-base-cased
--dataset_name wikitext
--dataset_config_name wikitext-2-raw-v1
--do_train
--do_eval
--output_dir /tmp/test-plm
要在您自己的训练和验证文件上对其进行微调,请运行:
python run_plm.py
--model_name_or_path=xlnet-base-cased
--train_file path_to_train_file
--validation_file path_to_validation_file
--do_train
--do_eval
--output_dir /tmp/test-plm
如果您的数据集按每行一个样本进行组织,则可以使用--line_by_line
标志(否则脚本会连接所有文本,然后将它们拆分为相同长度的块)。
注意:在 TPU 上,您应该将--pad_to_max_length
标志与--line_by_line
标志结合使用,以确保所有批次具有相同的长度。