2. 教师-学生架构详解
知识蒸馏的核心,说白了就是「大模型教小模型」。但怎么教、谁来教、学生长什么样,这里面的门道可不少。我刚开始做蒸馏的时候,以为随便找个大模型当老师,再搭个小模型就能出效果。结果呢?蒸馏出来的模型要么精度掉得厉害,要么推理速度根本没提升。后来踩的坑多了,才慢慢摸清楚这里面的规律。
核心观点:教师-学生架构不是简单的「大+小」组合。教师模型决定知识上限,学生模型决定推理效率,两者的架构差异直接影响蒸馏效果。选对了,事半功倍;选错了,事倍功半。
2.1 教师模型的选择原则
教师模型的任务是「输出高质量的知识」。我个人习惯从三个维度来评估一个教师模型是否合格:
- 精度优先:教师模型的准确率必须显著高于学生模型的目标精度。如果教师自己都学不好,教出来的学生肯定更差。
- 输出丰富度:教师模型的软标签(soft label)分布要足够「有信息量」。过于自信的模型(比如输出接近 one-hot 的分布)其实不适合做教师,因为它的软标签太平坦,学生学不到中间知识。
- 架构成熟度:尽量选择经过广泛验证的 backbone,比如 ResNet、BERT、ViT 等。这些模型的中间层特征和注意力机制已经被研究得很透彻,方便我们提取中间层知识。
我在项目中遇到过一个问题:用了一个特别大的 ViT 模型当教师,去蒸馏一个小型 CNN。结果学生模型完全学不到 ViT 的全局注意力模式,因为 CNN 的局部感受野根本「接不住」这种知识。后来我换了一个同样基于 CNN 的大模型当教师,蒸馏效果立刻提升了 3 个点。
经验之谈:教师模型和学生模型的「知识表达方式」越接近,蒸馏效果越好。如果架构差异太大,建议使用中间层特征对齐或注意力迁移等技巧来弥补。
2.2 学生模型的设计策略
学生模型的设计,核心目标就一个:在保持精度的前提下,尽可能减小计算量。我总结了三条设计策略:
- 深度 vs 宽度:减少深度(层数)通常比减少宽度(通道数)更有利于蒸馏。因为深度减少后,学生模型的「抽象层次」变少,但每一层的表达能力还在。我建议优先减少层数,保持每层的通道数不变。
- 结构简化:去掉教师模型中的复杂模块,比如注意力头数减半、去掉部分残差连接、使用更简单的激活函数。但要注意,简化后的学生模型必须保留「学习核心特征」的能力。
- 参数量控制:学生模型的参数量通常是教师模型的 1/5 到 1/10。如果压缩比太大,蒸馏效果会急剧下降。我一般先尝试 1/5 的压缩比,再根据效果逐步调整。
| 设计维度 | 推荐策略 | 注意事项 |
|---|---|---|
| 深度(层数) | 优先减少层数 | 保持每层通道数不变,避免信息瓶颈 |
| 宽度(通道数) | 适度减少通道数 | 通道数减少过多会导致特征表达能力不足 |
| 注意力头数 | 减半或保留单头 | 多头注意力对蒸馏效果影响较大,需谨慎 |
| 激活函数 | 使用 ReLU 替代 GELU | 简单激活函数有利于学生模型收敛 |
避坑指南:我曾经设计了一个学生模型,把教师模型的 12 层 Transformer 压缩到 2 层。结果蒸馏后精度掉了 15 个点。后来我改成 4 层,精度只掉了 3 个点。记住:学生模型不能太「瘦」,否则学不到教师模型的深层知识。
2.3 架构差异对蒸馏效果的影响
教师和学生之间的架构差异,是蒸馏效果的最大变量。我把它分为三种情况:
- 同构蒸馏:教师和学生使用相同的架构,只是规模不同。比如 ResNet-50 教 ResNet-18。这是最理想的情况,蒸馏效果最好。
- 异构蒸馏:教师和学生使用不同的架构。比如 Transformer 教 CNN,或者 CNN 教 MLP。这种情况下,知识迁移的难度最大。
- 跨模态蒸馏:教师和学生的输入或输出模态不同。比如图像模型教文本模型,或者语音模型教图像模型。这种情况比较少见,但效果往往出人意料。
为什么会这样?你想想看,同构蒸馏时,教师和学生的中间层特征具有相似的语义空间,学生可以直接「模仿」教师的中间层输出。但异构蒸馏时,两者的特征空间完全不同,学生只能通过最终的 soft label 来学习,信息损失很大。
关键数据:根据我的实验经验,同构蒸馏的精度损失通常在 1-3 个百分点,异构蒸馏的精度损失在 5-10 个百分点。如果架构差异过大,甚至可能出现负迁移(学生比独立训练还差)。
下面这张图展示了教师-学生架构的核心逻辑:
2.4 架构差异的补偿策略
如果架构差异不可避免,怎么办?我试过几种补偿策略,效果还不错:
- 中间层特征对齐:在教师和学生的中间层之间添加一个「适配器」(adapter),把教师的特征映射到学生的特征空间。适配器通常是一个 1x1 卷积或线性层。
- 注意力迁移:对于 Transformer 架构,可以让学生模型模仿教师模型的注意力图(attention map)。注意力图包含了 token 之间的相关性信息,对异构蒸馏特别有效。
- 多教师蒸馏:使用多个不同架构的教师模型,让学生从多个角度学习。每个教师负责「教」一部分知识,最后加权融合。
实用技巧:如果教师是 Transformer,学生是 CNN,我建议在 CNN 的最后一层添加一个「全局注意力模块」,用来模拟 Transformer 的全局感受野。这个模块很小,不会增加太多计算量,但蒸馏效果能提升 2-3 个点。
嗯,这里要注意:补偿策略不是万能的。如果教师和学生的架构差异实在太大(比如 CNN 教 RNN),我建议直接放弃异构蒸馏,改用数据增强或自蒸馏。有时候,换个思路比硬扛更有效。