MichiganNLP/one-shot-grpo-bias
GitHub: MichiganNLP/one-shot-grpo-bias
该研究项目揭示LLM后训练对齐存在严重脆弱性——单个偏见样本的GRPO训练即可覆盖已有对齐状态并诱发系统性泛化偏见,提供完整的实验代码、数据与模型检查点。
Stars: 0 | Forks: 0
# 只要一个就能使它们全部产生偏见:用 One-Shot GRPO 打破规则
[](https://arxiv.org/abs/2606.10931)
[](https://lit.eecs.umich.edu/one-shot-grpo-bias/)
[](https://huggingface.co/datasets/MichiganNLP/one-shot-grpo-bias-flipped)
[](https://huggingface.co/collections/MichiganNLP/one-shot-grpo-bias-6a29b7207c6f98cf9d3ef5bf)
[](LICENSE)
论文《只要一个就能使它们全部产生偏见:用 One-Shot GRPO 打破规则》(Naihao Deng, Yilun Zhu, Naichen Shi, Clayton Scott, Rada
Mihalcea) 的研究代码。
## 摘要
现代大型语言模型(LLM)通常通过大规模的 post-training 进行对齐,以确保公平和可靠的行为。在这项工作中,我们研究了 Group Relative Policy Optimization
(GRPO) 能多容易地打破这些防护机制。我们表明,**在单个有偏见样本上进行 one-shot GRPO 训练足以引发系统性偏见**,这种由刻板印象驱动的推理可以泛化到不同的属性、类别和基准测试中。我们进一步发现,不同模型对这种偏见的易感性因其初始产生偏见输出的可能性而异。我们的结果揭示了 post-training 中的一个关键漏洞:对齐状态可以被单个样本覆盖。
## 此存储库包含的内容
```
src/src/data/ Download benchmarks, build val/test splits, and flip
training labels (stereotype / random / by-category).
src/src/nli/ NLI-based reasoning-consistency evaluation.
src/src/fair_prm/ Fairness process-reward-model (PRM) scoring.
src/src/constants.py Central, env-configurable paths (see "Configuration").
src/src/verl_3_15_2026/ Vendored, locally-patched verl (Apache-2.0); see
src/src/verl_3_15_2026/PATCHES.md.
src/scripts/train_verl/ Per-model GRPO/PPO training scripts, hyperparameter
sweeps, and post-hoc analysis (MMLU, TruthfulQA,
toxicity, counterfactual probe, NLI consistency).
src/scripts/slurm_jobs/ SLURM submission wrappers.
figures/ Result figures from the paper.
```
训练数据(原始基准测试 + 我们的翻转标签数据集)**未**被提交到 git 中 —— 请参阅 [数据](#data)。
## 安装
```
git clone https://github.com/MichiganNLP/one-shot-grpo-bias.git
cd one-shot-grpo-bias
pip install -r requirements.txt
```
训练和 rollouts **在 Singularity/Apptainer 容器内**运行,该容器基于兼容 `verl` 的镜像(包含 vLLM)构建;它们不在裸登录节点上运行。分析/评估脚本(`mmlu_eval.py`、`toxicity_eval.py`、……)在普通的 Python 环境和 GPU 下运行。有关确切的容器和启动方案,请参阅 `src/scripts/train_verl/` 和各模型对应的脚本。
## 数据
这五个偏见基准测试是具有各自许可证的公开数据集(BBQ、
CrowS-Pairs, WinoQueer: CC-BY-4.0; StereoSet: CC0-1.0; GenMO: 见源文件)。我们**不**重新托管它们。相反:
1. **从原始来源下载 + 重建**:
cd src/src/data
python download_bbq.py # 以及 download_{crowdspairs,stereoset,winoqueer,genMO}.py
python build_bbq_val.py # 构建 val/test 数据集
python flip_train_data_single_example.py # 生成翻转后的训练数据
2. **或者从 HuggingFace Hub 拉取我们衍生的(翻转标签)数据**:
⚠️ 此数据集是**受限的(gated)**:您必须登录并在下载前接受内容警告。根据其构建方式,它包含刻板印象相关内容。
默认情况下,所有内容的读取源/写入目标均为 `./datasets/` 和 `./results/`。
## 模型
**偏见崩溃**的模型检查点作为**受限(gated)**存储库发布(需要登录 + 接受内容警告),归组在 [这个 HuggingFace
Collection](https://huggingface.co/collections/MichiganNLP/one-shot-grpo-bias-6a29b7207c6f98cf9d3ef5bf) 中。
遵循 OLMo 惯例,**每个保存的训练步骤都是一个单独的 git
revision**(`step25`、`step50`、……);`main` 是论文中选定的(偏见崩溃最严重的)步骤。
**主要结果 —— 涵盖所有四个模型的 one-shot z̃₁₂(年龄)**(3B = full fine-tune,
7B/8B = LoRA,与论文保持一致):
| 模型 | 基础模型 | 类型 |
|---|---|---|
| [`Llama-3.2-3B-Instruct-bias-z12-Age`](https://huggingface.co/MichiganNLP/Llama-3.2-3B-Instruct-bias-z12-Age) | Llama-3.2-3B-Instruct | full |
| [`Qwen2.5-3B-Instruct-bias-z12-Age`](https://huggingface.co/MichiganNLP/Qwen2.5-3B-Instruct-bias-z12-Age) | Qwen2.5-3B-Instruct | full |
| [`Llama-3.1-8B-Instruct-bias-z12-Age-lora`](https://huggingface.co/MichiganNLP/Llama-3.1-8B-Instruct-bias-z12-Age-lora) | Llama-3.1-8B-Instruct | LoRA |
| [`Qwen2.5-7B-Instruct-bias-z12-Age-lora`](https://huggingface.co/MichiganNLP/Qwen2.5-7B-Instruct-bias-z12-Age-lora) | Qwen2.5-7B-Instruct | LoRA |
**单样本差异研究**(Llama-3.2-3B-Instruct,full)—— 不同的单一
偏见样本,按训练准确率的方差排序(z̃₁ 最高 → z̃₁₀₀ 最低):
| 模型 | 样本 | 类别 |
|---|---|---|
| [`…-bias-z1-SexualOrientation`](https://huggingface.co/MichiganNLP/Llama-3.2-3B-Instruct-bias-z1-SexualOrientation) | z̃₁ | 性取向 |
| [`…-bias-z2-PhysicalAppearance`](https://huggingface.co/MichiganNLP/Llama-3.2-3B-Instruct-bias-z2-PhysicalAppearance) | z̃₂ | 外貌 |
| [`…-bias-z40-Gender`](https://huggingface.co/MichiganNLP/Llama-3.2-3B-Instruct-bias-z40-Gender) | z̃₄₀ | 性别 |
| [`…-bias-z66-Nationality`](https://huggingface.co/MichiganNLP/Llama-3.2-3B-Instruct-bias-z66-Nationality) | z̃₆₆ | 国籍 |
| [`…-bias-z87-Disability`](https://huggingface.co/MichiganNLP/Llama-3.2-3B-Instruct-bias-z87-Disability) | z̃₈₇ | 残障 |
| [`…-bias-z100-Disability`](https://huggingface.co/MichiganNLP/Llama-3.2-3B-Instruct-bias-z100-Disability) | z̃₁₀₀ | 残障 |
```
# 全量 fine-tunes (3B) — 直接加载:
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"MichiganNLP/Llama-3.2-3B-Instruct-bias-z12-Age", revision="step125")
# LoRA adapters (7B/8B) — 加载到 base model 上:
from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
model = PeftModel.from_pretrained(
base, "MichiganNLP/Qwen2.5-7B-Instruct-bias-z12-Age-lora", revision="step275")
```
## 配置
`src/src/constants.py` 通过两个环境变量(带有相对于代码库的默认值)解析所有路径,因此不需要硬编码特定于机器的路径:
```
export GRPO_BIAS_DATA=/path/to/datasets # default: ./datasets
export GRPO_BIAS_RESULTS=/path/to/results # default: ./results
```
### 运行 shell 脚本
`src/scripts/` 下的训练/评估脚本使用三个占位符来代替
硬编码的路径:`${REPO_ROOT}`、`${HF_HOME}`(模型解析为
`$HF_HOME/hub/models--…/snapshots/`)和 `${SIF}`(容器镜像)。在启动前通过此辅助命令设置它们:
```
export SIF=/path/to/your/verl_vllm.sif # required: your container image
source src/scripts/env.sh # sets REPO_ROOT, HF_HOME, SIF
```
脚本中的模型 `snapshots/` 哈希值是我们使用的确切版本 —— 请更新它们以匹配您的 HuggingFace 缓存,或者直接将 `MODEL_PATH`
指向模型目录。自定义的 GRPO 奖励函数位于
`src/src/evaluator_score.py`(通过 `custom_reward_function.path` 引用)。
## 复现实验
- **训练**(在单个翻转样本上进行 one-shot GRPO,及其变体):
`src/scripts/train_verl/train_flipped_data_*_single_example.sh`
- **超参数扫描**(lr, rollout n, KL β):`src/scripts/train_verl/sweep_*.sh`
- **在纯净的混合测试集上进行偏见/公平性评估**:`src/scripts/train_verl/eval_val_only.sh`
- **更广泛的对齐检查**:`mmlu_eval.py`、`truthfulqa_eval.py`、`toxicity_eval.py`
- **机制分析**:`counterfactual_probe.py`、`nli_consistency_compare.py`
## 内置的 verl
`src/src/verl_3_15_2026/` 是 [verl](https://github.com/volcengine/verl)
(Apache-2.0) 的一个快照,包含了进行混合基准测试评估和适配小型 LLM 所需的少量本地补丁。保留了上游的 `LICENSE` 和 `Notice.txt`;我们的
修改记录在 `src/src/verl_3_15_2026/PATCHES.md` 中。
## 引用
```
@article{deng2026onebias,
title = {It Takes One to Bias Them All: Breaking Bad with One-Shot GRPO},
author = {Deng, Naihao and Zhu, Yilun and Shi, Naichen and Scott, Clayton and Mihalcea, Rada},
journal = {arXiv preprint arXiv:2606.10931},
year = {2026}
}
```
## 许可证
我们的代码在 [MIT License](LICENSE) 下发布。内置的 `verl` 遵循
Apache-2.0 协议。底层基准测试保留其原始许可证。
## 致谢
基于 [verl](https://github.com/volcengine/verl) 构建。我们感谢
BBQ、CrowS-Pairs、StereoSet、WinoQueer 和 GenMO 的作者发布他们的基准测试。
标签:AI对齐, DLL 劫持, GRPO, Trivy, 大语言模型, 强化学习, 算法偏见, 逆向工具