哈佛大学在读博士:模型量化——更小更快更强

内容来源:将门线上直播第179期

分享嘉宾:哈佛大学在读博士 董鑫

编辑整理:秋林津渡

文章出品:将门、DataFun

导读 本次分享嘉宾是 董鑫 老师,现在 哈佛大学就读博士二年级 ,主要研究方向是efficient machine learning,包括但不限于模型的压缩、量化,硬件和软件的协同设计。本次分享的主题为 神经网络中的模型量化问题

本次介绍会围绕下面六点展开:

  • 什么是量化和为什么需要做量化

  • 模型量化常见的问题和挑战

  • 模型量化问题的3种解决方法

  • 量化网络的进一步剪枝

  • 弥补量化网络剪枝后性能下降的问题

  • 量化网络的扩展与延伸

▌一、什么是量化和为什么需要做量化

1.1、什么是量化

先定义一下什么是量化,在IEEE standard 中,大部分的操作系统和编程语言默认使用单精度来表示数值,单精度的数值是由32位浮点数构成,所谓浮点数是其小数点的位数可以根据实际情况来确定。

在standard表达体系当中,所表达的范围和精度是非常高的,精度指2个数之间他们的差别能有多小,这个差别越小,说明他们的精度越高。在IEEE 32位单精度标准当中,数值精度大概是1.2*10^38,这样的精度已经非常高了。这是为什么在计算编程中,实际上用的是离散的数,当然计算机不能表示连续的数,由于这些离散的数精度非常高,所以不管在做优化和其他事情的时候,是直接当作连续的数来处理的。

但当把浮点数变成定点数,或者用更少的比特数来表示这个数时,情况就会发生比较大的改变,这个数的精度变低了,同时这个数从连续的数变成了离散的数。举个例子,K比特的数字,一共有2^K个不同的取值,这些取值均匀的分布在数轴上面,针对8比特的量化,一个数只有256种不同的数值,一般在量化中,希望有正有负,而且在表示一个数的时候,为了在硬件计算方便,一般用2的补码来表示,所以对于一个8比特的定点数来说,有128个负数,1个0,以及127个正数,也就是这个数在梯度下降优化的时候只能取256个数值的某一个,专业上这256个数值叫做quantization levels,就是在量化之后有多少种可能的选择。

用更少的比特数,quantization levels就越少,最极端的情况是1比特,每个数只有2个可以选择的数,一般可以认为是+1或-1。其实不一定是+1或-1,前面可以有一个乘数来调节范围,更严格的来说,应该是+A或-A,这个A是可以调节的因子。

在研究量化问题的时候,本质来讲是要搞清楚如何优化一个离散数,离散变量。优化离散变量在计算机领域一直是一个比较困难的问题,有各种各样的方法,针对量化网络也提出了一些特殊的方法。

1.2、为什么需要做量化

其实压缩或加速网络的方法有很多,比较常见的有三种:

  • 矩阵分解

比较早的一种,如上图,假如X是某一层的参数,大小是IÍJ,在做完矩阵分解后,将其分解成2个小的矩阵,T和P,T的大小是IÍR,P转置之后的大小是RÍJ,当R比较小的时候,比如I和J等于100,R等于2,那在分解之前X的大小是100*100,X有10000个值,但是在分解之后,是2个2*100的矩阵,那参数数量就变成400,这个就是矩阵分解能够带来的优化。矩阵分解更多是在memory内存上的优化,对计算加速影响是比较小的,因为在分解之后,矩阵的大小就不是一个方阵了,计算上可能会有一些问题,所以这种方法现在用的已经比较少了。

  • 网络剪枝

目前用的最多的一种方法是剪枝,因为剪枝这种方法非常的直观,如果把神经网络想象成一个树枝,可以把一些无用的树枝拿掉。比如上图剪枝后,就变成了稀疏的网络,这个稀疏网络可以用稀疏矩阵存取的方法来存取。

