商汤提出的BRECQ量化框架是个什么?

BrecqQuant

商汤提出的BRECQ量化框架是个什么?

引言

近年来,深度学习在多个领域取得了显著进展,但其巨大的计算成本和内存占用问题逐渐凸显。为了压缩和加速已训练好的网络,量化成为了一种重要的技术手段。量化主要分为两类:量化感知训练(QAT)和后训练量化(PTQ)。尽管QAT能够取得较好的量化效果,但其需要完整的训练数据集和大量的计算资源。相比之下,PTQ则更加轻量级,仅需要一小部分校准数据即可进行量化,但低比特量化时的精度损失较大。本文提出了一种新的PTQ框架BRECQ(Block Reconstruction based Quantization),首次实现了INT2比特量化的极限突破。

方法概述

BRECQ通过分析量化过程中的二阶误差,并基于神经网络的基本构建块进行重建。其主要贡献包括:

  1. 基于二阶误差分析定义重建单元:本文定义了一组重建单元,并通过理论和实验证明块重建是实现跨层依赖和泛化误差之间良好平衡的最佳选择。

  2. 结合遗传算法和块内敏感度度量生成混合精度量化模型:通过遗传算法和块内敏感度度量,BRECQ能够生成具有延迟和大小保证的混合精度量化神经网络,适用于各种硬件平台。

  3. 广泛的实验验证:本文在多种手工设计和搜索得到的神经架构上进行了大量实验,证明了BRECQ在图像分类和目标检测任务中的有效性。

方法细节

二阶误差分析

量化可以视为对权重的一种特殊扰动。为了定量分析量化引起的损失退化,可以使用泰勒级数展开来近似:

E [ L ( w + Δ w ) ] − E [ L ( w ) ] ≈ Δ w T g ˉ ( w ) + 1 2 Δ w T H ˉ ( w ) Δ w E[L(w+\Delta w)] - E[L(w)] \approx \Delta w^T \bar{g}(w) + \frac{1}{2} \Delta w^T \bar{H}(w) \Delta w E[L(w+Δw)]E[L(w)]ΔwTgˉ(w)+21ΔwTHˉ(w)Δw

其中, g ˉ ( w ) = E [ ∇ w L ] \bar{g}(w) = E[\nabla_w L] gˉ(w)=E[wL] 是梯度, H ˉ ( w ) = E [ ∇ w 2 L ] \bar{H}(w) = E[\nabla_w^2 L] Hˉ(w)=E[w2L] 是Hessian矩阵, Δ w \Delta w Δw 是权重扰动。

为了处理大规模Hessian矩阵的计算和存储问题,本文将其转化为输出Hessian矩阵,即:

arg ⁡ min ⁡ θ ^ Δ θ T H ˉ ( θ ) Δ θ ≈ arg ⁡ min ⁡ θ ^ E [ Δ z ( n ) T H ( z ( n ) ) Δ z ( n ) ] \arg \min_{\hat{\theta}} \Delta \theta^T \bar{H}(\theta) \Delta \theta \approx \arg \min_{\hat{\theta}} E[\Delta z^{(n)T} H(z^{(n)}) \Delta z^{(n)}] argθ^minΔθTHˉ(θ)Δθargθ^minE[Δz(n)TH(z(n))Δz(n)]

块重建

网络输出重建虽然能准确估计二阶误差,但在实践中容易导致过拟合。本文提出块重建方法,即在每个块内进行输出重建,忽略块间依赖但考虑块内依赖。块重建的优点在于它能够在跨层依赖和泛化误差之间找到良好的平衡。

近似预激活Hessian

为了计算块内的二阶误差,需要用到预激活Hessian矩阵。本文使用对角Fisher信息矩阵(FIM)来近似预激活Hessian,优化目标变为:

min ⁡ w ^ E [ Δ z ( i ) T diag ( ( ∂ L ∂ z 1 ( i ) ) 2 , . . . , ( ∂ L ∂ z a ( i ) ) 2 ) Δ z ( i ) ] \min_{\hat{w}} E[\Delta z^{(i)T} \text{diag}((\frac{\partial L}{\partial z^{(i)}_1})^2, ..., (\frac{\partial L}{\partial z^{(i)}_a})^2) \Delta z^{(i)}] w^minE[Δz(i)Tdiag((z1(i)L)2,...,(za(i)L)2)Δz(i)]

混合精度量化

为了进一步提升量化效果,BRECQ结合混合精度技术,通过遗传算法搜索最优的比特宽度配置。其优化目标为:

min ⁡ c L ( w ^ , c ) , s.t.  H ( c ) ≤ δ , c ∈ { 2 , 4 , 8 } n \min_c L(\hat{w}, c), \text{ s.t. } H(c) \leq \delta, c \in \{2, 4, 8\}^n cminL(w^,c), s.t. H(c)δ,c{2,4,8}n

