特征基蒸馏:FitNets 的 hint learning

本文定位:L3 主流方法体系。在响应基蒸馏之后,本文进入”用中间层特征”的蒸馏——以 FitNets 为代表。 前置知识:建议先读《响应基蒸馏(Logits 蒸馏)》。

1. 为什么需要特征基蒸馏

响应基蒸馏只对齐”最终答案”。但教师网络中间隐层也蕴含大量知识——例如某一层学到的边缘/纹理/语义特征。仅对齐输出,可能浪费这些信息,尤其是当学生容量远小于教师时。

特征基蒸馏(feature-based distillation)即让学生去模仿教师中间层的特征表示,而不仅是最后一层 logits。

2. FitNets 是什么

Romero et al. (2015, FitNets: Hints for Thin Deep Nets, arXiv:1412.6550, ICLR 2015) 是特征基蒸馏的开创性工作。其设定有一个特别之处:

  • 教师网络更深
  • 学生网络更薄(thin)但更深(deep)——即通道更窄、层数更多。

这样做的目的:用”更深”来补偿”更薄”带来的容量损失。但要训练这样一个薄而深的学生,仅靠响应基蒸馏不够,于是引入 **hint(提示)**机制。

3. Hint Learning 与 Regressor

FitNets 的核心思想是:选教师网络的某一中间层作为 hint 层,选学生网络的某一中间层作为 guided 层,让学生的 guided 层去匹配教师的 hint 层特征。

由于师生对应层的特征图尺寸/通道数可能不同,FitNets 引入一个可训练的 regressor(回归器,通常是卷积或线性映射),把学生的 guided 特征投影到与教师 hint 特征相同的空间,再用回归损失(如 L2 / MSE)对齐。

教师:  ... -> [hint 层] ----------------> (目标特征)
                              |
学生:  ... -> [guided 层] -> regressor -> (对齐到 hint 空间) -> MSE loss

4. 两阶段训练

FitNets 采用两阶段:

  1. 第一阶段(hint 预训练):先只训练 regressor + 学生前几层,使其 guided 特征能匹配教师 hint 特征(最小化特征 MSE)。这给学生一个”好的中间起点”。
  2. 第二阶段(整体蒸馏):在响应基蒸馏损失的基础上,叠加特征匹配损失,端到端微调学生全部参数。

5. 实现要点

  • 选层:hint/guided 层需对应”语义层级相近”的位置;选择是经验性的(具体配对准则「待核实」,依网络结构而定)。
  • 维度对齐:特征图尺寸/通道不同 → 用 regressor 投影。
  • 损失组合:最终损失一般为 响应基蒸馏损失 + $\lambda \times$ 特征匹配损失($\lambda$ 为平衡系数,具体取值「待核实」)。
  • 教师冻结:hint 特征由教师 no_grad 提供。

6. 伪代码(两阶段)

# 阶段一:hint 预训练
regressor = Regressor(...)           # 把 student guided 投影到 teacher hint 空间
for x, _ in dataloader:
    with torch.no_grad():
        h_t = teacher_hint(x)        # 教师 hint 层特征
    h_s = regressor(student_guided(x))
    loss_h = MSE(h_s, h_t)
    loss_h.backward(); optimizer.step()   # 仅更新 regressor + student 前段

# 阶段二:整体蒸馏(特征 + 响应)
for x, y in dataloader:
    with torch.no_grad():
        h_t = teacher_hint(x); z_t = teacher(x)
    h_s = regressor(student_guided(x)); z_s = student(x)

    loss_feat = MSE(h_s, h_t)                       # 特征基
    loss_resp = T**2 * KL(soft(z_t/T), soft(z_s/T)) # 响应基
    loss = loss_resp + lambda_ * loss_feat
    loss.backward(); optimizer.step()

7. 适用场景:教师更”深”时

当教师更深、学生被设计得更时,响应基蒸馏往往不足以把”深层结构知识”传下去。FitNets 的 hint learning 通过暴露中间层特征,让学生即便更薄也能借”更深”补回容量,从而逼近教师性能。这正是”thin deep nets”命名与动机所在。

8. 特征基蒸馏的后续发展(概览)

FitNets 开启特征基蒸馏后,后续工作从不同角度丰富了”中间层知识”的迁移方式(本节概览):

  • 注意力迁移(Attention Transfer, Zagoruyko & Komodakis 2017, arXiv:1612.03928, ICLR 2017):不模仿原始特征图,而是让学生去匹配教师的注意力图(attention map)——即把特征通道聚合成空间注意力,再对齐。这比逐元素匹配特征更关注”模型在看哪里”。
  • 与 FitNets 相比,注意力迁移避免了因特征图维度不同而必须训练 regressor 的负担,常只需空间归一化后即可对齐。

特征基与响应基并非互斥:实践中常把二者组合,先用特征基把中间表示拉近,再用响应基保证最终输出一致。FitNets 的两阶段设计正是这种组合的早期范本。

需要说明,特征基蒸馏的效果高度依赖”选哪一层”:若 hint/guided 层语义层级不匹配(例如教师高层语义对应学生低层),对齐反而可能损害训练。因此选层往往是特征基方法的主要调参成本,具体配对准则因网络结构而异(「待核实」)。此外,当师生架构差异过大(如 CNN 教师 → Transformer 学生),直接对齐特征图不可行,此时需要借助投影或改用关系/响应基。这也是为什么在 LLM/VLM 蒸馏中,特征基常配合更复杂的适配器使用(如 LLaVA-KD 等多模态蒸馏工作,具体 arXiv 号待核实)。

最后给出一个落地 checklist:① 选定教师 hint 层与学生 guided 层(语义层级对齐);② 若维度不同,设计 regressor 投影;③ 第一阶段只训 regressor + 学生前段,让中间特征先对齐;④ 第二阶段叠加响应基损失端到端微调;⑤ 教师始终冻结、不回传梯度。按此顺序操作,能显著降低训练初期因”特征尺度差异过大”导致的震荡。FitNets 之所以强调两阶段,正是为了给学生一个稳定的中间起点,这也是它相比一步到位式训练更稳的关键。

与响应基相比,特征基的代价是必须能访问教师中间层,因此不适合闭源教师;但它的收益是在容量差距大时提供更密的监督。实践中常先做响应基基线,若学生明显欠拟合、或师生架构差异巨大,再引入 hint / 注意力等特征基手段,按”先简后繁”的原则逐步加料。需要提醒:特征基带来的额外超参(选层、regressor 结构、特征损失权重)也会增加调参负担,应权衡收益与成本后再决定是否采用。

9. 小结

  • 特征基蒸馏对齐师生中间隐层,弥补响应基只用输出层的不足。
  • FitNets (Romero 2015) 引入 hint 层 + regressor,把学生 guided 特征对齐教师 hint 特征。
  • 采用两阶段(先 hint 预训练,再整体蒸馏),尤其适合”教师更深、学生更薄”的设定。

延伸阅读 / 参考文献

  • Romero A. et al. (2015). FitNets: Hints for Thin Deep Nets. arXiv:1412.6550, ICLR 2015.(基于 hint/特征的中间层蒸馏与 regressor 对齐)
本文累计阅读