但网络剪枝也有一定的问题,假如做的是非结构化的剪枝,比如不是把整个channel或者整个layer都剪掉,而是把某些参数置成0,把参数矩阵变成稀疏的,这种情况下,同时又使用了cuda或普通的GPU进行编程,是很难看到性能的提升。在我的实验当中,可能性能还有一定的下降,这个性能是指计算速度和延迟。

另一种现在用的比较多的方法是做结构化的剪枝,就是把整个channel都拿掉,相当于给网络做了一个瘦身,这样的话,一般能够起到加速的效果。但是加速比并不一定是和压缩比成正比的,也就是说,即使剪掉一半的channel数,也不一定能把延迟降低到之前的1/2。压缩这种方法用的比较多,由于比较直观,简单好用。另外压缩带来的更多是内存方面的优势,所以加速的优势也是来源于内存,因为存取内存的时间变少了。

  • AutoML的方法

利用神经网络自动搜索的方法来搜索出一个比较小的网络。

  • 为什么有了这些方法,仍需要做量化?

量化不仅能在内存压缩上起到作用,还能在计算方面进行加速,因为算2个32比特的浮点数时间,肯定要比2个4比特定点数的时间多得多。

另外从本质上来讲,量化是硬件友好的。不管是通用的硬件,还是特殊的硬件,内部结构都是位操作,都是一些加法器、乘法器,那这些加法器、乘法器都是由一个一个比特构成的。量化就是在减少使用的比特数,在硬件上自然就能起到加速的效果,量化带来的加速是与生俱来的。

一个好的量化算法不仅要考虑模型的performance,模型的准确率,还要考虑模型的efficiency。模型量化后能带来的压缩比、加速比,以及在硬件中是否容易实现。比如非均匀量化,非均匀量化在硬件上特别不好实现,现在大部分量化的文章,都是在讲均匀量化。

▌二、模型量化常见的问题和挑战

在做量化过程中可能会遇到很多问题。这些问题可以分成2个部分,一个是forward前向传播部分,一个是backward反向传播部分。

2.1、在前向传播中模型量化常见的问题

forward部分,主要有3个待解决的问题,分别是:

  • 离散值带来的网络表达能力的下降

最大的也是最显而易见的问题是,在做完量化之后,一个连续的值变成了离散值,而且这个离散值可选的数值大大变少了。比如用2比特做量化,一个值最多有4种可选的数值。对于一个长度为100的向量,每个值最多有4种可选的数值时,那这个向量最多能表示4^100个方向,就可能带来网络表达能力的下降。

  • 量化范围和量化精度之间的平衡

在做量化的过程中有一个trade-of,即量化范围和量化精度之间的抉择。量化范围,是量化后最大的数减最小的数,也等于resolution乘以总共的quautization levels。,简单理解,resolution分辨率是每个小格长度,每个小格的长度越小,分辨率越高,总共有多少个小格是由量化的比特来决定的。量化范围和量化精度是成反比的,由于参数分布是比较广的,在量化范围和量化精度如何做一个抉择也是一个比较重要的问题。

  • 使用均匀量化还是非均匀量化

非均匀量化对硬件不太友好,但每个quantization levels之间的间隔不用做到一致,自由度就更高了。在实际实验中,非均匀量化达到的模型准确性比均匀量化好,所以选择均匀量化还是非均匀量化是一个值得思考的问题。

2.2、在反向传播中模型量化常见的问题

在backward中量化最大的问题是,将神经网络的参数值变成了离散值,离散值的求导非常麻烦。举一个例子,如上图公式所示,一个普通的全链接层,x是这层的输入,y是这层的输出。对于一个量化网络,首先要量化参数,用一个Q函数去量化全精度的,其中f是全精度的意思,是量化参数,x是上一层量化的输出,是这一层的输入,得到的h已经不是量化的结果,需要用P函数对h进行量化,最后得到的y是量化后的输出。

