CN117574977A - 一种有效地提升低比特模型精度的量化方法 - Google Patents
一种有效地提升低比特模型精度的量化方法 Download PDFInfo
- Publication number
- CN117574977A CN117574977A CN202210926524.8A CN202210926524A CN117574977A CN 117574977 A CN117574977 A CN 117574977A CN 202210926524 A CN202210926524 A CN 202210926524A CN 117574977 A CN117574977 A CN 117574977A
- Authority
- CN
- China
- Prior art keywords
- value
- bit
- clip
- quantization
- parameter
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000013139 quantization Methods 0.000 title claims abstract description 76
- 238000000034 method Methods 0.000 title claims abstract description 60
- 230000004913 activation Effects 0.000 claims abstract description 34
- 238000009826 distribution Methods 0.000 claims abstract description 28
- 230000006870 function Effects 0.000 claims description 20
- 238000012549 training Methods 0.000 claims description 18
- 238000013528 artificial neural network Methods 0.000 claims description 15
- 210000002569 neuron Anatomy 0.000 claims description 15
- 239000011159 matrix material Substances 0.000 claims description 12
- 230000008569 process Effects 0.000 claims description 12
- 238000004364 calculation method Methods 0.000 claims description 9
- 238000010606 normalization Methods 0.000 claims description 8
- 238000006243 chemical reaction Methods 0.000 claims description 5
- 238000005520 cutting process Methods 0.000 claims description 5
- 230000009466 transformation Effects 0.000 claims description 5
- 230000003213 activating effect Effects 0.000 claims description 4
- 238000010586 diagram Methods 0.000 description 7
- 230000008901 benefit Effects 0.000 description 5
- 238000013135 deep learning Methods 0.000 description 4
- 238000002474 experimental method Methods 0.000 description 4
- 230000008859 change Effects 0.000 description 3
- 238000013473 artificial intelligence Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 238000011002 quantification Methods 0.000 description 2
- 238000003860 storage Methods 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 102100030148 Integrator complex subunit 8 Human genes 0.000 description 1
- 101710092891 Integrator complex subunit 8 Proteins 0.000 description 1
- 230000001133 acceleration Effects 0.000 description 1
- 230000006835 compression Effects 0.000 description 1
- 238000007906 compression Methods 0.000 description 1
- 230000008034 disappearance Effects 0.000 description 1
- 238000005265 energy consumption Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000010801 machine learning Methods 0.000 description 1
- 238000003058 natural language processing Methods 0.000 description 1
- 230000008447 perception Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 230000007480 spreading Effects 0.000 description 1
- 238000003892 spreading Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
- G06N3/084—Backpropagation, e.g. using gradient descent
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/38—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
- G06F7/48—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
- G06F7/483—Computations with numbers represented by a non-linear combination of denominational numbers, e.g. rational numbers, logarithmic number system or floating-point numbers
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Computational Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Pure & Applied Mathematics (AREA)
- Mathematical Optimization (AREA)
- Mathematical Analysis (AREA)
- Artificial Intelligence (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biomedical Technology (AREA)
- General Health & Medical Sciences (AREA)
- Biophysics (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Molecular Biology (AREA)
- Health & Medical Sciences (AREA)
- Evolutionary Computation (AREA)
- Data Mining & Analysis (AREA)
- Nonlinear Science (AREA)
- Computational Linguistics (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明提供一种有效地提升低比特模型精度的量化方法,所述方法是在现有的量化方法的基础上将激活值变成一个可学习的参数,并在此基础上加入了范围限制,以使该激活值快速地往期望的方向收敛;根据全精度模型的分布情况,在一个有效的范围内学习每一层的激活值,得到一个分布更合理的特征feature,从而降低量化模型带来的精度损失以提升量化后模型的精度。
Description
技术领域
本发明属于神经网络技术领域,特别涉及一种有效地提升低比特模型精度的量化方法。
背景技术
随着人工智能应用在手机、IoT上的普及,受能耗和设备体积的限制,端侧硬件的计算性能和存储能力相对较弱,这给人工智能模型带来了新的挑战——需要模型更小更快更强。量化,就是其中的一个重要手段。因此,近年来量化成为学术界与工业界热门的研究方向。但与此同时,模型量化也引发了巨大的挑战。其中比较大的有两个:一是由于表示精度下降引起信息损失带来准确率的下降;二是量化带来的不连续性使神经网络的训练不稳定。学术和工业界的大多数工作也正是围绕它们展开的。
一方面,量化的好处在于:量化是将以往用32bit或者64bit表达的浮点数用8bit、16bit甚至1bit、2bit等占用较少内存空间的形式进行存储。这样的好处是:
1.减少模型体积,降低模型存储空间需求;
2.降低内存带宽需求;
3.加速计算。现代移动端设备,基本都支持SIMD(单指令流多数据流),以128-bit寄存器为例,单个指令可以同时运算4个32位单精度浮点,或者8个16位整型,或者16个8位整型。显然8位整型数在SIMD的加持下,运算速率要更快。
另一方面,量化也面临一些问题:
量化最核心的挑战,是如何在减少模型数据位宽的同时,模型的准确度不要掉下来,也就是在压缩率与准确率损失间作trade-off。这衍生出很多有趣的子问题,比如量化对象是谁(weight,activation,gradient),量化到几位(8位,4位,2位,1位),量化参数选哪些(如moving rate,clipping value),量化参数是否可以自动优化,不同层是否需要不同的量化参数,如何在量化后恢复准确率或者在训练时考虑量化等;
模型量化主要包括两个部分,一是对权重Weight量化,一是针对激活值Activation量化;只有同时对两部分进行量化,才能获得最大的计算效率收益;权重可以借助网络正则化等手段,让权重分布尽量紧凑,减少离群点、不均匀分布情况发生,而对于激活值还缺乏有效的手段。
此外,现有技术中的常用术语如下:
1.模型量化:简单来说就是用更低比特数据(如8位整型)代替原浮点数据(32位)。
2.量化感知训练:在量化的过程中,对网络进行训练,从而让网络参数能更好地适应量化带来的信息损失。
所谓的量化感知训练(Quantization-aware Training),其中网络的前向(forward)模拟INT8计算,反向(backward)仍然是FP32。如图1(a)、图1(b)所示。
3.非对称量化:将浮点范围中的最小值/最大值映射到整数范围的最小值/最大值。除了比例因子以外,这经过使用零点(也称为量化误差,或偏移)来完成。如图2所示。
4.对称量化:选择最小/最大值之间的最大绝对值,而不是将浮点范围的精确最小值/最大值映射到量化范围。另外,不使用零点,即有效量化的浮点范围相对于零是对称的,量化范围也是如此。如图3所示。
5.量化策略:例如BNN(Binarized Neural Networks),XNOR-Net、TWN(Ternaryweight networks)、DoReFa-Net。
6.BatchNorm(批量标准化),BN是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布;若对神经网络每一层做归一化,会使每一层输出为标准正态分布,会使神经网络完全学习不到特征。
7.ReLU(Rectified Linear Unit),线性整流函数又称修正线性单元,是人工神经网络中常用的激活函数。通常意义下,线性整流函数指代数学中的斜坡函数,即f(x)=max(0,x),而在神经网络中,线性整流作为神经元的激活函数,定义了该神经元在线性变换wTx+b之后的非线性输出结果。即对于进入神经元的来自上一层神经网络的输入向量x,使用线性整流激活函数的神经元会输出max(0,wTx+b),至下一层神经元或作为整个神经网络的输出(取决现神经元在网络结构中所处位置)。
8.Relu6,ReLU6就是普通的ReLU但是限制最大输出为6,ReLU6限制为正侧的值6。任何6或大于6的输入值都将被限制为值6。
8.PyTorch:一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。基于Python的可续计算包,提供两个高级功能:(1)、具有强大的GPU加速的张量计算。(2)、包含自动求导系统的深度神经网络。
发明内容
为了解决上述问题,本申请的目的在于:提供一种切实有效地能够提升低比特模型精度的方法。
具体地,本发明提供一种有效地提升低比特模型精度的量化方法,所述方法是在现有的量化方法的基础上将激活值变成一个可学习的参数Clip_value并进行运算,所述方法中使用在PyTorch中的二维卷积调用torch.nn.Conv2d:Clip_value=nn.Parameter(torch.tensor(6.0))即初始化网络的时候添加一个可训练参数Clip_value,其是单个tensor值,并设置默认值为6.0,并在此基础上加入了范围限制,以使该激活值快速地往期望的方向收敛,深度学习的过程就是一个参数不断迭代训练直至达到一个差不多的精度且不再变化(即收敛);根据全精度模型的分布情况,在一个有效的范围内学习每一层的激活值,得到一个分布更合理的特征feature,从而降低量化模型带来的精度损失以提升量化后模型的精度。
所述方法进一步包括:
S1,输入特征input feature;
S2,卷积/全连接:
S2.1,一方面,判断是否量化,如果量化,则量化权重weight;如果不量化,按原始的float数据进行计算;
S2.2,另一方面,判断是否有偏移bias?如果有,则进行偏移加biasadd,再进一步进行S3;如果没有,则直接进行S3;
S3,判断是否有批量标准化BN?如果有,则进行批量标准化BatchNorm,再进一步进行S4;如果没有,则直接进行S4;
S4,进一步判断是否量化?
如果量化,则判断是否最后一层?如果否,则量化激活Feature,用前面提到的现有的量化方法对每层的输出特征进行量化,再进一步进行S5;如果是,则直接进行S5;
如果不量化,则判断activation_fn==None是否成立,即判断激活是否为空,也就是带不带激活函数?如果成立,则进行Relu/Relu6函数,再进一步进行S5;如果不成立,则直接进行S5;
S5,输出特征output feature。
所述步骤S2中:
所述卷积:输入矩阵与卷积核进行对应元素相乘并求和,其中卷积核也是一种矩阵,所以一次卷积的结果的输出是一个数,最后对整个输入输入矩阵进行遍历,最终得到一个结果矩阵;所述方法针对卷积操作的对象和使用场景用到的是PyTorch中的二维卷积,使用方法是从torch.nn模块中调用,其调用的是torch.nn.Conv2d;
所述全连接:指一个由多个神经元所组成的层,其所有的输出和该层的所有输入都有连接,即每个输入都会影响所有神经元的输出;所述方法在PyTorch中的nn.Linear()表示线性变换,全连接层被看作是nn.Linear()表示线性变层再加上一个激活函数层所构成的结构。
所述步骤S3中:
所述BN:即BatchNorm就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布;计算过程如下:
第一步计算输入的均值;
第二步计算输入的方差;
第三步根据前面的均值和方差进行归一化;
第四步乘上训练的scale再加上shifit。
所述量化方法是将网络输出的范围在0.0~1.0之间的张量调整成数值为0~255、uint8类型的图片数据,这个过程就是量化;
所述现有的量化方法包括:
(1)用r表示浮点实数,q表示量化后的定点整数浮点和整型之间的换算公式为:
r=S(q-Z)
其中,S是scale,表示实数和整数之间的比例关系,z是zero point,表示实数中的0经过量化后对应的整数,它们的计算方法为:
rmax、rmin分别是的最大值和最小值,qmin、qmin同理;
(2)基于范围的线性量化即对输出的量化:
r=torch.clamp(0,6.0,r)将x截断至0-6
r=r/6.0归一化
N=2bit-1,其中bit是要量化的比特位,设为8,那么量化范围值N就是0-255无符号类型,相当于上式中的S=1/Nq=round(r*N)这样就算出来的q值就是输入量化后的值。
所述变成一个可学习的参数,进一步包括:
torch.nn.Parameter是继承自torch.Tensor的子类,其作用是作为nn.Module中的可训练参数使用;它与torch.Tensor的区别就是nn.Parameter会自动被认为是module的可训练参数,即加入到parameter()这个迭代器中去;而module中非nn.Parameter()的普通tensor是不在parameter中的;所以在torch中如果要把一个tensor转换为可训练参数,只要定义其为nn.Parameter()即可。
所述方法进一步包括:
初始化网络的时候添加一个可训练参数Clip_value,其是单个tensor值,并设置默认值为6.0,同时设置clipMin,clipMax的值,为浮点值,设clipMin=0,clipMax=2.0;量化的比特位bit,设bit=8:表示为:Init:
Clip_value=nn.Parameter(torch.tensor(6.0))
其中,Clip_value是激活值的最大范围,对这个最大范围又加了一个限制,clipMin和clipMax,在这个范围之内进行Clip_value的学习,以使模型达到一个相对较高的精度;
在所述运算的时候,进一步包括以下步骤:
(1)先将Clip_value值截断至clipMin-clipMax之间,保证Clip_value不至于太大或太小;
(2)将计算完卷积、BN、激活之后的值X截断至0-Clip_value之间;
(3)进一步归一化X;
(4)计算量化值范围,N_levels=2bit-1,设bit=8,该值就是255;
(5)X_Q=round(X*N_levels)量化X的值;
(6)最后又除上N_levels,相当于做了一个反量化,方便后面的运算;表示为:
Forward:
Clip_value=torch.clamp(clipMin,clipMax,Clip_value)
X=torch.clamp(X,0,Clip_value.item())
X=X/Clip_value
N_levels=2^bit-1
X_Q=torch.round(X*N_levels)/N_levels。
所述clipMin和clipMax的值,用到的经验值:
或者,
所述方法如果在8bit精度发生偏差,则需要先用一个batch的训练数据分析一下已经收敛的浮点模型的Feature分布,之后根据每一层的feature的分布情况来设置这个clipMin和clipMax。
由此,本申请的优势在于:降低量化模型带来的精度损失,试验证明,该方法对就很多网络在4bit情况下仍然能保证和原浮点模型相当的精度。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。
图1(a)是现有技术量化感知训练中仅整数算术推理的示意图。
图1(b)是现有技术量化感知训练中通过模拟量化进行训练的示意图。
图2是现有技术中非对称量化的示意图。
图3是现有技术中对称量化的示意图。
图4是本申请量化方法的简化流程图。
图5是本申请方法中BN的计算过程示意图。
图6是本申请方法中部分代码的示意图。
具体实施方式
为了能够更清楚地理解本发明的技术内容及优点,现结合附图对本发明进行进一步的详细说明。
本发明涉及一种有效地提升低比特模型精度的量化方法,如图4所示,是方法步骤示意图。所述方法进一步包括:
S1,输入特征input feature;
S2,卷积/全连接:
S2.1,一方面,判断是否量化,如果量化,则量化权重weight;如果不量化,按原始的float数据进行计算;
S2.2,另一方面,判断是否有偏移bias?如果有,则进行偏移加biasadd,再进一步进行S3;如果没有,则直接进行S3;
S3,判断是否有批量标准化BN?如果有,则进行批量标准化BatchNorm,再进一步进行S4;如果没有,则直接进行S4;
S4,进一步判断是否量化?
如果量化,则判断是否最后一层?如果否,则量化激活Feature,用现有的量化方法对每层的输出特征进行量化,再进一步进行S5;如果是,则直接进行S5;
如果不量化,则判断activation_fn==None是否成立,即判断激活是否为空,也就是带不带激活函数?如果成立,则进行Relu/Relu6函数,再进一步进行S5;如果不成立,则直接进行S5;
S5,输出特征output feature。
所述方法是在现有的量化方法的基础上将激活值变成一个可学习的参数Clip_value并进行运算,所述方法中使用在PyTorch中的二维卷积调用torch.nn.Conv2d:Clip_value=nn.Parameter(torch.tensor(6.0))即初始化网络的时候添加一个可训练参数Clip_value,其是单个tensor值,并设置默认值为6.0,并在此基础上加入了范围限制,以使该激活值快速地往期望的方向收敛,深度学习的过程就是一个参数不断迭代训练直至达到一个差不多的精度且不再变化(即收敛),深度学习本身就是一个用大数据不断迭代收敛的过程,收敛的速度视训练任务、数据和网络不同;根据全精度模型的分布情况,在一个有效的范围内学习每一层的激活值,得到一个分布更合理的特征feature,从而降低量化模型带来的精度损失以提升量化后模型的精度。
具体地,本方法可以描述如下:
1.现有的量化方法:
将网络输出的范围在0.0~1.0之间的张量调整成数值为0~255、uint8类型的图片数据,这个过程就是量化。所以量化本质上只是对数值范围的重新调整,可以粗略理解为是一种线性映射。
(1)这里用r表示浮点实数,q表示量化后的定点整数。浮点和整型之间的换算公式为:
r=S(q-Z)
其中,S是scale,表示实数和整数之间的比例关系,z是zero point,表示实数中的0经过量化后对应的整数,它们的计算方法为:
rmax、rmin分别是的最大值和最小值,qmin、qmin同理;
(2)基于范围的线性量化(对输出的量化):
r=torch.clamp(0,6.0,r)将x截断至0-6
r=r/6.0归一化
N=2bit-1其中bit是要量化的比特位,比如8,那么量化范围值N就是0-255(无符号类型),相当于上式中的S=1/N
q=round(r*N)这样就算出来的q值就是输入量化后的值。
2.变成一个可学习的参数
torch.nn.Parameter是继承自torch.Tensor的子类,其主要作用是作为nn.Module中的可训练参数使用。它与torch.Tensor的区别就是nn.Parameter会自动被认为是module的可训练参数,即加入到parameter()这个迭代器中去;而module中非nn.Parameter()的普通tensor是不在parameter中的。所以在torch中如果要把一个tensor转换为可训练参数,只要定义其为nn.Parameter()即可。
3.深度学习的基本算子:
卷积:卷积在数学上用通俗的话来说就是输入矩阵与卷积核(卷积核也是矩阵)进行对应元素相乘并求和,所以一次卷积的结果的输出是一个数,最后对整个输入输入矩阵进行遍历,最终得到一个结果矩阵,说白了就是一个卷积核在图像上滑动,并求取对应元素相乘求和的过程。在PyTorch中针对卷积操作的对象和使用场景的不同,有一维卷积、二维卷积、三维卷积与转置卷积(卷积的逆操作),它们的使用方法比较相似,都从torch.nn模块中调用,这里主要用到的是PyTorch中的二维卷积,其调用的是torch.nn.Conv2d.
全连接:通常所说的全连接层是指一个由多个神经元所组成的层,其所有的输出和该层的所有输入都有连接,即每个输入都会影响所有神经元的输出。在PyTorch中的nn.Linear()表示线性变换,全连接层可以看作是nn.Linear()表示线性变层再加上一个激活函数层所构成的结构。BN:BN(即BatchNorm)就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。其计算过程如图5所示:
第一步计算输入的均值;
第二步计算输入的方差;
第三步根据前面的均值和方差进行归一化;
第四步乘上训练的scale再加上shifit。
4.代码文字说明,如图6所示,其中,
Init:
Clip_value=nn.Parameter(torch.tensor(6.0))
初始化网络的时候添加一个可训练参数Clip_value,其是单个tensor值,并设置默认值为6.0。同时设置clipMin,clipMax的值,为浮点值,比如clipMin=0,clipMax=2.0;量化的比特位bit,比如bit=8.
Forward:
Clip_value=torch.clamp(clipMin,clipMax,Clip_value)
X=torch.clamp(X,0,Clip_value.item())
X=X/Clip_value
N_levels=2^bit-1
X_Q=torch.round(X*N_levels)/N_levels
在运算的时候,步骤如下:
(1)先将Clip_value值截断至clipMin-clipMax之间,保证Clip_value不至于太大或太小;
(2)将计算完卷积(+BN+激活)之后的值X截断至0-Clip_value之间;
(3)进一步归一化X;
(4)计算量化值范围,N_levels=2^bit-1,比如bit=8,该值就是255;
(5)X_Q=round(X*N_levels)量化X的值;
(6)最后又除上N_levels,相当于做了一个反量化,方便后面的运算。其中,Clip_value是激活值的最大范围,对这个最大范围又加了一个限制,clipMin和clipMax,在这个范围之内进行Clip_value的学习,以使模型达到一个相对较高的精度,关于clipMin和clipMax的值,目前用到的经验值:
或者,
本文试验选取的是Resnet/MobilenetV2+cifar100分类试验,具体结果展示如下表:
32bit | 8bit | 4bit | 4bit-1.0 | 4bit-2.0 | |
Resnet50 | 71.21% | 70.89% | 63.41% | 68.16% | 70.92% |
MobilenetV2 | 71.12% | 70.67% | 68.63% | 69.52% | 70.55% |
其中,4bit表示未加入有范围的可学习范围的方法,4bit-1.0代表上述组合设置(1),即其他clipMin=1.0,4bit-2.0代表上述组合设置(2),即其他clipMin=2.0。
进一步地,在后面的试验中发现本文所述方法在有些网络及特殊的训练任务上采用默认的(经验)范围值并不能达到一个预期的精度,有的在8bit精度就会有一点偏差,这个时候,需要先用一个batch的训练数据分析一下已经收敛的浮点模型的Feature分布,之后根据每一层的feature的分布情况来设置这个clipMin和clipMax,试验证明确实有效。
根据全精度模型的分布情况,在一个有效的范围内学习每一层的激活值,得到一个分布更合理的feature,从而降低量化模型带来的精度损失,试验证明,该方法对就很多网络在4bit情况下仍然能保证和原浮点模型相当的精度。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种有效地提升低比特模型精度的量化方法,其特征在于,所述方法是在现有的量化方法的基础上将激活值变成一个可学习的参数Clip_value并进行运算,所述方法中使用在PyTorch中的二维卷积调用torch.nn.Conv2d:Clip_value=nn.Parameter(torch.tensor(6.0))即初始化网络的时候添加一个可训练参数Clip_value,其是单个tensor值,并设置默认值为6.0,并在此基础上加入了范围限制,以使该激活值往期望的方向收敛;根据全精度模型的分布情况,在一个有效的范围内学习每一层的激活值,得到一个分布更合理的特征feature,从而降低量化模型带来的精度损失以提升量化后模型的精度。
2.根据权利要求1所述的一种有效地提升低比特模型精度的量化方法,其特征在于,所述方法进一步包括:
S1,输入特征input feature;
S2,卷积/全连接:
S2.1,一方面,判断是否量化,如果量化,则量化权重weight;如果不量化,按原始的float数据进行计算;
S2.2,另一方面,判断是否有偏移bias?如果有,则进行偏移加biasadd,再进一步进行S3;如果没有,则直接进行S3;
S3,判断是否有批量标准化BN?如果有,则进行批量标准化BatchNorm,再进一步进行S4;如果没有,则直接进行S4;
S4,进一步判断是否量化?
如果量化,则判断是否最后一层?如果否,则量化激活Feature,再进一步进行S5;如果是,则直接进行S5;
如果不量化,则判断activation_fn==None是否成立,即判断激活是否为空,也就是带不带激活函数?如果成立,则进行Relu/Relu6函数,再进一步进行S5;如果不成立,则直接进行S5;
S5,输出特征output feature。
3.根据权利要求2所述的一种有效地提升低比特模型精度的量化方法,其特征在于,所述步骤S2中:
所述卷积:输入矩阵与卷积核进行对应元素相乘并求和,其中卷积核也是一种矩阵,所以一次卷积的结果的输出是一个数,最后对整个输入输入矩阵进行遍历,最终得到一个结果矩阵;所述方法针对卷积操作的对象和使用场景用到的是PyTorch中的二维卷积,使用方法是从torch.nn模块中调用,其调用的是torch.nn.Conv2d;
所述全连接:指一个由多个神经元所组成的层,其所有的输出和该层的所有输入都有连接,即每个输入都会影响所有神经元的输出;所述方法在PyTorch中的nn.Linear()表示线性变换,全连接层被看作是nn.Linear()表示线性变层再加上一个激活函数层所构成的结构。
4.根据权利要求3所述的一种有效地提升低比特模型精度的量化方法,其特征在于,所述步骤S3中:
所述BN:即BatchNorm就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布;计算过程如下:
第一步计算输入的均值;
第二步计算输入的方差;
第三步根据前面的均值和方差进行归一化;
第四步乘上训练的scale再加上shifit。
5.根据权利要求4所述的一种有效地提升低比特模型精度的量化方法,其特征在于,所述量化方法是将网络输出的范围在0.0~1.0之间的张量调整成数值为0~255、uint8类型的图片数据,这个过程就是量化;
所述现有的量化方法包括:
(1)用r表示浮点实数,q表示量化后的定点整数浮点和整型之间的换算公式为:
r=S(q-Z)
其中,S是scale,表示实数和整数之间的比例关系,z是zero point,表示实数中的0经过量化后对应的整数,它们的计算方法为:
rmax、rmin分别是的最大值和最小值,qmin、qmin同理;
(2)基于范围的线性量化即对输出的量化:
r=torch.clamp(0,6.0,r)将x截断至0-6
r=r/6.0归一化
N=2bit-1,其中bit是要量化的比特位,设为8,那么量化范围值N就是0-255无符号类型,相当于上式中的S=1/N
q=round(r*N)这样就算出来的q值就是输入量化后的值。
6.根据权利要求5所述的一种有效地提升低比特模型精度的量化方法,其特征在于,所述变成一个可学习的参数,进一步包括:
torch.nn.Parameter是继承自torch.Tensor的子类,其作用是作为nn.Module中的可训练参数使用;它与torch.Tensor的区别就是nn.Parameter会自动被认为是module的可训练参数,即加入到parameter()这个迭代器中去;而module中非nn.Parameter()的普通tensor是不在parameter中的;所以在torch中如果要把一个tensor转换为可训练参数,只要定义其为nn.Parameter()即可。
7.根据权利要求6所述的一种有效地提升低比特模型精度的量化方法,其特征在于,所述方法进一步包括:
初始化网络的时候添加一个可训练参数Clip_value,其是单个tensor值,并设置默认值为6.0,同时设置clipMin,clipMax的值,为浮点值,设clipMin=0,clipMax=2.0;量化的比特位bit,设bit=8:表示为:
Init:
Clip_value=nn.Parameter(torch.tensor(6.0))
其中,Clip_value是激活值的最大范围,对这个最大范围又加了一个限制,clipMin和clipMax,在这个范围之内进行Clip_value的学习,以使模型达到一个相对较高的精度;
在所述运算的时候,进一步包括以下步骤:
(1)先将Clip_value值截断至clipMin-clipMax之间,保证Clip_value不至于太大或太小;
(2)将计算完卷积、BN、激活之后的值X截断至0-Clip_value之间;
(3)进一步归一化X;
(4)计算量化值范围,N_levels=2bit-1,设bit=8,该值就是255;
(5)X_Q=round(X*N_levels)量化X的值;
最后又除上N_levels,相当于做了一个反量化,方便后面的运算;
表示为:
Forward:是表示一个前向传播,构建网络层的先后运算步骤:
Clip_value=torch.clamp(clipMin,clipMax,Clip_value)
X=torch.clamp(X,0,Clip_value.item())
X=X/Clip_value
N_levels=2^bit-1
X_Q=torch.round(X*N_levels)/N_levels。
8.根据权利要求7所述的一种有效地提升低比特模型精度的量化方法,其特征在于,所述clipMin和clipMax的值,用到的经验值:
或者,
9.根据权利要求8所述的一种有效地提升低比特模型精度的量化方法,其特征在于,所述方法如果在8bit精度发生偏差,则需要先用一个batch的训练数据分析一下已经收敛的浮点模型的Feature分布,之后根据每一层的feature的分布情况来设置这个clipMin和clipMax。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210926524.8A CN117574977A (zh) | 2022-08-03 | 2022-08-03 | 一种有效地提升低比特模型精度的量化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210926524.8A CN117574977A (zh) | 2022-08-03 | 2022-08-03 | 一种有效地提升低比特模型精度的量化方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117574977A true CN117574977A (zh) | 2024-02-20 |
Family
ID=89883105
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210926524.8A Pending CN117574977A (zh) | 2022-08-03 | 2022-08-03 | 一种有效地提升低比特模型精度的量化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117574977A (zh) |
-
2022
- 2022-08-03 CN CN202210926524.8A patent/CN117574977A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109754066B (zh) | 用于生成定点型神经网络的方法和装置 | |
US20220004884A1 (en) | Convolutional Neural Network Computing Acceleration Method and Apparatus, Device, and Medium | |
CN111695671B (zh) | 训练神经网络的方法及装置、电子设备 | |
US20220091821A1 (en) | Adaptive quantization method and apparatus, device and medium | |
US11604987B2 (en) | Analytic and empirical correction of biased error introduced by approximation methods | |
US11704556B2 (en) | Optimization methods for quantization of neural network models | |
KR20200111948A (ko) | 인공 신경망을 처리하는 방법 및 이를 위한 전자 장치 | |
CN112001294A (zh) | 一种基于yolact++的车身表面损伤检测及掩膜生成方法和存储设备 | |
CN114677548B (zh) | 基于阻变存储器的神经网络图像分类系统及方法 | |
CN111950715A (zh) | 基于自适应动态移位的8位整型全量化推理方法及装置 | |
KR20190130443A (ko) | 뉴럴 네트워크의 양자화 방법 및 장치 | |
Pedersoli et al. | Espresso: Efficient forward propagation for BCNNs | |
CN117574977A (zh) | 一种有效地提升低比特模型精度的量化方法 | |
Christ et al. | Low-precision logarithmic arithmetic for neural network accelerators | |
CN112215347A (zh) | 用于确定神经网络的成对连续层之间的传递函数的方法和计算工具 | |
Chin et al. | A high-performance adaptive quantization approach for edge CNN applications | |
US20230401420A1 (en) | Compiling asymmetrically-quantized neural network models for deep learning acceleration | |
CN111061455A (zh) | 一种三角函数cordic迭代运算协处理器 | |
US20220300784A1 (en) | Computer-readable recording medium having stored therein machine-learning program, method for machine learning, and calculating machine | |
CN115564987A (zh) | 一种基于元学习的图像分类模型的训练方法及应用 | |
CN117348837A (zh) | 浮点精度模型的量化方法、装置、电子设备以及存储介质 | |
WO2021248544A1 (en) | Low resource computational block for trained neural network | |
CN114444688A (zh) | 神经网络的量化方法、装置、设备、存储介质及程序产品 | |
CN114222997A (zh) | 用于对神经网络进行后训练量化的方法和装置 | |
Naganuma et al. | Accelerating convolutional neural networks using low precision arithmetic |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |