本仓库包含 IF-Guide 的代码,这是我们在论文中提出的大语言模型去毒化技术:
您可以使用我们的方法,通过识别有害的训练样本并在预训练或微调期间抑制它们,来对大语言模型进行去毒化!
我们研究了训练数据如何导致大语言模型中出现有毒行为。先前大多数降低模型毒性的工作采用反应式方法,例如对预训练(且可能存在毒性的)模型进行微调,使其与人类价值观对齐。相比之下,我们提出了一种主动方法——IF-Guide——它利用影响函数来识别任何训练数据中的有害 token,并在训练期间抑制其影响。为此,我们首先证明标准影响函数无法有效发现有害训练记录。然后,我们提出了一种新的改编方法,用于衡量从训练数据到模型毒性的 token 级归因,同时提供了选择有毒训练文档的技术,以及可以集成到预训练和微调中的学习目标。此外,IF-Guide 不依赖人类偏好数据,而现有对齐方法通常需要这些数据。在评估中,我们表明 IF-Guide 能大幅降低显性和隐性毒性——与未审查模型相比最高降低 10 倍,与基线对齐方法(如 DPO 和 RAD)相比在预训练和微调场景中最高降低 3 倍。IF-Guide 计算高效:计算影响分数不需要十亿参数模型;百万参数模型——参数减少 7.5 倍——即可有效作为识别有害数据的代理。
创建 conda 环境(您可以使用任何包含 python>=3.10 的环境)并安装必要的包:
conda create -n IF-Guide python=3.10
conda activate IF-Guide
pip install -r requirements.txt
注意: 我们使用 Kronfluence 包通过 EK-FAC 计算影响分数。我们创建了一个自定义实现,以支持我们论文中引入的差分影响技术(第 4 页,公式 6)。该软件包的所有其他组成部分归功于原始创作者。谢谢!
接下来,进入工作目录:
cd src
要训练模型,请运行:
./scripts/train.sh
这会调用 train.py,它接受以下关键参数:
注意: 所有其他参数均可保留默认值,以复现我们的实验设置。这也适用于以下各节。
要微调现有模型,请运行:
./scripts/finetune.sh
这会运行 finetune.py,它使用以下附加参数:
| 参数 | 描述 |
|---|---|
--checkpoint_dir | 已保存模型的路径。如果使用预训练模型,请设为 None。 |
--max_steps | 微调的最大步数。 |
IF-Guide 由四个步骤组成:(1) 使用 EK-FAC 计算逆 Hessian 近似值,(2) 计算有毒和无毒查询数据上逐 token 的差分影响分数(第 4 页,公式 8),(3) 选择训练中要抑制的有影响力的有毒 token(第 23 页,算法 1),以及 (4) 使用我们基于惩罚的训练目标来抑制有毒 token(第 5 页,公式 9)。
运行:
./scripts/fit_factors.sh
这会调用 fit_factors.py,并接受以下主要参数:
运行:
./scripts/compute_scores.sh
这会运行 compute_scores.py,其关键参数如下(除了用于计算因子的大部分参数外):
运行:
./scripts/build_toxic_token_mask.sh
这会运行 build_toxic_token_mask.py。它接受以下主要参数:
在为特定模型计算出有毒 token 掩码后,您可以在 ./scripts/train.sh(和 ./scripts/finetune.sh)中指定 --toxic_token_mask_path 和 --toxic_lambda 参数,以使用 IF-Guide 训练/微调模型。
我们提供了评估显性毒性(通过 Detoxify)、隐性毒性(通过 ToxiGen-RoBERTa)和流畅度(在 LAMBADA 和 OpenWebText 上测量)的代码。
运行:
./scripts/run_toxicity_eval.sh
这会运行 run_toxicity_eval.py,它有以下主要参数:
运行:
./scripts/run_implicit_toxicity_eval.sh
它需要以下参数:
| 参数 | 描述 |
|---|---|
--outputs_file_path | 显性毒性运行输出文件的路径。我们重新评估现有输出以节省时间。这应该是显性评估期间生成的 output.json 文件。 |
--dataset | 输出所来自的数据集。决定最终输出的格式。 |
运行:
./scripts/run_fluency_eval.sh
它有以下主要参数:
我们发现我们的方法与解码时防御 奖励增强解码(RAD) [EMNLP 2023] 是可组合的。要使用 RAD 运行 IF-Guide(或独立测试 RAD),请先下载奖励模型(由原作者提供)并将其放置在预期目录中:
cd utils/rad/reward_modeling
gdown https://storage.googleapis.com/rad_release/saved_models.zip
unzip saved_models.zip && rm saved_models.zip && rm -rf saved_models/gpt2_sentiment
我们所使用的 RAD 实现的功劳完全归功于原作的作者。谢谢!
如果您觉得这份源代码对您有帮助,请引用我们的工作。
@inproceedings{coalson2025ifguide,
title={{IF}-Guide: Influence Function-Guided Detoxification of {LLM}s},
author={Coalson, Zachary and Bae, Juhan and Carlini, Nicholas and Hong, Sanghyun},
booktitle={The Thirty-ninth Annual Conference on Neural Information Processing Systems},
year={2025},
url={https://openreview.net/forum?id=V82wLePv0o}
}
如有任何疑问和建议,请联系 Zachary Coalson ([email protected])。
| 参数 | 描述 |
|---|
--model_name | 要训练的模型名称。必须在 utils/registry.yaml 中注册,并带有相应的分词器(参见现有模型示例) |
--save_id | 用于输出目录命名的描述性标签。 |
--toxic_token_mask_path | token 掩码的路径(通过 IF-Guide 生成)。标准训练使用 None。 |
--toxic_lambda | 我们的训练目标所使用的惩罚项的强度。 |
| 参数 | 描述 |
|---|
--model_name | 要拟合因子的模型名称。 |
--checkpoint_dir | 已保存模型的路径。如果使用预训练模型,请设为 None。 |
--train_indices_path | 用于训练模型的训练索引路径(如果使用整个数据集则不需要)。必须与确切索引匹配且顺序相同。我们提供了自己的十亿 token OpenWebText 子集的索引,并将其路径设为默认值。 |
--output_dir | 保存 Hessian 近似数据的路径。 |
| 参数 | 描述 |
|---|
--model_name | 要计算分数的模型名称。 |
--checkpoint_dir | 已保存模型的路径。如果使用预训练模型,请设为 None。 |
--save_id | 追加到保存目录末尾以自定义命名的标签。 |
--save_dir | 保存分数的目录(在原始因子目录内)。 |
--factors_path | 包含上一步中拟合的(逆)Hessian 因子的目录路径。 |
--query_dataset | 用于构建查询梯度的查询数据集。目前唯一选项是 RTP。 |
--toxic_query_indices_path | 查询数据集中与有毒示例相对应的索引路径。我们在 ../data/RTP/query_indices/toxic_indices.npy 中提供了来自 RTP 的有毒子集。 |
--nontoxic_query_indices_path | 无毒查询的索引路径。我们在 ../data/RTP/query_indices/nontoxic_indices.npy 中提供了来自 RTP 的无毒子集。 |
| 参数 | 描述 |
|---|
--model_name | 要为其构建掩码的模型名称。 |
--scores_path | 上一步中计算的分数路径。 |
--window | 上下文窗口长度。 |
--toxicity_threshold | 确定有毒 token 的阈值(以百分位数表示,例如 0.99)。 |
--max_tokens | 要选择的有毒 token 的最大数量。 |
--query_dataset | 用于构建查询梯度的查询数据集。目前唯一选项是 RTP。 |
--inspection_idx | 我们会自动用红色打印单个训练示例中被抑制的 token。该参数根据排名指定要打印的示例(例如,0 是排名最高的训练示例)。 |
| 参数 | 描述 |
|---|
--model_name | 要评估的模型名称。 |
--checkpoint_dir | 已保存模型的路径。如果使用预训练模型,请设为 None。 |
--dataset | 要评估的数据集。可以是 RTP、AttaQ 或 BOLD。 |
--save_dir | 保存结果的目录。 |
--decoding_defense | 要应用的解码时防御。none 或 rad。不适用于我们的 OpenWebText 评估。 |
--save_outputs | 是否保存模型的输出。 |
| 参数 | 描述 |
|---|
--model_name | 要评估的模型名称。 |
--checkpoint_dir | 已保存模型的路径。如果使用预训练模型,请设为 None。 |
--dataset | 要评估的数据集。可以是 RTP、AttaQ 或 BOLD。 |
--save_dir | 保存结果的目录。 |
--decoding_defense | 要应用的解码时防御。none 或 rad。不适用于我们的 OpenWebText 评估。 |