优化这个网络,就要去训练这个网络的,就要得到这个的梯度。的梯度通过如上链式方程式计算得到,的梯度由下面4项组成,第1、3项比较好计算,用线性求导就能算出。红框框出来的2项,本质是对Q,,P函数来求导的,但是对于一个量化函数来说,基本上是一个阶梯函数,阶梯函数的梯队几乎在所有位置上都等于0。那红框的这2项他们的梯度都为0,所以相乘的结果是的梯度一直为0。那也就是说w的梯度很难通过P,Q函数计算得到。梯度为0,无法优化这个网络,所以要想办法去解决这个问题。

一般的,在forward阶段,使用了Q,P函数,在backward阶段,Q,P不存在了。一个比较常见的解决办法是,红框中的梯度强行等于1。如上图右边部分,在forward阶段,我们使用阶梯函数来量化,在backward阶段,量化函数变成y=x,不做任何量化,y=x函数导数为1,契合了梯度强行为1的这个常见的做法。

这种方法叫做straight-forward estimator,STE方法,由hinton在一门课上提出来的,在实际应用中,效果还是不错的。虽然强行处理的方法可以训练和优化网络,但还是有弊端。当把loss curb损失走向曲线画出来,可以明显的观察到量化网络的loss波动是非常大的,训练非常不稳定。那这个不稳定到底是从哪来的?可以回过头来看一看,红框的部分强行赋值为1后,量化前和量化后的梯度值是一样的,量化之前和量化之后的参数也是一样的。这样的假设叫做gradientmissing match,实际只能算出量化之后的参数梯度,用这个参数梯度去更新量化前的参数梯度,这就有不匹配的问题。另外,在使用这个STE过程中,不管是理论还是实验的表明不能简简单单的把红框的梯度赋值为1,还需要做一个clip,当参数或activation特别大的时候,相应的梯度是0,否则网络收敛性就大打折扣,这是使用STE时需要处理的细节。

▌三、模型量化问题的3种解决方法

如何解决在量化中出现的问题,目前关于量化的论文是非常多的,从一个更高的角度来看这些文章,在处理量化过程中分为3个部分。如上图所示,橙色的曲线是参数在量化之前的分布,极少的论文处理pre-quanttransform这个问题,即在量化参数之前,先对参数分布做下调整,绿色曲线就是调整后参数分布。做完参数分布调整后,下面一步,是最多paper关注的内容,也是量化当中比较关键的一步,即projectation,就是把之前连续的参数,project到预先设定好的quantization levels上面。比如使用一个3个值的量化,+1,-1,0,就要决定哪些参数量化成+1,哪些参数量化成-1,哪些参数量化成0,这个过程就叫做projectation,其本质就是一个分段函数,这个过程的梯度也是最难处理的。最后一个过程叫post quant transform,在做完projectation后,所有的参数都聚集在+1,-1,0这3个值上了,需要对这3个值再处理,最简单的方法是对这3个值乘以一个quantization factor,比如0.15,也可以做更多的操作。几乎所有量化的问题都可以归类到这3类中的某几类,大部分的paper还是在做projectation,post-quant transform是最少的。

3.1、提高量化网络表达能力

总结完量化过程遇到的问题之后,现在来讲一下,有没有办法去处理这些问题,让这些问题变得没那么严重,或者是解决这些问题。第一个问题,在量化之后精度是非常受限的,quantization levels的数量是有限的,8比特量化也只有256个值,2比特量化只有4个值,4个值的表达能力肯定是很弱的。量化之后的网络性能很差的原因在于量化的levels太少了,实际在实验过程中,发现了另外一个比较有趣的现象,就是网络性能变差不仅仅是因为quantization levels太少,还有可能是在量化之后网络的参数范围变小了。举一个例子,量化之前,尤其是对activation,其范围最大可以到5、6,最小也能到-5、-6,当然是relu之前。但做完量化之后,比如1比特量化,activation的范围最大是+1,最小是-1,范围大大折扣,会对网络性能造成影响。为了验证这个想法,我们做了一个简单的实验,一个非常简单模型来说明问题。

