# LAB 17 · 软目标与坍塌:三个数值检查 按问题继续 常数坍塌反例、固定教师KL学习及单独EMA计算 对应课堂(2 页) 可先阅读已有结果,再决定是否运行。重算时请核对各节记录的数据、参数、环境与日期。 **学习路径:** [视图、投影头与历史字典](/course/study/contrastive-views.html) 这是[CLS 06](https://deepnote.com/project/38755e4e-23f6-4f5f-8c68-8a2e4114b1c1/notebook/c0645a4db6e04188ab5b119e87c53bed)“目标是否排除了无用解”的短练习,连接[P11](/course/pages/l3-r2-p11.html)。 先把常量输出代入一致性损失,解释为什么零损失仍然无用;然后读固定线性教师的保留KL,最后单独核对三次EMA。三项计算分别检查解、拟合与参数平滑,不是一项视觉教师模型训练。 写下三个对象:谁提供目标,谁接收梯度,EMA平均什么。输入是解析二维数据,教师是手工线性函数;EMA没有参与前面的蒸馏优化。[教师来源与坍塌说明](/course/blocks/teacher-target-source-and-collapse.html)保留更完整的解释。若要观察EMA接入真实图像训练,再选[LAB 07](https://deepnote.com/project/38755e4e-23f6-4f5f-8c68-8a2e4114b1c1/notebook/0d1b8f6fbf6a476c93ffcc169f2ec1f4)。 [此段独立阅读](/course/notebook-blocks/39d5a7ff74ae40e2a86056d0d8322096.html)展开完整实现代码 ``` # Writable ephemeral workspace for detached readonly cloud runs. import os, tempfile os.chdir(tempfile.mkdtemp(prefix='lec03_lab17_')) import numpy as np rng=np.random.default_rng(17) X=rng.normal(size=(384,2)); X=np.c_[X,np.ones(len(X))] teacher=np.array([[2,-2,0],[0,1,-1],[.2,-.1,0.]]) def softmax(z): e=np.exp(z-z.max(1,keepdims=True)); return e/e.sum(1,keepdims=True) T=2.; target=softmax(X@teacher/T); W=np.zeros((3,3)) def kl(q,p): return float((q*np.log((q+1e-12)/(p+1e-12))).sum(1).mean()) before=kl(target[256:],softmax(X[256:]@W/T)) for step in range(600): pred=softmax(X[:256]@W/T) W-=.3*X[:256].T@(pred-target[:256])/256/T after=kl(target[256:],softmax(X[256:]@W/T)) constant=np.ones((8,4)); diverse=rng.normal(size=(8,4)) print('heldout teacher/student KL',round(before,5),'->',round(after,5)) print('collapsed consistency loss',float(((constant-constant[::-1])**2).mean()),'variance',constant.var(0).tolist()) print('noncollapsed variance',diverse.var(0).round(3).tolist()) ema=np.zeros_like(W) for t in range(3): ema=.9*ema+.1*W assert np.allclose(ema,(1-.9**3)*W) print('3 EMA updates preserve factor',round(1-.9**3,3),'of fixed student parameters') print('temperature teacher probabilities',softmax(np.array([[3.,1.,0.]])/T).round(4).tolist()) ``` [此段独立阅读](/course/notebook-blocks/89b4ff8dd23d4c6d89882682635269a5.html) ## 已完成的基准运行 以下是本轮本地独立 Python 进程的实际标准输出,云端执行另行记录。 ``` heldout teacher/student KL 0.24742 -> 1e-05 collapsed consistency loss 0.0 variance [0.0, 0.0, 0.0, 0.0] noncollapsed variance [1.239, 0.712, 1.084, 1.199] 3 EMA updates preserve factor 0.271 of fixed student parameters temperature teacher probabilities [[0.6285, 0.2312, 0.1402]] ``` 保留集 KL 降低表示学生更接近这个教师的概率分布;不能据此宣称视觉迁移更好。增大温度让非最大类别得到更多质量,也会改变梯度尺度;正式蒸馏常乘 T² 补偿,本代码明确不乘,比较学习率时要一起考虑。 EMA 平滑参数变化,stop-gradient 限制梯度路径,但“常量也能获得零一致性损失”的反例并未因此从数学上消失。MoCo 还用负例;BYOL/DINO 的训练设计和经验条件应分别解释。先到 [CLS 05](https://deepnote.com/project/38755e4e-23f6-4f5f-8c68-8a2e4114b1c1/notebook/b8320404134f4a2e858ccfe7d50a71d3) 区分训练目标与 probe,再只改变 T=1/4 比较分布与KL曲线。来源:[知识蒸馏论文](https://arxiv.org/abs/1503.02531)、[BYOL](https://arxiv.org/abs/2006.07733)。 [此段独立阅读](/course/notebook-blocks/7044913259924763a3b29542e91fbca8.html) ## 旧版热身(历史参考) 旧版热身仅保留为历史参考,不参与当前基准运行;当前解释与计算以上方完整实验为准。 #### 展开查看旧版代码(仅展示,不执行) ``` import numpy as np z=np.ones((8,4)); print('collapsed variance',z.var(0),'pair loss',((z-z[::-1])**2).mean()) rng=np.random.default_rng(3); student=rng.normal(size=4); teacher=np.zeros(4) for _ in range(3): teacher=.9*teacher+.1*student print('EMA teacher',teacher.round(3),'stop-gradient is one component, not a proof') ``` [此段独立阅读](/course/notebook-blocks/1658d972c93e45b4a3bb0d957f2e33d2.html)