於 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
標誌結合使用,以確保所有批次具有相同的長度。