如上图,输入X1,X2是从0-1分布中随机采样采出来的,加一个随机噪声,就造了一个数据集,为网络的输入,最后网络的结果是对X1,X2做异或操作(XOR),或同或操作(XNOR)。由于X1,X2是有噪声的0-1数据,希望这个网络能够先把这个噪声过滤掉,学到一个正确的输出结果。这个问题比较简单,用的网络也很简单,只有2层网络。三角形的部分是activation,尝试了几种不同的activation。接下来看看图中几条曲线代表什么意思,绿色的曲线代表的是一个量化的激活函数,是一个3值的量化函数,0,-a,+a,这个a值是通过计算得到的,可以参考基本的baseline算法。绿色的结果是最差的,也符合预期,因为精度很低,range也非常小,所以效果是最差的,相应的loss也是最高的。比较有意思的是这条红色的曲线,红色的曲线使用的是tanh激活函数,tanh不是一个量化函数,是一个连续函数,只不过会把结果限制在-1,+1之间,所以tanh也是一个具有压缩功能的激活函数。其实在早期,sigmoid、tanh激活函数使用的比较多,但使用过程中发现了很多弊端,后面转成使用relu激活函数。可以看到,tanh这个激活函数可表示的范围也是非常小的,只有-1到+1,即使使用了一个全精度的激活函数,可表示范围很小,对应精度依旧是很差的。这条蓝色的线,范围也只是3个数,+1,-1,0,但对这3个数加了一个乘数,而且还加了一个bias(偏置),让其范围可以更加自由的变化。可以看到,在这种情况下,即使只有3个值,仍然比全精度表现的更好。这个橙色的曲线是对tanh激活函数按照下面论文的方法进行改造,让其范围更大,对应的loss是最低的。通过这个实验,是想证明在量化之后,quantization levels变得特别少,这是个严重的问题,但量化范围大大受限,这个问题也是需要解决的。在比特数确定下来之后,实际上是没有办法去解决quantization levels数量太少的这个问题的,但实际上,可以在quantizationrange上做更多的探索。

上图这篇文章的解决方法也比较简单,range太窄了,不能自动的调节,那可以在quantize之后的激活函数加上一个scale factor,和一个bias,即乘以γ,再加上β,这个过程叫做再参数化。再参数化之前量化值是-1,+1,0,再参数化后虽然还是3个值,但变成了-γ+β,+ γ+β, β,这个范围是可以调整了,每一层都有这2个参数。同样的道理,对W也加上一个scanlefactor,这里乘以a,没有增加一个bias,因为增加一个bias,会导致计算复杂,所以w只乘以α。这样做完之后,也是一个对称的均匀的量化,当然会引入一些额外的计算量,但引入的计算量是很低的。如上图所示,可以对计算公式稍做出来,就是浮点数的相乘相加操作,并且后面这部分,是可以提前计算存在硬件上面的,所以引入的额外计算量(compulation overhead)非常小,带来的效果是能动态的调整量化的范围。其中,γ, β, α是可以被loss训练,这样网络的表达能力会更强一些。此外,在使用relu激活函数时,γ, β也可以起到sparsity的作用。在[1]这篇文章提到,最优稀疏度并不是50%,直接用relu,稀疏度基本上是50%,但实验发现60%左右才是最优的稀疏度。但稀疏度太高比如90%,网络的性能肯定也是不好的。

经过这样一个操作之后,如上图右边部分,绿色的部分是baseline的方法的稀疏度曲线,直接做3值处理,蓝色的曲线是这篇[1]paper中用手工调整稀疏度的可能最优稀疏度的曲线结果,橙色的曲线是使用我们的方法自动调节稀疏度曲线,可以看到通过优化的方法自动调节稀疏度和通过手工的方法,吻合层度是比较高的。

如上图是做完优化后带来的一些好处和效果。在ResNet-18里面,TTQ是非均匀的3值量化函数,效果比其他均匀量化的效果都要好,我们的方法RTN-R是均匀量化,经过优化,达到的效果比TTQ的要好,提高了2个百分点,同时也缩小了和全精度量化精度的差距。在其他方面,我们的方法也体现出来一定的优势,当把activation和weigth都变成3值的时候,精度达到64.5%,和全精度差距只有4.7,这个提高还是蛮大的。在AlexNet和MobileNet上,我们的方法也有至少1个百分点的提高,可以看到我们的方法还是比较有效的。

