SPTD:利用训练动态实现高效选择性预测,以单模型成本媲美深度集成

发布时间:2026/5/25 8:08:13

SPTD:利用训练动态实现高效选择性预测,以单模型成本媲美深度集成 1. 选择性预测让机器学习模型学会“知之为知之不知为不知”在医疗影像诊断、自动驾驶决策、金融风险评估这些容错率极低的领域一个错误的模型预测可能意味着生命的代价或巨大的经济损失。我们训练出的模型无论精度多高总会在某些“棘手”的样本上犯错。一个自然的想法是与其让模型在所有样本上都“硬着头皮”给出一个可能错误的答案不如让它学会在“没把握”的时候主动说“我不知道”将决策权交给更可靠的系统或人类专家。这就是选择性预测Selective Prediction或选择性分类Selective Classification的核心思想。想象一下你是一位经验丰富的医生面对一张极其模糊或病变特征不典型的X光片。一位新手医生可能会基于有限的模式匹配给出一个武断的诊断而你更可能的选择是要求进行更详细的检查如CT或活检或者寻求科室会诊。选择性预测旨在为机器学习模型赋予这种“自知之明”。其技术框架非常直观对于一个训练好的分类模型我们额外引入一个“选择函数”或“门控机制”。对于每一个输入样本该机制会输出一个“置信度分数”。我们预先设定一个阈值只有当置信度分数高于此阈值时模型才输出其预测结果否则模型选择“弃权”。这样我们就在模型的“覆盖率”Coverage即做出预测的样本比例和“选择性准确率”Selective Accuracy即在做出预测的样本上的准确率之间建立了一个权衡曲线。这项技术的价值不言而喻。它允许我们在部署模型时根据实际应用对准确率的严苛要求灵活地调整覆盖率。例如在自动驾驶的紧急制动场景中我们可以设定极高的准确率门槛如99.99%系统只在绝对有把握时才触发制动其余情况则交由驾驶员处理或采用更保守的策略从而在整体上构建一个更安全可靠的系统。然而实现高效的选择性预测并非易事。其核心挑战在于如何设计一个既精准又高效的置信度评分函数这个评分需要能真实反映模型在该样本上犯错的可能性。一个朴素的想法是直接使用模型输出的最大软概率Softmax Response作为置信度。但众所周知现代神经网络常常存在“过度自信”的问题即使预测错误其最大软概率值也可能很高。这就引出了不确定性量化Uncertainty Quantification领域的一系列方法如贝叶斯神经网络、蒙特卡洛Dropout、深度集成等。其中深度集成通过训练多个独立模型并集成其预测被证明是生成高质量不确定性估计的强基准方法。但它的代价也显而易见训练和推理的计算成本与集成成员数量成线性增长这在模型越来越大、数据越来越多的今天成为了一个沉重的负担。那么有没有一种方法既能获得媲美深度集成的不确定性估计质量又只需付出单模型训练的成本呢基于训练动态Training Dynamics的选择性预测方法SPTD正是为了回答这个问题而生。2. SPTD原理深度解析从训练轨迹中挖掘“不确定性”信号SPTD方法的灵感源于一个深刻的观察一个样本对于模型来说是否“困难”或“不确定”会清晰地反映在模型学习它的整个“历程”中。我们可以把模型的训练过程想象成一位学生在学习一系列题目。对于简单的题目例如识别清晰的猫狗图片学生可能看一遍就记住了并且在后续的复习中都能稳定答对。对于困难的题目例如区分某些品种极其相似的狗学生可能时而答对时而答错需要反复学习和纠错最终可能仍无法达到稳定掌握。SPTD将这一直觉形式化。它不需要训练多个模型而是充分利用标准训练流程中自然产生的副产品——训练检查点。在训练一个深度神经网络时我们通常会每隔一定迭代次数保存一次模型快照Checkpoint。SPTD方法的核心就是收集从训练早期到收敛的整个过程中一系列中间模型 ({f_1, f_2, ..., f_T}) 对同一个测试样本 (x) 的预测序列。2.1 核心评分机制预测不一致性的加权求和SPTD为每个测试样本计算一个“不稳定性分数”Instability Score。这个分数的设计直观而有效记录最终预测首先获取最终训练好的模型 (f_T) 对样本 (x) 的预测标签 (L f_T(x))。遍历检查点对于每一个中间检查点模型 (f_t)检查其预测标签 (f_t(x)) 是否与最终预测 (L) 一致。计算不一致性定义在时间步 (t) 的指示变量 (a_t) [ a_t \begin{cases} 0, \text{if } f_t(x) L \ 1, \text{if } f_t(x) \neq L \end{cases} ] (a_t 1) 意味着在训练的第 (t) 个阶段模型对样本 (x) 的预测发生了“摇摆”或“分歧”。时间加权并非所有阶段的不一致性都同等重要。在训练初期模型参数随机预测本身就不稳定此时的不一致性信息噪声较大。而在训练后期模型接近收敛如果此时预测仍在变化则强烈暗示该样本位于决策边界附近是模型难以把握的“硬样本”。因此SPTD引入了一个基于时间的权重 (v_t)通常定义为 (v_t (t/T)^k)其中 (k 0) 是一个超参数。这是一个凸函数赋予训练后期的不一致性更高的权重。生成最终分数样本 (x) 的SPTD分数 (s_{\text{sum}}(x)) 定义为加权不一致性的总和 [ s_{\text{sum}}(x) \sum_{t1}^{T} v_t \cdot a_t ]这个分数的直观解释是什么分数 (s_{\text{sum}}(x)) 越高表明在模型训练的关键后期阶段对该样本的预测越不稳定频繁地在不同类别间切换。这种不稳定性正是模型内部“困惑”和“不确定”的外在表现。因此高分样本应被视作高不确定性样本在选择性预测中被拒绝。注意这里有一个关键细节。原始论文中探讨了两种聚合方式求和sum与取最大值max。求和分数 (s_{\text{sum}}) 累积了所有时间步的不一致性对持续的预测摇摆更敏感。而最大值分数 (s_{\text{max}} \max_t (v_t \cdot a_t)) 只关注最严重的一次分歧。实验表明求和分数通常能提供更平滑、更可靠的排序性能优于最大值分数。因为求和能更好地“去噪”将偶尔的早期波动与后期持续的犹豫区分开来。2.2 与深度集成的内在联系与本质区别SPTD常被称为“时间维度上的集成”。深度集成是在“空间”维度上并行训练多个模型通过评估这些独立模型预测的“分歧”来度量不确定性。而SPTD是在“时间”维度上利用单个模型在不同训练阶段的“自我分歧”来度量不确定性。它们的核心联系在于都利用了“预测的方差”作为不确定性的代理。深度集成计算的是不同模型在同一时间点训练完成时预测的方差。SPTD计算的是同一模型在不同时间点预测的方差。它们的核心区别在于成本和假设成本深度集成需要训练N个模型训练成本是SPTD的N倍推理时也需要运行N个前向传播。SPTD只需训练一个模型但需要在训练过程中保存T个检查点推理时需要运行T次前向传播通常T远小于N且检查点预测可以预先计算并缓存。假设深度集成假设不同随机初始化的模型会探索损失函数的不同局部极小值其预测分歧反映了数据本身的模糊性。SPTD假设一个样本如果在训练轨迹的末端仍导致预测摇摆那么它很可能位于决策边界是模糊的。一个重要的实操心得是SPTD对检查点的存储和计算进行了巧妙的“摊销”。在训练完成后我们可以一次性用所有保存的检查点模型对整个验证集/测试集进行前向传播并将每个样本的预测序列存储下来。在后续进行选择性预测时我们只需要根据存储的预测序列快速计算SPTD分数即可无需重新加载模型进行计算。这大大降低了部署时的推理开销。2.3 理论优势为什么训练动态是有效的信号从学习理论的角度看SPTD的有效性可以通过“训练动态反映了样本难度”这一现象来解释。研究如Swayamdipta等人2020年的工作表明模型在学习过程中对“简单”样本的损失会迅速下降并保持稳定而对“困难”或“歧义”样本的损失则下降缓慢且波动较大。预测标签的切换正是这种损失波动的外在体现。SPTD分数本质上是在度量样本学习曲线的“平滑度”。一个理想的、易于学习的样本其预测标签从某个中间点开始就应该保持恒定。而一个困难的样本其预测标签可能会在正确的标签和几个相似的错误标签之间反复横跳直到训练结束也可能无法完全稳定下来。加权求和机制放大了训练后期的不稳定性使其成为区分样本可靠性的强信号。3. SPTD实战指南从零实现与关键调优理解了原理我们来看如何在实际项目中应用SPTD。下面我将提供一个基于PyTorch的简化实现框架并深入探讨每个环节的注意事项。3.1 实现步骤详解步骤一模型训练与检查点保存这是最基础的一步。我们需要修改常规的训练循环定期保存模型的状态字典。import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader import os def train_model_with_checkpoints(model, train_loader, val_loader, epochs, checkpoint_interval, save_dir): optimizer optim.SGD(model.parameters(), lr0.1, momentum0.9, weight_decay5e-4) scheduler optim.lr_scheduler.CosineAnnealingLR(optimizer, T_maxepochs) criterion nn.CrossEntropyLoss() os.makedirs(save_dir, exist_okTrue) checkpoint_paths [] for epoch in range(epochs): model.train() for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output model(data) loss criterion(output, target) loss.backward() optimizer.step() # 验证逻辑可以在这里添加... scheduler.step() # 定期保存检查点 if (epoch 1) % checkpoint_interval 0 or epoch epochs - 1: checkpoint_path os.path.join(save_dir, fcheckpoint_epoch_{epoch1}.pth) torch.save({ epoch: epoch 1, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), scheduler_state_dict: scheduler.state_dict(), }, checkpoint_path) checkpoint_paths.append(checkpoint_path) print(fCheckpoint saved at epoch {epoch1}) return checkpoint_paths关键技巧checkpoint_interval的选择至关重要。太稀疏会丢失重要的动态信息太密集则存储和计算开销大。一个经验法则是在训练初期可以保存得密集一些例如每2-5个epoch因为初期变化剧烈在训练后期可以稀疏一些例如每10-20个epoch。也可以采用对数尺度进行保存。步骤二计算样本的SPTD分数训练完成后加载所有检查点为需要评估的数据集如验证集计算每个样本的分数。def compute_sptd_scores(model_class, checkpoint_paths, data_loader, devicecuda, k2): 计算数据集中所有样本的SPTD分数。 model_class: 模型类的定义 checkpoint_paths: 检查点文件路径列表按训练时间顺序排列 data_loader: 数据加载器 k: 时间加权指数 T len(checkpoint_paths) model model_class().to(device) all_scores [] # 预分配空间存储每个检查点的预测 # 假设数据集大小为N类别数为C # 这里用一个列表存储每个检查点的预测结果标签避免存储所有logits节省内存 checkpoint_predictions [] # 阶段1: 遍历所有检查点收集预测标签 for idx, ckpt_path in enumerate(checkpoint_paths): print(fLoading checkpoint {idx1}/{T}: {ckpt_path}) checkpoint torch.load(ckpt_path, map_locationdevice) model.load_state_dict(checkpoint[model_state_dict]) model.eval() preds_this_checkpoint [] with torch.no_grad(): for data, _ in data_loader: # 不需要标签 data data.to(device) output model(data) _, predicted output.max(1) # 获取预测标签 preds_this_checkpoint.append(predicted.cpu()) # 将当前检查点的所有batch预测拼接起来 checkpoint_predictions.append(torch.cat(preds_this_checkpoint, dim0)) # 阶段2: 计算每个样本的SPTD分数 num_samples checkpoint_predictions[0].size(0) all_scores torch.zeros(num_samples) # 获取最终预测最后一个检查点 final_predictions checkpoint_predictions[-1] for t in range(T): # 计算当前检查点预测与最终预测的不一致性 disagreement (checkpoint_predictions[t] ! final_predictions).float() # [N, ] # 计算时间权重 v_t (t/T)^k注意索引从0开始 weight ((t 1) / T) ** k # 累加加权不一致性 all_scores weight * disagreement return all_scores.numpy() # 返回一个长度为N的分数数组步骤三确定阈值与实施选择性预测在验证集上计算所有样本的SPTD分数和真实标签后我们可以根据目标覆盖率来确定阈值。def determine_threshold(scores, labels, target_coverage): 根据目标覆盖率在验证集上确定最优阈值。 scores: 验证集样本的SPTD分数数组 (N,) labels: 验证集真实标签 (N,) preds: 最终模型的预测标签 (N,) target_coverage: 目标覆盖率如0.8 # 最终模型的预测假设已经获得 final_preds ... # 形状 (N,) # 将分数和标签、预测对齐 sorted_indices np.argsort(scores) # SPTD分数越低越自信所以按升序排序 sorted_scores scores[sorted_indices] sorted_labels labels[sorted_indices] sorted_preds final_preds[sorted_indices] # 计算在不同阈值下的覆盖率和准确率 num_samples len(scores) num_accept int(target_coverage * num_samples) # 接受分数最低的 target_coverage 比例样本 accepted_indices sorted_indices[:num_accept] rejected_indices sorted_indices[num_accept:] # 计算选择性准确率 accepted_correct (sorted_preds[:num_accept] sorted_labels[:num_accept]).sum() selective_accuracy accepted_correct / num_accept if num_accept 0 else 0.0 # 阈值可以取被接受样本中最高分和被拒绝样本中最低分的平均值或直接取分界点分数 threshold (sorted_scores[num_accept - 1] sorted_scores[num_accept]) / 2 if 0 num_accept num_samples else (sorted_scores[-1] 1e-6 if num_accept num_samples else sorted_scores[0] - 1e-6) print(f目标覆盖率: {target_coverage:.2f}) print(f实际覆盖率: {num_accept/num_samples:.4f}) print(f选择性准确率: {selective_accuracy:.4f}) print(f建议阈值: {threshold:.6f}) return threshold, selective_accuracy # 在测试集上应用 def selective_predict(test_scores, test_preds, threshold): 根据阈值进行选择性预测。 返回接受决策的布尔数组以及接受样本的预测结果。 accept_mask test_scores threshold selective_preds test_preds[accept_mask] return accept_mask, selective_preds3.2 超参数选择与性能调优SPTD的核心超参数不多但每个都影响显著检查点数量T与保存策略这是性能与成本的权衡。论文实验表明即使检查点数量较少如50个SPTD也能取得不错的效果。当检查点数量增加到与深度集成成员数相当时如T ≈ ESPTD能达到与深度集成相媲美的性能而训练成本仅相当于单个模型。我的经验是在总训练epoch数的10%-20%区间内均匀采样检查点通常能取得很好的效果。例如训练200个epoch每10个epoch保存一次得到20个检查点。时间加权指数k参数k控制着如何权衡不同训练阶段的不一致性。k0意味着所有检查点权重相同均匀加权。k0赋予后期检查点更高权重。k值较小时如0.5模型对中期的不稳定性也较为敏感。k值较大时如2或3论文中常用模型几乎只关注训练末尾阶段的不稳定性这通常能提供最干净的信号因为训练初期的噪声被有效抑制。建议从k2开始尝试这是一个在多个数据集上表现稳健的默认值。可以在验证集上绘制不同k值对应的“覆盖率-准确率”曲线AUC来进行选择。最终模型的选择SPTD分数是基于与最终模型预测的一致性来计算的。因此最终模型的质量直接影响SPTD的效能。务必确保你的最终模型是充分收敛、性能良好的。如果使用了早停Early Stopping请确保保存的是验证集性能最佳的模型而不是最后一个epoch的模型。3.3 与现有训练流程的集成SPTD的一个巨大优势是“非侵入性”。它不需要修改损失函数、网络结构或训练流程。你完全可以沿用现有的、调优好的训练脚本只需增加检查点保存和分数计算的后处理步骤即可。这使得它易于被集成到现有的机器学习管道中。一个高效的部署工作流如下训练阶段正常训练模型并定期保存检查点到磁盘。校准阶段离线 a. 加载所有检查点在验证集上计算每个样本的SPTD分数。 b. 根据业务需求例如要求选择性准确率高于99%在验证集上确定对应的阈值。 c. 可选将验证集所有样本的SPTD分数分布可视化观察其与正确/错误分类的关系确认分数的区分度。推理阶段在线 a. 对于新的输入用最终模型进行预测得到标签L。 b. 用所有检查点模型可预先加载到内存对该输入进行前向传播计算其SPTD分数s。 c. 比较s与预设阈值若s threshold则输出预测L否则输出“弃权”或触发后续处理流程。重要提醒计算SPTD分数需要T次前向传播这比单次推理慢T倍。为了优化在线推理速度可以考虑以下策略模型蒸馏尝试用一个小型网络来学习SPTD分数从而避免运行所有检查点。缓存与批处理如果应用场景允许可以对一批查询进行批处理计算充分利用GPU并行能力。选择性计算对于明显简单或困难的样本或许可以用更少的检查点或更简单的启发式方法快速决策只对中间地带的样本使用完整的SPTD计算。4. 实验结果分析与横向对比理论再优美也需要实验的验证。我们依据提供的材料深入剖析SPTD在标准视觉基准数据集上的表现并将其与主流方法进行对比。4.1 性能对比SPTD vs. 传统方法我们主要对比以下几类方法SR (Softmax Response)基线方法直接使用最终模型预测的最大软概率作为置信度。SAT (Self-Adaptive Training)一种通过动态重标注困难样本来优化训练过程的方法旨在提升模型校准性和选择性预测能力。DE (Deep Ensembles)深度集成通过训练多个独立模型并集成其预测来估计不确定性是性能强基准。SPTD我们介绍的方法。DESPTD在深度集成的每个成员上应用SPTD再将分数集成代表性能上限。下表展示了在CIFAR-100数据集上不同覆盖率下的选择性准确率均值±标准差5次随机运行覆盖率SRSATERSRDESPTDDESPTD100%75.1(±0.0)75.1(±0.0)75.1(±0.0)75.1(±0.0)75.1(±0.0)90%78.2(±0.1)78.9(±0.1)80.2(±0.0)80.4(±0.1)81.1(±0.1)80%82.1(±0.0)82.9(±0.0)84.7(±0.1)84.6(±0.1)85.0(±0.2)70%86.4(±0.1)87.2(±0.1)88.6(±0.1)88.7(±0.0)88.8(±0.1)60%90.0(±0.0)90.3(±0.2)90.2(±0.2)90.1(±0.0)90.4(±0.1)50%92.9(±0.1)93.3(±0.0)94.8(±0.0)94.6(±0.0)94.9(±0.0)40%95.1(±0.0)95.2(±0.1)96.8(±0.1)96.9(±0.1)96.9(±0.0)30%97.2(±0.2)97.5(±0.0)98.4(±0.1)98.4(±0.1)98.5(±0.0)20%97.8(±0.1)98.3(±0.1)99.0(±0.0)98.8(±0.2)99.2(±0.1)10%98.1(±0.0)98.8(±0.1)99.2(±0.1)99.4(±0.1)99.6(±0.1)注加粗表示在该覆盖率下所有方法中的最佳性能下划线表示单次训练运行方法中的最佳性能。数据来源于提供的材料。从表中我们可以得出几个关键结论SPTD显著优于单次训练方法在几乎所有覆盖率下SPTD的选择性准确率都明显高于SR和SAT。这表明利用训练动态提供的不确定性信号远比单纯依赖最终模型的软概率或使用特定的训练技巧更有效。SPTD媲美甚至部分超越深度集成这是SPTD最引人注目的优势。在多数覆盖率水平上尤其是60%-90%这个实用区间SPTD的性能与DE非常接近有时甚至略优如90%覆盖率时。考虑到DE需要训练5-10个独立模型而SPTD只需一个这个结果极具吸引力。DESPTD代表了性能上限将SPTD应用于深度集成的每个成员然后集成它们的分数得到了最好的性能。这验证了两种不确定性来源模型间差异和训练动态不稳定性是互补的。低覆盖率下的卓越表现在极低覆盖率如10%-30%下SPTD和DE都能达到接近99%以上的惊人准确率。论文中的分析指出在低覆盖率区域对训练动态更细致的刻画即更多检查点能带来帮助。这是因为只有那些在整个训练过程中都极其不稳定的“超级困难”样本才会被筛选出来拒绝剩下的都是模型极度确信的样本。4.2 成本-性能权衡分析性能的提升不能忽视成本的代价。下表对比了各方法在训练时间、空间以及推理时间、空间上的复杂度方法训练时间训练空间推理时间推理空间性能排名SRO(1)O(1)O(1)O(1)5SATO(1)O(1)O(1)O(1)4DEO(E)O(E)O(E)O(E)2SPTDO(1)O(T)O(T)O(T)2DESPTDO(E)O(E×T)O(E×T)O(E×T)1E: 集成成员数 T: 检查点数量解读与实操建议SR和SAT成本最低但性能也最差。适用于对不确定性要求不高、资源极度受限的场景。DE训练和推理成本都与集成数量E线性相关。为了获得好性能E通常需要5-10这意味着5-10倍的计算和存储开销。在模型巨大时这个成本可能令人望而却步。SPTD训练成本仅为O(1)与训练单个模型无异这是其最大优势。它需要存储T个检查点因此空间复杂度为O(T)。推理时需要T次前向传播时间复杂度为O(T)。关键在于T通常可以远小于E。例如用50个检查点T50的SPTD就能达到与5个模型集成E5相近的性能而训练成本仅为后者的1/5。推理时50次前向传播虽然比5次多但检查点模型是同一个网络可能享受到更好的缓存一致性且在实际部署中可以通过优化来缓解。DESPTD性能最强但成本也最高是DE和SPTD成本的乘积。仅在追求极致性能且不计成本的场景下考虑。对于大多数实践者SPTD在性能和成本之间提供了最佳的平衡点。它让你用单模型训练的成本获得了接近集成方法的性能。4.3 训练动态的可视化洞察模型如何学习SPTD的强大之处不仅在于结果还在于它为我们打开了一个观察模型学习过程的“窗口”。通过分析训练动态我们可以获得关于数据和模型本身的深刻见解。提供的材料中的图3.8展示了一个经典模式它分别绘制了在训练和测试集上被正确分类和错误分类的样本其SPTD分数期望值E[·]和方差V[·]随训练检查点变化的曲线。正确分类的样本冷色调线无论是训练集还是测试集其预测不一致性的期望和方差都随着训练的进行而迅速下降并趋近于0。这意味着模型很快地、稳定地学会了这些样本。错误分类的样本暖色调线其预测不一致性的期望和方差在整个训练过程中都保持在一个较高的水平并且持续波动。这直观地展示了模型在面对这些“困难户”时的挣扎和犹豫。这个可视化极具价值。在模型开发阶段你可以通过观察这些曲线来诊断问题如果测试集错误样本的方差在训练末期仍然很高可能意味着模型容量不足或存在过拟合。如果训练集和测试集的动态差异巨大可能预示着严重的分布外问题。你可以定位那些在整个训练过程中都保持高方差的测试样本对其进行人工分析理解模型为何困惑这可能是改进数据集或模型架构的关键。5. 高级话题与未来方向SPTD为我们提供了一个强大而高效的框架但选择性预测领域仍有许多开放性问题值得探索。5.1 超越分类回归与时间序列预测选择性预测的思想同样适用于回归和时序预测任务。在回归中我们不再预测离散标签而是连续值。不确定性可以表现为预测值的方差。SPTD可以很自然地扩展我们可以计算每个检查点模型对同一输入预测值的方差或更鲁棒的统计量作为不确定性分数。在时间序列预测中模型需要预测未来序列。同样我们可以用多个检查点模型预测的序列之间的差异如均方误差的方差来度量不确定性。实验表明在这些任务上SPTD也能提供与深度集成相当的性能同时在低覆盖率区域表现更优。5.2 与差分隐私的交互在要求数据隐私的场景下我们使用差分隐私DP技术训练模型。一个关键发现是差分隐私的噪声注入会损害模型的不确定性估计能力。DP-SGD中的梯度裁剪和噪声添加不仅降低了模型效用准确率还使得模型对其错误预测变得更加“过度自信”。这意味着在相同覆盖率下一个差分隐私模型的选择性准确率会低于非隐私模型。SPTD在这种场景下显示出独特的优势。因为DP训练本身就需要记录隐私预算的消耗保存检查点是常见做法。SPTD利用这些现成的检查点没有引入额外的隐私成本由于差分隐私的后处理性质。而像深度集成这样的方法因为需要训练多个模型会因高级组合定理而消耗更多的隐私预算或者在固定总预算下导致每个模型更弱的隐私保护从而性能下降更严重。因此在隐私敏感的应用中SPTD是更具实用性的选择性预测方案。5.3 分布外检测与对抗样本的潜力一个很自然的问题是SPTD分数能否用于检测分布外OOD样本或对抗样本初步研究表明是有潜力的。OOD样本或精心构造的对抗样本对于模型来说是极其“陌生”或“反常”的很可能导致其在训练的不同阶段产生混乱且不一致的预测从而获得很高的SPTD分数。提供的材料中的图3.9展示了SPTD在CIFAR-10/100数据集上区分正常测试集、OOD数据集SVHN和对抗样本PGD攻击生成的能力。可以看到OOD和对抗样本的SPTD分数分布与正常样本有显著差异通过设置阈值可以实现一定程度的区分AUC可达0.8以上。但这并非SPTD的主要设计目标其在此任务上的可靠性仍需更多研究验证。对于专门的OOD检测或对抗防御仍有更专用的方法。5.4 构建高性能选择性分类器的要素分解要构建一个接近理想预言机即总能先接受正确样本的选择性分类器我们需要理解其性能差距的来源。研究将选择性分类的“差距”分解为五个部分贝叶斯误差数据本身存在的、不可避免的噪声。即使是最优模型也会犯错。近似误差由于模型容量有限无法完美拟合真实函数。排序误差置信度评分函数未能将样本按真实正确概率完美排序。这是校准Calibration要解决的核心问题。统计误差由于有限数据带来的估计噪声。实施误差如优化不充分、分布偏移等。SPTD主要作用于减少“排序误差”。它通过利用训练动态提供的丰富信号生成了比简单软概率更优质的排序。温度缩放Temperature Scaling等后处理校准技术虽然能改善概率的校准度即预测概率与真实正确频率匹配但因为是单调变换不改变样本间的相对顺序因此无法减少排序误差。而像SPTD或深度集成这样的方法通过引入新的信息源时间动态或模型差异本质上改变了置信度得分的生成机制从而能够对样本进行重新排序更有效地将正确样本排在前面。5.5 警惕“选择性”的滥用与防御最后我们必须以审慎的态度看待选择性预测。这项技术可以被用于善意地提升系统可靠性也可能被恶意滥用。一个不道德的机构可能故意训练一个模型使其对特定群体如某类贷款申请人的预测总是保持“低置信度”从而系统性地拒绝为他们服务同时以“模型不确定”为借口规避歧视审查。为此研究者提出了如“机密守护者”这样的框架通过零知识证明等技术让第三方审计者能够验证模型置信度分数的真实性保其没有被恶意篡改以诱导不公平的弃权。这提醒我们在设计和部署选择性预测系统时必须考虑其公平性、可审计性和透明度。在我自己的项目经验中SPTD已经成为我构建可靠机器学习系统的首选工具之一。它的实现简单与现有流程无缝集成并且以极低的额外成本提供了巨大的性能收益。当你下一次需要让模型在关键应用中说“我不知道”时不妨从保存训练检查点开始尝试一下SPTD。你可能会惊喜地发现模型在训练过程中的那些“犹豫”和“反复”恰恰是它在向你诉说哪些问题最难解。

相关新闻