Fork von https://github.com/huggingface/transformers/tree/86d5fb0b360e68de46d40265e7c707fe68c8015b/examples/pytorch/Language-Modeling am 17.05.2021.
Feinabstimmung (oder Training von Grund auf) der Bibliotheksmodelle für die Sprachmodellierung an einem Textdatensatz für GPT, GPT-2, ALBERT, BERT, DistilBERT, RoBERTa, XLNet ... GPT und GPT-2 werden mit trainiert oder optimiert ein kausaler Sprachmodellierungsverlust (CLM), während ALBERT, BERT, DistilBERT und RoBERTa mithilfe eines maskierten Sprachmodellierungsverlusts (MLM) trainiert oder verfeinert werden. XLNet verwendet Permutation Language Modeling (PLM). Weitere Informationen zu den Unterschieden zwischen diesen Zielen finden Sie in unserer Modellzusammenfassung.
Es stehen zwei Skriptsätze zur Verfügung. Der erste Satz nutzt die Trainer-API. Der zweite Satz mit no_trainer
im Suffix verwendet eine benutzerdefinierte Trainingsschleife und nutzt das ? Beschleunigen Sie die Bibliothek. Beide Sets verwenden das ? Datensatzbibliothek. Sie können sie ganz einfach an Ihre Bedürfnisse anpassen, wenn Sie eine zusätzliche Verarbeitung Ihrer Datensätze benötigen.
Hinweis: Das alte Skript run_language_modeling.py
ist hier weiterhin verfügbar.
Die folgenden Beispiele werden auf Datensätzen ausgeführt, die auf unserem Hub gehostet werden, oder mit Ihren eigenen Textdateien für Training und Validierung. Im Folgenden geben wir Beispiele für beides.
Das folgende Beispiel optimiert GPT-2 auf WikiText-2. Wir verwenden den rohen WikiText-2 (vor der Tokenisierung wurden keine Token ersetzt). Der Verlust liegt hier in der kausalen Sprachmodellierung.
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
Das Training auf einer einzelnen K80-GPU dauert etwa eine halbe Stunde und die Ausführung der Evaluierung etwa eine Minute. Nach der Feinabstimmung des Datensatzes erreicht es einen Ratlosigkeitswert von ~20.
Um Ihre eigenen Trainings- und Validierungsdateien auszuführen, verwenden Sie den folgenden Befehl:
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
Für das Training wird der integrierte HuggingFace Trainer
verwendet. Wenn Sie eine benutzerdefinierte Trainingsschleife verwenden möchten, können Sie das Skript run_clm_no_trainer.py
verwenden oder anpassen. Sehen Sie sich das Skript an, um eine Liste der unterstützten Argumente zu erhalten. Ein Beispiel ist unten dargestellt:
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
Das folgende Beispiel optimiert RoBERTa auf WikiText-2. Auch hier verwenden wir den rohen WikiText-2. Der Verlust ist anders, da BERT/RoBERTa über einen bidirektionalen Mechanismus verfügen; Wir verwenden daher denselben Verlust, der während des Vortrainings verwendet wurde: maskierte Sprachmodellierung.
Gemäß dem RoBERTa-Papier verwenden wir dynamische Maskierung anstelle statischer Maskierung. Das Modell konvergiert daher möglicherweise etwas langsamer (Überanpassung dauert mehr Epochen).
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
Um Ihre eigenen Trainings- und Validierungsdateien auszuführen, verwenden Sie den folgenden Befehl:
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
Wenn Ihr Datensatz mit einer Stichprobe pro Zeile organisiert ist, können Sie das Flag --line_by_line
verwenden (andernfalls verkettet das Skript alle Texte und teilt sie dann in Blöcke gleicher Länge auf).
Für das Training wird der integrierte HuggingFace Trainer
verwendet. Wenn Sie eine benutzerdefinierte Trainingsschleife verwenden möchten, können Sie das Skript run_mlm_no_trainer.py
verwenden oder anpassen. Sehen Sie sich das Skript an, um eine Liste der unterstützten Argumente zu erhalten. Ein Beispiel ist unten dargestellt:
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
Hinweis: Auf TPU sollten Sie das Flag --pad_to_max_length
in Verbindung mit dem Flag --line_by_line
verwenden, um sicherzustellen, dass alle Ihre Stapel die gleiche Länge haben.
Dieser Teil wurde nach examples/research_projects/mlm_wwm
verschoben.
XLNet verwendet ein anderes Trainingsziel, nämlich die Modellierung der Permutationssprache. Es handelt sich um eine autoregressive Methode zum Erlernen bidirektionaler Kontexte durch Maximieren der erwarteten Wahrscheinlichkeit über alle Permutationen der Faktorisierungsreihenfolge der Eingabesequenz.
Wir verwenden das Flag --plm_probability
, um das Verhältnis der Länge einer Spanne maskierter Token zur umgebenden Kontextlänge für die Modellierung der Permutationssprache zu definieren.
Das Flag --max_span_length
kann auch verwendet werden, um die Länge einer Spanne maskierter Token zu begrenzen, die für die Modellierung der Permutationssprache verwendet werden.
So optimieren Sie XLNet auf Wikitext-2:
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
Führen Sie zur Feinabstimmung Ihrer eigenen Trainings- und Validierungsdatei Folgendes aus:
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
Wenn Ihr Datensatz mit einer Stichprobe pro Zeile organisiert ist, können Sie das Flag --line_by_line
verwenden (andernfalls verkettet das Skript alle Texte und teilt sie dann in Blöcke gleicher Länge auf).
Hinweis: Auf TPU sollten Sie das Flag --pad_to_max_length
in Verbindung mit dem Flag --line_by_line
verwenden, um sicherzustellen, dass alle Ihre Stapel die gleiche Länge haben.