Este repositorio contiene el código que acompaña al artículo Preentrenamiento de modelos lingüísticos con preferencias humanas. La base de código se basa en Trainer
de Hugging Face Transformers y contiene implementaciones de cinco objetivos para el preentrenamiento con retroalimentación humana (PHF) discutidos en el documento, así como devoluciones de llamada y scripts para evaluarlos.
Los objetivos de PHF se pueden implementar anotando los datos de entrenamiento con recompensas y sobrescribiendo Trainer.compute_loss
para usarlos como señal de entrenamiento adicional. Las recompensas las proporciona una instancia de apo.scorers.Scorer
: un objeto capaz de determinar, para un texto determinado, si está alineado o desalineado con las preferencias humanas, como la no ofensiva. El evaluador también se utiliza para evaluar muestras de LM entrenados por PHF.
La base de código se basa en el ecosistema y la varita Hugging Face (para monitoreo y gestión de experimentos).
Asumimos Python 3.9+. Para ejecutar el script de entrenamiento para MLE en la tarea de toxicidad, haga lo siguiente:
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
Los scripts train.py
requieren rutas a dos archivos de configuración: para la tarea y para el método. Los archivos de configuración para tareas ( toxicity
, pii
, pep8
) se almacenan en archivos YAML: configs/{task}/pretrain.yml
(para experimentos de preentrenamiento) y configs/{task}/finetuning.yml
(para ajustes finos). Los archivos de configuración para los métodos se almacenan por separado en los directorios configs/{task}
. Cada par de configuración de método de tarea (para entrenamiento previo y ajuste fino) contiene los hiperparámetros que utilizamos en nuestros experimentos y permite reproducir los resultados del artículo.
Los parámetros individuales se pueden anular desde la línea de comando usando el argumento override
. Por ejemplo:
python train.py --task configs/toxicity/pretrain.yml --method configs/toxicity/mle.yml --override training.per_device_train_batch_size=8
Nombre | Archivos de configuración | Datos de entrenamiento | Goleador | Descripción |
---|---|---|---|---|
Toxicidad | configs/toxicity | tomekkorbak/pile-detoxify | DetoxifyToxicityScorer | La puntuación de desalineación es la probabilidad de toxicidad según desintoxicar |
PII | configs/pii | tomekkorbak/pile-pii-scrubadub | PIIScorer | La puntuación de desalineación es la cantidad de PII (por ejemplo, nombres, URL) por carácter, según Scrubadub. |
pep8 | configs/pep8 | kejian/codeparrot-train-more-filter-3.3b-cleaned | PEP8Scorer | La puntuación de desalineación es la cantidad de violaciones de PEP8 por personaje, según pycodestyle |
Los seis objetivos de entrenamiento con retroalimentación humana utilizados en nuestros experimentos se implementan de la siguiente manera:
Nombre | clase objetiva | Descripción |
---|---|---|
MLE | MLE | Una envoltura delgada alrededor de PyTorch CrossEntropyLoss |
Filtración | MLE | Necesita configurar dataset.filter_threshold en la configuración |
Entrenamiento condicional | MLE | También necesitas configurar dataset.conditional_training_config en config` |
improbable | Unlikelihood | También es necesario configurar los hiperparámetros objective.score_threshold y objective.alpha |
AWR | AWR | También es necesario configurar los hiperparámetros objective.alpha y objective.beta |
RWR | AWR | Un caso especial de AWR con objective.alpha=1 |
Los modelos previamente entrenados en nuestros experimentos están disponibles en HugginFace Hub:
Objetivo | Toxicidad | pep8 | PII |
---|---|---|---|
MLE | tomekkorbak/goofy_pasteur | kejian/mighty-mle | tomekkorbak/nervous_wozniak |
Mediana de filtrado | tomekkorbak/amazing_shannon | kejian/poderoso-filtrado | tomekkorbak/cocky_carson |
Condicional | tomekkorbak/hungry_saha | kejian/poderoso-condicional | tomekkorbak/boring_mcclintock |
UL | tomekkorbak/nifty_banach | kejian/poderoso-ul | tomekkorbak/afectivo_wescoff |
AWR | tomekkorbak/upbeat_ramanujan | kejian/vigor-awr | tomekkorbak/confident_knuth |
RWR | tomekkorbak/keen_clarke | kejian/mighty-rwr | tomekkorbak/gifted_hugle |
En cada paso de evaluación, apo.callbacks.GenerateAndScoreCallback
itera sobre una lista de GenerationScenario
proporcionada en el archivo de configuración de la tarea. Para cada escenario, se generan muestras num_samples
y se calculan las siguientes métricas de wandb:
score
, desalineación promedio (entre num_samples
muestras) de las muestras generadas asignadas por el evaluadorscore_max@25
, puntuación máxima promedio en 25 muestras (similar a la toxicidad máxima esperada en el artículo RealToxicityPrompts)current_samples
, una wandb.Table
de muestras junto con sus indicaciones (si las hay) y puntuaciones Además de calificar muestras de LM, utilizamos apo.callbacks.KLGPT3Callback
para estimar el KL del LM actual a partir de GPT-3. Esto requiere extraer muestras de GPT-3 que se almacenan en caché y se reutilizan en iteraciones posteriores. |
.
├── 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 }
}