其中, c c c 是比特宽度向量, H ( ⋅ ) H(\cdot) H() 是硬件性能度量函数, δ \delta δ 是性能阈值。

实验结果

图像分类任务

在ImageNet分类任务上,BRECQ在各种现代深度学习架构上均取得了优异的量化效果。特别地,在2比特权重量化下,BRECQ的精度损失控制在5%以内,远超过其他现有方法。

目标检测任务

在MS COCO目标检测任务上,BRECQ在4比特权重和8比特激活量化下,性能几乎无损。即使在2比特权重量化下,模型仍能保持接近原始的性能。

混合精度量化

通过遗传算法搜索最优的混合精度配置,BRECQ能够在相同延迟下显著提升量化模型的精度,并适应不同的硬件要求。

结论

BRECQ是一种基于块重建的后训练量化框架,通过二阶误差分析和混合精度技术,实现了INT2比特量化的极限突破。实验结果表明,BRECQ在多种任务和模型上均取得了优异的量化效果,为深度学习模型的压缩和加速提供了新的思路。

代码示例

由于篇幅限制,这里仅展示BRECQ框架中部分关键步骤的伪代码实现。完整的实现代码请参考论文附带的源代码。

# 伪代码:块重建优化算法
def block_reconstruction(model, calibration_data, iterations):for block in model.blocks:input_data, fp_output = prepare_input_output(block, calibration_data)for _ in range(iterations):quantized_output = quantize_block(block)delta_z = fp_output - quantized_outputupdate_block_weights(block, delta_z)return model# 伪代码:遗传算法搜索混合精度配置
def genetic_algorithm_search(population, mutation_prob, iterations, threshold):for _ in range(iterations):fitness = evaluate_fitness(population)sorted_population = sort_population(fitness)crossover_population = crossover(sorted_population)mutation_population = mutate(sorted_population, mutation_prob)population = combine_populations(crossover_population, mutation_population, threshold)return best_individual(population)

希望本文解析能帮助大家更好地理解和应用BRECQ框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA插件:mybatis log plus,完整SQL语句输出插件

背景 idea中,我们开发项目时,在控制台中都会有日志输出,操作数据库也会有对应的SQL输出。 不过在控制台输出的SQL,不管增删改查,如果有传参,参数一般都是需要我们自己拼接,形成一个完整的、可…

华清数据结构day4 24-7-19

链表的相关操作 linklist.h #ifndef LINKLIST_H #define LINKLIST_H #include <myhead.h> typedef int datatype; typedef struct Node {union{int len;datatype data;};struct Node *next; } Node, *NodePtr;NodePtr list_create(); NodePtr apply_node(datatype e); …

基于微信小程序+SpringBoot+Vue的刷题系统(带1w+文档)

基于微信小程序SpringBootVue的刷题系统(带1w文档) 基于微信小程序SpringBootVue的刷题系统(带1w文档) 本系统是将网络技术和现代的管理理念相结合&#xff0c;根据试题信息的特点进行重新分配、整合形成动态的、分类明确的信息资源&#xff0c;实现了刷题的自动化&#xff0c;…

HTML学习 - 表格

<table><tr><th>姓名</th><th>年龄</th><th>性别</th></tr><tr><td>张三</td><td>11</td><td>男</td></tr><tr><td>李三</td><td>21</td&…

matlab SAR图像的多视滤波

目录 一、算法原理1、概述2、时域多视滤波3、频域多视滤波4、参考文献 二、代码实现1、时域多视滤波 三、结果展示四、相关链接 一、算法原理 1、概述 单视复数数据&#xff08;Single Look Comple&#xff09;是原始的最高分辨率数据&#xff0c;但是从单个像元散射的雷达回波…

如何使用捕获过滤器

点击捕获&#xff0c;选项&#xff0c;然后在所选择的捕获过滤器上输入对应的捕获表达式 抓包过滤器 type(类型) 限定符: 比如host&#xff0c;net&#xff0c;port限定符等dir(方向) 限定符: src dstProto(协议类型)限定符: ether ip arp 二层过滤器举例 tcp dst port 135 …

K3s部署及研究

K3s部署及研究 K3s和K8s详解什么是 Kubernetes (K8s)?什么是 K3s?对比 K8s 和 K3s举个例子1、备份系统自带yum源配置文件2、进入 /etc/yum.repos.d3、删除文件4、设置5、缓存 查看集群是否正常 安装K3S Node节点查看主节点token获取主节点服务地址 添加node节点查看节点状态 …

python—selenium爬虫

