Knowledge distillation 怎么做?
temperature 有什么用?为什么乘 T²?
先弄清楚:每个概念是什么
- Knowledge distillation
- student(小模型)不只学标准答案,还模仿 teacher(大模型或 ensemble)给每个类打的概率。目的是部署时又快又便宜,准确率接近 teacher。
- Hard label 与 soft target
- Hard label 只说是哪一类。soft target 是 teacher 输出的整个概率分布,错误类别之间的相对大小就是 teacher 学到的 similarity 结构,常叫 dark knowledge。例:汽车图片上 teacher 给卡车 0.047、胡萝卜 0.0003,差约 150 倍。
- Temperature \(T\)
- softmax 之前把 logit 都除以 \(T\)。\(T\) 越大分布越平,小概率被放大,数字见下面的表。
- KL divergence
- 衡量两个分布差多少,\(\mathrm{KL}(p\,\|\,q) = \sum_i p_i \log(p_i/q_i)\),完全一样时为 0。它等于 cross-entropy 减去 teacher 自己的 entropy,后者和 student 无关,所以用 KL 还是 CE,gradient 一样。
30 秒回答
Distillation trains a small student to match a large teacher's output distribution, not just the hard labels. Both softmaxes use a temperature T > 1, which softens them and exposes how the teacher ranks the wrong classes, so each example carries much more information. The loss is cross-entropy with the true labels at T = 1 plus the KL divergence between teacher and student at temperature T, multiplied by T² because the soft-target gradients scale as 1/T². At inference the student uses T = 1.
推导
Loss
teacher logits \(v\),student logits \(z\),两边用同一个 \(T\):
\[ p_i = \frac{e^{v_i/T}}{\sum_j e^{v_j/T}},\qquad q_i = \frac{e^{z_i/T}}{\sum_j e^{z_j/T}} \] \[ \mathcal L = \alpha\,\mathrm{CE}\big(y,\ q^{(T=1)}\big) + (1-\alpha)\,T^2\,\mathrm{KL}\big(p^{(T)} \,\|\, q^{(T)}\big) \]hard 项和推理都用 \(T = 1\)。
为什么乘 \(T^2\)
soft 项对 student logit 的 gradient(论文 eq. 2):
\[ \frac{\partial C}{\partial z_i} = \frac1T\,(q_i - p_i) \]\(T\) 远大于 logit 时用 \(e^{x}\approx 1 + x\),再假设每个样本的 logits 均值为 0(\(N\) 是类别数,eq. 4):
\[ \frac{\partial C}{\partial z_i} \approx \frac{1}{NT^2}\,(z_i - v_i) \]soft 项的 gradient 按 \(1/T^2\) 缩小,乘 \(T^2\) 抵消掉,调 \(T\) 时两项的相对权重才不变。例:\(v = (6, 3, -2)\)、\(z = (2, 1, 0)\),\(T\) 从 1 到 16,gradient 缩小约 70 倍,乘 \(T^2\) 后保持在 0.6–2.0。高温极限下就是最小化 \(\tfrac12(z_i - v_i)^2\),即 logit matching。
代码(NumPy)
def softmax(z, T=1.0):
e = np.exp((z - z.max(-1, keepdims=True)) / T)
return e / e.sum(-1, keepdims=True)
def kd_loss(z_s, z_t, y, T=4.0, alpha=0.5):
# hard:真实标签的 CE,用 T = 1
q1 = softmax(z_s)
hard = -np.log(q1[np.arange(len(y)), y]).mean()
# soft:KL(teacher || student),两边同一个 T
p, q = softmax(z_t, T), softmax(z_s, T)
soft = (p * (np.log(p) - np.log(q))).sum(-1).mean()
return alpha * hard + (1 - alpha) * T**2 * soft
\(T\) 和 \(\alpha\) 怎么选
\(T\) 是 hyperparameter,在 validation set 上试出来。固定 \(\alpha\),对 \(T\) = 1、2、4、8 各蒸馏一次,取 student validation accuracy 最好的,再调 \(\alpha\),hard 项权重通常小一些。transfer set 没有 label 时只用 soft 项(\(\alpha = 0\))。
\(T\) 不是越大越好。teacher logits (6, 3, −2),卡车 / 胡萝卜的概率比 \(= e^{5/T}\):
| \(T\) | 汽车 | 卡车 | 胡萝卜 | 卡车 / 胡萝卜 |
|---|---|---|---|---|
| 1 | 0.952 | 0.047 | 0.0003 | 148 |
| 2 | 0.806 | 0.180 | 0.015 | 12.2 |
| 4 | 0.622 | 0.294 | 0.084 | 3.5 |
| 10 | 0.457 | 0.338 | 0.205 | 1.6 |
\(T\) 太低,错误类别几乎都是 0,和 hard label 差不多。\(T\) 太高,三类趋于平均,还逼 student 去拟合很负、很 noisy 的 logit。论文 MNIST 里每层 30 个 unit 的小 student 在 \(T\) = 2.5–4 最好。
必答点
- student 学 teacher 的 soft target,两边 softmax 用同一个 \(T > 1\)
- loss \(= \alpha\,\)CE(hard, \(T = 1\)) \(+ (1-\alpha)\,T^2\,\)KL(teacher ‖ student, \(T\))
- 乘 \(T^2\):soft 项 gradient \(\propto 1/T^2\)
- 高温极限 = logit matching;推理时 \(T = 1\)
追问
为什么 soft target 比 hard label 好?
每个样本带的信息多、gradient variance 小。论文语音实验只用 3% 数据,hard label 训练 44.5%,soft target 57.0%,接近全量数据的 58.9%。
除了最后的输出,还能蒸馏什么?
中间层 feature。FitNets 让 student 的中间层经过一个 regressor 去拟合 teacher 的中间层,能训练更深更窄的 student。
LLM 怎么蒸馏?
word-level 是在每个 token 上匹配 teacher 的 next-token 分布。sequence-level(Kim & Rush 2016)是 teacher 在训练集上 beam search 生成输出,student 在这些数据上做普通 CE 训练。
来源Hinton, Vinyals & Dean 2015 §1(p.2)、§2–2.1 eq. 1–4(p.3)、§3(p.4)、§6 Table 5(pp.7–8)· Kim & Rush 2016 §3.1–3.2(pp.3–4)· Romero et al. 2014, FitNets(abstract)