用极少量数据进行指令调优:**SCAR** 隆重登场
社区文章 发布于 2025 年 5 月 31 日
庄力,华云城,武翠庄,詹浩岚,曲丽珍,格拉姆雷扎·哈法里
被 **ACL 2025** 主会接收
代码仓库 • 模型 • 论文
重要意义
指令调优的大型语言模型(LLM)通常在数十万甚至数百万的指令-响应对上进行训练。收集、过滤和微调如此规模的数据集,例如 OLMo-7B 的 320,000 对或 LLaMA 风格混合中的数百万示例,需要大量的人力投入和 GPU 资源。
**SCAR**(Style Consistency Aware Response Ranking,风格一致性感知响应排序)表明,仅选择风格连贯的响应不仅能降低成本,还能提高性能。在许多情况下,一个小型且风格一致的子集可以超越在完整、嘈杂数据集上进行微调的模型,同时训练效率更高。
在 OLMo-7B 上,我们使用原始训练集的 **0.7%–3%**,即可达到或超越全数据基线。在 StarCoder 代码生成任务上,5k 对(占数据量的 38%)的子集也提高了性能。
核心思想(一段话)
具有相似特征的响应,例如简洁的措辞、一致的格式和稳定的语调,通过减少训练期间的冲突信号,帮助大型语言模型更有效地学习。SCAR 使用一个轻量级排序器,根据响应中的两个关键风格相关线索对指令和响应对进行评分:
- **语言形式** (句长、列表使用、功能词等表面特征)
- **指令意外性** (给定指令后响应的可预测性)
得分最高的配对构成新的微调集。
关键结果
模型家族 | 基线检查点 | 全集大小 | 指标 ↑ | 基线 | SCAR 子集 → 得分 |
---|---|---|---|---|---|
OLMo-7B | allenai/OLMo-7B-SFT |
320k 对 | AlpacaEval L.C. 胜率 | 3.86 | 5k (1.5%) → 5.64 |
10k (3%) → 5.37 | |||||
2.5k (0.7%) → 4.08 | |||||
StarCoder-15B | bigcode/octocoder |
13k 对 | HumanEval + MultiPL-E (Pass@1 + 10 平均) | 37.9 | 5k (38%) → 40.1 |
完整的表格和消融实验在论文和 README 中。
如何解读这些数字
- **基线检查点** — 原始作者提供的官方监督微调模型(OLMo-7B-SFT 或 Octocoder-15.5B)。
- **SCAR 子集** — 我们从相同的基础模型家族(OLMo-7B 或 StarCoder-15B)开始,但仅在 SCAR 选择的配对上进行微调。
- **收益** — 使用 5k OLMo 配对(原始数据的 1.5%),我们比全数据 OLMo-7B-SFT **提升了 1.78 个胜率点**;即使是 2.5k 配对(0.7%)也保留了大部分基线分数。对于 StarCoder,将 13k 提交数据集过滤到 5k 配对,在综合 Pass@ 指标上**提升了 2.2 点**。
这些结果强调了两个事实
- **风格一致性很重要**:大型混合数据中低质量或风格不一致的响应会积极损害 SFT 质量。
- **数据效率**:一个小型、连贯的子集可以超越一个大得多但风格不一致的集合,节省令牌和 GPU 小时。
快速入门
pip install scar-tool
import torch
from transformers import AutoTokenizer
from style_ranker.ranker.model import StyleRanker
model_path = "lizhuang144/scar-gte-base"
ranker = StyleRanker.from_pretrained(model_path).eval()
tok = AutoTokenizer.from_pretrained(model_path)
instructions = ["Write a poem about spring",
"Explain quantum computing"]
answers = ["I am sorry. Who are you? Why should I tell you...",
"Quantum computing is a type of computation..."]
ins = tok(instructions, padding=True, truncation=True, return_tensors="pt")
ans = tok(answers, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
scores = ranker(ins.input_ids, ins.attention_mask,
ans.input_ids, ans.attention_mask)
for s, i, a in zip(scores, instructions, answers):
print(f"{s.item():5.2f} {i[:35]} → {a[:35]}")
适用于大型数据集
from style_ranker.rank import rank_and_filter
pairs = rank_and_filter(model_path,
instructions,
answers,
ratio=0.02, # keep top 2 %
device="cuda")
Hub 上的模型
名称 | 基础编码器 |
---|---|
lizhuang144/scar-gte-base |
阿里巴巴-NLP gte-base-en-v1.5 |
lizhuang144/scar-gte-large |
阿里巴巴-NLP gte-large-en-v1.5 |
lizhuang144/scar-roberta-base |
FacebookAI roberta-base |
SCAR 的应用场景
- **过滤** SFT 之前嘈杂的自指令或 ChatGPT 数据。
- **评分** 候选响应,用于 RLHF 奖励模型训练。
- **构建** 紧凑的领域特定指令集,尤其在 GPU 预算紧张时。
局限性
- 当**原始数据集包含风格不一致的响应**时,收益最大;对于单一大型语言模型输出(风格变化最小),收益则较小。
- 排序器**仅支持英语**。
- **不会自动删除**重复指令;请先进行去重。
引用
@inproceedings{li-etal-2025-scar,
title = "{SCAR}: Data Selection via Style Consistency-Aware Response Ranking for Efficient Instruction-Tuning of Large Language Models",
author = "Li, Zhuang and
Hua, Yuncheng and
Vu, Thuy-Trang and
Zhan, Haolan and
Qu, Lizhen and
Haffari, Gholamreza",
editor = "Che, Wanxiang and
Nabende, Joyce and
Shutova, Ekaterina and
Pilehvar, Mohammad Taher",
booktitle = "Proceedings of the 63rd Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)",
month = jul,
year = "2025",
address = "Vienna, Austria",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2025.acl-long.625/",
pages = "12756--12790",
ISBN = "979-8-89176-251-0"
}
链接
- 论文 https://aclanthology.org/2025.acl-long.625/
- 代码 https://github.com/zhuang-li/SCAR
- 模型 https://huggingface.co/lizhuang144/scar-gte-base
如有疑问或反馈,请随时在 GitHub 上提出 issue,或直接通过 zhuang.li@rmit.edu.au 与我联系。