6.3 教材与考卷:数据准备与效果评估 本节摘要:蒸馏项目里数据面与评估面常被当成"训练之外的小事",恰恰相反——教材(训练数据与增强)决定学生能学到什么,考卷(评估流程)决定你会不会骗过自己。本节讲数据准备的三件事(增强与重打分、难例挖掘、无标签半监督)与评估的三道防线(基线对照、多指标互证、分布外复检),配一套可直接搬走的评估代码与一条完整案例。 6.1 选好了师生,6.2 定好了旋钮,按流程图走到了第三个工位:备教材、出考卷。这一节把 6.2 里"教材质量"四个字展开成可执行的操作,同时把第五章各行业零散出现的验收口径收拢成一套统一流程。 教材三件事 第一件:增强之后必须重打分。
本节摘要:蒸馏项目里数据面与评估面常被当成"训练之外的小事",恰恰相反——教材(训练数据与增强)决定学生能学到什么,考卷(评估流程)决定你会不会骗过自己。本节讲数据准备的三件事(增强与重打分、难例挖掘、无标签半监督)与评估的三道防线(基线对照、多指标互证、分布外复检),配一套可直接搬走的评估代码与一条完整案例。
6.1 选好了师生,6.2 定好了旋钮,按流程图走到了第三个工位:备教材、出考卷。这一节把 6.2 里"教材质量"四个字展开成可执行的操作,同时把第五章各行业零散出现的验收口径收拢成一套统一流程。
第一件:增强之后必须重打分。 数据增强改变了输入,教师对新样本的判断必须现算——拿旧分布上的预存软目标配新增强样本,等于让学生学一份对不上的答案。工程上这意味着增强与教师前向要进同一个数据管线:增强一批、打分一批、缓存一批。增强强度也有讲究:语义不变的常规增强(翻转、裁剪、色彩抖动)可以放开用;语义边缘型的增强(大幅旋转、强噪声)要克制——教师对"快看不懂"的样本会给出犹豫的软目标,教材质量反而被稀释。
第二件:难例挖掘。 教师与学生分歧大的样本,是最值得反复教的教材。做法:训练中途周期性跑一遍"分歧扫描",把师生预测不一致、或教师输出熵处于中段(0.4 到 0.8)的样本抽出来,组成难例池加倍采样。注意难例池要滚动更新——学生学会一批,下一批顶上。
第三件:无标签半监督。 1.3 与 5.3 都提过"教师打分当标签",这里补齐工程细节:置信度过滤(教师置信低于阈值的样本丢弃或降权)、类目均衡(伪标签分布要与业务先验对齐,防止难类被系统性放弃)、渐进式引入(伪标签数据占比从两三成逐步提到七八成,给学生适应期)。
# 教材管线三件套:增强后重打分 + 难例池 + 伪标签过滤 import torch import torch.nn.functional as F @torch.no_grad() def textbook_pipeline(teacher, student, x_raw, augment, y_hard=None, conf_floor=0.3, entropy_band=(0.4, 0.8)): teacher.eval(); student.eval() x_aug = augment(x_raw) # 增强先做 t_logits = teacher(x_aug) # 打分必须跟在增强后面 t_soft = F.softmax(t_logits, dim=-1) conf = t_soft.max(-1).values ent = -(t_soft * t_soft.clamp_min(1e-9).log()).sum(-1) keep = conf > conf_floor # 伪标签过滤:师傅没把握的不发 s_pred = student(x_aug).argmax(-1) t_pred = t_logits.argmax(-1) hard_pool = keep & (s_pred != t_pred) # 难例池:师生分歧且教师有把握 mid_band = keep & (ent > entropy_band[0]) & (ent < entropy_band[1]) return { "x": x_aug[keep], "soft": t_soft[keep], "hard_label": None if y_hard is None else y_hard[keep], "hard_pool_idx": hard_pool.nonzero().squeeze(-1), "mid_band_ratio": mid_band.float().mean().item(), } # 输出示例(一批 256 张): # {'mid_band_ratio': 0.31, 难例池 42 张, 过滤后有效教材 233 张} # mid_band_ratio 长期低于 0.15 说明教师输出太尖锐(回 6.1 查校准), # 高于 0.5 说明教材整体偏难(增强强度或数据分布有问题)。
防线一:基线对照。 蒸馏学生必须与"同结构、同数据、直接训练"的学生比,而不是只与教师比。少了这条,你无法区分收益来自蒸馏还是来自训练本身——这是 3.3 机制清单的验收版。汇报口径统一为三个数:教师成绩、直接训练基线、蒸馏学生。
防线二:多指标互证。 单看准确率的自欺空间太大。最小指标组:任务指标(准确率或 mAP)之外加两项——与教师的 KL 距离(学得像不像)、校准误差(置信度可信不可信)。前者看传艺效果,后者看学生有没有学到教师的分寸感。第五章说过各行业任务指标不同,但这后两项是通用的。
防线三:分布外复检。 测试集若与训练分布同源,分数会系统性虚高。抽一份"时间上更晚、来源上更杂"的复检集(如线上最近一周回流数据),单独出分。蒸馏学生在这里的跌幅若明显大于直接训练基线,说明学生学到的是教师的分布记忆而非泛化能力——错误继承机制的现场验尸。
# 一次防自欺的完整评估:三数对照 + KL + 校准 + 分布外复检 import torch import torch.nn.functional as F @torch.no_grad() def full_exam(model, teacher, loader, n_bins=10): model.eval(); teacher.eval() n = correct = 0 kl_sum = 0.0 bins = [[0, 0, 0.0] for _ in range(n_bins)] # [命中数, 样本数, 置信和] for x, y in loader: logits = model(x) probs = F.softmax(logits, dim=-1) conf, pred = probs.max(-1) correct += pred.eq(y).sum().item() n += y.numel() kl_sum += F.kl_div(F.log_softmax(logits, dim=-1), F.softmax(teacher(x), dim=-1), reduction="batchmean").item() * y.size(0) for c, p_ok in zip(conf, pred.eq(y)): b = min(int(c * n_bins), n_bins - 1) bins[b][0] += int(p_ok); bins[b][1] += 1; bins[b][2] += c.item() ece = sum(t / n * abs(h / max(t, 1) - cs / max(t, 1)) for h, t, cs in bins) print(f"准确率: {correct/n:.4f}") print(f"与教师平均 KL: {kl_sum/n:.4f}(越小学得越像)") print(f"校准误差 ECE: {ece:.4f}(超 0.05 需温度缩放校准)") # 输出示例(同任务两套学生的对比): # 直接训练版:准确率 0.9012 | KL 0.412 | ECE 0.081 # 蒸馏训练版:准确率 0.9194 | KL 0.177 | ECE 0.036 # 蒸馏版三项全优:更准、更像素师傅、置信度更诚实—— # 若只有第一项领先而 KL 更大,警惕"分数撞对但路子走歪"。

