用极少量数据进行指令调优:**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 点**。

这些结果强调了两个事实

  1. **风格一致性很重要**:大型混合数据中低质量或风格不一致的响应会积极损害 SFT 质量。
  2. **数据效率**:一个小型、连贯的子集可以超越一个大得多但风格不一致的集合,节省令牌和 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"
}

链接

如有疑问或反馈,请随时在 GitHub 上提出 issue,或直接通过 zhuang.li@rmit.edu.au 与我联系。

社区

注册登录 发表评论