Knowledge Distillation(2)——FitNets: Hints for Thin Deep Nets

FitNets是一种深度模型压缩方法,通过利用教师网络的中间层特征指导学生网络训练,使学生网络在保持轻量化的同时,深度增加且性能优秀。此方法在ICLR2015年提出,旨在解决深层网络优化难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

在Hinton教主挖了Knowledge Distillation这个坑后,另一个大牛Bengio立马开始follow了,在ICLR2015发表了文章FitNets: Hints for Thin Deep Nets

有一个背景是,可能那时候残差网络还没出来,deeper网络不好优化,所以teacher没那么深,而利用teacher的hint辅助训练student,可以把student网络做的更深:
在这里插入图片描述
motivation是,引导帮助训练一个deeper and thinner student,既轻量化又有不错的表现
核心idea在于,不仅仅是将teacher的输出作为knowledge,在一些中间隐含层的表达上,student也要向teacher学习:

在这里插入图片描述
由于teacher和student在一些隐含层的尺寸是不对应的,需要使用额外的参数建立二者间的映射:
在这里插入图片描述

Method

HINT-BASED TRAINING

Student网络整体是要比teacher小的。但作者发现,student可以适当的比teacher更深一点,有助于取得更好的表现。为了更好的训练这种thin deep net,作者提出了一个概念:hint

Hint定义是:teacher的隐含层输出,用来引导student的学习过程。类似的又从student中选择一个隐含层叫做guided layer,我们希望guided layer能预测出与hint layer相近的输出。
(文章中,hint/guided layer好像都是选在网络的正中间……)

在student的学习过程中,loss定义如下:
在这里插入图片描述
vvv 是特征输出 ,rrr 是针对teacher student的隐含层尺寸不一致而设计的regressor,期望student的guided layer经过这个regressor后,与hint layer相近。

其中,为了减少参数,regressor不是FC,而是conv的形式。使用k1×k2k_1\times k_2k1×k2的kernel,将student Ng,1×Ng,2N_{g,1}\times N_{g,2}Ng,1×Ng,2的feature,回归到teacher Nh,1×Nh,2N_{h,1}\times N_{h,2}Nh,1×Nh,2 的feature (Ng,i−ki+1=Nh,iN_{g,i}-k_i+1=N_{h,i}Ng,iki+1=Nh,i)

FITNET STAGE-WISE TRAINING

在这里插入图片描述
上图一个细节是,student 相比于teacher是thin and deep
(注:图最右边不是LDKL_{DK}LDK,应该是LKDL_{KD}LKD,代表Hinton定义的知识蒸馏训练联合loss)

在训练时,先是用hint-based training,基于上一节的LHTL_{HT}LHT进行监督,诱导student在隐含层输出与teacher相近的特征表达。而训练完的模型作为一个pretrained model,再用hinton之前的方法,让student同时学习hard label&soft target
在这里插入图片描述

(不过这里我有些疑问就是,虽然学习到了相近的feature表征方式,但是那个统一feature尺度的regressor在第二步训练时并不会用到,这样输出的两个特征还是有一些差距的。这种强行回归的方式总感觉不够优雅。
再者,这样的一个方式仅仅是用做初始化模型,这让我有点怀疑其作用能有多大。可不可以设计一个联合的训练方式嘛???在学习hard label、soft target的同时,对中间一些层也进行hint-based约束会更有效嘛?看看之后的论文有没有和我类似的想法)

好吧,在实验部分,作者表明自己做了联合优化hint和classification target(指hard label?)的实验,但效果不好,或者说没找到一个合适的方式来进行联合训练:
在这里插入图片描述
对于联合优化hint&soft target,作者认为不好学习……那上一个不是train了,只是效果不好嘛???有点懵……
在这里插入图片描述

实验结果

实验结果上,student比teacher参数少,效果比teacher还要好,有点东西啊。
不过这种效果好也许是网络更深导致的,作者为什么没有设计一个同样配置的网络,不使用hint,甚至不使用soft target作为对比???可能是作者认为student效果已经逼近state-of-the-art,单纯训一个和student相同配置的网络没这效果??
(好吧后来仔细看了论文,可能那时候没有resnet,deep网络不好优化,这篇论文motivation就是为了更好的优化deepper网络!!!)
在这里插入图片描述

### FitNets架构及其实现 FitNets 是一种早期的知识蒸馏方法,其核心思想在于不仅传递最终的预测结果(即软标签),还通过中间层特征图的学习来增强模型之间的知识迁移。这种方法特别适用于小型学生网络无法完全匹配大型教师网络复杂度的情况。 #### 架构设计 FitNets 的主要创新点之一是引入了 **hint layers** 来指导学生网络学习教师网络的关键特征表示。具体来说,在训练过程中,除了传统的输出层损失外,还会计算一个额外的中间层损失函数,用于强制学生网络模仿教师网络特定层次的激活模式[^1]。这种机制使得即使学生网络的整体结构较浅或参数较少,也能捕获到教师网络的重要语义信息。 以下是 FitNets 中涉及的主要组件: - **Teacher Network**: 提供高质量的知识源,通常是一个深层复杂的神经网络。 - **Student Network**: 需要优化的目标轻量化模型。 - **Hint Layer**: 教师网络中的某一层被选作 hint layer,该层负责向学生网络提供详细的内部表征信息。 #### 实现细节 为了有效实施上述策略,FitNess采用了两阶段训练流程: 1. **预训练阶段**: 利用标准监督信号单独对 teacher 和 student 进行初始化权重调整; 2. **联合训练阶段**: 同时最小化两个目标——一个是基于 softmax 输出的概率分布差异;另一个则是衡量选定 hint 层之间欧几里得距离的标准 MSE (Mean Squared Error) 损失项。 下面给出一段 Python 伪代码演示如何构建这样的系统框架: ```python import torch.nn as nn import torch.optim as optim class TeacherModel(nn.Module): def __init__(self): super(TeacherModel, self).__init__() # Define a deep network here... class StudentModel(nn.Module): def __init__(self): super(StudentModel, self).__init__() # Define a shallow network here... teacher = TeacherModel() student = StudentModel() criterion_kd = nn.MSELoss() # For intermediate feature matching criterion_ce = nn.CrossEntropyLoss() # Standard classification loss optimizer = optim.Adam(student.parameters(), lr=0.001) for data, target in dataloader: output_teacher, features_teachers = teacher(data) output_student, features_students = student(data) kd_loss = criterion_kd(features_students['hint'], features_teachers['hint']) ce_loss = criterion_ce(output_student, target) total_loss = alpha * kd_loss + beta * ce_loss optimizer.zero_grad() total_loss.backward() optimizer.step() ``` 其中 `alpha` 和 `beta` 控制两种不同类型误差的重要性权衡系数[^2]。 #### 结果评估 实验表明,相比仅依赖于传统交叉熵损失的传统压缩技术而言,加入 fitnets 所提出的辅助约束条件可以显著提升小规模 CNNs 在图像识别任务上的表现效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值