文章目录 Selenium与Requests对比一、工作原理二、功能特点三、性能表现 下载对应驱动1.首先我们需要打开edge浏览器&#xff0c;打开设置&#xff0c;找到“关于Microsoft Edge”&#xff0c;点击进入查看浏览器版本。2.查找版本之后&#xff0c;搜索edge驱动下载&#xff0c;…

群管机器人官网源码

一款非常好看的群管机器人html官网源码 搭建教程&#xff1a; 域名解析绑定 源码文件上传解压 访问域名即可 演示图片&#xff1a; 群管机器人官网源码下载&#xff1a;客户端下载 - 红客网络编程与渗透技术 原文链接&#xff1a; 群管机器人官网源码

STM32CUBEIDE FreeRTOS操作教程(一):LED闪灯

STM32CUBEIDE FreeRTOS操作教程&#xff08;一&#xff09;&#xff1a;LED闪灯 STM32CUBEIDE(不是STM32CUBEMX)开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开…

PCB工艺边设计准则

在PCB设计时&#xff0c;通常会在电路板的边缘预留一定的空间&#xff0c;这部分空间被称为工艺边。它有助于在生产过程中确保电路板的尺寸和形状的准确性。以使得组装时更加顺畅、便捷。而工艺边的加工&#xff0c;使得线路板上的元件可以精准地与设备对接&#xff0c;从而提高…

springboot系列十一:Thymeleaf

文章目录 官方文档基本介绍Thymeleaf机制说明Thymeleaf语法表达式运算符th属性迭代条件运算使用Thymeleaf th属性需要注意点 Thymeleaf综合案例需求说明思路分析代码实现 作业布置 官方文档 在线文档: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 离线…

DNS域名管理系统、搭建DNS服务

1.DNS概述 1.DNS&#xff08;domain name system &#xff09; 域名管理系统 域名&#xff1a; 由特定的格式组成&#xff0c;⽤来表示互联⽹中某⼀台计算机或者计算机组的名称&#xff0c;能够使⼈更⽅便的访问互联⽹&#xff0c;⽽不⽤记住能够被机器直接读取的IP地址。 计算…

C++:模板(函数模板,类模板)

目录 泛型编程 函数模板 函数模板格式 函数模板的原理 函数模板的实例化 类模板 类模板格式 类模板实例化 模板分为函数模板和类模板 在C中使用模板可以让我们实现泛型编程 泛型编程 如果我们需要实现一个加法add函数&#xff0c;那么会怎么实现呢&#xff1f; int…

python 闭包、装饰器

一、闭包&#xff1a; 1. 外部函数嵌套内部函数 2. 外部函数返回内部函数 3.内部函数可以访问外部函数局部变量 闭包&#xff08;Closure&#xff09;是指在一个函数内部定义的函数&#xff0c;并且内部函数可以访问外部函数的局部变量&#xff0c;即使外部函数已经执行…

重磅 - Github 上免费大屏来啦,教你快速搭建积木报表

先看看大屏效果 JimuReport积木报表的集成版本&#xff0c;已经提供了免费数据可视化设计工具。 支持丰富的数据源连接&#xff0c;能够通过拖拉拽方式快速制作图表和门户设计&#xff1b;目前支持多种图表类型&#xff1a;柱形图、折线图、散点图、饼图、环形图、面积图、漏斗…

# Redis 入门到精通(七)-- redis 删除策略

Redis 入门到精通&#xff08;七&#xff09;-- redis 删除策略 一、redis 删除策略–过期数据的概念 1、Redis 中的数据特征 Redis 是一种内存级数据库&#xff0c;所有数据均存放在内存中&#xff0c;内存中的数据可以通过TTL指令获取其状态。 XX &#xff1a;具有时效性…

Linux下git入门操作

0.创建仓库 可以按这个配置来&#xff0c;.gitignore中存放了上传时忽略的文件类型后缀。 1.clone仓库 在gitee上创建好仓库&#xff0c;点击克隆/下载&#xff0c; 复制地址fyehong/Linux_notes 。 在所需的文件夹中放置仓库。比如我在文件夹lesson9下存储仓库。就在less…

C# 与C++ cli

cli CLI&#xff08;Command Line Interface&#xff09;是一种通过命令行界面与计算机系统进行交互的方式。它提供了一种以文本形式输入命令和接收系统输出的方法&#xff0c;用于执行各种操作和管理计算机系统。以下是CLI的详细解释&#xff1a; 一、定义与基本概念 定义&…

Python酷库之旅-第三方库Pandas(041)

目录 一、用法精讲 136、pandas.Series.ne方法 136-1、语法 136-2、参数 136-3、功能 136-4、返回值 136-5、说明 136-6、用法 136-6-1、数据准备 136-6-2、代码示例 136-6-3、结果输出 137、pandas.Series.eq方法 137-1、语法 137-2、参数 137-3、功能 137-4、…