跳转到内容

LLMSurgeon — 从模型回答反推训练数据配方

待复核

LLMSurgeon 是一套只看大模型生成的文字,反推它预训练数据大概由哪些领域组成的方法。日常类比:你没有进厨房,也拿不到菜谱,只能尝几口汤,然后判断这锅汤里大概有多少番茄、牛肉、洋葱和香料。

这里的”番茄、牛肉、洋葱”换成训练数据领域:网页、书籍、代码、论文、维基百科、论坛问答等。传统审计常问”这篇具体文章有没有被模型见过”,LLMSurgeon 问的是更宏观的问题:这个模型的知识来源比例像不像它声称的训练配方。

论文把这个任务叫 Data Mixture Surgery(DMS)。目标不是偷出训练数据,而是在一个预先给好的领域分类表里,估计模型真正表现出来的领域分布。

不理解 LLMSurgeon,下面这些事都很难解释:

  • 为什么同样是大模型,有的特别会写代码,有的特别会写百科式解释——训练数据配方会塑造模型习惯
  • 为什么”有没有见过某个样本”不等于”训练集整体是什么结构”——单粒沙子和整片海滩不是一个尺度
  • 为什么闭源模型的数据透明度会成为治理问题——外部审计者通常拿不到训练集,只能看模型行为
  • 为什么简单数分类器输出会偏——分类器会把相似领域混淆,必须先校准它的错法

LLMSurgeon 可以拆成 三步

  1. 先学会认领域:准备一个已标注的参考数据集,训练外部领域分类器。类比:先训练品酒师分辨酸味、甜味、木桶味。

  2. 再记录品酒师会怎么错:在参考集上算出 soft confusion matrix,知道分类器把 C 和 C++、网页和过滤网页混在一起的概率。类比:不是假装品酒师完美,而是先写下他总把哪两种味道搞混。

  3. 最后反向校正:让目标模型用中性提示生成很多文本,分类器给出一个带偏的观测分布,再用混淆矩阵解一个约束反问题。类比:看到模糊照片后,先知道镜头怎么糊,再把图像尽量还原。

这三步背后的关键假设叫 label shift:领域比例会变,但每个领域内部的语言特征大致不变。也就是说,模型写出的代码样文本,统计上仍然像代码样文本。

案例 1:把问题写成”配方估计”

Section titled “案例 1:把问题写成”配方估计””
domains = ["web", "code", "paper", "wiki"]
true_mix = {"web": 0.55, "code": 0.20, "paper": 0.15, "wiki": 0.10}
generated_texts = sample_model_outputs(prompt="Continue naturally", n=5000)

逐部分解释

  • domains 是预先约定的分类表,LLMSurgeon 不能发现表外的新领域
  • true_mix 是我们想估计但真实世界里通常看不见的训练配方
  • generated_texts 是唯一黑盒入口:不给权重、不给训练集,只拿模型回答

案例 2:为什么不能直接数分类器结果

Section titled “案例 2:为什么不能直接数分类器结果”
raw_counts = {"web": 0.45, "code": 0.30, "paper": 0.15, "wiki": 0.10}
confusion = {
"web": {"web": 0.80, "wiki": 0.20},
"code": {"code": 0.70, "paper": 0.30},
}

逐部分解释

  • raw_counts 看起来像答案,但它混进了分类器自己的偏差
  • confusion 记录”真实是 web 时有 20% 被认成 wiki”这类系统性错误
  • 如果不校正,代码领域可能被高估,论文领域可能只是代码文本被误认出来
import numpy as np
from scipy.optimize import minimize
C = np.array([[0.80, 0.20], [0.10, 0.90]])
observed = np.array([0.62, 0.38])
def loss(pi):
return np.linalg.norm(C.T @ pi - observed) ** 2
result = minimize(loss, x0=[0.5, 0.5],
bounds=[(0, 1), (0, 1)],
constraints={"type": "eq", "fun": lambda p: p.sum() - 1})
print(result.x)

逐部分解释

  • C.T @ pi 表示”真实配方经过分类器偏差后,会被我们观察成什么样”
  • loss 衡量预测观测和真实观测之间差多少
  • boundssum() - 1 保证答案仍是概率分布:不能负数,总和必须是 1
  1. 把 DMS 当成 membership inference:MIA 关心单个样本有没有出现,DMS 关心整体比例,尺度不同会让误差累积。

  2. 把分类器输出当真相:领域分类器再准也会有稳定偏差,不校正混淆矩阵就会把偏差写进最终配方。

  3. 把分类表切得过细:C 和 C++、C4 和 Common Crawl 这类来源太像,分类器分不开时反问题会变得不稳定。

  4. 忽略提示词影响:强风格提示会把生成文本推向某个领域,导致观测分布不再像预训练分布。

适用

  • 想审计开源或闭源模型的大致训练领域比例
  • 已经有明确 taxonomy,比如网页、代码、书籍、论文、百科
  • 能拿到可靠参考数据,用来训练领域分类器并估计混淆矩阵
  • 需要先做低成本安全 triage,再决定哪些模型值得更贵的人工红队

不适用

  • 想证明某篇具体文章被训练过——那是 MIA 或数据使用推断问题
  • 想发现完全未知的新领域——LLMSurgeon 只能在给定分类表里分配概率
  • 目标模型经过强 RLHF 或指令调优,生成分布可能偏离预训练底座
  • 领域边界天然重叠,比如过滤网页 vs 原始网页、相邻编程语言
  • 2017 年前后:membership inference 成为模型隐私审计的标准问题,核心是判断单条样本是否进过训练集。
  • 2020-2024 年:The Pile、LLaMA、Pythia、OLMo、StarCoder 等模型公开或半公开训练配方,给”配方级审计”提供了参照物。
  • 2024-2025 年:研究者发现很多 MIA 在 LLM 上并不稳定,单样本检测难直接扩展成整体数据组成。
  • 2026 年:LLMSurgeon 把问题换成 DMS:不追逐每个样本,而是估计领域分布这张宏观地图。
  1. 黑盒审计可以从”单样本”上升到”分布”——看不见训练集,也可以对训练配方做概率估计。
  2. 校准比分类本身更关键——LLMSurgeon 的增益主要来自知道分类器怎么错,再把错法反解掉。
  3. 好 taxonomy 是半个方法——领域必须语义上可分,分得过细会让矩阵病态。
  4. 生成文本不是训练集镜子——中性提示、后训练影响、领域触发方式都会改变观测结果。
  • llama —— LLMSurgeon 在 LLaMA 公开配方上验证粗粒度数据比例恢复
  • starcoder-2023 —— 细粒度代码语言分类最容易暴露”领域太像”的问题
  • chinchilla —— 讨论训练数据数量,LLMSurgeon 讨论训练数据组成
  • scaling-laws —— scaling law 管总量与算力,DMS 管不同数据桶的比例
  • gpt-3 —— 早期闭源大模型让训练数据透明度问题变得突出
  • attention —— 这些审计对象大多是 Transformer 系大语言模型

(暂无反向链接)