Overhaul Distillation(ICCV 2019)原理与代码解析
paper:A Comprehensive Overhaul of Feature Distillation
official implementation:GitHub - clovaai/overhaul-distillation: Official PyTorch implementation of "A Comprehensive Overhaul of Feature Distillation" (ICCV 2019)
本文的创新点
本文研究了知识蒸馏的各个方面,并提出了一种新的特征蒸馏方法,使蒸馏损失在教师特征变换、学生特征变换、特征蒸馏位置、距离函数各方面之间协同作用。具体来说,本文提出的蒸馏损失包括一个新设计的margin relu特征变换方法、一个新的蒸馏位置、以及一个partial L2距离函数。在ImageNet中,本文提出的方法使得ResNet-50取得了21.65%的top-1 error,优于教师网络ResNet-152的精度。
方法介绍
蒸馏位置
激活函数是神经网络的重要组成部分,它使网络具有了非线性。但之前的大部分蒸馏方法都没有考虑到激活函数,蒸馏位置大都在于某各个layer或某个block的尾端,却没有考虑和激活函数如ReLU的关系。本文提出的方法中,蒸馏位置位于某个layer的尾端和第一个ReLU之间,如下图所示
pre-ReLU的位置可以使学生接触到教师模型通过ReLU之间的信息,避免了信息的分解和丢失。
损失函数
由于蒸馏位置是在ReLU之前,因此特征中的正值包含教师会利用的信息而负值没有,如果教师网络中的值是正值,学生网络应该生成和教师一样的值,如果教师网络中是负值,学生也应该生成负值从而使得激活状态和教师一致。因此作者提出的教师变换函数,保存正值同时有一个负值margin
其中 \(m\) 是一个小于0的margin值,作者取名为margin ReLu。\(m\) 的具体值定义为每个通道的负响应值的期望,如下
\(m\) 一方面可以在训练过程中直接计算,如https://github.com/clovaai/overhaul-distillation/issues/7所示。也可以通过前一个BN层的参数来计算,作者在附录中给出了具体计算方法。
对于一个通道 \(\mathcal{C}\) 和教师特征 \(F^{i}_{t}\) 的第 \(i\) 个元素,该通道的margin值 \(m_{c}\) 为训练图片的期望值即式(3)。通常我们不知道 \(F^{i}_{t}\) 的分布,所以只能通过训练过程中的平均值来得到期望。但是ReLU前的BN层决定了一个batch中的特征 \(F^{i}_{t}\) 的分布,BN层将每个通道的特征归一化为均值 \(\mu\) 方差 \(\sigma\) 的高斯分布,即
每个通道的均值方差 \((\mu,\sigma)\) 对应BN层的参数 \((\beta,\gamma)\),因此利用 \(F^{i}_{t}\) 的分布可以直接计算边际值
利用高斯分布的概率密度函数pdf进行积分就可以得到期望,其中范围小于0。积分的结果可以通过正太分布的cdf累积分布函数 \(\Phi(\cdot)\) 进行简单的表示。
在官方实现中,也是通过这种方式即式(10)来计算margin值的。
因为蒸馏的位置是在ReLU函数前,negative response没有经过ReLU的过滤,因此蒸馏损失函数需要考虑到ReLU。在教师特征中,positive response实际上被网络使用,这意味着教师的正响应应该通过具体的值来传递,但负响应却不是。对于教师的负响应,如果学生的响应值高于目标值应该降低,而如果低于目标值不需要增加,因为不管具体值是多少都会被ReLU过滤掉。因此,本文提出了partial L2 distance函数,如下
完整的蒸馏损失函数如下
其中 \(\sigma_{m_{c}}\) 是教师转换函数margin ReLU,\(r\) 是是学生转换函数1x1 conv + BN,\(d_{p}\) 是距离函数patial L2 distance。
实验结果
在CIFAR-100数据集上,不同的教师网络和学生网络的结果如表2所示
不同的教师-学生网络组合,本文的方法和其它蒸馏方法的结果对比如下,可以看出,在所有组合下,本文提出的方法都得到了最低的error。
在ImageNet数据集上和其它方法的对比如表4,可以看出本文的方法error也是最低的。
代码解析
实现代码主要在distiller.py中,本文的第一个创新点在蒸馏的位置,即ReLU前,实现如下
t_feats, t_out = self.t_net.extract_feature(x, preReLU=True)
s_feats, s_out = self.s_net.extract_feature(x, preReLU=True)
学生特征的转换为1x1卷积+BN,即实现中的self.Connectors,具体实现如下
def build_feature_connector(t_channel, s_channel):C = [nn.Conv2d(s_channel, t_channel, kernel_size=1, stride=1, padding=0, bias=False),nn.BatchNorm2d(t_channel)]for m in C:if isinstance(m, nn.Conv2d):n = m.kernel_size[0] * m.kernel_size[1] * m.out_channelsm.weight.data.normal_(0, math.sqrt(2. / n))elif isinstance(m, nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()return nn.Sequential(*C)
教师特征的转换为本文提出的margin ReLU,边际margin值的计算如下,即上述的式(10)
def get_margin_from_BN(bn):margin = []std = bn.weight.datamean = bn.bias.datafor (s, m) in zip(std, mean):s = abs(s.item())m = m.item()if norm.cdf(-m / s) > 0.001:margin.append(- s * math.exp(- (m / s) ** 2 / 2) / math.sqrt(2 * math.pi) / norm.cdf(-m / s) + m)else:margin.append(-3 * s)return torch.FloatTensor(margin).to(std.device)
蒸馏损失函数实现如下,其中第一行就是教师特征的转换函数,即式(2)
def distillation_loss(source, target, margin):target = torch.max(target, margin)loss = torch.nn.functional.mse_loss(source, target, reduction="none")loss = loss * ((source > target) | (target > 0)).float()return loss.sum()
相关文章:

Overhaul Distillation(ICCV 2019)原理与代码解析
paper:A Comprehensive Overhaul of Feature Distillation official implementation:GitHub - clovaai/overhaul-distillation: Official PyTorch implementation of "A Comprehensive Overhaul of Feature Distillation" (ICCV 2019) 本文的…...

<Linux开发>驱动开发 -之-内核定时器与中断
<Linux开发>驱动开发 -之-内核定时器与中断 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详…...

希尔贝壳邀您参加2023深圳国际人工智能展览会
2023深圳国际人工智能展览会“AIE”将于2023年5月16-18日在深圳国际会展中心 (宝安)举办,希尔贝壳受邀参加,展位号:A331。 伴随着智能行业的快速发展,展会已被越来越多的企业列入每年必选展会,也成为各采购商选购的理…...

设计优质微信小程序的实用指南!
微信小程序是一种快速发展的应用形式,设计良好的小程序能够提升用户体验并吸引更多的用户。在设计微信小程序时,有一些关键的指南可以帮助我们做出出色的设计。以下是即时设计总结的一些设计指南,希望能对准备设计微信小程序的人有所帮助。 …...
大数据期末总结
文章目录 一、这学期分别学习了Scala、spark、spring、SpringMvc、SpringBoot1、scala2、spark3、spring4、SpringMvc5、SpringBoot 二、总结 一、这学期分别学习了Scala、spark、spring、SpringMvc、SpringBoot 1、scala Scala是一门基于JVM的编程语言,具有强大的…...

selenium面试题总结
今天有同学问到seleinum面试的时候会问到的问题,随便想了想,暂时纪录一下。欢迎大家在评论中提供更多问题。 1.selenium中如何判断元素是否存在? selenium中没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素异常捕获…...

⑧电子产品拆解分析-1拖4USB拓展坞
⑧电子产品拆解分析-1拖4USB拓展坞 一、功能介绍二、电路分析以及器件作用1、内部电路拆解三、参考资料学习一、功能介绍 ①USB2.0一拖四通讯;②具备OTG功能,可适配大部分USB接口设备;二、电路分析以及器件作用 1、内部电路拆解 分析:❤️ ❤️ ❤️ 主控是MA8601 USB 2.0…...

月度精华汇总 | 最新XR行业资讯、场景案例、活动都在这一篇里啦!
在过去的一个月中,平行云为您带来了关于XR领域的一系列精彩文章,涵盖了行业资讯、应用案例,市场互动,帮助您掌握XR领域最新动态,了解实时云渲染、Cloud XR技术的价值,以及平行云实时云渲染解决方案LarkX…...

Redis实战案例1-短信登录
Redis的共享session应用 1. 项目的相关工作 导入sql文件 找到对应的sql文件即可 基本表的信息 基本架构 导入对应的项目文件,启动相关的service服务; 在nginx-1.18.0目录下启动命令行start nginx.exe; 2. 基于session实现登录的流程 这里利用到Javaweb中…...

华为OD机试真题 JavaScript 实现【找终点】【2023 B卷 100分】,附详细解题思路
一、题目描述 给定一个正整数数组,设为nums,最大为100个成员,求从第一个成员开始,正好走到数组最后一个成员,所使用的最少步骤数。 要求: 第一步必须从第一元素开始,且1 < 第一步的步长 &…...
详解数据仓库数据湖及湖仓一体
比别人更快接收好文章 随着近几年数据湖概念的兴起,业界对于数据仓库和数据湖的对比甚至争论就一直不断。有人说数据湖是下一代大数据平台,各大云厂商也在纷纷的提出自己的数据湖解决方案,一些云数仓产品也增加了和数据湖联动的特性。 但是…...
基于注解切换、Hikari实现的SpringBoot动态数据源(支持JNDI)
实现效果 先说效果,要实现方法级别注解切换当前数据源,不设置注解时走默认数据源,同时支持JNDI源。 总体思路 Spring框架中存在一个抽象类AbstractRoutingDataSource,他是一个可以动态选择当前DataSource的路由类,我…...

Java中的动态链接VS操作系统动态链接
在操作系统OS中为了优化内存的使用会采用一种动态链接方式,一个文件想要在操作系统中运行必须经过编译、汇编译、链接、装载等步骤。可以参考Java程序是怎么跑起来的。本篇主要讲解Java栈帧中动态链接部分与操作系统的的动态链接的区别与联系 操纵系统为什么需要动态…...

深入理解Linux虚拟内存管理(七)
系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理(一) 深入理解Linux虚拟内存管理(二) 深入理解Linux虚拟内存管理(三) 深入理…...
GSR II 智能速度辅助系统的型式认证和系统作为独立技术单元的型式认证测试流程和技术要求
智能速度辅助系统ISA的型式认证和系统作为独立技术单元的型式认证测试流程和技术要求 补充欧洲议会和欧洲理事会第2019/2144号条例,为机动车智能速度辅助系统的型式认证和这些系统作为独立技术单元的型式认证规定了详细的测试程序和技术要求,并修订该条例的附件二 (1)(EU…...

工厂方法模式(五)
过气的,终究是过气了 上一章简单介绍了工厂模式(四), 如果没有看过,请观看上一章 一.工厂方法模式 工厂方法模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。 将类的实例化(具体产品的创建&…...

力扣笔记(每日随机一题)——最佳买卖股票时机含冷冻期
问题(中等) 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 卖出股票后&a…...

yolov5 6.1 关于 tensorrt 加速的使用以及问题说明
文章目录 1. 参考连接2. 使用说明2.1 导出加速模型2.1 使用加速模型2.2 加速参数对比 3. 问题说明3.1 在 Tensorrt 8.4.1.5 版本上使用 export.py 导出失败的问题3.2 把模型文件由 best.pt 更换成加速后的 best.engine 后,执行推理时标注的类别名不正确的问题3.3 导…...
SVR(支持向量机)用法介绍
一、SVR回归介绍 SVR(Support Vector Regression)是支持向量机(SVM)在回归问题中的应用。与SVM分类模型相似,SVR也是一种非概率性算法,通过使用核函数将数据映射到高维空间,并在该空间上寻找最优的超平面与训练数据之间的间隔最大化…...

是面试官放水,还是公司实在是太缺人?这都没挂,腾讯原来这么容易进···
本人211非科班,之前在字节和腾讯实习过,这次其实没抱着什么特别大的希望投递,没想到腾讯可以再给我一次机会,还是挺开心的。 本来以为有个机会就不错啦!没想到能成功上岸,在这里要特别感谢帮我内推的同学&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...