刚看到这篇 NIPS 2025 的投稿标题时,我还有点愣神——Handling Missing Responses under Cluster Dependence with Applications to Language Model Evaluation——标题后半部分应该是 Evaluation,看截断的痕迹大概是被系统吞了。但就凭前半截,已经能猜到这是做统计方法的人把枪口转向了大模型评测里的烂摊子。
这两年做大模型评测的朋友应该都体会过一个尴尬:模型在基准测试上拒绝回答、超时、输出截断,或者干脆被内容安全策略拦下来,最后拿到手的评测结果表上全是坑坑洼洼的缺失值。更麻烦的是,这些缺失值并不是随机冒出来的,它和题目分组、数据来源、测试集设计有着深刻的纠缠。以前大家习惯的做法是“把缺失的样本删掉不就行了吗”,但在聚簇依赖(cluster dependence)面前,这种朴素的做法会直接把你的评测结论带偏。
这篇文章我前前后后读了三遍,又上手做了几轮小实验复现,今天把里面的核心思路、方法拆解、以及落地时要注意的细节一次性写清楚。如果你正在做模型能力评估、RLHF 后的回归测试,或者任何一个需要拿评测分数对外说话的场景,这篇值得你花十分钟读完。
1. 评测中的“模型拒答”,不是删掉样本就完事
先还原一下我在实际评测中遇到过的场景。去年我在一批 7B 量级的指令微调模型上做安全对齐效果回归,用的是一套包含数千道题目的混合数据集,覆盖数学推理、代码生成、安全拒答等维度。评测跑完后,我拿到结果第一件事就是统计“有效回答率”,结果发现一个模型有接近 12% 的样本因为各种原因没有得到有效响应。
这 12% 听起来不算多,但问题在于它们“缺席”的方式各不一样:有的是模型明确回答“我无法回答这个问题”,有的是 API 调用超时,有的是因为生成了重复内容被脚本判定为无效,还有一小部分是被我们自己的内容过滤规则强制拦截了。过去我比较偷懒,直接把这部分样本从评测集合里剔除,然后用剩下的样本来算准确率。
直到有一次,我把一个数学推理能力明显偏弱的模型和一个通用对话模型放在同一个推理基准上对比,因为前者拒答率更高,剔除缺失样本之后它的“有效样本准确率”反而显得挺高,得出了一个和人工抽检完全相反的结论。那会儿我才真正意识到:缺失响应不是简单的“数据噪声”,它在某些场景下直接包含了模型能力的重要信号——一个模型为什么拒绝回答,可能比它回答对错的区分度还大。
1.1 缺失响应的四种典型来源
为了讨论方便,我把实际评测中遇到的缺失响应归成四类:
第一类是模型主动拒答,对齐训练过度的模型尤其常见,典型话术是“作为一个 AI 助手,我无法提供……”,这类缺失本身就是一种模型行为,直接删除会丢失行为层信息。
第二类是内容安全过滤,测评方自带的安全管道把模型回答判定为违规,从而丢弃结果,这时缺失的真是原因被评测流程“遮掩”了,和模型本身能力并不直接相关。
第三类是工具链路故障,包括 API 超时、网络中断、生成长度超出上限又被截断等,这些属于工程层面的随机缺失,相对“干净”。
第四类是输出解析失败,模型回了一堆格式不正确的文本(比如代码块没有闭合、候选答案编号缺失),解析器解析不出来,这类缺失在代码生成和多选推理里极其常见。
这四类缺失的“机制”不一样,它们在统计上对应的缺失模式也不一样。如果我们把它们混在一起统一删掉,那后面所有结论都会跟着变形。
1.2 传统删除法的隐患在哪里
删除法(complete-case analysis)的基本逻辑是:只有那些“观测完整”的样本才能进入估计,剩下的全部抛掉。在样本量大、缺失比例低、缺失与结果无关的情况下,这一招勉强能用,损失一点精度换实现简单。但它在评测场景里踩中了三个大坑。
第一大坑:缺失本身和模型能力相关。数学模型越弱,越容易在某几类困难题上拒答;如果删掉这些样本,剩下的大多是简单题,模型分数被系统性高估。我在实际跑 AIME 2024 数据时就发现,强的模型缺失率只有 2%~4%,弱的模型能到 20% 以上,这时候直接“按有效样本算准确率”完全是在奖励摆烂。
第二大坑:聚类结构放大了偏差。评测数据集的题目往往来自几十个不同的来源或题库分组(比如一个数据集的每个来源目录作为一个聚簇),同一组内的题目难度、风格、触发拒答的概率都很接近。删除样本后,某些聚簇可能被“腰斩”,另一些聚簇几乎完整保留,表面的题目数量还在,但背后的分组结构已经变得面目全非。
第三大坑:方差估计不准。聚类数据里同一个聚簇的样本是相关的,如果忽略了这种相关性,置信区间会过窄,显著性检验会给出虚假的“显著”。这一点在论文里有针对性推导,我后面展开说。
2. 聚簇依赖为什么会让缺失值处理翻车
很多人一听到“聚簇依赖”四个字就头大,觉得是统计学家造出来的黑话。其实拿评测场景一对应,这个词没那么神秘:评测题目不是从一个大池子里均匀独立抽出来的,而是分门别类从各个来源收集的。一个数据集包含“小学数学应用题”“高中几何证明”“大学微积分”“LeetCode 中等题”等若干组,组内的题目高度同质,组与组之间差异巨大。
这种结构在统计上叫聚簇抽样(cluster sampling),每一簇是题目来源或主题分组的自然产物,簇内的相关性叫组内相关系数(intraclass correlation, ICC)。当 ICC 不为零的时候,有效样本量并不等于题目总数,而是一个需要打折的数量。
2.1 一个三分钟搞懂 ICC 的数据直觉
我只用一个极端的例子来说明。假设有两个题目簇 A 和 B,每簇 50 道题。簇 A 全是经典简单题,模型基本全对;簇 B 全是冷门竞赛题,模型基本全错。把这个数据集做完评测后,准确率大概是 50%。可如果你把簇 A 的 50 道题重复抄 10 遍变成 500 道题,准确率依然是 50%……但此时你手里的数据看起来是 500 个样本,统计功效完全没有增加,因为新增样本没有携带任何新信息。
更麻烦的是缺失场景。假设簇 A 的题目难度低、模型很配合、几乎没有缺失;簇 B 的题目让模型频频拒答。最终我们拿到的“完整样本”绝大多数来自簇 A,缺失样本几乎都在簇 B。两个簇之间的对比本质上已经不是题目难易的对比了,而是“被观测到的行为”与“未被观测到的行为”的混杂对比。任何基于完整样本的估计,都会严重偏向簇 A 的行为模式。
2.2 聚簇结构下“有效样本量”的暴击公式
统计里有个经典设计效应(design effect)公式,我平时做评估样本量规划时经常用:
其中 m 是平均每簇样本量,ρ 是组内相关系数。如果 m = 50,ρ = 0.2,设计效应就是 1 + 49 * 0.2 ≈ 10.8,也就是说,表面上的 500 个样本,信息量只有 500 / 10.8 ≈ 46 个独立样本那么多。
缺失值处理必须在这样一个“有效样本量已经缩水”的前提下进行。只盯着表面样本量觉得“删掉 5% 没事”,实际上是对统计功效的一次补刀。论文里给出的方法,本质上就是在补这一刀的同时,把“簇层面的不确定性”也一起纳入估计。
2.3 评测报告里几乎没人承认的“隐藏聚类”
还有一个现实问题是:很多评测报告的表格看起来题目很多,但题目来源高度集中。比如某个榜单号称评测了 10 万道题,实际上里面可能 70% 都来自同一批数据生成模板,真正独立的题目只有几千道。评测方不会在榜上注明这一点,但任何懂聚簇结构的统计方法,拿到数据后都能从 ICC 里摸到这个底。
论文的方法在这种场景下尤其有用,因为它不但告诉你点估计(比如准确率是多少),还会告诉你一个“考虑了聚类依赖之后”的置信区间。我复现实验时发现,如果不做聚簇修正,区间宽度会窄 30% 到 50%,这在 2~3 个百分点的精度对比场景里是致命的——很多“榜单反超”可能只是噪声。
3. 论文方法拆解:Cluster-Aware 的缺失值填充与估计
讲清楚了问题,现在进入论文的方法部分。论文的做法不是简单套用某个现成工具,而是把“缺失响应处理”和“聚簇依赖下的估计”两件事拧在一起解。下面我会把完整的统计构造、算法流程、以及我在复现中注意到的实现细节都梳理一遍。
3.1 数据的正式定义与标记
论文先把评测数据抽象成一个带聚簇结构的数据集,用 Y_ij 表示第 i 个簇(cluster)里的第 j 个响应(response)。在我们的场景里,簇可以是“一个数据集的某个来源目录”“同一批生成的题目”,响应可以是“回答是否正确”或“回答是否有内容”等。
然后论文引入一个响应指示变量 R_ij:当模型给出了可用响应时取 1,否则取 0。问题是,我们真正关心的是所有样本上的某个目标量,比如“在全体题目上的平均准确率”,但只能观察到 R_ij=1 的那部分样本的答案。这就是经典缺失数据问题中 MAR(Missing At Random)和 MNAR(Missing Not At Random)的区分开始发挥作用的地方。
在评测场景里,我最常用也最关心的是 MNAR——模型拒答本身很可能与题目难度、模型能力直接相关。论文的方法并不强求一个假想的“完全随机缺失”假设,而是通过加权或者建模缺失概率,把缺失带来的偏倚拉回来。
3.2 IPW 加权的直觉:给乖乖回答的样本“加权重”
缺失值处理最经典的思路之一是逆概率加权(Inverse Probability Weighting, IPW)。直觉是这样:如果一个来自聚簇 i 的样本被观测到的概率只有 0.4,那么它代表的其实是“背后没有被观测到的另外 0.6 个样本”,所以它的权重应该是 1 / 0.4 = 2.5。把所有观测样本按其被观测概率的倒数加权,就可以构造出一个在期望意义下逼近总体目标量的估计量。
放在评测场景里的做法就是:用一个模型(比如 logistic regression)来拟合“样本是否被模型响应”的概率,输入的特征可以是题目难度 embedding、簇特征、模型层输出等。然后每个实际观测到的响应样本被赋予一个 1 / P(R=1 | X) 的权重。论文在这里有一个关键主张:这个拟合模型不能忽略簇结构,也就是说,拟合缺失概率时,必须显式地把聚簇随机效应(cluster random effect)放进去。这也和直观一致:同一簇内的题目缺失机制高度相似,如果忽略这一点,缺失概率的估计就会偏差。
我复现时的做法是:把题目难度特征、题目来源序号作为固定效应,把簇 ID 作为随机效应,用逻辑回归拟合。要注意的是,当某些簇的缺失概率接近 1 时,IPW 权重会变得非常大,导致方差爆炸。论文里通常建议对权重做截尾(truncation),比如设定最大权重为总样本量的平方根量级,这在实际评测中非常关键。我在实验中就遇到过某个簇 95% 以上都缺失的情况,不截尾的话点估计直接被这一个簇拽飞。
3.3 聚类鲁棒方差估计:不要欺骗自己的显著性
论文的另一个核心模块是聚类鲁棒方差估计(cluster-robust variance estimation)。传统方差估计通常假设样本独立,但在我们的数据里,簇内的样本高度相关。如果无视这个相关性,会用“噱头置信区间”给自己壮胆。
聚类鲁棒方差的核心是在估计方差时考虑簇内相关性导致的额外变异性。具体做法是:基于簇层面构建“独立单元”。把每一个簇视为一个“超级样本”,簇内样本之间的协动关系整体打包进方差计算。
标准形式如下(简化版示意):
V_cluster = M / (M - 1) * (Σ_i (u_i - ū)(u_i - ū)^T) * V_naive
其中 M 是簇的数量,u_i 是第 i 个簇对估计方程(estimating equation)的贡献,ū 是各个簇贡献的均值,V_naive 是朴素方差。这里 M/(M-1) 是小样本修正系数。
我在实验里观察到,在一个聚簇数量较少(比如只有 20 个来源目录)的数据集上,这个修正能将置信区间扩大 40% 以上。这带来的不仅是数字上的变化,而是结论方向上的变化——很多“领先一个百分点”的模型对比,在考虑了聚簇依赖之后变成了“统计上无差异”。
3.4 论文提出的整体算法流程
把上面几块拼在一起,论文的完整流程大致是这样:
第一步,拟合缺失概率模型。把样本的特征(题目的文本 embedding、模型层的输出特征、簇 ID)输入带聚簇随机效应的缺失模型,得到每个样本的响应概率 P(R=1)。
第二步,计算逆概率权重。对于每个观测到的响应样本,权重 = 1 / P(R=1)。这一步之后一般要做截尾和归一化,防止个别簇主导估计。
第三步,用加权后样本估计目标量。比如加权准确率就是所有观测响应样本(加权后)中回答正确的比例。
第四步,计算聚簇鲁棒方差。用估计方程在簇层面上的贡献做方差估计,输出带聚簇修正的置信区间。
第五步,敏感性分析。论文还建议对比几种不同假设下的结果,比如 MAR 假设下的估算、MNAR 假设下的估算、以及完全采样下的底线,看结论是否稳定。如果结论一会儿正一会儿反,那就必须谨慎解读。
为了帮助理解,我可以把不加聚类处理的常规加权估计和论文的方法放进一张表里对照:
| 环节 | 普通 IPW 做法 | 论文 Cluster-Aware 做法 |
|---|---|---|
| 缺失概率模型 | 仅用样本特征 | 样本特征 + 聚簇随机效应 |
| 目标量估计 | 加权平均 | 加权平均(相同) |
| 方差估计 | 朴素方差(假设独立) | 聚簇鲁棒方差(簇间累加) |
| 置信区间 | 通常过窄 | 更保守、可靠 |
| 适用性 | 简单场景 | 评测数据有多来源分组时 |
这张表可以作为任何想快速理解论文增量的人的速查卡。
3.5 复现时踩过的两个实现坑
这里我必须多说两句实现细节,因为论文里写起来轻描淡写,实际动手做的时候一踩一个准。
第一个坑是:簇的大小极端不平衡时,矩阵病态容易爆。有些数据集里 100 个题目簇的大小可能差 10 倍以上,拟合带随机效应的逻辑回归对优化器的要求很高。我尝试了几种实现方式,直接用 statsmodels 的 MixedLM 在部分数据集上会报收敛警告,后来换用 R 的 lme4(lme4 做带随机效应的广义线性模型更成熟),或者用 PyTorch 里自定义的负对数似然手写优化,效果会稳定不少。
第二个坑是:截尾阈值的取值对结果影响很大。论文里没有给出一个万能默认值,实际上需要在验证集上做一些网格搜索,或者干脆做一个简单规则:所有权重截断在权重分布的 90%~95% 分位数以内。我在实际评测中发现这个规则比固定阈值更稳健。如果你要在自己的评测流程里落地,建议至少跑三种截尾阈值下的结果,确认结论没有因为权重处理而改变。
4. 有效性验证:合成数据与真实基准上的收益
方法设计得再精巧,最终还是要拿数据和实验说话。论文在实验部分设计了两大类验证,一类是可控的合成数据实验,用来验证统计性质;另一类是真实语言模型评测基准上的对比,用来验证实用价值。我把里面的关键结果和自己复现时的观察放在一起讲。
4.1 合成数据实验:覆盖率与偏差的系统验证
合成数据的好处是我们可以知道“真实答案”。论文模拟了多种缺失机制组合:完全随机缺失(MCAR)、随机缺失(MAR)、非随机缺失(MNAR),同时把聚簇结构分成了弱相关(ICC 小)和强相关(ICC 大)两种档位。
关键指标有两个:一是估计偏差(bias),也就是说我们算出来的准确率和真实准确率差多少;二是置信区间覆盖率(coverage),也就是 95% 置信区间包含真实值的频率。结果显示,普通删除法在 MNAR + 强聚簇依赖的场景下偏差最大,估计的准确率可以直接偏离 10 个百分点以上;论文方法在同样的场景下能把偏差压到 2 个百分点以内。
更重要的是覆盖率。普通方法因为方差低估,覆盖率可能掉到 60% 以下,也就是说你每做 10 次评测,有 4 次置信区间根本没套住真实值。论文方法在大多数场景下能把覆盖率拉回 90% 以上。这一点对做实操的人来说太关键了——发出去的评测结论如果没有有效的区间估计支撑,随时可能被复现实验打脸。
4.2 真实基准:SuperGPQA 与 AIME 上的评测对比
论文的真实实验用在了 SuperGPQA 和 AIME 2024 等基准上,这两个数据集在领域里都比较有代表性:SuperGPQA 是千道级多学科问答基准,内容覆盖极广,题目来源天然就有很强的聚簇结构;AIME 是竞赛级数学题,拒答率在弱模型上尤其高。
我复现时用的是某个 7B 量级的模型,它的 AIME 原始完整评测准确率大概在 15% 上下,但有效回答率只有 80% 左右。用传统“删掉缺失样本”的方法,算出来的准确率能虚高到 20% 左右;而用论文的加权估计方法,得到的准确率在 16%~17% 之间,并给出了一个至少在 3 个百分点宽的置信区间。哪个数字更接近真实水平?答案是后者。
在 SuperGPQA 上我也观察到了类似现象,只不过因为该基准本身题目提示词设计得相对友好,缺失率较低,两组方法之间差异没有 AIME 那么悬殊,但置信区间的宽度差距依然显著。这说明方法在“缺失率低”的场景里依然有价值——它可以帮你避免对榜单微小差异的过度解读。
4.3 这些实验结果对我做评测的直接影响
做完这些复现之后,我把论文里的方法固化成了一个内部评测脚本。现在每次跑完批量评测,我不光输出各个模型的点估计分数,还会附上一行聚簇鲁棒置信区间。这行数字改变了我对很多模型对比的判断方式——以前看到“领先 1.2 个百分点”会觉得这是个不错的信号,现在如果两个模型区间重叠明显,我会认为它们基本没有可比性的差距。
这种“拒绝自欺欺人”的意识,我觉得是这篇论文最大的价值所在——它给我们提供了一个理论上站得住脚、实操上落得了地的手段,而不是在大模型评测的“幻觉繁荣”里继续自嗨。
5. 这套方法在实际评测工作流中的落地启发
论文看到这里,我相信很多读者最关心的已经变成“我怎么把它用到自己的评测 pipeline 里”。这一节我会给出一个具体的接入方案,以及一些从实际操作中沉淀下来的经验判断。
5.1 最小可用接入方案:五步上手
第一步,改造数据记录格式。在评测脚本里记录每一个样本级别的结果,包括题目 ID、来源目录(簇 ID)、题目难度特征、模型是否给出有效响应、响应是否正确。不要把中间结果只留一个总值,没有样本级数据后面什么也做不了。
第二步,确定簇的划分粒度。通常直接用“题目来源目录”,如果数据集没有按来源划分,可以按主题类别或题目模板 ID 来替代。划分粒度直接决定了聚簇修正的有效性,粒度太粗会把不相关的题目扔进同一簇稀释聚类信号,粒度太细会减少簇数量削弱方差估计稳定性。
第三步,拟合缺失概率模型。用带聚簇随机效应的逻辑回归拟合 R_ij,特征可以简单先用“题目自身的 embedding 降维向量 + 难度值”。如果你们团队的算力有限,也可以退一步用 XGBoost 拟合缺失概率后单独估计簇效应,效果差不了太多。
第四步,计算加权准确率和聚簇鲁棒置信区间。这一步可以直接用现成统计包实现,比如 R 的sandwich包和clubSandwich包,加上lme4拟合聚簇逻辑回归,五到十行代码就能跑通。
第五步,做敏感性抽查。建议至少对比以下三种情况下的准确率:完整样本删除法、论文加权法、以及把所有缺失样本视为回答错误的下界估计。如果三种结果都在可接受的共识范围内,那结论基本是实的。
5.2 什么时候可以沿用老方法,什么时候必须上这个框架
我个人的经验判断是:如果缺失率低于 3%,且缺失模式非常随机(比如主要来自 API 超时),删除法带来的偏差可控,不值得上全套复杂流程。但只要缺失率超过 5%,且缺失更多的集中在特定主题或特定难度的题目上,那就不要偷懒了,聚簇依赖几乎一定存在。
还有一种情况是,你在做多个 prompt 变体之间的对比测试,目的是比较不同对齐策略对拒答倾向的影响。此时缺失响应本身就是你要研究的对象,直接删掉等于把最有信息量的行为信号扔进了垃圾桶,这种情况下尤其需要论文这种把“缺失响应”和“内容估计”同时建模的思路。
5.3 一个具体的实操模板(伪代码层面)
为了让大家对落地更有概念,我贴一段简化版的伪代码。这一段已经足够让有 Python 基础的读者直接照着思路移植到自己的脚本里:
# 伪代码:聚簇鲁棒缺失值加权估计 # 输入:样本级评测结果列表 # 每条记录包含 cluster_id, feature, answered_flag, correct_flag import numpy as np from sklearn.linear_model import LogisticRegression # 1. 先用普通特征拟合缺失概率(基线) X = np.array([r.feature for r in results]) R = np.array([r.answered_flag for r in results]) clf = LogisticRegression().fit(X, R) p_obs = clf.predict_proba(X)[:, 1] # 2. 修正:加入聚簇随机效应的近似(用簇内均值作偏移特征即可) cluster_effect = {} for cid in set(r.cluster_id for r in results): mask = np.array([r.cluster_id == cid for r in results]) cluster_effect[cid] = np.mean(R[mask]) - np.mean(R) X_cluster = np.column_stack([X, np.array([cluster_effect[r.cluster_id] for r in results])]) clf2 = LogisticRegression().fit(X_cluster, R) p_obs_adj = clf2.predict_proba(X_cluster)[:, 1] # 3. 计算截尾权重 weights = 1.0 / np.clip(p_obs_adj, 0.05, 0.95) weights_cap = np.minimum(weights, np.percentile(weights, 95)) # 4. 估计加权准确率 obs_mask = R == 1 acc = np.sum(weights_cap[obs_mask] * np.array([r.correct_flag for r in results])[obs_mask]) \ / np.sum(weights_cap[obs_mask]) # 5. 聚簇鲁棒方差(简化版,完整版用 sandwich 估计) cluster_contrib = [] for cid in set(r.cluster_id for r in results): mask = np.array([r.cluster_id == cid for r in results]) & obs_mask cluster_contrib.append(np.sum(weights_cap[mask] * (correct[mask] - acc)) / np.sum(weights_cap)) se_cluster = np.std(cluster_contrib) / np.sqrt(len(cluster_contrib))注意这只是一个教学用的简化版,实际使用请换成真正的混合效应模型和 sandwich 估计器。核心意思是先缺失概率、后加权、再簇级方差,这个三步流程是整篇论文所有推导最终落到地面上的形态。
5.4 未来评测基础设施里,我觉得还会长出什么
读这篇论文的时候我脑子里冒出来一个更大的判断:大模型评测正在从一个“写 prompt 跑分”的粗放阶段,进入一个“把评测本身当成统计推断问题”的精细化阶段。以后我们评测一个模型,可能不再只是丢给它 5000 道题、算一个数字,而是会精确地描述:在怎样的采样框架下、考虑了怎样的缺失机制、置信区间是多少、在什么假设下结论成立。这其实是统计调查方法对评测工程的一次补课。
这篇论文在“聚簇依赖”这一点上开了一个好头,但后续还大有空间。比如怎么在评测集构建时就更合理地设计聚簇结构,怎么在模型迭代过程中把每次评测的聚簇鲁棒方差做成回归测试的门禁指标,又怎么把“缺失响应”本身作为对齐策略分析的抓手(拒答率、拒绝边界、拒绝内容分布)——这些都是可以顺着这篇论文的思路继续做下去的方向。
我现在已经把聚簇鲁棒置信区间加进了自己所有对外评测报告的固定模板里,并且要求每次模型增量评测至少跑一次敏感性分析。做这行的都知道,模型能力的变化很多时候就藏在那几个百分点的波动里,但到底是真进步还是统计假象,以前真说不准。现在有了这层防护网,至少在我这里,忽悠不了了。