使用人类偏好进行语言模型的预训练
该仓库包含了论文 使用人类偏好进行语言模型的预训练 的代码。代码库围绕 Hugging Face Transformers 的 Trainer
构建,包含针对五种使用人类反馈(PHF)进行预训练目标的实现,并附带回调和评估脚本。
PHF 目标可以通过用奖励标注训练数据并重写 Trainer.compute_loss
来实现,以使用它们作为额外的训练信号。奖励由一个 apo.scorers.Scorer
实例提供:一个能够确定给定文本是否符合或偏离人类偏好(如无冒犯性)的对象。这个打分器也用于评估从 PHF 训练的语言模型生成的样本。
代码库围绕 Hugging Face 生态系统和 wand(用于监控和实验管理)构建。
快速开始
我们假设 Python 3.9+。要运行针对毒性任务的最大似然估计(MLE)训练脚本,请执行:
pip install -r requirements.txt
wandb login # 或者设置 `WANDB_API_KEY` 和 `WANDB_PROJECT` 环境变量
export OPENAI_API_KEY='sk-your_key' # 需要用于评估
python train.py --task configs/toxicity/pretrain.yml --method configs/toxicity/mle.yml
配置
train.py
脚本需要任务和方法的两个配置文件路径。任务的配置文件(toxicity
、pii
、pep8
)存储在 YAML 文件中:configs/{task}/pretrain.yml
(用于预训练实验)和 configs/{task}/finetuning.yml
(用于微调)。方法的配置文件分开存储在 configs/{task}
目录中。每个任务-方法配置对(用于预训练和微调)包含我们在实验中使用的超参数,并允许重现论文中的结果。
可以在命令行使用 override
参数覆盖单个参数。例如:
python train.py --task configs/toxicity/pretrain.yml --method configs/toxicity/mle.yml --override training.per_device_train_batch_size=8
任务
名称 | 配置文件 | 训练数据 | 打分器 | 描述 |
---|---|---|---|---|
毒性 | configs/toxicity | tomekkorbak/pile-detoxify | DetoxifyToxicityScorer | 不符合评分是根据 detoxify 的毒性概率 |
PII | configs/pii | tomekkorbak/pile-pii-scrubadub | PIIScorer | 不符合评分是每个字符的 PII 数量(如名字、URL),根据 scrubadub |
PEP8 | configs/pep8 | kejian/codeparrot-train-more-filter-3.3b-cleaned | PEP8Scorer | 不符合评分是每个字符的 PEP8 违例数,根据 pycodestyle |
目标
我们实验中使用人类反馈训练的六个目标实现如下:
名称 | 目标类 | 描述 |
---|---|---|
MLE | MLE | 一个绕过 PyTorch CrossEntropyLoss 的薄包装 |
过滤 | MLE | 需要在配置中设置 dataset.filter_threshold |
条件训练 | MLE | 还需要在配置中设置 dataset.conditional_training_config |
不似然性 | Unlikelihood | 还需要设置超参数 objective.score_threshold 和 objective.alpha |
AWR | AWR | 还需要设置超参数 objective.alpha 和 objective.beta |
RWR | AWR | AWR 的一个特殊例子,设置 objective.alpha=1 |
预训练模型
我们实验中预训练的模型可以在 HuggingFace Hub 上找到:
指标
在每个评估步骤中,apo.callbacks.GenerateAndScoreCallback
遍历任务配置文件中提供的 GenerationScenario
列表。对于每个情景,生成 num_samples
个样本并计算以下 wandb 指标:
score
,生成样本的平均不符合度(在num_samples
样本中)分配给打分器score_max@25
,25 个样本中的平均最大分数(类似于 RealToxicityPrompts 论文中的预期最大毒性)
current_samples
,一个wandb.Table
的样本以及它们的提示内容(如果有的话)和分数
除了评分语言模型的样本,我们还使用 apo.callbacks.KLGPT3Callback
估算当前语言模型与 GPT-3 的 KL 偏差。这需要从 GPT-3 中抽样,这些样本在后续迭代中会被缓存和重用。
代码库结构
.
├── apo
│ ├── callbacks.py # 实现评估管道的回调
│ ├── dataset_wrappers.py # 用于训练的标记块流迭代器
│ ├── kl_gpt3.py # 测量与 GPT-3 的 KL 偏差的逻辑
│ ├── metrics.py # 计算语言模型样本(和数据集元素,用于调试)的指标
│ ├── models.py # 一个添加值头和公开实现细节的 GPT2LMHeadModel 子类
│ ├── objectives.py # 实现损失函数的类
│ ├── scorer_utils.py
│ ├── scorers.py # 给语言模型样本和数据集元素评分的类
│ ├── trainer.py # 一个 Hugging Face Trainer 的子类,公开了一些功能
│ └── utils.py
├── configs
│ └── pep8
│ └── pii
│ └── toxicity
├── scripts # 评估脚本
│ └── dataset_builders # 用于生成一些数据集的脚本
├── resources # 小型 git 追踪的文件,从中加载词列表或提示
└── train.py # 主训练脚本
引用
@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}
}