另外一个,我们的方法还提到一个关于3值量化的计算问题,之前3值网络计算是用2比特实现的,2比特可以表示4个数值,这就浪费了一个数值。在计算过程中,引入特殊硬件设计专门对3值进行计算。如上图图(a)是baseline的方法,通过2比特网络实现的,图(b)是我们设计的硬件图,可以看到(b)中没有32bit counter,所以是可以加速计算的。

3.2、在量化范围和量化精度之间如何取舍

第2个问题是在量化过程中关于如何选着量化范围及量化精度。在确定比特之后,量化范围和量化精度呈一个反比关系,精度越高,每个小格的长度越小,所能表达的范围越低。

这个量化范围和前面讲的范围有区别的,这个量化范围指的是在量化之前对哪个部分做clip操作。在量化之前,不管是activation还是参数,分布都呈现2个特点,一个是长尾效应,有几个别参数的绝对值可能会很大,脱离了大部分的情况,大部分的数值都集中在0附近,如上图所示,像一个中型的分布。假如现在要量化这个网络,首先要确定量化哪个部分,范围越宽,精度就越低,反之,量化的范围越窄,量化的范围越高。那假如把量化的范围定的很窄,问题在于虽然中间这部分的精度变得很高了,但是外围数值很大的参数都会被很粗略的quantize到边界,这种处理时比较粗糙的,对网络精度的影响也是比较大的。另外一种方法是,把量化的范围定的很大,这样外围的很大的一些数(outliers)的量化误差就会变小,但是带来的问题是中间这个部分值很多,量化范围很大的时候,中间部分的分辨率就会变的很低,中间部分的精度就变的有问题了,所以如何选取量化范围是一个很棘手的问题,选着太小,outliers不好处理,选择太大,中间的数值又非常多,他们的精度又变的很低,网络准确率下降也很大。那怎么去选这个量化范围,到底要在哪个范围做量化。

其实一个最好的方法就是,就是直接用loss function决定量化范围落在哪个区间,希望得到这2个范围的梯度,通过梯度优化的方法去优化结果。

如上图所示,这种方法最早出现在paper[1]上,α就是clipping threshold,首先对参数进行clip,之后再做量化,α其实就是刚刚提到的范围,假如对α进行求导,可以看到,只有一部分对α的导数是不等于0,也就是说,只有落在外部的outliers才会对α的大小有贡献,落在内部的参数对α的优化没有作用的,因为gradient为0。这个显然不是最好的结果,一个理想的clipping threshold,应该同时考虑这些outliers和inside weigths,内部的和外部的参数应该都能考虑得到。经过改写之后,重新定义了这个公式,梯度2个部分都不是0了,outliers和内部的参数都能对α的优化起到作用,那通过这种方法,统一的全局的考虑到了所有的参数,具体的推导可以参考[2]文献。

3.3、均匀量化和非均匀量化的选择

如上图参数的分布,是长尾和中型分布的,有些区域参数量特别多,有些区域参数量特别少,不是均匀分布。目前使用的仍然是均匀的量化,因为均匀的量化在硬件上是比较友好的,但想一下用均匀量化去量化一个非均匀的参数分布,不是一个优化的做法。

那能不能找一个非均匀的量化函数,并且在硬件上非常高效?power-of-two算法,量化是2的多少次方,和一个数相乘,因为2的x次方和r相乘实际上是对r做位移,可以在一个时钟周期结束,所以是非常快的。2的x次方的量化函数是非均匀的,在0附近的精度会很高,随着这个数值越来越大,精度就变得越来越低了,这个也符合之前讲的参数分布,0附近数很多,希望精度高一些,在外面的数很少,希望精度低一些。

