MichiganNLP/one-shot-grpo-bias

GitHub: MichiganNLP/one-shot-grpo-bias

该研究项目揭示LLM后训练对齐存在严重脆弱性——单个偏见样本的GRPO训练即可覆盖已有对齐状态并诱发系统性泛化偏见,提供完整的实验代码、数据与模型检查点。

Stars: 0 | Forks: 0

# 只要一个就能使它们全部产生偏见:用 One-Shot GRPO 打破规则 [![论文](https://img.shields.io/badge/paper-arXiv-b31b1b.svg)](https://arxiv.org/abs/2606.10931) [![网站](https://img.shields.io/badge/project-page-blue.svg)](https://lit.eecs.umich.edu/one-shot-grpo-bias/) [![数据](https://img.shields.io/badge/%F0%9F%A4%97%20data-HuggingFace-yellow.svg)](https://huggingface.co/datasets/MichiganNLP/one-shot-grpo-bias-flipped) [![模型](https://img.shields.io/badge/%F0%9F%A4%97%20models-Collection-yellow.svg)](https://huggingface.co/collections/MichiganNLP/one-shot-grpo-bias-6a29b7207c6f98cf9d3ef5bf) [![许可证: MIT](https://img.shields.io/badge/License-MIT-green.svg)](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, 大语言模型, 强化学习, 算法偏见, 逆向工具