深度学习论文笔记(知识蒸馏)—— FitNets: Hints for Thin Deep Nets

本文深入探讨了知识蒸馏技术,一种模型压缩方法,通过让小型模型模仿大型模型的输出,提升其泛化能力。文章介绍了知识蒸馏的基本概念、工作原理及方法,并讨论了模型深度、宽度和注意力机制对性能的影响。

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

最近看了不少文献,一直懒得总结,现在才爬起来写总结…,不少论文的idea还是不错的

主要工作

让小模型模仿大模型的输出(soft target),从而让小模型能获得大模型一样的泛化能力,这便是知识蒸馏,是模型压缩的方式之一,本文在Hinton提出knowledge distillation方法(下文简称KD)的基础上进行扩展,利用teacher模型特征提取器的中间层输出作为hints,结合KD,对更深但更窄的student模型进行知识蒸馏。

本文的工作背景为2014年,此时残差结构、MSRA初始化、BN算法还没有提出,训练深度网络往往存在一定困难,而本文提出的知识蒸馏方法可以有效训练深度网络


知识蒸馏的一些简单介绍

知识蒸馏本质是让小模型模拟大模型的输出,teacher模型可以看成是一个函数,简单起见,假设teacher模型为一个二维函数,将训练集上的 X X X输入到teacher模型,输出的集合记为 Y Y Y,设训练集上的 X X X取值范围为 [ a , b ] [a,b] [a,b],则student模型的任务为依据 { X , Y } \{X,Y\} {X,Y},模拟teacher模型在 [ a , b ] [a,b] [a,b]范围上的曲线。

如果让teacher模型拟合数据集 A A A,数据集 A A A自变量的取值范围记为 [ a , b ] [a,b] [a,b],蒸馏时使用数据集 B B B,数据集 B B B自变量的取值范围记为 [ c , d ] [c,d] [c,d]

若数据集 B B B与数据集 A A A的差异较大,即 [ a , b ] [a,b] [a,b] [ c , d ] [c,d] [c,d]没有交集,则student模型在数据集 A A A上的表现往往比较差,在数据集 B B B上的表现也不如意,原因在于teacher模型在 [ c , d ] [c,d] [c,d]处的曲线并不是数据集 B B B的目标曲线,因此student模型在数据集 B B B上的表现不好,同时,student模型拟合的teacher模型在 [ c , d ] [c,d] [c,d]处的曲线,在 [ a , b ] [a,b] [a,b]区域的曲线可能与teacher模型相差较大,所以student模型在数据集 A A A上的表现也不如意,但如果 A A A B B B差异不大,则student模型在 A A A B B B上的表现都可能较好。

上述想法也能解释为什么增量学习的代表作 L w F LwF LwF效果不佳


文中一些有意思的观念

提高网络性能有三个主流的方式(个人观点),网络的深度、宽度、注意力机制,网络越深,某些函数族的表现能力更强,表现能力个人理解为拟合能力,在文章发表的那个年代,表现优异的网络深度往往比较大。

基于上述理念,文章选择的student模型将比teacher模型更深,但更窄。


Method

文章将knowledge distillation分为两个阶段,步骤如下图
在这里插入图片描述
具体步骤如下:

一、选择teacher模型特征提取器的第 N N N层输出作为hint,从第一层到第 N N N层的参数对应图(a)中的 W H i n t W_{Hint} WHint

二、选择student模型特征提取器的第 M M M层输出作为guided,从第一层到第 M M M层的参数对应图(a)中的 W G u i d e d W_{Guided} WGuided

三、步骤一与步骤二的特征图维度可能不匹配,因此引入卷积层调整器,记为 r r r,对guided的维度进行调整

四、进入阶段一训练,最小化如下损失函数:
在这里插入图片描述
u h u_h uh表示teacher模型从第一层到第 N N N层对应的函数, v g v_g vg表示student模型从第一层到第 M M M层对应的函数, r r r表示卷积层调整器,对应的参数记为 W r W_r Wr,如图(b)

五、因为阶段一没有label信息,蒸馏粒度不够细,因此论文引入阶段二的训练,利用hinton提出的knowledge distillation对student模型进行蒸馏,如图©

阶段一的训练类似于一个正则化,因此 N N N M M M的取值应该自行调节, N N N M M M的取值越大,student模型正则化的程度就越大,原文如下:
在这里插入图片描述
该说法个人不太赞同,因为论文给出了阶段二,阶段二相当于在阶段一的基础上进行知识蒸馏,似乎和模型容量没有太大关系,神经网络的较浅层提取的是通用特征,较深层提取的是任务相关的特征,选择合适的 N N N M M M,可以避免student模型的任务相关层拟合teacher模型的通用特征层,这才是选择合适 N N N M M M的理由(个人理解)

整个算法的伪代码如下:
在这里插入图片描述

作者也尝试过将阶段一与阶段二合并训练,但是发现优化不动模型,实验部分在此不多做总结,有兴趣可以浏览原文

### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值