Ce référentiel contient le code accompagnant l'article Pré-entraînement des modèles linguistiques avec des préférences humaines. La base de code est construite autour Trainer
de Hugging Face Transformers et contient des implémentations de cinq objectifs de pré-formation avec retour humain (PHF) discutés dans l'article, ainsi que des rappels et des scripts pour les évaluer.
Les objectifs du PHF peuvent être mis en œuvre en annotant les données d'entraînement avec des récompenses et en écrasant Trainer.compute_loss
pour les utiliser comme signal d'entraînement supplémentaire. Les récompenses sont fournies par une instance de apo.scorers.Scorer
: un objet capable de déterminer, pour un morceau de texte donné, s'il est aligné ou non avec les préférences humaines telles que le caractère non offensant. Le marqueur est également utilisé pour évaluer des échantillons provenant de LM formés par PHF.
La base de code est construite autour de l'écosystème et de la baguette Hugging Face (pour la surveillance et la gestion des expériences).
Nous supposons Python 3.9+. Pour exécuter le script de formation pour MLE sur la tâche de toxicité, procédez :
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
Les scripts train.py
nécessitent des chemins vers deux fichiers de configuration : pour la tâche et pour la méthode. Les fichiers de configuration des tâches ( toxicity
, pii
, pep8
) sont stockés dans des fichiers YAML : configs/{task}/pretrain.yml
(pour les expériences de pré-entraînement) et configs/{task}/finetuning.yml
(pour le réglage fin). Les fichiers de configuration des méthodes sont stockés séparément dans les répertoires configs/{task}
. Chaque paire de configurations tâche-méthode (pour le pré-entraînement et pour le réglage fin) contient les hyperparamètres que nous avons utilisés dans nos expériences et permet de reproduire les résultats de l'article.
Les paramètres individuels peuvent être remplacés à partir de la ligne de commande à l'aide de l'argument override
. Par exemple:
python train.py --task configs/toxicity/pretrain.yml --method configs/toxicity/mle.yml --override training.per_device_train_batch_size=8
Nom | Fichiers de configuration | Données de formation | Buteur | Description |
---|---|---|---|---|
Toxicité | configs/toxicity | tomekkorbak/pile-detoxify | DetoxifyToxicityScorer | Le score de désalignement est la probabilité de toxicité selon la détoxification |
Informations personnelles | configs/pii | tomekkorbak/pile-pii-scrubadub | PIIScorer | Le score de désalignement est le nombre de PII (par exemple, noms, URL) par caractère, selon Scrubadub |
PEP8 | configs/pep8 | kejian/codeparrot-train-more-filter-3.3b-cleaned | PEP8Scorer | Le score de désalignement est le nombre de violations PEP8 par caractère, selon le pycodestyle |
Les six objectifs de formation avec feedback humain utilisés dans nos expérimentations sont mis en œuvre comme suit :
Nom | Classe d'objectif | Description |
---|---|---|
MLE | MLE | Un mince wrapper autour de PyTorch CrossEntropyLoss |
Filtration | MLE | Vous devez définir dataset.filter_threshold dans la configuration |
Formation conditionnelle | MLE | Vous devez également définir dataset.conditional_training_config dans config` |
Improbable | Unlikelihood | Vous devez également définir les hyperparamètres objective.score_threshold et objective.alpha |
AWR | AWR | Vous devez également définir les hyperparamètres objective.alpha et objective.beta |
RWR | AWR | Un cas particulier d'AWR avec objective.alpha=1 |
Les modèles pré-entraînés dans nos expériences sont disponibles sur HugginFace Hub :
Objectif | Toxicité | PEP8 | Informations personnelles |
---|---|---|---|
MLE | tomekkorbak/goofy_pasteur | kejian/puissant-mle | tomekkorbak/nervous_wozniak |
Médiane de filtrage | tomekkorbak/amazing_shannon | kejian/puissant-filtrage | tomekkorbak/cocky_carson |
Conditionnel | tomekkorbak/hungry_saha | kejian/puissant-conditionnel | tomekkorbak/boring_mcclintock |
UL | tomekkorbak/nifty_banach | kejian/puissant-ul | tomekkorbak/affectionate_wescoff |
AWR | tomekkorbak/upbeat_ramanujan | kejian/vigor-awr | tomekkorbak/confident_knuth |
RWR | tomekkorbak/keen_clarke | kejian/puissant-rwr | tomekkorbak/gifted_hugle |
À chaque étape d'évaluation, apo.callbacks.GenerateAndScoreCallback
parcourt une liste de GenerationScenario
fournie dans le fichier de configuration de la tâche. Pour chaque scénario, des échantillons num_samples
sont générés et les métriques wandb suivantes sont calculées :
score
, désalignement moyen (sur num_samples
échantillons) des échantillons générés attribués par le correcteurscore_max@25
, score maximum moyen sur 25 échantillons (similaire à la toxicité maximale attendue dans l'article RealToxicityPrompts)current_samples
, un wandb.Table
d'échantillons avec leurs invites (le cas échéant) et leurs scores En plus de noter les échantillons LM, nous utilisons apo.callbacks.KLGPT3Callback
pour estimer le KL du LM actuel à partir de GPT-3. Cela nécessite de prélever des échantillons de GPT-3 qui sont mis en cache et réutilisés dans les itérations suivantes. |
.
├── 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 }
}