
刚看到这篇 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_ij1 的那部分样本的答案。这就是经典缺失数据问题中 MARMissing At Random和 MNARMissing 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(R1 | 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(R1)。第二步计算逆概率权重。对于每个观测到的响应样本权重 1 / P(R1)。这一步之后一般要做截尾和归一化防止个别簇主导估计。第三步用加权后样本估计目标量。比如加权准确率就是所有观测响应样本加权后中回答正确的比例。第四步计算聚簇鲁棒方差。用估计方程在簇层面上的贡献做方差估计输出带聚簇修正的置信区间。第五步敏感性分析。论文还建议对比几种不同假设下的结果比如 MAR 假设下的估算、MNAR 假设下的估算、以及完全采样下的底线看结论是否稳定。如果结论一会儿正一会儿反那就必须谨慎解读。为了帮助理解我可以把不加聚类处理的常规加权估计和论文的方法放进一张表里对照环节普通 IPW 做法论文 Cluster-Aware 做法缺失概率模型仅用样本特征样本特征 聚簇随机效应目标量估计加权平均加权平均相同方差估计朴素方差假设独立聚簇鲁棒方差簇间累加置信区间通常过窄更保守、可靠适用性简单场景评测数据有多来源分组时这张表可以作为任何想快速理解论文增量的人的速查卡。3.5 复现时踩过的两个实现坑这里我必须多说两句实现细节因为论文里写起来轻描淡写实际动手做的时候一踩一个准。第一个坑是簇的大小极端不平衡时矩阵病态容易爆。有些数据集里 100 个题目簇的大小可能差 10 倍以上拟合带随机效应的逻辑回归对优化器的要求很高。我尝试了几种实现方式直接用 statsmodels 的 MixedLM 在部分数据集上会报收敛警告后来换用 R 的 lme4lme4 做带随机效应的广义线性模型更成熟或者用 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 道题、算一个数字而是会精确地描述在怎样的采样框架下、考虑了怎样的缺失机制、置信区间是多少、在什么假设下结论成立。这其实是统计调查方法对评测工程的一次补课。这篇论文在“聚簇依赖”这一点上开了一个好头但后续还大有空间。比如怎么在评测集构建时就更合理地设计聚簇结构怎么在模型迭代过程中把每次评测的聚簇鲁棒方差做成回归测试的门禁指标又怎么把“缺失响应”本身作为对齐策略分析的抓手拒答率、拒绝边界、拒绝内容分布——这些都是可以顺着这篇论文的思路继续做下去的方向。我现在已经把聚簇鲁棒置信区间加进了自己所有对外评测报告的固定模板里并且要求每次模型增量评测至少跑一次敏感性分析。做这行的都知道模型能力的变化很多时候就藏在那几个百分点的波动里但到底是真进步还是统计假象以前真说不准。现在有了这层防护网至少在我这里忽悠不了了。