但是2的n次方这种量化其实是有问题的,随着不断增加比特数,0的部分精度会越来越高,但后面部分的精度是不会改变的,这就有点过犹不及。0附近的精度太高了,高到已经不需要那么高的精度了,但外部的精度又太低了,那能不能把0附近的精度拿一部分来补偿后面的精度,其实是可以把2个power-of-two加在一块的。把2个power-of-two加在一块有3个方面的优点:

– 第1个硬件实现特别方便,只需要做2次shift operation。

– 第2个表达范围增加了,power-of-two是一个非均匀的量化,在0附近精度依然是很高的,在外面部分的精度相对比较低,也符合参数的分布。

– 第3个是没有单个power-of-two的问题,在0附近精度特别高,高到已经不需要的那种层度。

所以用2个power-of-two加在一起的方法,就解决了之前的一序列的问题。

如上图是最新结果,红色的部分是我们的方法,在5比特的ResNet-18上,已经能大幅超过全精度网络了,上面的那个蓝色虚线是全精度的准确率。在ResNet-34上面,5比特的网络也能超过全精度的网络。在3精度的网络中,跟全精度的网络的差距也在进一步减少,所以我们的方法还是比较有效的,而且计算量也比其它的算法要小,不用做乘法了,所有的操作只需要做2次shift operation。

▌四、量化网络的进一步剪枝

在做工程过程中,很关心的一个问题是,做完量化后还能不能进一步的做一个剪枝,或者做完剪枝后能不能去做量化。这个问题,其实可以从3个角度去分析,先做量化再做剪枝,先做剪枝再做量化,或者剪枝和量化一起做,这里重点说一下第3种,量化剪枝一起做。实际上,剪枝一般是把参数置成0,而在大部分量化函数中,0已经是其中的一个quantilation levels,所以量化和剪枝一起做的思路还是正常做量化,只是期望更多的参数值被量化到0这个值上。这也许是一个比较好的方向,目前没有paper是这么做的。在CVPR 2019我写了一篇文章,尝试去量化一个二值网络,就是一个binaryneural network,二值网络已经非常高效了,但我还在想他是不是还是冗余的,是不是可能量化他。其实这篇paper的idea也是比较简单的,训练2个二值网络,一个二值网络叫主网络,是一个正常的二值网络,另外一个二值网络用来指示上面这个二值网络的某个channel是不是被去掉了,下面这个二值网络的值为0,那上面主网络对应的channel是被删去的,如果值为1,就保留某个channel。下面那个二值网络起到的是一个门的作用,这个门控制着上面主网络的channel是不是被去掉了,这个网络叫做main/subsidiar network。实际上下二个网络都是二值网络,他们可以使用相同的优化方法同时被优化。

如上图是实验结果,在ResNet-18当中,去掉了大概21.4%的filter,精度比不去做pruning还要提高了一些。对一个二值网络,做完去边之后精度有非常小的提升,非但没有下降,还有微小的提升,说明二值网络也存在冗余,也可以被量化。

▌五、弥补量化网络剪枝后性能下降的问题

在工程中大家比较关心的另一个问题,是在做完量化,剪枝,去边后,尤其是当使用非常激进的量化策略,比如1比特,2比特,3比特的量化,网络性能不可避免的都有些下降,有没有方法去补足这些性能的下降?这里总结了4种可以尝试的方法:

第1种方法,使用更少的比特来量化网络,表达能力是下降了,那能不能把宽度变得更宽一点,这是上图paper[1]的方法,这个idea特别简单。给层加宽度这种方法是很有效的,即使只加一点点宽度,性能就能达到一个很好的增长。加宽度这种方法总体来讲性价比是比较高的,而且实际操作也比较容易。总结一下,当精度下降了,就用宽一点的网络。

第2种方法,是对activation和参数做一个mixed precision。网络中的不同的参数,不同的层,不同的filter,他们的重要层度是不一样的,这个在剪枝的文章中多次被验证。那能不能给不同的参数赋予不同的比特数,重要的参数,给多一点比特,精度高一点,不重要的参数给低一点的比特数,精度低一点。paper[2]就是用的learning的方法去学习到每个参数的比特数的,但是这样做硬件上可能会有问题,2个不同位数的参数相乘相加,低位数的都需要补位后再操作,这样带来的性能提升就没有那么明显,或者设计一种新的硬件结构支持2个精度的数值做运算。

