蒸馏:从教师软概率到 response 监督的最小复现

蒸馏:从教师软概率到 response 监督的最小复现

  • 系列:开源 AI 论文复现实验与代码解读|第五轮 066
  • 日期:2026-09-07
  • 读者:研究生、科研新人和工程型研究者

复现价值:先问教师究竟交出了什么

知识蒸馏指用教师模型提供的监督训练学生模型。教师可以交出完整输出概率,也可以只交出生成文本。前者让学生看见"第二可能答案"与最高分答案的差距,后者保存一条具体行为轨迹。学生容量较小、教师有偏差、迁移样本覆盖不足,都可能限制收益;参数少只是结构属性,效果仍须独立检验。

论文报告:Hinton、Vinyals 与 Dean 在 2015 年预印本中讨论软目标及温度,展示图像和语音任务中的知识迁移;这不是所有学生都能无损压缩教师的定理。原论文

Kim 与 Rush 的 EMNLP 2016 工作将监督提升到完整输出序列,用教师束搜索生成的序列训练学生。束搜索是在每一步保留多个候选前缀的近似解码;它不保证找到全局概率最大的句子。现代 response distillation,即响应蒸馏,也常将教师生成文本作为训练标签,但具体采样与过滤策略不能自动等同于原论文。序列级蒸馏

核心思想与公式:概率、序列与损失方向

logit 是归一化前的分数。对同一输入,教师和学生的 logit 分别为 z t , z s ∈ R B × C z^t,z^s\in\mathbb R^{B\times C} zt,zs∈RB×C,其中 B B B 是批大小, C C C 是类别数。定义:

p T = softmax ⁡ ( z t / T ) , q T = softmax ⁡ ( z s / T ) , L = ( 1 − α ) CE ⁡ ( y , q 1 ) + α T 2 KL ⁡ ( p T ∥ q T ) . p_T=\operatorname{softmax}(z^t/T),\quad q_T=\operatorname{softmax}(z^s/T),\qquad L=(1-\alpha)\operatorname{CE}(y,q_1)+\alpha T^2\operatorname{KL}(p_T\|q_T). pT=softmax(zt/T),qT=softmax(zs/T),L=(1−α)CE(y,q1)+αT2KL(pT∥qT).

T > 0 T>0 T>0 是温度,增大它通常使概率更平缓; y y y 是长度为 B B B 的真实标签,CE 为交叉熵, α \alpha α 控制教师监督权重。KL 即两种概率分布差异的度量,这里对类别求和、对样本取平均。教师固定时,软交叉熵与这个方向的 KL 相差教师熵,学生梯度相同。乘 T 2 T^2 T2 用于补偿高温下梯度尺度,不能理解成温度越高知识越多。公式与温度讨论

响应蒸馏则使用教师生成的 y ^ = ( y ^ 1 , ... , y ^ L ) \hat y=(\hat y_1,\ldots,\hat y_L) y^=(y^1,...,y^L):

L r e s p = − 1 M ∑ b , j m b j log ⁡ q θ ( y ^ b j ∣ x b , y ^ b , < j ) , M = ∑ b , j m b j . L_{\rm resp}=-\frac{1}{M}\sum_{b,j}m_{bj}\log q_\theta(\hat y_{bj}\mid x_b,\hat y_{b,<j}),\quad M=\sum_{b,j}m_{bj}. Lresp=−M1∑b,jmbjlogqθ(y^bj∣xb,y^b,<j),M=∑b,jmbj.

L L L 为序列长度上限, m ∈ { 0 , 1 } B × L m\in\{0,1\}^{B\times L} m∈{0,1}B×L 标识有效响应词元,提示词与填充位置不参与平均,结束词元是否保留须明确; M M M 不能为零。模型输出形状为 [B,L,V], V V V 为词表大小。训练时输入已有前缀并预测下一词元,必须对齐因果移位。完整文本可由学生自己的分词器重新编码;直接逐词元匹配两模型概率则要求词表语义与上下文对齐。

MiniLLM 研究反向 KL,即 KL ⁡ ( q θ ∥ p ) \operatorname{KL}(q_\theta\|p) KL(qθ∥p),并配套设计采样和优化。其序列期望依赖学生分布,不能在固定教师响应上交换函数参数便声称实现了整套方法。本文采用 2024 年 v4;当前 arXiv v6 已将题名改为含 On-Policy 的版本。MiniLLM v4版本记录

图中两条路线是替代选择:概率进入 KL,响应进入词元交叉熵;损失指向学生表示训练监督,教师保持冻结。独立测试集检查训练后的学生,不用于产生训练目标。图示概念关系,不表示本次已训练语言模型。

官方代码阅读路线:沿着有效 token 找分母

