首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >卷积神经网络训练模拟量化实践

卷积神经网络训练模拟量化实践

原创
作者头像
Ldpe2G
修改于 2019-01-13 07:53:55
修改于 2019-01-13 07:53:55
1.8K0
举报

前言

深度学习在移动端的应用是越来越广泛,由于移动端的运算力与服务器相比还是有差距,

所以在移动端部署深度学习模型的难点就在于如何保证模型效果的同时,运行效率也有保证。

在实验阶段对于模型结构可以选择大模型,因为该阶段主要是为了验证方法的有效性。在验证

完了之后,开始着手部署到移动端,这时候就要精简模型的结构了,一般是对训好的大模型

进行剪枝,或者参考现有的比如MobileNetV2和ShuffleNetV2等轻量级的网络重新设计自己的

网络模块。而算法层面的优化除了剪枝还有量化,量化就是把浮点数(高精度)表示的权值和

激活值用更低精度的整数来近似表示。低精度的优点有,相比于高精度算术运算,其在单位

时间内能处理更多的数据,而且权值量化之后模型的存储空间能进一步的减少等等[1]。

对训练好的网络做量化,在实践中尝试过TensorRT[5][8]的后训练量化算法,效果还不错。

但是如果能在训练过程中去模拟量化的过程,让网络学习去修正量化带来的误差,

那么得到的量化参数应该是更准确的,而且在实际量化推断中模型的性能损失应该能更小。

而本文的内容就是介绍论文[3][4]和复现其过程中的一些细节。

按照惯例,先给出本文实验的代码:TrainQuantization

训练模拟量化

方法介绍

首先来看下量化的具体定义,对于量化激活值到有符号8bit整数,论文中给出的定义如下:

公式中的三角形表示量化的缩放因子,x表示浮点数激活值,首先通过除以缩放因子然后最近

邻取整,然后把范围限制到一个区间内,比如量化到有符号8bit,那么范围就是 [-128, 127]。

而对于权值还有一个小的技巧,就是量化到[-127, 127]:

具体为什么这么做,论文中说了是为了实现上的优化,具体解释可以看论文[3]附录B

ARM NEON details这一小节。

而训练量化说白了就是在forward阶段去模拟量化这个过程,本质就是把权值和激活值量化到8bit

再反量化回有误差的32bit,所以训练还是浮点,backward阶段是对模拟量化之后权值的求梯度,

然后用这个梯度去更新量化前的权值。然后在下个batch继续这个过程,通过这样子能够让网络学会

去修正量化带来的误差。

上面给这个示意图就很直观的表示了模拟量化的过程,比如上面那条线表示的是量化前的

范围[rmin, rmax],然后下面那条线表示的就是量化之后的范围[-128, 127],比如现在要进行

模拟量化的forward,先看上面那条线从左到右数第4个圆点,通过除以缩放因子之后就会映射

124到125之间的一个浮点数,然后通过最近邻取整就取到了125,再通过乘以缩放因子返回

上面第五个圆点,最后就用这个有误差的数替换原来的去forward。forward阶段的模拟量化用

公式表示如下:

backward阶段求梯度的公式表示如下:

对于缩放因子的计算,权值和激活值的不一样,权值的计算方法是每次forward直接对权值

求绝对值取最大值,然后缩放因子 weight scale = max(abs(weight)) / 127。然后对于激活值,

稍微有些不一样,激活值的量化范围不是简单的计算最大值,而是通过

EMA(exponential moving averages)在训练中去统计这个量化范围,更新公式如下:

moving_max = moving_max * momenta + max(abs(activation)) * (1- momenta)

公式中的activation表示每个batch的激活值,而论文中说momenta取接近1的数就行了,

在实验中我是取0.95。然后缩放因子 activation scale = moving_max /128。

实现细节

在实现过程中我没有按照论文的方法量化到无符号8bit,而是有符号8bit,第一是因为无符号8bit

量化需要引入额外的零点,增加复杂性,其次在实际应用过程中都是量化到有符号8bit。然后论文中

提到,对于权值的量化分通道进行求缩放因子,然后对于激活值的量化整体求一个缩放因子,这样

效果最好。在实践中发现有些任务权值不分通道量化效果也不错,这个还是看具体任务吧,不过本文

给的实验代码是没分的。

然后对于卷积层之后带batchnorm的网络,因为一般在实际使用阶段,为了优化速度,batchnorm

