大家好,这是专栏《AI不惑境》的第十篇文章,讲述模型量化相关的内容。

进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考。如果说学习是一个从模仿,到追随,到创造的过程,那么到这个阶段,应该跃过了模仿和追随的阶段,进入了创造的阶段。从这个境界开始,讲述的问题可能不再有答案,更多的是激发大家一起来思考。

作者&编辑 | 言有三

模型量化是非常实用的模型压缩技术,当前已经在工业界发展比较成熟,本文给大家梳理模型量化的核心技术,发展现状,未来展望以及学习资源推荐。

1 模型量化基础

1.1 什么是模型量化

我们知道为了保证较高的精度,大部分的科学运算都是采用浮点型进行计算,常见的是32位浮点型和64位浮点型,即float32和double64。

对于深度学习模型来说,乘加计算量是非常大的,往往需要GPU等专用的计算平台才能实现实时运算,这对于端上产品来说是不可接受的,而模型量化是一个有效降低计算量的方法。

量化,即将网络的权值,激活值等从高精度转化成低精度的操作过程,例如将32位浮点数转化成8位整型数int8,同时我们期望转换后的模型准确率与转化前相近。

1.2 模型量化的优势

模型量化可以带来几方面的优势,如下。

(1) 更小的模型尺寸。以8bit量化为例,与32bit浮点数相比,我们可以将模型的体积降低为原来的四分之一,这对于模型的存储和更新来说都更有优势。

(2) 更低的功耗。移动8bit数据与移动32bit浮点型数据相比,前者比后者高4倍的效率,而在一定程度上内存的使用量与功耗是成正比的。

(3) 更快的计算速度。相对于浮点数,大多数处理器都支持8bit数据的更快处理,如果是二值量化,则更有优势。

上图展示的是一个二值权重和激活值矩阵的运算,卷积过程中的乘加都可以转换为异或操作,并行程度更高,运算速度因此也更快。

因此,在工业界对模型量化有着非常强烈的需求,接下来我们讲解其中的主要算法。

2 模型量化算法

量化的技术根据不同的量化原理和位宽可以分为许多种。根据量化原理来说,可以分为直接经验量化算法,基于重建的方法,基于梯度和损失优化的算法等。根据位宽常见的有1bit量化,8bit量化,以及任意bit数量化。

由于我们在实际应用的时候更关注量化本身带来的对模型体积的减小和加速效果,因此我们根据位宽的不同来分别介绍常见的代表性模型量化技术。

2.1 二值量化(1bit量化)

二值量化是最高效率的量化方式,也可以称之为1bit量化,即将32位浮点数量化为1bit整型,非常适合FPGA等平台进行并行运算。二值量化模型以Binary Connect和Binarized Neural Networks为代表。

BinaryConnect[1]是首先做二值化研究的论文,它们对权重进行了二值化。将权重和每层的激活值全部二值化的方法有两种方法。第一种就是符号函数,即x>0,则f(x)=1,x<0,则f(x)=-1。另一种是以一定的概率赋值,类似于Dropout技术。

BinaryConnect在前向传播权重量化的时候,使用了随机的二值化方法,如下:

需要注意的是,为了保持精度,权重在前向传播和反向传播计算的时候进行二值化,但是在进行参数更新的时候使用浮点类型。随机的二值化策略能够起到提高模型泛化能力的作用,这与Dropout,Dropconnect等技术是类似的。

在BinaryConnect的基础上,Binarized Neural Networks[2]随后被提出,它对权重和激活值都进行了二值化,并且同时采用了符号函数和随机量化两种策略。对于激活函数,采用了随机量化方法,而其余的都采用符号函数。

针对符号函数的导数并不连续,无法进行梯度传播的问题,该网络方法将符号函数进行松弛,在-1到1之间采用了线性函数:f(x)=max(-1,min(1,x))。

下图展示的就是一个二值化的权重。

当然了,二值量化还有非常多的技术,包括XNorNet[3]等基于重建的模型,优化目标敏感的二值化模型,基于阈值的二值化改进,激活值正则化等,篇幅有限不再详述,读者可以阅读综述文章[4]进行学习。

2.2 8bit量化

8bit量化是当前工业界最常见的量化方法,也是当前精度保持最高的量化类型。Tensorflow,TensorRT等框架都提供了支持,并且各自代表着非对称量化和对称量化的方案,以Nvidia的8bit对称量化方案为例:

TensorRT[5]通过最小化原始数据分布和量化后数据分布之间的KL散度来对激活值进行量化,将FP32降为INT8的操作如下:

FP32(T) = scale_factor(s) * 8-bit(t) +FP32_bias(b)

实验证明偏置实际上是不需要的,去掉偏置后就是T=s∗t。其中s就是比例因子(scaling factor),因此现在的问题就是如何确定比例因子,一个简单的示意图如下:

上图直接将一个tensor中的-|max|和|max|的FP32值线性映射为-127和127,这样的映射是对称的,并且是不饱和的,实验结果显示这样做会导致比较大的精度损失。主要的原因是max值可能会存在一些离散点噪声,如果直接进行线性缩放,可能就放大了这些噪声,TensorRT的改进做法是从127和|max|之间选择好一个阈值T,把大于这个阈值T的部分截断,示意图如下:

只要阈值选取得当,就能将不稳定的大激活值舍弃掉,并且使精度损失不至于降低太多。原始的数据是一个FP32的分布,现在我们要用INT8的分布来表达这个tensor,根据阈值|T|的取值不同有多种选择,只需要选择其中最接近FP32的即可,所以现在的问题是确定|T|。

我们需要一个衡量指标来衡量不同的INT8分布与原来的FP32分布之间的差异程度,这就是相对熵,或者称为KL散度,它是衡量两个分布相似度的经典算法,定义如下:

KL_divergence(P,Q):= SUM(P[i]*log(P[i]/Q[i]),i)

P,Q分别称为参考分布(reference_distribution)、量化分布(quantize_distribution)。在应用的时候,每一层的|T|值都不同,确定每一层的|T|值的过程被称为校准(Calibration)。

所以完整的流程如下:

(1) 首先将FP32的模型在一个数据集(Calibration Dataset)上跑一遍记录下每一层的FP32激活值,这里没必要去跑整个训练集,比较现实的做法是从验证集中选取一个子集,当然它最好有代表性,多样性好。之后对网络的每一层收集激活值,得到直方图,bins的大小官方建议为2048,所以阈值就在128和2047之间。

(2) 对于128和2047之间的不同阈值|T|进行遍历,选取使得KL散度取得最小值的|T|。对每一层计算出|T|,得到一个所谓的CalibrationTable。把0-T组的数值线性映射到0-128之间,超出T的直接映射到128。

具体的代码实现可以看源代码,下表展示的是一些实验结果,证明分类任务上精度损失并不大。

当前8bit的量化还有以Google提出的非对称量化方法[6],篇幅有限不再赘述。

2.3 任意bit量化

除了2bit和8bit两类最常见的量化方法,3bit,4bit,6bit等也经常被研究,以韩松等人提出的Deep Compression[7]为例,Deep Compression综合应用了剪枝、量化、编码三个步骤来进行模型压缩,是2016 ICLR最佳论文。

整个框架如上所示,包括三个步骤:

(1) 网络剪枝

即移除不重要的连接,包括3个步骤,分别是普通网络训练,删除权重小于一定阈值的连接得到稀疏网络,对稀疏网络再训练,这是一个反复迭代的过程。

(2) 权重量化

如下图,这是一个4×4的权值矩阵,量化权重为4阶,即2bit,分别对应浮点数-1.0,0,1.5,2.0。

对weights矩阵采用cluster index进行存储后,原来需要16个32bit float,现在只需要4个32bit float,与16个2bit uint,参数量为原来的(16×2+4×32)/(16×32)=0.31。

这就完成了存储,那如何对量化值进行更新呢?事实上,文中仅对码字进行更新,也就是量化后的2bit的权重。

将索引相同的地方梯度求和乘以学习率,叠加到码字,这就是不断求取weights矩阵的聚类中心。原来有成千上万个不同浮点数的weights矩阵,经过一个有效的聚类后,每一个值都用其聚类中心进行替代,作者的研究表明这样并不会降低网络的效果。而聚类的迭代过程,通过BP的反向传播完成。

(3) 霍夫曼编码

霍夫曼编码是一种成熟的编码技巧,与CNN无关,它有效地利用了权重的有偏分布,可以进一步减少需要存储的参数体积。

3 模型量化算法的展望

在第二部分,我们简单对2bit,8bit,任意bit量化方法介绍了代表性的框架,但是其实量化本身还有非常多的研究方向,下面列举其中比较具有代表性的。

3.1 混合精度量化

所谓混合精度量化,它可以指不同的网络层有不同的量化位阶,或者权重,激活以及输出采用不同的量化方案,当下可以利用AutoML技术来实现,以HAQ[78]框架为例。

3.2 量化训练框架

