闲话模型压缩之量化(Quantization )篇
1. 前⾔
这些年来,深度学习在众多领域亮眼的表现使其成为了如今机器学习的主流⽅向,但其巨⼤的计算量仍为⼈诟病。尤其是近⼏年,随着端设备算⼒增强,业界涌现出越来越多基于深度神经⽹络的智能应⽤。为了弥补算⼒需求与供给的鸿沟,近⼏年来模型压缩成为了业界的热点之⼀。模型压缩⼜可细分为多个⼦⽅向。之前在中有过⼀些简单的论述,同时在中更加具体地整理了些关于⽹络剪枝(network pruning)的东西,本⽂就再将⽬光放到另⼀类⽅法上-量化(Quantization)。模型量化可以带来多⽅⾯的好处:
计算效率提升:很多处理器整数计算指令都要⽐相应的浮点计算⾼效。以CPU为例,浮点运算指令的latency平均会长于对应的整数运算指令,早期的CPU尤其如此。对于FPGA来说,浮点运算就更⿇烦了。⽽且乘法的复杂度通常与操作数bit-width的平⽅成正⽐,因此将表⽰精度降低可以有效降低复杂度。
内存和存储占⽤减少:量化对模型的『瘦⾝』效果可谓⽴杆见影,它所带来的好处是两⽅⾯的:其⼀,减少memory footprint。我们知道很多时候推理性能的瓶颈不在于计算⽽在于访存,在这种情况下提⾼计算密度会对耗时有显著的优化效果;其⼆,节省存储空间,减少应⽤的size,同时便于软件的升级更新。
减少能耗:我们知道功耗主要来⾃计算和访存两部分。⼀⽅⾯ ,以乘加运算为例,8位整型与32浮点相⽐
能耗可有数量级的差异。另⼀⽅⾯,访存是耗电⼤户。假设原本只能放在DRAM中的模型经过量化能放⼊SRAM,那不仅提升性能,⽽且减少了能耗,简直完美。
正如其它模型压缩⽅法⼀样,对模型的量化基于⼀个共识。那就是复杂的、⾼精度表⽰的模型在训练时是必要的,因为我们需要在优化时捕捉微⼩的梯度变化,然⽽在推理时并没有必要。也就是说,⽹络中存在很多不重要的参数,或者并不需要太细的精度来表⽰它们。另外,实验证明神经⽹络对噪声鲁棒,⽽量化其实也可看作是噪声。这就意味着我们在部署模型前可以将之化简,⽽表⽰精度降低就是化简的重要⼿段之⼀。我们知道,⼤多深度学习训练框架默认下模型的参数是32位浮点的,计算也是32位浮点的。模型量化的基本思想就是⽤更低精度(如8位整型)来代替原浮点精度。听起来似乎⾮常的简单,但是细看之下会发现这个坑⽐想象中⼤得多。从相关的⽂献可以看到各⼤巨头公司都或多或少地参于其中,似乎成为了兵家必争之地。量化最核⼼的挑战是如何在减少表⽰精度的同时不让模型的准确度掉下来,即在压缩率与准确率损失间作trade-off。这就衍⽣出很多有趣的⼦问题,⽐如量化对象是什么(weight,activation,gradient),量化到⼏位(8位,4位,2位,1位),量化参数(如step size,clipping value)如何选择,量化参数是否可以⾃动优化,不同层是否需要不同的量化参数,如何在量化后恢复准确率或者在训练时考虑量化,等等。。。
2. 原理与分类
这⾥先⾮常简单列⼀下基本原理。 由于相关的介绍与⽂献⾮常多,这⾥不细展开,主要为了统⼀下术语。对于典型的浮点到整型的量化,其本质上是将实数域中的某⼀段映射到整数。如果使⽤的是线性量化,其⼀般形式可表⽰为:
其中的和分别为量化前和后的数,称为scaling factor,称为zero point。这个zero point即是原值域中的0在量化后的值。在weight 或activation中会有不少0(⽐如padding,或者经过ReLU),因此我们在量化时需要让实数0在量化后可以被精确地表⽰。为使量化后在指定位数整数表⽰范围内(如位),这⾥scaling factor可以取:
其中和分别为量化对象(如weight或activation)的dynamic range下界与上界。那么问题来了,如果这个dynamic range很⼴,或者有些很离奇的outlier,那这样做就会便得⽐特位被浪费在那些并不密集的区域,导致信息的丢失。因此,还有种做法就是对dynamic range先做clip,把那些含信息少的区域切掉。即:
其中和分别为clip的上下界,作为量化参数clipping value。这个取值也是门艺术,⼤了浪费⽐特位,⼩了把就把太多有⽤信息“切”掉了,如何选取后⾯会再讨论。
q =round (s ∗x +z )
x q s z n max −min x x
2−1
n min x max x q =round (s ∗clip (x ,α,β)+z )
αβ
以上⽅法中由于对原值域和量化后值域都不要求关于0对称,故称为⾮对称(Asymmetric)量化。如果将上⾯的zero point设为0,则称为对称(Asymmetric)量化。可以说对称量化是⾮对称量化的特例。另外因计算机内部⽤补码表⽰,其表⽰范围不是关于0对称的。因此对于对称量化,会将整型值域最⼩值去掉,如8位有符号整型表⽰范围[-128, 127],截取后变成[-127, 127]。这样整型值域才是直正的对称,否则会产⽣偏差。相⽐⽽⾔,⾮对称量化优点是能够更充分利⽤⽐特位,因为对于对称量化⽽⾔,碰到dynamic range关于0两边严重不对称的话(⽐如经过ReLU后的activation),会⽐较低效。但这也是有代价的,即计算更加复杂。以乘法为例,对于对称量化来说,量化后乘法只是原值乘法再乘以⼀个缩放因⼦:;⽽对于⾮对称量化来说,就要复杂⼀些了:。总得来说,对称与⾮对称量化各有利弊,得看⽤在什么地⽅。如实际中weight的分布通常是关于0对称的⾼斯分布,那⽐较适⽤⽤对称量化。⽽ReLU后的activation是没有负数的,因此适⽤于⾮对称量化。另外,如果⾮对称量化中整个值域都落在正区间,那就可以⽤⽆符号整型表⽰,否则⽤有符号整型。
量化⽅法还分为均匀(Uniform)量化与⾮均匀(Non-uniform)量化。最简单就是让量化的等级间距离
相等,这类量化称为均匀量化。但直觉上这样会有更多的信息丢失,因为⼀般来说dynamic range中肯定有些区域点密集,有些稀疏。相应地,有均匀量化就有⾮均匀量化,它是指量化等级间不等长,如log quantization。再⾼级⼀点,那就是通过学习来得到更⼤⾃由度的映射(可通过查表表⽰)。直觉上,⾮均匀量化似乎能达到更⾼的准确率,但它的缺点是不利于硬件加速。对于量化对象,主要有以下三个。当然,实际中可能是量化其中的多个甚⾄全部。weight(权重):weight的量化是最常规也是最常见的。量化weight可达到减少模型⼤⼩和memory footprint等⽬的。
activation(激活函数输出):实际中activation往往是占内存使⽤的⼤头,因此量化activation不仅可以⼤⼤减少memory footprint。更重要的是,结合weight的量化可以充分利⽤整数计算获得性能提升。
gradient(梯度):相对上⾯两者略微⼩众⼀些,因为主要⽤于训练。它主要作⽤是在分布式计算中减少通信开销,单机训练时也可减少backward时的开销。对于量化位数,可以有很多种选择。⼤体可分为⼏类:
float16量化是⽐较保险的做法,⼤多数情况下可以不丢失太多精度的情况下有明显的性能提升。因为都是浮点,相对来说容易,就不细展开了。8位是⽐较常见的,也是相对成熟的。相关的研究很多,各种主流框架也基本都⽀持。
8位以下⽬前⽽⾔学界相对玩得多些,⼯业界有少量⽀持,但还没有太成熟。8位以下主要是4,2和1位
(因为位数为2的幂次性能会更好,也更容易实现)。如果精度低⾄1位,也就是⼆值化,那可以⽤位运算进⾏计算。这对处理器⽽⾔是很友好的。按量化过程中是否需要进⾏训练可分为两类:PTQ(Post-training quantization):顾名思义,就是在模型训练后做的量化。⼜可细分为两种:需要calibration数据,这些数据主要⽤来统计得到量化参数,因此是不需要打标的,⼀般百来张即可。完全不需要数据集。这适⽤于那些完全拿不到训练环境和数据的场景。
QAT(Quantization aware training):⼜可分是要从头训练还是fine-tuning。基本上到4位及以下量化由于信息丢失较多,因此很多⽅法中(也不绝对)需要训练介⼊。
⼀般来说,QAT可以得到更⾼的准确率,但同时也会有更强的假设,就是有训练数据,训练环境和所需的成本。在⼀些场景下这个假设很难满⾜。⽐如云服务上,对于给定的模型,不可能还要求提供数据和训练环境。以量化参数的共⽤范围或者说粒度来分,可分为:Per-axis/per-channel:对tensor的单个轴有单独的量化参数,如per-channel就是weight的每个channel使⽤单独的量化参数。Per-tensor/per-layer:每个tensor有单独的量化参数。对于卷积或全连接层这些的话这也就意味着每层独⽴的量化参数。
Global:即整个⽹络使⽤相同的量化参数。⼀般来说,对于8位量化,全局量化参数影响不明显,但到更低精度,就会对准确率有较⼤影响。
3. 业界⽅法
其实很早就有对神经⽹络量化的研究,如1990年Fiesler等⼈的《Weight Discretization Paradigm for Optical Neural Networks》。⽽今天,深度学习的兴起和对准确率的追求使得神经⽹络越来越重,因此这⽅⾯的需求也重新成为了热点。
s x ∗x s y =y s s xy x y (s x +x z )∗x (s y +y z )=y s s xy +x y s xz +x y s yz +y x z z x y
3.1 基于压缩的⽅法
量化最简单粗暴的做法的是rounding。2015年IBM的论⽂《Deep Learning with Limited Numerical Precision》中描述了两种将浮点转为定点的rounding⽅法:⼀种是Round-to-nearest,即就近取整;另⼀种是Stochastic rounding,即以⼀定概率(与向下取整点的距离成正⽐)确定向上还是向下取整。与前者相⽐,它是⼀种⽆偏的估计。
另外⼀个直观的思路就是将之看作⼀个数据压缩问题。2016年Stanford、清华和NVIDIA的经典论⽂《Deep Compression:
Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》中的量化部分就是采⽤了先将weight进⾏聚类,⽣成codebook,再通过weight sharing达到对weight压缩的⽬
的。数据压缩中VQ(Vector quantization)是⼀类常见的⽅法,它在最近邻搜索问题中应⽤得⽐较多,其基本思想是将D维空间的数映射到codebook(包含codeword的集合)中的
codeword。这种映射就称为quantizer。像K-means,product quantization都属于此类⽅法。K-means任何⼀本机器学习教材都会详细说,不多说。PQ(Product quantization)主要针对空间⾮常⼤以⾄codeword指数增加的情况,它将原向量空间分为M个低维⼦空间(将D维空间向量看作M个D/M维⼦向量的联接),并且将每个⼦空间进⾏量化,最后将这些codeword进⾏联接。感觉VQ/PQ的路⼦Facebook是⽐较喜欢的,似乎在这个⽅向上⼀直有研究。从2014年的论⽂《Compressing Deep Convolutional Networks using Vector Quantization》将之引⼊神经⽹络的weight量化到2019年的《And the Bit Goes Down: Revisiting the Quantization of Neural Networks》通过最⼩化activation的reconstruction error提升PQ效果,再到2020发表的论⽂《Training with Quantization Noise for Extreme Model Compression》提出在每次迭代中只随机选取⼀部分weight做量化,从⽽减少STE带来的梯度估计偏差影响。另外,2015年华盛顿⼤学与NVIDIA的论⽂《Compressing Neural Networks with the Hashing Trick》中提出HashedNets⽤于神经⽹络中weight间的随机共享。为了降低内存使⽤,它使⽤hash来建⽴共享的映射关系。
3.2 如何确定量化参数
前⾯的讨论还遗留下来⼀个灵魂拷问,即量化会带来精度损失,那怎么选取量化时所⽤参数(如scaling factor,zero point,clipping value)可以尽可能地减少对准确率的影响呢。量化误差来⾃两⽅⾯,⼀个是clip操作带来的,⼀个是round操作带来的。⽽这两者间是有trade-off关系的。总得来说,选取合适的量化参数是⾮常考究的问题,事实上⼤多数业界的研究正是为了解决这个问题。业界主要有如下⼏类⽅法,其实和之前network pruning中介绍的⼏类⽅法的精神是类似的。
3.2.1 基于统计近似的⽅法
对于均匀量化中的量化参数clipping value,除了⼿⼯设定之外,⼀个简单的做法就是统计下要量化的对象,取最⼤值和最⼩值。但这样的问题在于如果有outlier,就会使得clipping value的绝对值很⼤,从⽽影响要量化区间的精度。2016年Stanford的论⽂《Convolutional Neural Networks using Logarithmic Data Representation》提出了⼀种⾮均匀量化⽅法,即将weight和activation在log域中进⾏表⽰,并给出了在该表⽰下将向量乘加⽤位运算实现的⽅法。它的clipping value是⼀个超参,通过少量数据tune出来的。⽂中指出相⽐线性均匀量化,这种⽅法对量化更加鲁棒。2018年Intel的论⽂《Highly Efficient 8-bit Low Precision Inference of Convolutional Neural Networks with IntelCaffe》主要讨论了Intel优化版Caffe中对于8位精度推理的⽀持。它基于经典的线性量化建模,其中的scaling
factor参数通过基于calibration数据集来统计量化对象的最⼤值来得到。2019年上海科技⼤学与商汤的论
weight可不可数
⽂《Fully Quantized Network for Object Detection》提出基于percentile的activation clamping⽅法。它从训练集中采样⼀部分作为calibration set,然后在这个集合上进⾏模型推理并记录它的activation。假设activation为⾼斯分布,通过统计得到均值和⽅差,然后基于-th和-th percentiles 来进⾏weight clipping。2020年得克萨斯⼤学和Google Brain的论⽂《Post-training Quantization with Multiple Points: Mixed
Precision without Mixed Precision》提出multi-point quantization,使⽤低位数据的多个向量的线性组合来近似,⽽传统⽅法中使⽤单个低精度数的⽅式。该⽅法通过贪⼼选择来构建multi-point quantization,然后基于与输出的误差⾃适应地决定低精度点的数量。
3.2.2 基于优化的⽅法
定义误差的测度为优化⽬标,然后利⽤优化⽅法来求解。这样问题就归结为如何定义误差。⼀种常见的是量化误差(Quantization error),设量化函数为,那⽬标就是对于输⼊数据分布,使量化误差最⼩化,可形式化为:
不少的⽅法都是基于该⽬标或类似⽬标。
γ(1−γ)Q (w )Q (x )=∗arg min p (x )(Q (x )−Q ∫x )dx
2
2017年⼤疆的论⽂《Towards Accurate Binary Convolutional Neural Network》提出ABC-Net(Accurate-Binary-
Convolutional)以量化误差为优化⽬标。它⽐较特⾊的是将weight和activation表⽰成⼀系列⼆进制基的线性组合。如weight可表⽰为,其中与同维度但元素为-1或+1。这样,优化问题就是⼀个线性回归问题。这种⽅式与类似的多bit-width量化⽅案相⽐,在计算上有优势。如在计算时能将输出限制在{-1, +1},从⽽节省硬件资源。2017年阿⾥巴巴的论⽂《Extremely Low Bit Neural Network: Squeeze the Last Bit Out with ADMM》解耦了连续空间中的参数学习和量化所要求的离散化约束,将量化模型的训练建模为MIP(Mixed integer programming)问题。通过引⼊辅助变量,使问题变成可⽤ADMM(Alternating Direction Method of
Multipliers)来解的形式。ADMM的每步迭代分为三步:连续空间下的proximal step,离散空间下的projection step和dual update。这样就将原NP-hard问题分解为多个更易解的⼦问题。2018年微软在论⽂《LQ-Nets: Learned Quantization for Highly Accurate and Compact Deep Neural Networks》中提出⾮均匀量化⽅法LQ-Nets,在训练中同时学习weight和quantizer。它可对weight和activation进⾏任意位精度的量化。为了使量化对位运算兼容,它将quantizer建模成⼀系列浮点数组成的basis vector(替换传
统的)的线性组合。训练过程中weight还是与传统⽅法⼀样训练,⽽量化参数是在forward中通过QEM(Quantization Error Minimization)算法优化求解的。QEM⽬标是最⼩化量化误差,它通过交替最⼩化编码系数与basis vector来进⾏迭代优化 。2018年Intel与以⾊列理⼯学院的论⽂《Post Training 4-bit Quantization of Convolutional Networks for Rapid-deployment》提出ACIQ⽅法,它适⽤于weight和activation,且不需要训练。以最⼩化tensor级别的量化误差为优化⽬标,并给出最优clipping value和bit-width的解析解。类似地,2019年华为的论⽂《Low-bit Quantization of Neural Networks for Efficient Inference》也基于MSE来最优的clipping value。2019年华为的另⼀论⽂《Low-bit Quantization of Neural Networks for Efficient Inference》将线性量化任务形式化为Minimum Mean Squared Error(MMSE)问题,然后⽤迭代⽅式求解。它针对weight与activation,可以量化到4位,且不需要⽹络的fine-tuning。只是在⼀些步骤中(如activation量化,scaling factor refinement)需要calibration data。2020年Samsung的论⽂《Post-Training Piecewise Linear Quantization for Deep Neural Networks》提出了⼀种post-training量化⽅法Piecewise linear quantization(PWLQ)。它主要针对具有长尾的bell-shaped分布。该⽅法将量化范围切分成不相交的区域,每个区域赋于相同的量化⽔平。最优的切分点是通过最⼩化量化误差来得到的。
之前很多基于优化⽅法的⼯作将最⼩化量化误差作为⽬标。但最⼩化量化误差是否就意味着loss最⼩呢?只能说前者是后者的⼀个思路,但并不等同。显然,后者才是我们更关注的东西。因此,也有些基
于优化的⼯作开始将loss纳⼊考虑 。2016年⾹港科技⼤学的论⽂《Loss-aware Binarization of Deep Networks》直接关于⼆值化的weight最⼩化loss,然后⽤proximal Newton算法,其中的Hessian矩阵通过Adam optimizer中的second moments进⾏近似。2018年⾹港科技⼤学的论⽂《Loss-aware Weight Quantization of Deep
Networks》⽤类似的思路拓展到三值化⽹络。2019年Intel和以⾊列理⼯学院的论⽂《Loss Aware Post-training Quantization》从量化参数对于loss的表⾯形态影响出发,指出对于⼩bit-width量化,loss函数表⾯会变得⾮常凹凸陡峭(以Gaussian curvature为测度),层间的step size相互依赖也更明显,从⽽让最优量化参数的选择变得⼗分困难。另外,有时传统基于范数的MSE未必达到最好的准确率。基于这些考虑,⽂中提出⼀个三阶段⽅法-LAPQ(Loss aware post-training quantization),它优化的⽬标为相对于step size的⽹络损失函数。⾸先,考虑单层到多种范数下最⼩化量化误差的step size。然后,基于前⼀步的结果采样,再通过插值得到⼆次函数近似并到最优解。最后,以前⼀步得到的最优解为初始值,通过gradient-free优化⽅法(Powell’s method)进⼀步得到最终最优解。
3.2.3 基于可微分的⽅法
W ≈αB ∑i =1M
i i B i W [1,2,...,2]K −1L 2L p
主要思想是使优化⽬标相对于量化参数可微,这样就可以通过SGD在训练⽹络时顺便也把量化参数给学习了。⽽且这个训练以准确率为⽬标,不会像上⾯优化⽅法中⼀样,优化⽬标与最终⽬标还存在偏差。2018年三星和KAIST的论⽂《Joint Training of Low-precision Neural Network with Quantization interval Parameters》提出QIL(Quantization interval learning)⽅法。它将weight与
activation的量化区间作为可学习参数,对于每⼀层通过两参数指定区间的中⼼与到中⼼的距离。在训练模型同时也学习量化参数。2018年IBM的论⽂《PACT: Parameterized Clipping Activation for Quantized Neural Networks》提出PACT(PArameterized Clipping acTivation)⽅法。它将ReLU替换成带clipping参数的激活函数,并且在训练中优化它来到scaling factor。PACT允许activation量化到任意bit-width。论⽂表明在⼤量的模型和数据集上,将weight和activation同时量化到4位可以维持和原始精度模型类似的准确率。2018年IBM⼜在论⽂《Bridging the Accuracy Gap for 2-bit Quantized Neural Networks》中将适⽤于activation的PACT⽅法与⽤于weight的SAWB(Statistical-aware weight binning)⽅法结合,⽤于2位的量化。SAWB基于训练时采集的统计信息以最⼩化MSE为⽬标到最优的scaling factor。2019年Sony在论⽂《Differentiable Quantization of Deep Neural Networks》中提出
DQ(Differentiable Quantization)⽅法,通过构造可微的量化器,可以通过梯度下降来学习每个weight和activation的量化参数,如step size, dynamic range,然后可以推导出bit-width。2019年IBM的论⽂《Learned Step Size Quantization》将基于学习的⽅法拓展到step size,并提出LSQ(Learned Step Si
ze Quantization)⽅法,它延续了将step size作为可训练参数(每层有单独的step
size),然后在训练过程中进⾏学习的做法。⽂中主要提出⼀种量化函数关于step size参数的梯度计算⽅法。与之前的QIL与PACT⽅法相⽐,这种梯度对于transition point敏感,符合在transition point处step size的变化会引起量化后值⼤的变化的intuition。另外提出对step size梯度进⾏缩放以保证其数值⼤⼩上与weight的梯度差不多。该⽅法在将weight和activation都量化到2,3,4位时仍能在
ImageNet这样的⼤型数据集上达到⾼准确率,尤其是3位的量化⽹络能达到全精度⽹络的准确率。2019年中科⼤、阿⾥与南加州⼤学发表的论⽂《Quantization Networks》提出⼀种可应⽤于weight与activation且适⽤于任意位量化的⽅法。它将量化函数形式化为可微分的⾮线性函数。量化函数被表⽰为⼀些sigmoid函数的线性组合,这些sigmoid函数具有可学习的参数。这样,便可以以⼀种end-to-end的⽅式来学习这些量化参数。2019年北航,商汤和北京理⼯的论⽂《Differentiable Soft Quantization: Bridging Full-Precision and Low-Bit Neural Networks》提出DSQ(Differentiable Soft Quantization)⽅法。它通过分段的tanh函数构建可微的soft quantization function,⼆值量化是其特殊形式。因为该函数相对于量化参数可微,因此可以在⽹络的训练中⼀起学习。
3.2.4 基于贝叶斯的⽅法
贝叶斯⽅法以其优雅的理论基础⼀直是机器学习中⾮常流⾏的⽅法。在模型压缩领域也不例外。2017年
阿姆斯特丹⼤学的论⽂《Bayesian Compression for Deep Learning》将weight以group为单位,并引⼊使weight稀疏的先验,再基于变分推理⽅法估计后验分布,最后基于后验分布的variance确定每层最优的bit-width。同年阿姆斯特丹⼤学另⼀篇论⽂《Soft Weight-Sharing for Neural Network
Compression》基于soft weight-sharing的思想,在re-training过程中同时做了quantization和pruning。Soft weight-sharing体现在针对weight使⽤⾼斯混合模型(GMM)作为先验,然后将variational lower bound(negative variational free energy)作为⽬标,通过gradient descent进⾏优化,同时学习weight与GMM中的参数。在后处理中,将weight设为它所在component的均值,同时通过component间KL divergence为测度,合并⼩于指定阀值的两个component。2017年俄罗斯斯科尔科沃创新中⼼等机构的论⽂《Variational Dropout Sparsifies Deep Neural Networks》将之贝叶斯理论中的变分推理⽅法⽤于⽹络模型的裁剪。它扩展
Variational Dropout并提出Sparse VD(Variational Dropout)⽅法。它将weight表⽰成参数与⾼斯噪声的乘积,使weight 变成以和为参数的⾼斯分布并对其施加log-uniform先验(它可以使weight变得稀疏),然后以SGVB(在variational lower bound上使⽤reparameterization trick得来,具体见《Auto-encoding Variational Bayes》)为优化⽬标学习参数,最后通过学习到的参数与给定阀值⽐较决定对特定weight是否要做裁剪。2018年Bosch和亚琛⼯业⼤学的论⽂《Variational Network Quantization》扩展了
Sparse VD⽅法提出VNQ(Variational Network Quantization)将变分推理⽅法引⼊量化任务。我们知道贝叶斯⽅法中先验的设计是很tricky的。本⽂针对量化引⼊了multi-modal的先验(称为quantizing prior),该先验分布在codebook中值(如[-r, 0, r])会有"spike"。然后通过最⼤化ELBO得到最优的变分参数。由于先验的影响,参数的后验会聚集在⼏个codebook中的值上,接着就可以对每个weight通过argmax得到它该量化为codebook中的那个。2019年北航和百度等机构发表的论⽂《Bayesian Optimized 1-Bit CNNs》利⽤贝叶斯学习来提升bit-width为1的CNN的表现,提出了BONNs(Bayesian optimized 1-bit CNNs)⽅法。它在loss中引⼊双峰⾼斯混合模型作为先验分布,使后验分布趋向于双峰。该模型可以通过SGD⽅法进⾏end-to-end的训练。
3.3 让模型更容易量化θN (1,α)θα