的参数都会提前融合进卷积层的参数中,所以训练模拟量化的过程也要按照这个流程。首先把

batchnorm的参数与卷积层的参数融合,然后再对这个参数做量化。以下两张图片分别表示的是训练过程

与实际应用过程中对batchnorm层处理的区别:

对于如何融合batchnorm参数进卷积层参数,看以下公式:

公式中的,W和b分别表示卷积层的权值与偏置,x和y分别为卷积层的输入与输出,则根据bn的计算

公式,可以推出融合了batchnorm参数之后的权值与偏置,Wmerge和bmerge。

在实验中我其实是简化了融合batchnorm的流程,要是完全按照论文中的实现要复杂很多,

而且是基于已经训好的网络去做模拟量化实验的,不基于预训练模型训不起来,可能还有坑要踩。

而且在模拟量化训练过程中batchnorm层参数固定,融合batchnorm参数也是用已经训好的移动

均值和方差,而不是用每个batch的均值和方差。

具体实现的时候就是按照论文中的这个模拟量化卷积层示例图去写训练网络结构的。

实验结果

用VGG在Cifar10上做了下实验,效果还可以,因为是为了验证量化训练的有效性,所以训

Cifar10的时候没怎么调过参,数据增强也没做,训出来的模型精确度最高只有0.877,比最好的

结果0.93差不少,然后模拟量化是基于这个0.877的模型去做的,可以得到与普通训练精确度基本

一样的模型,可能是这个分类任务比较简单。然后得到训好的模型与每层的量化因子之后,就可以

模拟真实的量化推断过程,不过因为MXNet的卷积层不支持整型运算,所以模拟的过程也是用浮点

来模拟,具体实现细节可见示例代码。

结束语

以上内容是根据最近的一些工作实践总结得到的一篇博客,对于论文的实现很多地方都是我自己

个人的理解,如果有读者发现哪里有误或者有疑问,也请指出,大家互相交流学习:)。

参考资料

[1] 8-Bit Quantization and TensorFlow Lite: Speeding up mobile inference with low precision

[2] Building a quantization paradigm from first principles

[3] Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference

[4] Quantizing deep convolutional networks for efficient inference: A whitepaper

[5] 8-bit Inference with TensorRT

[6] TensorRT(5)-INT8校准原理

