Este repositório contém o código que acompanha o artigo Pré-treinamento de modelos de linguagem com preferências humanas. A base de código é construída em torno do Hugging Face Transformers' Trainer
e contém implementações de cinco objetivos para pré-treinamento com feedback humano (PHF) discutidos no artigo, bem como retornos de chamada e scripts para avaliá-los.
Os objetivos do PHF podem ser implementados anotando os dados de treinamento com recompensas e substituindo Trainer.compute_loss
para usá-los como sinal de treinamento adicional. As recompensas são fornecidas por uma instância de apo.scorers.Scorer
: um objeto capaz de determinar, para um determinado trecho de texto, se ele está alinhado ou desalinhado com as preferências humanas, como a não-ofensividade. O marcador também é usado para avaliar amostras de LMs treinados em PHF.
A base de código é construída em torno do ecossistema e da varinha Hugging Face (para monitoramento e gerenciamento de experimentos).
Assumimos Python 3.9+. Para executar o script de treinamento para MLE na tarefa de toxicidade, faça:
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
Os scripts train.py
requerem caminhos para dois arquivos de configuração: para tarefa e para método. Arquivos de configuração para tarefas ( toxicity
, pii
, pep8
) são armazenados em arquivos YAML: configs/{task}/pretrain.yml
(para experimentos de pré-treinamento) e configs/{task}/finetuning.yml
(para ajuste fino). Os arquivos de configuração para métodos são armazenados separadamente nos diretórios configs/{task}
. Cada par de configuração tarefa-método (para pré-treinamento e ajuste fino) contém os hiperparâmetros que usamos em nossos experimentos e permite a reprodução dos resultados do artigo.
Parâmetros individuais podem ser substituídos na linha de comando usando o argumento override
. Por exemplo:
python train.py --task configs/toxicity/pretrain.yml --method configs/toxicity/mle.yml --override training.per_device_train_batch_size=8
Nome | Arquivos de configuração | Dados de treinamento | Marcador | Descrição |
---|---|---|---|---|
Toxicidade | configs/toxicity | tomekkorbak/pile-detoxify | DetoxifyToxicityScorer | A pontuação de desalinhamento é a probabilidade de toxicidade de acordo com a desintoxicação |
Informações de identificação pessoal | configs/pii | tomekkorbak/pile-pii-scrubadub | PIIScorer | A pontuação de desalinhamento é o número de PIIs (por exemplo, nomes, URLs) por caractere, de acordo com o scrubadub |
PEP8 | configs/pep8 | kejian/codeparrot-train-more-filter-3.3b-cleaned | PEP8Scorer | A pontuação de desalinhamento é o número de violações do PEP8 por caractere, de acordo com o pycodestyle |
Os seis objetivos de treinamento com feedback humano usados em nossos experimentos são implementados da seguinte forma:
Nome | Classe objetiva | Descrição |
---|---|---|
MLE | MLE | Um invólucro fino em torno do PyTorch CrossEntropyLoss |
Filtragem | MLE | Você precisa definir dataset.filter_threshold na configuração |
Treinamento condicional | MLE | Você também precisa definir dataset.conditional_training_config em config` |
Improvável | Unlikelihood | Você também precisa definir os hiperparâmetros objective.score_threshold e objective.alpha |
AWR | AWR | Você também precisa definir os hiperparâmetros objective.alpha e objective.beta |
RWR | AWR | Um caso especial de AWR com objective.alpha=1 |
Os modelos pré-treinados em nossos experimentos estão disponíveis no HugginFace Hub:
Objetivo | Toxicidade | PEP8 | Informações de identificação pessoal |
---|---|---|---|
MLE | tomekkorbak/goofy_pasteur | Kejian/poderoso-mle | tomekkorbak/nervoso_wozniak |
Mediana de filtragem | tomekkorbak/amazing_shannon | Kejian/filtragem poderosa | tomekkorbak/cocky_carson |
Condicional | tomekkorbak/hungry_saha | kejian/poderoso-condicional | tomekkorbak/boring_mcclintock |
UL | tomekkorbak/nifty_banach | Kejian/poderoso-ul | tomekkorbak/afetuoso_wescoff |
AWR | tomekkorbak/upbeat_ramanujan | Kejian/vigor-awr | tomekkorbak/confident_knuth |
RWR | tomekkorbak/keen_clarke | Kejian/mighty-rwr | tomekkorbak/gifted_hugle |
Em cada etapa de avaliação, apo.callbacks.GenerateAndScoreCallback
itera em uma lista de GenerationScenario
s fornecida no arquivo de configuração da tarefa. Para cada cenário, as amostras num_samples
são geradas e as seguintes métricas wandb são calculadas:
score
, desalinhamento médio (em amostras num_samples
) das amostras geradas atribuídas pelo pontuadorscore_max@25
, pontuação máxima média em 25 amostras (semelhante à toxicidade máxima esperada no artigo RealToxicityPrompts)current_samples
, um wandb.Table
de amostras junto com seus prompts (se houver) e pontuações Além de pontuar amostras de LM, usamos apo.callbacks.KLGPT3Callback
para estimar KL do LM atual do GPT-3. Isso requer a extração de amostras do GPT-3 que são armazenadas em cache e reutilizadas em iterações subsequentes. |
.
├── 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 }
}