先读 PyTorch 官方教程的 train_knowledge_distillation:教师进入评估模式,在不记录梯度的上下文中前向,学生保留梯度;然后核对两边温度和混合权重。评估模式只改变 dropout 等模块行为,本身不会阻止梯度构图。这是框架教学代码,并非 Hinton 论文的原始实现。官方教程

再读 LMOps 的 minillm/finetune.pyget_distil_loss 在非模型并行分支计算教师 softmax 与学生 log-softmax 的软交叉熵,用 label != -100 排除无效目标,最后除以有效位置数;该函数没有显式温度缩放,不能把本文的温度三实验冒充官方默认值。训练入口用 kd_ratio 混合真实标签与教师损失。KD 源码

响应路线先按仓库 README 的 SeqKD 小节生成并处理伪响应,再运行微调。MiniLLM 路线另从 trainer.py 追踪 rollout 收集、响应 logit 切片与模型更新,再读 losses.py 中策略损失及正则;这些模块说明它与离线响应拟合的差别。本文只阅读,没有启动分布式训练;仓库 main 未锁定提交,后续运行兼容性待人工核验。官方仓库训练器损失实现

最小实验:真实训练,明确缩小范围

code/minimal_distillation.py 仅依赖 Python 标准库。数据由二维坐标和固定非线性评分规则生成三分类标签。教师在六维多项式特征上拟合十八个参数,学生在三维线性特征上拟合九个参数;这是真实优化的分类模型,但不是预训练神经语言模型。

教师训练集三百六十条、迁移集九十条、测试集二百四十条,用不同数据种子生成。教师训练四百步并冻结,学生均训练二百五十步,学习率统一为 0.12;三个运行种子为 66、67、68,只改变初始化。同一个种子下,四组学生从完全相同权重出发。温度一与三、软监督权重 0.7 均预先固定,不用测试集选参。

bash 复制代码
PYTHONPYCACHEPREFIX=/private/tmp/codex-ai-066-pycache python3 -m py_compile code/minimal_distillation.py code/torch_loss_check.py
python3 code/minimal_distillation.py > code/smoke_test.txt

本次实际验证:Python 3.9.6、CPU;教师特征 [360,6],学生特征 [90,3],测试 logit [240,3]。下表为三个初始化的均值,NLL 是真实标签的负对数似然,越低越好;所有评测概率均使用温度一。

学生监督 准确率 真实标签 NLL 与教师的 KL
仅真实标签 0.9542 0.2100 0.0438
仅教师最高分标签 0.9333 0.2165 0.0485
真实标签加软目标,温度一 0.9500 0.2223 0.0495
真实标签加软目标,温度三 0.9500 0.1887 0.0347

教师准确率均为 0.9792。学生各组准确率的样本标准差均为零,NLL 仍有微小波动,完整数值与权重保存在 code/results.json。零波动只说明这三个初始化得到相同数量的正确预测,不说明结果没有统计不确定性。

温度三改善了概率指标,却未改善相对真实标签基线的准确率。硬教师分支没有真实标签混合,因此表格也不能单独证明"软概率形式"优于硬目标;严格消融应额外匹配标签混合比例。教师测试错题共五条,各学生均复制其中四条错误,这个切片太小,适合作为警报而非稳定错误率估计。

本次另通过 KL 自比较、方向不对称、大 logit 稳定性和有限差分梯度检查;梯度最大误差约为 7.94 × 10 − 12 7.94\times10^{-12} 7.94×10−12。torch_loss_check.py 提供有效词元、教师 detach 和掩码梯度对照,但本机两个 Python 环境均缺少 torch,只有语法检查通过,运行待人工核验。分类硬标签分支不等于完整 response 蒸馏,本次没有文本生成、序列训练或原论文 benchmark。

评测协议:相似度不能代替正确性

正式复现先冻结教师检查点、数据来源、分词器与聊天模板,按问题家族切分训练、开发、测试,执行去重和污染检查。用开发集选择温度、权重和停止步,再只对冻结方案报告测试结果。本文没有开发集,直接用预定最终步,适合机制检查,不承担最优配置选择。

同时报告任务指标、真实参考下的 NLL、教师一致率与教师错题上的错误复制。语言任务要固定解码温度、最大新词元数、停止条件,保存原始响应;开放答案结合独立盲评,可验证任务优先采用答案或执行检查。仅复述教师措辞,不应自动得高分。

还要区分两类波动:重复初始化衡量优化敏感性,重复采样测试问题才涉及样本不确定性。本文三个种子共享同一测试集,所以标准差不能充当总体准确率的置信区间。真实报告可在题目层面做配对重采样,保留同一道题上基线与蒸馏模型的对应关系;同一家族多条改写应作为一个抽样单元,避免把相关记录当成独立证据。