[7] caffe-int8-convert-tool.py

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MXNet实现卷积神经网络训练量化
深度学习在移动端的应用是越来越广泛,由于移动端的运算力与服务器相比还是有差距,所以在移动端部署深度学习模型的难点就在于如何保证模型效果的同时,运行效率也有保证。
BBuf
2020/03/20
1.2K0
MXNet实现卷积神经网络训练量化
深度学习框架落地 | 量化网络的重要性(附源码地址下载)
在实验阶段对于模型结构可以选择大模型,因为该阶段主要是为了验证方法的有效性。在验证完了之后,开始着手部署到移动端,这时候就要精简模型的结构了,一般是对训好的大模型进行剪枝,或者参考现有的比如MobileNetV2和ShuffleNetV2等轻量级的网络重新设计自己的网络模块。而算法层面的优化除了剪枝还有量化,量化就是把浮点数(高精度)表示的权值和激活值用更低精度的整数来近似表示。低精度的优点有,相比于高精度算术运算,其在单位时间内能处理更多的数据,而且权值量化之后模型的存储空间能进一步的减少等等。
计算机视觉研究院
2021/01/14
1.1K0
深度学习框架落地 | 量化网络的重要性(附源码地址下载)
Pytorch实现卷积神经网络训练量化(QAT)
深度学习在移动端的应用越来越广泛,而移动端相对于GPU服务来讲算力较低并且存储空间也相对较小。基于这一点我们需要为移动端定制一些深度学习网络来满足我们的日常续需求,例如SqueezeNet,MobileNet,ShuffleNet等轻量级网络就是专为移动端设计的。但除了在网络方面进行改进,模型剪枝和量化应该算是最常用的优化方法了。剪枝就是将训练好的「大模型」的不重要的通道删除掉,在几乎不影响准确率的条件下对网络进行加速。而量化就是将浮点数(高精度)表示的权重和偏置用低精度整数(常用的有INT8)来近似表示,在量化到低精度之后就可以应用移动平台上的优化技术如NEON对计算过程进行加速,并且原始模型量化后的模型容量也会减少,使其能够更好的应用到移动端环境。但需要注意的问题是,将高精度模型量化到低精度必然会存在一个精度下降的问题,如何获取性能和精度的TradeOff很关键。
BBuf
2020/08/04
4K0
Pytorch实现卷积神经网络训练量化(QAT)
卷积神经网络的卷积层_卷积神经网络详解
模块融合:将一些相邻模块进行融合以提高计算效率,比如conv+relu或者conv+batch normalization+relu,最常提到的BN融合指的是conv+bn通过计算公式将bn的参数融入到weight中,并生成一个bias;
全栈程序员站长
2022/11/07
1.8K0
卷积神经网络的卷积层_卷积神经网络详解
LLM 大模型学习必知必会系列(六):量化技术解析、QLoRA技术、量化库介绍使用(AutoGPTQ、AutoAWQ)
模型的推理过程是一个复杂函数的计算过程,这个计算一般以矩阵乘法为主,也就是涉及到了并行计算。一般来说,单核CPU可以进行的计算种类更多,速度更快,但一般都是单条计算;而显卡能进行的都是基础的并行计算,做矩阵乘法再好不过。如果把所有的矩阵都加载到显卡上,就会导致显卡显存的占用大量增加,尤其是LLM模型大小从7b、14b、34b到几百b不等,占用显存的大小就是惊人的数字,如何在减少运算量和显存占用的条件下,做到推理效果不下降太多呢?在这里需要引入浮点数和定点数的概念。
汀丶人工智能
2024/05/26
2.8K0
LLM 大模型学习必知必会系列(六):量化技术解析、QLoRA技术、量化库介绍使用(AutoGPTQ、AutoAWQ)
神经网络低比特量化——TQT
可见,Asymmetric & Per-Channel & Real-valued scaling方法对量化的表达最为灵活,无论是简单网络还是难网络均能保证良好的量化精度误差,但是硬件部署不友好;反之,针对Symmetric & Per-Tensor & Power-of-2 scaling方法对量化表达不够灵活,简单网络实施量化较灵活,但是,针对如MobileNet类型的紧凑型网络结构量化后的损失严重。但是,对硬件的部署十分友好。
AI异构
2020/08/21
3.3K0
神经网络低比特量化——TQT
​【大模型学习 | 量化】pytorch量化基础知识(1)
九年义务漏网鲨鱼
2025/06/25
2380
深度学习算法优化系列三 | Google CVPR2018 int8量化算法
这是Google在CVPR 2018上发表的一篇int8量化的论文,题目为《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》。也是入门量化最经典的论文之一。论文介绍了一种只使用整数运算的量化方式,相比于浮点数运算效率更高。一起先来看看这篇论文吧。论文的axriv地址可以在附录中找到。
BBuf
2019/12/27
2.8K0
深度学习算法优化系列三 | Google CVPR2018 int8量化算法
ICCV2019 高通Data-Free Quantization论文解读
https://openaccess.thecvf.com/content_ICCV_2019/papers/Nagel_Data-Free_Quantization_Through_Weight_Equalization_and_Bias_Correction_ICCV_2019_paper.pdf
BBuf
2020/08/04
1.5K0
ICCV2019 高通Data-Free Quantization论文解读
EasyQuant 后量化算法论文解读
本文的主要内容是解读 「EasyQuant: Post-training Quantization via Scale Optimization」 这篇由格灵深瞳出品的文章。
BBuf
2020/07/09
1.2K0
EasyQuant 后量化算法论文解读
基于Pytorch构建三值化网络TWN
三值化网络是2016年由Fengfu Li在论文《Ternary Weight Networks》中提出来的,它相比二值化网络具有更好的效果。论文地址如下:https://arxiv.org/abs/1605.04711 。
BBuf
2020/07/17
8290
深度学习算法优化系列十二 | 旷视科技 DoReFa-Net
我们知道,XORNet以及BNN都没有在反向传播阶段做梯度的量化,之前也没有任何工作可以在反向传播阶段将梯度量化到8位一下并且保持相当的预测精度。在BNN和XORNet中,虽然权重是二值化的,但是梯度仍然是全精度浮点数,因此在反向传播时反卷积依然是1bit和32bit数之间的运算,这导致BNN和XORNet的训练时间主要花在反向传播阶段。
BBuf
2020/02/25
2.7K4
一起实践神经网络量化系列教程(一)!
老潘刚开始接触神经网络量化是2年前那会,用NCNN和TVM在树莓派上部署一个简单的SSD网络。那个时候使用的量化脚本是参考于TensorRT和NCNN的PTQ量化(训练后量化)模式,使用交叉熵的方式对模型进行量化,最终在树莓派3B+上部署一个简单的分类模型(识别剪刀石头布静态手势)。
老潘
2023/10/19
1.5K0
一起实践神经网络量化系列教程(一)!
低比特量化之DoreFa-Net理论与实践
这篇文章首先详细介绍了DoreFaNet任意比特量化网络的原理,然后提供了DoreFaNet的Pytorch代码实现解析,并给出将DoreFa-Net应用到YOLOV3模型上之后的精度测试结果。论文原文:https://arxiv.org/pdf/1606.06160.pdf 。
BBuf
2020/07/28
1.4K0
低比特量化之DoreFa-Net理论与实践
神经网络低比特量化——LSQ
在推理时以低精度操作运行的深度网络比高精度具有功耗和存储优势,但需要克服随着精度降低而保持高精度的挑战。在这里,本文提出了一种训练此类网络的方法,即 Learned Step Size Quantization,当使用来自各种架构的模型时,该方法在 ImageNet 数据集上实现了 SOTA 的精度,其权重和激活量化为2、3或4 bit 精度,并且可以训练达到全精度基线精度的3 bit 模型。本文的方法建立在现有的量化网络中学习权重的方法基础上,通过改进量化器本身的配置方式。具体来说,本文引入了一种新的手段来估计和扩展每个权重和激活层的量化器步长大小的任务损失梯度,这样它就可以与其他网络参数一起学习。这种方法可以根据给定系统的需要使用不同的精度水平工作,并且只需要对现有的训练代码进行简单的修改。
AI异构
2020/08/10
3K0
神经网络低比特量化——LSQ
【现代深度学习技术】现代卷积神经网络05:批量规范化
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/03/31
2050
【现代深度学习技术】现代卷积神经网络05:批量规范化
F8Net:只有8比特乘法的神经网络量化
【GaintPandaCV导语】F8Net用定点化量化方法对DNN进行量化,在模型推理只有8-bit的乘法,没有16-bit/32-bit的乘法,采用非学习的方法即标准差来定小数位宽。目前是我看到的第一篇硬件层面全8-bit乘法的模型推理的方法。
BBuf
2022/04/06
1.7K0
F8Net:只有8比特乘法的神经网络量化
二值网络,围绕STE的那些事儿
二值网络,是指在一个神经网络中,参数的值限定在{-1,+1}或者{0,1}。而更为彻底的二值网络是让网络在进行计算时得到的激活值(activation)也被二值化。当然,最为彻底的,是在网络的训练过程中,对梯度也进行二值化。我们今天讨论的,就不涉及对梯度二值化了,只考虑前面的两种情况。
SIGAI学习与实践平台
2019/07/10
3.2K0
如何使用TensorFlow实现卷积神经网络
编者按:本文节选自图书《TensorFlow实战》第五章,本书将重点从实用的层面,为读者讲解如何使用TensorFlow实现全连接神经网络、卷积神经网络、循环神经网络,乃至Deep Q-Network。同时结合TensorFlow原理,以及深度学习的部分知识,尽可能让读者通过学习本书做出实际项目和成果。 卷积神经网络简介 卷积神经网络(Convolutional Neural Network,CNN)最初是为解决图像识别等问题设计的,当然其现在的应用不仅限于图像和视频,也可用于时间序列信号,比如音频信号、
CSDN技术头条
2018/02/13
1.5K0
如何使用TensorFlow实现卷积神经网络
深入了解NNIE量化技术
【GiantPandaCV导语】这篇文章对量化技术做了概要的介绍,由原理推导,验证实现了海思NNIE的量化算法。最后,作者还尝试了使用Pytorch对训练感知量化算法的进行复现,使其不依赖固定Cuda版本,并且可以使用多卡进行训练,内容非常硬核,具体请看文章。本文同步发表于知乎,地址为:https://zhuanlan.zhihu.com/p/223018242 。文末送出4本《机器学习与深度学习算法基础》书籍,欢迎评论区留言抽奖。
BBuf
2020/09/27
3.5K0
深入了解NNIE量化技术
推荐阅读
相关推荐
MXNet实现卷积神经网络训练量化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档