Knowledge distillation 怎么做?
temperature 有什么用?为什么乘 T²?

英文问法Explain knowledge distillation. · What does the temperature do? · Why multiply the soft loss by T²? · How would you distill an LLM?

考过微软 D&AS Bing Ads 2022

先弄清楚:每个概念是什么

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\)汽车卡车胡萝卜卡车 / 胡萝卜
10.9520.0470.0003148
20.8060.1800.01512.2
40.6220.2940.0843.5
100.4570.3380.2051.6

\(T\) 太低,错误类别几乎都是 0,和 hard label 差不多。\(T\) 太高,三类趋于平均,还逼 student 去拟合很负、很 noisy 的 logit。论文 MNIST 里每层 30 个 unit 的小 student 在 \(T\) = 2.5–4 最好。

必答点

追问

为什么 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)