背景。 某内容审核模型蒸馏项目,团队汇报"学生 95.2% 对直接训练基线 94.1%,蒸馏成功,建议全量上线"。评审时被拦下:评估流程没过三道防线。
操作。 补做评估。防线一复查:直接训练基线只训了 30 轮,蒸馏学生训了 60 轮——训练预算不对等,基线被人为压低。拉平轮数重跑,基线升到 94.8,蒸馏优势缩到 0.4 个点。防线二补测:与教师 KL 为 0.48(同项目健康水平 0.2 以下),ECE 0.09(教师 0.03)——学生分数是靠硬标签撑的,没学到教师的分寸感。防线三复检:用最近两周线上回流数据出分,蒸馏版跌幅 2.1 个点,直接训练版跌 1.3 个点——错误继承坐实。
结果。 结论从"蒸馏成功"翻案为"蒸馏基本无效":0.4 个点的名义优势在分布外被 0.8 个点的额外跌幅吃穿。回查 6.1 流程发现问题根源:教师在本域数据上未微调(任务失配),教师自己 ECE 就超 0.07。
解读。 这个案例展示了三道防线各拦什么:防线一拦"不公平对照"(训练预算、数据量、增强强度必须对齐),防线二拦"分数撞对"(准但不像、准但莽撞),防线三拦"记忆冒充泛化"。翻案不是坏事——上线后才暴露错误继承,代价是全量的。
变式。 若复检集只能小规模构造(回流数据少),改用时间切片法:按月切训练与测试,模拟分布漂移;对校准不达标的学生不必返工重训,先做部署侧温度缩放(一次参数扫描即可),KL 偏大才值得回训练侧查教师与配比。
⚠️ 常见坑:把验证集当考卷用到底。调参(6.2 的温度与权重扫描)已经在验证集上"消费"过它的信息,最终验收必须换一份从未参与任何决策的测试集与复检集——否则你测的是"过拟合验证集的程度"。
💡 关键直觉:教材与考卷是一体两面。教材里掺没掺水分(低置信伪标签、失配增强),考卷上 KL 与复检跌幅会先于准确率报警——把这两个仪表盘装上,多数"蒸馏玄学失败"在上线前就有征兆。