深度神经网络量化算法基础理论

关于量化,之前的博客中首先从第一个将量化思想应用在神经网络模型上的工作开始介绍,随后阐述了量化领域的极端情况,即二值化与三值化,并指出尽管目前已经存在多种对二值网络的优化方法,但是显然因极端量化带来的严重精度损失使得这类量化模型无法满足实际场景中的需求。参考之前博客中的量化分级,本文将主要关注Level3的量化方法,即通过在训练过程中模拟量化,来尽可能地降低由量化带来的精度损失,其属于量化感知训练一类,本小节将介绍的即为量化感知训练方法的一些基础理论。

根据量化间隔是否相等,可将量化方法分为均匀量化与非均匀量化,例如对数量化即为典型的非均匀量化方法,但目前该基于非均匀量化的部署还较难在现有硬件上实现,因此本研究主要关注均匀量化。

在均匀量化中,从量化参数中是否包含零点(Zero Point ,简写为zp )可分为非对称量化与对称量化。为便于理解,下面将通过[67][158]中的量化方案来阐述相关概念,其中非对称量化的计算如式2.6中所示。

 式2.6为量化计算过程,其中的s 为缩放因子,代表量化步长,zp 为零点,代表的是浮点数中的0经量化后的整数值,b 是设置的量化位宽,clip( ) 为截断函数, 代表舍入函数,为传统的向最接近值舍入方式。式2.7中则为反量化过程,用于在量化感知训练过程中来接近原始值。上述两式中涉及到两个量化参数szp ,在量化感知训练过程中,这两个参数的初始化与更新均通过式2.8与式2.9完成。

 上述两式中,xmaxxmin 分别表示原浮点值中的最大值与最小值,qmax 则为量化后的最大值。均匀对称量化则是在式2.6与式2.7的基础上删去零点即可,如式2.10与2.11中所示。

其量化参数s 的初始化与更新则与式2.8中相同。最后从量化粒度的角度,可将量化分为逐通道量化与逐层量化,例如在卷积层中,同一层的每个卷积核(Filter)拥有独立的量化参数则为逐通道量化,若每个卷积核共享同一组量化参数,则为逐层量化。一般来说,量化粒度越细,则量化造成的精度损失越低,但是更细的量化粒度,往往会造成更多的冗余计算,因此需要根据实际的参数分布以及硬件情况来选择量化粒度。

最后来关注一下如何通过量化将原本的浮点运算全部转为定点运算过程。鉴于卷积神经网络的运算本质上是由大量矩阵运算完成,此处不妨以两个矩阵的运算来做实例。首先假设两个大小为N×N 的矩阵r1r2r1r2 矩阵相乘后得到r3 ,计算如式2.12。

 采用最一般的量化方式,即式2.6中的非对称量化,不妨假设r1 矩阵的量化参数分别为s1zp1r2r3 的量化参数同理设置,可得式2.7。

 观察式2.14不难发现,除了s1s2/s3 为浮点数,其他运算均为定点数运算,因此此时只需将s1s2/s3 转为定点运算即可。参考[67]中的解决方法,不妨假设M=s1s2/s3 ,通过大量的实验发现,M 的值域通常为(0,1) ,鉴于此,可将其表示为M=2-nM0 ,其中的M0 值域为[0.5,1) ,n转为非负整数。此时,M0 可根据硬件情况表示为一个INT16或INT32的定点乘数,此处不妨假设为INT32,则表示M0 的整数此时是最接近2^31*M0 的INT32整型值,同时由于M0>0.5 ,所以这个值至少为2^30 ,即表明其至少有30位的相对精度,综上,与M0 的乘法运算可通过定点数乘法来完成,而2^-n 则可通过简单的移位来完成。同时鉴于s1s2/s3 中涉及到的量化参数在量化完成后均已知,所以可提前完成s1s2/s3 的近似转换。

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

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

相关文章

优化软件测试成本,7个步骤简单执行~

软件测试可以防止那些修复起来成本很高的错误,从而避免将来因为它们所导致的高昂费用。以下是优化前期成本的7个步骤。 为什么软件测试很重要? 平均一款手机应用程序包含大约5万行代码,微软Windows操作系统有大约5000万行代码,而…

【技能实训】DMS数据挖掘项目-Day02

文章目录 任务3【任务3.1】实现日志实体类【任务3.2】创建日志业务类,实现日志信息的采集及打印输出【任务3.3】创建日志测试类,测试任务3.2中的程序,演示日志信息的采集及打印输出 任务4【任务4.1】物流实体信息类【任务4.2】创建物流业务类…

Python一行命令搭建HTTP服务器并外网访问+-+内网穿透

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章:【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

SQL高级教程

SQL TOP 子句 TOP 子句 TOP 子句用于规定要返回的记录的数目。 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。 注释:并非所有的数据库系统都支持 TOP 子句。 SQL Server 的语法: SELECT TOP number|percent column_name(s) F…

JMeter元件

【测试计划–线程组/Threads(Users)】 模拟大量用户负载的情况,线程组可以设置运行的线程数(多少线程就代表多少用户); 【测试计划–线程组–取样器/sampler】 用来模拟用户操作,向服务器发出http请求、Webservice请求、java请求等&#xf…

node搭建本地https和wss服务(SSL证书安全)

node 后台 app.js配置 const express require(express) //加载express资源 const bodyParserrequire("body-parser")//一个Express中间件,用于解析HTTP请求体,获得请求的数据const app express() //返回一个express服务器对象 const https require(https) const …

Django_视图中的request对象详解(八)

目录 Request 属性 方法 QueryDict 源码等资料获取方法 Request 当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并创建一个包含请求元数据的 HttpRequest 对象 传入该函数的第一个参数,常用request表示。 HttpRequest实…

第 353 场LeetCode周赛

A 找出最大的可达成数字 签到题 class Solution { public:int theMaximumAchievableX(int num, int t) {return numt*2;} };B 达到末尾下标所需的最大跳跃次数 动态规划: 定义 p i p_i pi​为跳至 i i i处所需的最大跳跃次数, 有状态转移方程 p i m a x { p j 1 ∣ 0 ≤ j &…

3D 旋转木马

在工作中我们常用到3D装换和3D位移 主要知识点 3D位移:transale3d(x,y,z)3D旋转:rotate3d(x,y,z)透视:perspective3D呈现 transfrom-style 1、 transale3d translform: translform:translateX(100px):仅仅是在x轴上移动translform:transl…

HBuilder:开发者之梦的实现

目录 引言关于HBuilderHBuilder的优点:HBuilder的缺点:HBuilder使用的简单示例总结 Hbuilder 官网 引言 在当今数字化时代,移动应用程序开发已经成为了一个全球热门的领域。伴随着智能手机和移动设备的普及,人们对于移动应用的需求…

python使用代理ip——案例

python爬虫是指使用Python编写的程序,通过网络爬取信息并提取有效数据。它通过模拟浏览器请求,获取网页数据,并通过解析HTML/XML等文档结构,从中提取数据。 Python爬虫常用的库和工具包括: Requests:用于…

UE4/5 GAS技能系统入门

Unreal的GAS技能系统是针对游戏技能管理的一套逻辑封装方案,这套方案考虑面较广,包括了Cooldowns技能冷却、允许多技能同时释放、GameplayTags的使用、特殊的事件触发等,今天就来学习一下。 1.激活插件与C部分配置 1.1 创建测试工程&#x…