第3种方法,单一某一层带来的精度比较低,能不能将这一层copy成3份,这3份用的比特数是一样的,比如都是1比特,当然他们的量化方式是不一样的,把这3个结果合到一块输出,paper[3]用的这种方法,但目前我还没有复现出来。

第4种方法,是我们在cvpr2019上提出的,是单个的1比特的结果不太好,能不能把多个网络合在一块,最后输出的结果通过投票,boosting,bagging的方法把3个网络的结果合在一块,得到一个更高的准确率。这个方法在硬件上是比较友好的,因为这3个网络是可以并行处理的,当硬件比较强大的时候,3个网络训练的时间和1个网络训练的时间是差不多的。

▌六、量化网络的扩展与延伸

最后讲一下future work,在模型量化过程中,有哪些有趣的问题是可以扩展的,还有一些没有解决的open problem。

6.1、量化方法应用到复杂网络

现在的一个发展趋势是量化的方法开始和各种各样的方法结合起来,比如NLP模型,RNN已经有人做过了。另外,embeddinglayers,transformer,bert这些比较大的,比较耗内存的模型,能不能通过量化的方法,来减少训练时间,或者推理的时间。

在哈佛的另一个组研究了对RL systems量化的方法,这个问题之前没有人做,是因为RL里面用到的backbone network都比较简单,都是一个全链接层的网络或者网络规模不是很大。但现在随着RL网络规模不断变大,其量化也是值得做一做的。现有的量化的方法也不能直接套用到RL模型上去,因为有些数值上的特点有些不太一样。

在Detection,GAN具有不同用途网络中的量化应用,他们的网络结构不像CNN,feature map不断减少,最后输出某一类,Detection,GAN的输出结果,维度都是比较高的,数值精度可能也需要比较高,GAN输出精度至少是8比特,因为他输出的是图片,图片的像素至少要用8比特来表示,对GAN,Detection模型的量化方法也是比较有用的。

量化和AutoML的结合,在设计网络结构的时候,直接确定用的比特数,在低比特的情况下,网络是不是有新的特点,跟全精度网络结构是不一样的。

6.2、1比特网络

随着量化网络的不断推进,也应该关注binary neural networks,即1比特的网络。binary neural network没有乘法,没有加法,只有bool操作,比如and,or操作,非常的快。

之前提到的方法在5比特的时候已经可以打败全精度的网络,但实际第一层或最后一层,要么没有用量化,要么用的是8比特量化,这个也是很多paper里面沿用的一种方法,因为大家都发现,在第一层或最后一层做量化是非常敏感的,这个问题能不能被解决掉。

6.3、训练量化

现在的方法是做推理的时候用量化方法,在训练的时候做量化是更麻烦,因为在训练的时候,backward里面会有一些梯度,中间结果,这些梯度和中间结果能不能用低比特量化,以及怎么量化也是一个很重要的问题。

6.4、梯度不匹配优化方法

能不能提出一个更好的优化方法去解决刚刚提到的梯度不匹配的问题,已经有些paper在尝试分析这些问题了,但这个问题实际上没有被完全解决掉。

6.5、最小比特的理论分析

对于一个给定的模型或任务,能不能分析出最少使用的精度是多少。

6.6、量化与硬件,TVM结合加速

FPGA相关会议有很多paper都是在讲如何将量化和FPGA的加速器结合,以及比较火的TVM怎么去结合量化做一些更好的加速。

另外还有很多的工程问题,比如在量化中,batchnorm参数怎么解决,量化的batchnorm的4个参数对误差的影响还是特别大的,怎么去解决这个问题也是非常有意思的研究方向。

——END——

文章推荐:

阿里妈妈点击率预估中的长期兴趣建模

用户行为序列推荐模型

DataFunTalk:

专注于大数据、人工智能技术应用的分享与交流。

一个「在看」,一段时光! :point_down: