Lecture 03LAB 17 · 软目标与坍塌:三个数值检查
LAB 17 · 软目标与坍塌:三个数值检查
按问题继续
常数坍塌反例、固定教师KL学习及单独EMA计算
对应课堂(2 页)
可先阅读已有结果,再决定是否运行。重算时请核对各节记录的数据、参数、环境与日期。
学习路径: 视图、投影头与历史字典
先把常量输出代入一致性损失,解释为什么零损失仍然无用;然后读固定线性教师的保留KL,最后单独核对三次EMA。三项计算分别检查解、拟合与参数平滑,不是一项视觉教师模型训练。
展开完整实现代码
# 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())Lecture 03LAB 17 · 软目标与坍塌:三个数值检查
已完成的基准运行
以下是本轮本地独立 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² 补偿,本代码明确不乘,比较学习率时要一起考虑。
Lecture 03LAB 17 · 软目标与坍塌:三个数值检查
旧版热身(历史参考)
旧版热身仅保留为历史参考,不参与当前基准运行;当前解释与计算以上方完整实验为准。
展开查看旧版代码(仅展示,不执行)
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')
此引用的原文已在较早版本调整
原位置:block-1658d972c93e45b4a3bb0d957f2e33d2。当前正文保留在本篇;此旧引用没有足够证据自动等同于某个新段落。
此引用的原文已在较早版本调整
原位置:block-1658d972c93e45b4a3bb0d957f2e33d2。当前正文保留在本篇;此旧引用没有足够证据自动等同于某个新段落。
此引用的原文已在较早版本调整
原位置:block-1658d972c93e45b4a3bb0d957f2e33d2。当前正文保留在本篇;此旧引用没有足够证据自动等同于某个新段落。
此引用的原文已在较早版本调整
原位置:block-1658d972c93e45b4a3bb0d957f2e33d2。当前正文保留在本篇;此旧引用没有足够证据自动等同于某个新段落。