Dieses Repo enthält den Code, der dem Papier Pretraining Language Models with Human Preferences beiliegt. Die Codebasis basiert auf Trainer
von Hugging Face Transformers und enthält Implementierungen von fünf Zielen für das Vortraining mit menschlichem Feedback (PHF), die im Artikel besprochen werden, sowie Rückrufe und Skripte zu deren Auswertung.
PHF-Ziele können umgesetzt werden, indem die Trainingsdaten mit Belohnungen versehen und Trainer.compute_loss
überschrieben werden, um sie als zusätzliches Trainingssignal zu verwenden. Belohnungen werden durch eine Instanz von apo.scorers.Scorer
bereitgestellt: ein Objekt, das für einen bestimmten Textabschnitt bestimmen kann, ob er mit menschlichen Präferenzen, wie z. B. Nichtbeleidigung, übereinstimmt oder nicht. Der Scorer wird auch zur Auswertung von Stichproben von PHF-trainierten LMs verwendet.
Die Codebasis basiert auf dem Hugging Face-Ökosystem und dem Zauberstab (zur Überwachung und Experimentverwaltung).
Wir gehen von Python 3.9+ aus. Um das Trainingsskript für MLE für die Toxizitätsaufgabe auszuführen, gehen Sie wie folgt vor:
pip install -r requirements.txt
wandb login # or set `WANDB_API_KEY` and `WANDB_PROJECT` env variables
export OPENAI_API_KEY= ' sk-your_key ' # needed for evaluation
python train.py --task configs/toxicity/pretrain.yml --method configs/toxicity/mle.yml
Die train.py
-Skripte erfordern Pfade zu zwei Konfigurationsdateien: für die Aufgabe und für die Methode. Konfigurationsdateien für Aufgaben ( toxicity
, pii
, pep8
) werden in YAML-Dateien gespeichert: configs/{task}/pretrain.yml
(für Vortrainingsexperimente) und configs/{task}/finetuning.yml
(für die Feinabstimmung). Konfigurationsdateien für Methoden werden separat in den Verzeichnissen configs/{task}
gespeichert. Jedes Aufgaben-Methoden-Konfigurationspaar (zum Vortraining und zur Feinabstimmung) enthält die Hyperparameter, die wir in unseren Experimenten verwendet haben, und ermöglicht die Reproduktion der Ergebnisse aus der Arbeit.
Einzelne Parameter können über die Befehlszeile mit dem Argument override
überschrieben werden. Zum Beispiel:
python train.py --task configs/toxicity/pretrain.yml --method configs/toxicity/mle.yml --override training.per_device_train_batch_size=8
Name | Konfigurationsdateien | Trainingsdaten | Torschütze | Beschreibung |
---|---|---|---|---|
Toxizität | configs/toxicity | tomekkorbak/pile-detoxify | DetoxifyToxicityScorer | Der Fehlausrichtungs-Score ist die Wahrscheinlichkeit einer Toxizität gemäß Detoxify |
PII | configs/pii | tomekkorbak/pile-pii-scrubadub | PIIScorer | Der Misalignment Score ist laut Scrubadub die Anzahl der PIIs (z. B. Namen, URLs) pro Zeichen |
PEP8 | configs/pep8 | kejian/codeparrot-train-more-filter-3.3b-cleaned | PEP8Scorer | Der Misalignment Score ist laut Pycodestyle die Anzahl der PEP8-Verstöße pro Zeichen |
Die in unseren Experimenten verwendeten sechs Ziele für das Training mit menschlichem Feedback werden wie folgt umgesetzt:
Name | Objektive Klasse | Beschreibung |
---|---|---|
MLE | MLE | Eine dünne Hülle um PyTorch CrossEntropyLoss |
Filtern | MLE | Sie müssen dataset.filter_threshold in der Konfiguration festlegen |
Konditionelles Training | MLE | Sie müssen auch dataset.conditional_training_config in config` festlegen |
Unwahrscheinlichkeit | Unlikelihood | Sie müssen außerdem die Hyperparameter objective.score_threshold und objective.alpha festlegen |
AWR | AWR | Sie müssen außerdem die Hyperparameter objective.alpha und objective.beta festlegen |
RWR | AWR | Ein Sonderfall von AWR mit objective.alpha=1 |
Die in unseren Experimenten vorab trainierten Modelle sind auf HugginFace Hub verfügbar:
Objektiv | Toxizität | PEP8 | PII |
---|---|---|---|
MLE | tomekkorbak/goofy_pasteur | kejian/mighty-mle | tomekkorbak/nervous_wozniak |
Median filtern | tomekkorbak/amazing_shannon | kejian/mighty-filtering | tomekkorbak/cocky_carson |
Bedingt | tomekkorbak/hungry_saha | kejian/mächtig-bedingt | tomekkorbak/boring_mcclintock |
UL | tomekkorbak/nifty_banach | kejian/mächtig-ul | tomekkorbak/affectionate_wescoff |
AWR | tomekkorbak/upbeat_ramanujan | kejian/kraft-awr | tomekkorbak/confident_knuth |
RWR | tomekkorbak/keen_clarke | kejian/mighty-rwr | tomekkorbak/gifted_hugle |
Bei jedem Evaluierungsschritt iteriert apo.callbacks.GenerateAndScoreCallback
über eine Liste von GenerationScenario
s, die in der Aufgabenkonfigurationsdatei bereitgestellt werden. Für jedes Szenario werden num_samples
-Beispiele generiert und die folgenden Wandb-Metriken berechnet:
score
, durchschnittliche Fehlausrichtung (über num_samples
Stichproben) der generierten Stichproben, die vom Bewerter zugewiesen wurdenscore_max@25
, durchschnittliche maximale Punktzahl in 25 Proben (ähnlich der erwarteten maximalen Toxizität im RealToxicityPrompts-Artikel)current_samples
, eine wandb.Table
mit Beispielen zusammen mit ihren Eingabeaufforderungen (falls vorhanden) und Bewertungen Zusätzlich zur Bewertung von LM-Stichproben verwenden wir apo.callbacks.KLGPT3Callback
um KL des aktuellen LM aus GPT-3 zu schätzen. Dies erfordert das Ziehen von Beispielen aus GPT-3, die zwischengespeichert und in nachfolgenden Iterationen wiederverwendet werden. |
.
├── apo
│ ├── callbacks.py # callbacks implementing the evaluation pipeline
│ ├── dataset_wrappers.py # an iterable for streaming blocks of tokens for training
│ ├── kl_gpt3.py # logic for measuring KL from GPT-3
│ └── metrics.py # metrics computed on LM samples (and dataset elements, for debugging)
│ └── models.py # a subclass for GPT2LMHeadModel adding value heads and exposing implementation details
│ └── objectives.py # classes implementing loss functions
│ ├── scorer_utils.py
│ ├── scorers.py # classes for scoring LM samples and dataset elements
│ └── trainer.py # a subclass for Hugging Face Trainer exposing some functionalities
│ └── utils.py
├── configs
│ └── pep8
│ └── pii
│ └── toxicity
├── scripts # scripts for evaluation
│ dataset_builders # scripts used to generate some of the datasets
├── resources # small, git-tracked files from which lists of words or prompts are loaded
└── train.py # the main training script
@misc { https://doi.org/10.48550/arxiv.2302.08582 ,
doi = { 10.48550/ARXIV.2302.08582 } ,
url = { https://arxiv.org/abs/2302.08582 } ,
author = { Korbak, Tomasz and Shi, Kejian and Chen, Angelica and Bhalerao, Rasika and Buckley, Christopher L. and Phang, Jason and Bowman, Samuel R. and Perez, Ethan } ,
keywords = { Computation and Language (cs.CL), Machine Learning (cs.LG), FOS: Computer and information sciences, FOS: Computer and information sciences } ,
title = { Pretraining Language Models with Human Preferences } ,
publisher = { arXiv } ,
year = { 2023 } ,
copyright = { Creative Commons Attribution 4.0 International }
}