成本也要公平:除了学生训练步数,还要记录教师预训练或微调成本、生成词元数、软 logit 缓存体积和峰值内存。固定样本数并不等于固定训练词元数。硬响应与软分布两路线都应比较同架构、同初始化的真实标签基线,再做固定词元预算对照;改变数据量与损失形式时分别记录,避免把额外监督的收益归给公式。

失败排查:先检查方向,再检查数据

KL 数值异常时,先确认函数输入要求。PyTorch 的输入通常是学生对数概率,目标是教师概率;batchmean 对二维分类张量除以批大小,但直接用于三维张量不会自动除以有效词元总数。配套实现先选出有效位置变成 [M,V],再计算平均;空响应直接报错。KLDivLoss 文档

缓存也会造成隐蔽错误。保存软目标时应同时记录样本编号、词元编号、掩码、教师版本和温度;只按文件行号连接输入与概率,重新排序后就可能训练到别人的目标。若仅缓存最高几个概率,再归一化会改变原来的分布,必须说明遗漏概率质量如何处理。响应数据至少保留提示词、原始生成文本、生成参数与过滤原因,不能只留下清理后的答案。

训练很顺却生成退化时,打印一条完整的输入、移位标签和掩码,检查是否把提示词计入损失、丢掉结束标记或重复移位。教师使用评估模式并冻结,随机裁剪与预处理也应一致。若学生更像教师却更不正确,查看错误复制、数据覆盖与教师在目标领域的表现,不急着增加蒸馏权重。

后续科研问题

作者推断:容量受限时,最有价值的监督可能只来自部分不确定区域。可先按教师置信度分桶,比较同预算的分桶温度和固定温度,并把教师错误单独标记;收益是否来自过滤错误还是保留软信息,需要分开消融。

另一个问题是前缀分布。离线响应只覆盖教师走过的路径,学生自由生成会遇到自己的偏离。下一步可比较教师前缀与学生前缀上的监督,固定查询预算并记录错误出现位置;这才逐步接近在线蒸馏问题,而不是把分类实验的结论直接移植到长文本。

总结

蒸馏复现需要同时说明教师提供什么、学生在哪些输入上学习、结果由谁判断。本次建立了可回放的软硬监督对照,并保留准确率未提升和教师错误传播的事实。下一步应补齐张量运行验证与真实序列实验,继续用独立任务证据判断收益。

参考资料

检索日期:2026-09-07。以上正文链接均直接指向本次打开的一手资料。核心论文为 Geoffrey Hinton、Oriol Vinyals、Jeff Dean 的《Distilling the Knowledge in a Neural Network》(2015,arXiv v1);Yoon Kim、Alexander M. Rush 的《Sequence-Level Knowledge Distillation》(EMNLP 2016 定稿);Yuxian Gu、Li Dong、Furu Wei、Minlie Huang 的《MiniLLM: Knowledge Distillation of Large Language Models》(ICLR 2024,本文阅读 arXiv v4)。MiniLLM 当前 v6 的题名与版本变化另见正文版本记录。代码链接为检索日 main,PyTorch 损失接口采用固定 2.12 文档;官方教程为动态页面,依赖与模型运行兼容性待人工核验。

  1. Hinton 等,2015,原论文 PDF
  2. Kim 与 Rush,EMNLP 2016 会议页面全文
  3. Gu 等,MiniLLM 2024 v4官方代码
  4. PyTorch 官方蒸馏教程损失函数文档
相关推荐
MindUp1 小时前
AI算命背后的技术逻辑:从Prompt设计到排盘引擎的三款产品实测对比
人工智能·架构
Csvn1 小时前
第 19 章 Agent Skill 能力复用体系
人工智能·aigc·agent
其实防守也摸鱼1 小时前
CVE / NVD 漏洞数据库详解:从入门到实战
大数据·运维·人工智能·web安全·自动化
在所不辞兄1 小时前
【神经网络干货】物理信息神经网络:当神经网络开始“遵守”物理定律
人工智能·神经网络·机器学习
来让爷抱一个1 小时前
2026 AI for Science实战:把实验契约写进SPEC,MonkeyCode 云端跑通
人工智能·机器学习
智能汽车人1 小时前
自动驾驶大模型---Waymo在世界模型的探索
人工智能·机器学习·自动驾驶
木圭的AI时代指南1 小时前
为了跑星火Spark-X2.5,我把 llama.cpp 重新编译了一遍
大数据·人工智能·ai·语言模型
程序员JerrySUN1 小时前
Jetson边缘嵌入式实战课程第九讲:Ultralytics YOLO模型实战,从目标检测到实时推理
人工智能·计算机视觉·目标跟踪
土星云SaturnCloud1 小时前
VILA 视觉语言模型边缘部署实战
服务器·人工智能·语言模型·自然语言处理·边缘计算