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

news2024/11/10 22:04:12

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_output
            update_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.coloradmin.cn/o/1945430.html

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

相关文章

DAMA学习笔记(七)-数据集成和互操作

1.引言 数据集成和互操作(DII)描述了数据在不同数据存储、应用程序和组织这三者内部和之间进行移动和整合的相关过程。数据集成是将数据整合成物理的或虚拟的一致格式。数据互操作是多个系统之间进行通信的能力。数据集成和互操作的解决方案提供了大多数组织所依赖的基本数据管…

数据库解析一维和二维简易JSON,

项目还在使用Oracle11,不支持后续官方的json解析方式, 在 前年、去年、今年 接连 遇到json解析问题后(其实是公司的轮子效率太慢,太复杂,决定自己造个轮子,看看到底为什么慢,是不是真的很复杂&a…

计算机网络八股文(四)

目录 61.客户端调用close()后的断开流程是怎样的? 62.没有accept可以建立TCP连接吗? 63.没有listen可以建立TCP连接吗? 64.什么是TCP半连接队列(SYN队列)和全连接队列(accept队列)&#xff…

质量问题到底是谁的责任?

在竞争日益激烈的市场环境中,产品质量是企业生存与发展的基石。每当谈及生产企业的质量问题,我们往往不由自主地思考:在这一复杂而精细的生产链条中,究竟是谁该为质量问题负责? 必须明确一个无可争议的事实&#xff1…

MySQL多实例的配置

步骤1 环境准备 安装多实例数据库 1)安装好数据库mariadb yum -y install mariadb-server 2)创建mysql多实例数据文件目录 mkdir /data/mysql/3307/{data,etc,socket,log,bin,pid} -pv mkdir /data/mysql/3308/{data,etc,socket,log,bin,pid} –pv ch…

51单片机15(直流电机实验)

一、序言:我们知道在单片机当中,直流电机的控制也是非常多的,所以有必要了解一些这个电机相关的一些知识,以及如何使用单片机来控制这个电机,那么在没有学习PWM之前,我们先简单的使用GPIO这个管脚来控制电机…

【MySQL】Ubuntu22.04 安装 MySQL8 数据库详解

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》《MySQL》《Qt》 ❤️感谢大家点赞👍收藏⭐评论✍️ 一、安装目录 1.1 更新软件源 sheepAron:/root$ sudo apt update1.2 安装mysql_ser…

手持式气象监测设备

手持式气象监测设备以其小巧轻便、功能齐全的特点,逐渐成为了现代气象观测的便携新选择。 一、手持式气象监测设备的优势 手持式气象监测设备最大的优势在于其便携性。相比传统的气象监测站,手持式气象监测设备体积小巧、重量轻,用户可以轻松…

聊一聊 Node.js V22.5 有啥重要更新

大家好,今天我们来聊聊 Node.js 最新发布的 V22.5 版本。作为一名开发者,每次看到新的版本更新,总是让人期待不已。V22.5 中新增了许多强大且实用的功能,让我们的开发工作更加高效便捷。在这篇文章中,我们将重点讨论以…

压测实操--kafka-consumer压测方案

作者:九月 环境信息: 操作系统centos7.9,kafka版本为hdp集群中的2.0版本。 Consumer相关参数 使用Kafka自带的kafka-consumer-perf-test.sh脚本进行压测,该脚本参数为: thread:测试时的单机线程数&…

心率血氧传感器 - 从零开始认识各种传感器【第十三期】

1、什么是心率血氧传感器 心率传感器是一种用于测量人体心跳频率的设备或传感器。由于脉搏或者心率是生命体征的重要参数之一,所以心率测量是目前可穿戴产品必备的一个测量和健康监控功能。 而血氧传感器是一种用于测量人体血液中氧气饱和度的设备或传感器。血氧饱…

c# 端口监控 Helper 以及写一个端口监控工具

c# 端口监控 Helper 以及写一个端口监控工具 介绍核心代码:工具完整编码:1、编写界面2、打开定时控件的属性设置。3、编写定时控件的 Tick 事件结果(运行效果) 介绍 由于最近做上架比较多,会经常来确保服务器的服务&a…

分享从零开始学习网络设备配置--任务6.1 实现计算机的安全接入

项目描述 随着网络技术的发展和应用范围的不断扩大,网络已经成为人们日常生活中必不可少的一部分。园区网作为给终端用户提供网络接入和基础服务的应用环境,其存在的网络安全隐患不断显现出来,如非人为的或自然力造成的故障、事故&#xff1b…

第八讲:Sysmac Studio控制器设置

控制器设置 一、控制器设定-操作设置 1、启动模式(运行模式/编程模式) 控制器上电后,希望程序运行还是不运行。如果说希望程序运行,那么就选择运行模式。如果说希望上电后程序不运行就选择编程模式。 通常情况下选运行模式可能会比较多一些。 2、SD内存卡设置 当控制…

科研绘图系列:R语言和弦图 (Chord diagram)

介绍 和弦图(Chord Diagram)是一种用于展示多个实体之间相互关系的数据可视化方法。它通常用于表示网络或系统中不同节点(实体)之间的连接强度或流量。和弦图由一个圆形布局组成,每个节点在圆周上占据一个扇形区域,节点之间的连接通过圆内的线条(和弦)来表示。 特点:…

获取本地时间(Linux下,C语言)

一、函数 #include <time.h> time_t time(time_t *tloc);函数功能&#xff1a;获取本机时间&#xff08;以秒数存储&#xff0c;从1970年1月1日0:0:0开始到现在&#xff09;。返回值&#xff1a;获得的秒数&#xff0c;如果形参非空&#xff0c;返回值也可以通过传址调用…

判断字符串,数组方法

判断字符串方法 在JavaScript中&#xff0c;可以使用typeof操作符来判断一个变量是否为字符串。 function isString(value) {return typeof value string; } 判断数组 在JavaScript中&#xff0c;typeof操作符并不足以准确判断一个变量是否为数组&#xff0c;因为typeof会…

Soul App创始人张璐团队参与公益活动,帮助年轻人正视并管理情绪需求

最近,“脆皮年轻人”在社交平台上持续走红。该词指年轻人常因别人一些无意的动作而导致身体或心理创伤,反映出“Z世代”年轻人面临着心理健康挑战。在此背景下,Soul APP创始人张璐团队携手上海市精神卫生中心(宛平南路600号),共同发起了一场别开生面的青年心理健康公益活动,旨在…

JDBC操作MySQL数据

一准备、 1、首先在IDEA中导入导入包&#xff1a;mysql-connector-java-8.0.23 2、写初始化语句 &#xff08;1&#xff09;在目录下找到driver类 &#xff08;2&#xff09;在JDBCUtil函数中把驱动器的类路径改掉 ①打开driver类 ②按住类名 Driver用快捷键 CtrlAltshiftC …

学懂C语言(十八):C语言中数组及其应用

目录 一、数组的概念 二、数组的声明、初始化及访问 1、声明 2、初始化 3、访问数组元素 三、数组的应用 1. 存储和处理数据 2. 字符串处理 3. 多维数组 4. 函数参数 5、注意事项 一、数组的概念 C语言中的数组是一种数据结构&#xff0c;用于存储一…