目前前向传播中权重和激活的量化比较成熟,但是训练中大部分的计算在反向传播步骤,如果能够将量化技术应用在反向传播中,则可以加速卷积的反向梯度传播过程,不过这需要对梯度也进行量化操作,而梯度的分布比较复杂,容易带来误差造成训练过程的不稳定。如何让量化模型的训练更加稳定,这是非常值得研究的方向[9]。

3.3 非均匀量化方案

通常来说量化函数是一个分段的常数函数,不同的量化等级之间的距离是相等的,即均匀量化,然而数据的分布往往不是均匀的,所以均匀量化不是最合理的方案,因此有一些研究针对量化函数本身进行学习[10]。

除此之外,还有基于重建与损失敏感的量化方法,量化正则化方法,量化网络结构的设计,量化的具体硬件实现等内容。

我们不再一一介绍,对模型量化感兴趣的同学,欢迎到有三AI知识星球的网络结构1000变-模型压缩-模型量化板块进行学习,数十期内容定能满足你的求知欲。

扫码即可加入,了解有三AI知识星球详情请阅读以下文章。

【杂谈】有三AI知识星球一周年了!为什么公众号+星球才是完整的?

参考文献

[1] Courbariaux M, Bengio Y, David J, et al. BinaryConnect: training deep neural networks with binary weights during propagations[C]. neural information processing systems, 2015: 3123-3131.

[2] Courbariaux M, Hubara I, Soudry D, et al. Binarized neural networks: Training deep neural networks with weights and activations constrained to+ 1 or-1[J]. arXiv preprint arXiv:1602.02830, 2016.

[3] Rastegari M , Ordonez V , Redmon J , et al. XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks[J]. 2016.

[4] Qin H, Gong R, Liu X, et al. Binary neural networks: A survey[J]. Pattern Recognition, 2020.

[5] 8-bit-inference-with-tensorrt

[6] Jacob B, Kligys S, Chen B, et al. Quantization and training of neural networks for efficient integer-arithmetic-only inference[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 2704-2713.

[7] Han S, Mao H, Dally W J. Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding[J]. arXiv preprint arXiv:1510.00149, 2015.

[8] Wang K, Liu Z, Lin Y, et al. HAQ: Hardware-Aware Automated Quantization with Mixed Precision[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 8612-8620.

[9] Zhu F, Gong R, Yu F, et al. Towards Unified INT8 Training for Convolutional Neural Network.[J]. arXiv: Learning, 2019.

[10] Zhang D, Yang J, Ye D, et al. LQ-Nets: Learned Quantization for Highly Accurate and Compact Deep Neural Networks[C]. european conference on computer vision, 2018: 373-390.

总结

本次我们总结了模型量化的核心技术,并对其重要方向进行了展望,推荐了相关的学习资源,下一期我们将介绍知识蒸馏与迁移学习相关内容。

有三AI秋季划-模型优化组

如果你想系统性地学习模型优化相关的理论和实践,并获得持续的指导,欢迎加入有三AI秋季划-模型优化组,系统性地学习数据使用,模型使用和调参,模型性能分析,紧凑模型设计,模型剪枝,模型量化,模型部署,NAS等内容。

模型优化组介绍和往期的一些学习内容总结请参考阅读以下文章:

有三AI秋季划出炉,模型优化,人脸算法,图像质量等24个项目等你来拿

【总结】有三AI秋季划模型优化组3月直播讲了哪些内容,为什么每一个从事深度学习的同学都应该掌握模型优化的内容

转载文章请后台联系

侵权必究

往期精选

  • 【完结】深度学习CV算法工程师从入门到初级面试有多远,大概是25篇文章的距离

  • 【完结】优秀的深度学习从业者都有哪些优秀的习惯

  • 【完结】给新手的12大深度学习开源框架快速入门项目

  • 【完结】总结12大CNN主流模型架构设计思想

  • 【知乎直播】千奇百怪的CNN网络架构等你来

  • 【AI不惑境】数据压榨有多狠,人工智能就有多成功

  • 【AI不惑境】网络深度对深度学习模型性能有什么影响?

  • 【AI不惑境】网络的宽度如何影响深度学习模型的性能?

  • 【AI不惑境】学习率和batchsize如何影响模型的性能?

  • 【AI不惑境】残差网络的前世今生与原理

  • 【AI不惑境】移动端高效网络,卷积拆分和分组的精髓

  • 【AI不惑境】深度学习中的多尺度模型设计

  • 【AI不惑境】计算机视觉中注意力机制原理及其模型发展和应用

  • 【AI不惑境】模型剪枝技术原理及其发展现状和展望

【AI不惑境】模型量化技术原理及其发展现状和展望相关推荐

  1. 【AI不惑境】模型剪枝技术原理及其发展现状和展望

    大家好,这是专栏<AI不惑境>的第九篇文章,讲述模型剪枝相关的内容. 进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考.如果说学习是一个从模仿,到追随,到创造的过程,那么 ...

  2. 【AI不惑境】模型压缩中知识蒸馏技术原理及其发展现状和展望

    大家好,这是专栏<AI不惑境>的第十一篇文章,讲述知识蒸馏相关的内容. 进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考.如果说学习是一个从模仿,到追随,到创造的过程,那 ...

  3. 无线充电的技术原理和发展现状

    虽然"隔空充电"听起来非常"黑科技",但它其实就是无线充电的一种. 2009年,首款无线充电手机上市:2011年,脱离5V1A有线慢速充电的手机也开始出现. 随 ...

  4. 【AI不惑境】AutoML在深度学习模型设计和优化中有哪些用处?

    大家好,这是专栏<AI不惑境>的第十二篇文章,讲述AutoML在深度学习模型设计和优化相关的内容. 进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考.如果说学习是一个从模 ...

  5. 【AI不惑境】计算机视觉中注意力机制原理及其模型发展和应用

    大家好,这是专栏<AI不惑境>的第七篇文章,讲述计算机视觉中的注意力(attention)机制. 进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考.如果说学习是一个从模仿 ...

  6. 「AI不惑境」残差网络的前世今生与原理

    https://www.toutiao.com/a6713515733143257611/ 大家好,这是专栏<AI不惑境>的第五篇文章,讲述残差网络的来龙去脉和背后的原理. 进入到不惑境界 ...

  7. 「AI不惑境」学习率和batchsize如何影响模型的性能?

    https://www.toutiao.com/a6712708989177561611/ 大家好,这是专栏<AI不惑境>的第四篇文章,讲述学习率以及batchsize与模型性能的关系. ...

  8. 「AI不惑境」网络深度对深度学习模型性能有什么影响?

    https://www.toutiao.com/a6703349467061420557/ 大家好,这是专栏<AI不惑境>的第二篇文章,讲述模型深度与模型性能的关系. 进入到不惑境界,就是 ...

  9. 【AI不惑境】残差网络的前世今生与原理

    大家好,这是专栏<AI不惑境>的第五篇文章,讲述残差网络的来龙去脉和背后的原理. 进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考.如果说学习是一个从模仿,到追随,到创造 ...

最新文章

  1. 如何使用敏捷工具Leangoo脑图做Epic/ Theme /Story 管理
  2. 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )
  3. C++读取txt中数据的两种方法
  4. OSI七层模型、数据封装与解封装过程、TCP三次握手、四次挥手
  5. 国贸专业要考计算机二级,国贸专业考计算机二级有没有必要
  6. B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树
  7. 如何在Android中获取当前时间和日期
  8. js如何准确获取当前页面url网址信息
  9. 计算机中级培训感言,计算机中级培训培训感言
  10. 后基因组行为遗传学:从革命到常规(上)
  11. 服务器开发系列(四)——网络基础
  12. Java 学生管理系统--------13
  13. git 使用过程遇到的问题
  14. python手机端给电脑端发送数据_神途传奇 (手机端+电脑端) 数据互通 传奇来袭 www.8wf.com...
  15. java学习笔记20(Lambda表达式、函数式编程、流式计算、练习)
  16. 钢筋计数VOC数据集
  17. 瞎谈干净架构(clean architecture)
  18. MaxENT完整操作
  19. 2026年中国软件定义存储市场容量将接近45.1亿美元
  20. 我找到的一些google搜索技巧

热门文章

  1. “面试不败计划”:垃圾垃圾回收
  2. java.lang.IllegalArgumentException at org.springframework.asm.ClassReader.init(Unknown Source)
  3. 2021-10-16 集合(set)与映射(map) 恋上数据结构笔记
  4. 进腾讯了!(实习面经分享)
  5. HttpServlet类简介和简单用法
  6. 给solr配置中文分词器
  7. 高斯拟合原理_AlexNet原理和实现
  8. metaweblog php,[PHP]利用MetaWeblog API实现XMLRPC功能
  9. 10的预览模式_谷歌相机2020年3月更新汇总,适配米10等五摄手机,30s手动曝光
  10. c语言指针的自我评价,个人自我评价