量化部署系列 | 非均匀量化之APoT——Additive Powers-OF-Two

技术

好久没写量化相关的文章了,最近一个读者让我讲一下 Additive Powers-of-Two 这篇文章,我一看,是雨杭大佬三年前的佳作,也是一篇非线性量化相关的文章,正好借这个机会讲一下非均匀量化的基操。

论文:Additive Powers-of-Two Quantization: An Efficient Non-uniform Discretization for Neural Networks (ICLR 2020)

代码:https://github.com/yhhhli/APoT\_Quantization

之前讲的所有量化相关的文章,都是指 线性量化 ,或者说 均匀量化 。这也是目前工业界落地最常用的量化方式。

这种量化最大的好处就是实现起来非常简单,对硬件很友好。最大的问题则是,在神经网络里面,不管是 weight 还是 feature,数值分布通常是非均匀的:

picture.image

这种情况下用均匀量化,会导致中间峰值部分,一大坨数据都只能分配较少的量化点,而周围的数据则分布较多量化点,从而使得信息密集的区域被过分压缩。

但如果是非线性量化,那么就可以在中间的区间多放一些量化点,周围的少放一些,通过非均匀的量化来合理压缩数据。

不过非均匀量化最大的硬伤就是,硬件实现比来很不友好。韩松教授早期发表的 Deep Compression 就是用查表的方式来实现非均匀量化,但查表需要消耗的资源过大,对于普通的芯片来说几乎不能接受,因而也没法落地。

但有一种非均匀量化,对硬件来说极度友好,那就是本文将要介绍的 PoT (Powers-of-Two,也称为 对数量化 ) 以及改进版的 APoT (Additive Powers-of-Two)。

PoT量化

正式开讲前,先回顾一下线性量化的公式,这里只考虑对称量化。

假设 是量化后的定点数, 是量化前的浮点数, 是量化缩放系数, 是反量化后的数值,那么:

这几个公式其实就是量化反量化的过程,、 是可以通过 实现等价转换的,但由于 round (四舍五入) 操作的原因, 相比 丢失了很多信息,这就是量化的损失。

假设 的范围是 ,量化的比特数是 ,那么 。(用 是为了留多一个位给符号位)

量化的过程其实也可以理解为是把 这个区间等分成 份,然后把每一个 都映射到每一份的量化采样点上 (也可以把这些采样点理解为缩放系数)。

这些量化采样点也可以表示成以下这串数:

picture.image

那么什么是 PoT (Powers-of-Two) 量化呢?

看名字大概可以知道,就是用移位操作 (2 次方) 来代替线性量化中的缩放系数 。

那么采样点就变成:

picture.image

这种量化方式在硬件实现上比线性量化还要友好,因为 可以直接通过移位来实现:

picture.image

注意一点,PoT 量化只能用于对称量化,因为它没有零点的概念。

公式 初看比较陌生的话,可以用几个例子进一步体会一下。

如果 ,那么会对应这些缩放系数:

如果 ,那么则是:

看缩放系数的话,应该能明显体会到,PoT 是一种典型的非线性量化。看下图可以发现,左图线性量化,每个位置都会均匀采样一个量化点,而右图 PoT 则是靠近 0 的地方采样比较密集,越远离的地方采样越稀疏。因此对于大部分数值分布在 0 附近的情况非常适用,而深度模型中,weight 的数值一般就是这样分布的。

picture.image

APoT的改进

PoT 虽然相比均匀量化有诸多优点,但它也存在一个很大的缺陷。

其实看上面公式 (3) (4) 也能感觉出来它的问题。那就是,当量化比特数 增大的时候,量化采样点只会在 0 附近增加,而在靠近 1 的地方,采样点始终是 ,文章把这种现象称为 rigid resolution。如果 weight/feature 的数值分布不是严格集中在 0 附近,那 PoT 的效果可能还不如线性量化。

APoT 的提出就是为了解决这个问题。

它在 PoT 基础上提出了一个更加复杂的公式:

picture.image

这个公式初看很复杂,我们用一个例子来解释它的含义。

假设量化比特数 ,那么按照论文的定义,。我们设 ,则 。

那么, 这一项其实就是 、 两项相加。这里需要注意, 本身不是特指一个数,而是一个序列,每次相加时都要从这个序列中选出一个数。

在我们这个例子中,

而 就是 、 两个序列中的数值组合相加的结果 (所以称为 Additive PoT):

这里面总共有 个数,分别对应 16 个采样点。

公式中的 是为了防止最大值超过 而设置的一个参数。在我们这个例子中,最大的采样点 (缩放系数) 是 ,因此 ,这样经过最大的缩放因子后,最大值仍然是 。

APoT 这种在 PoT 采样点上进行组合相加的做法,相当于在原 PoT 的采样点基础上插入了一些新的采样点,从而不会像 rigid resolution 那样,每次增加比特数都只会在 0 附近增加量化采样的信息:

picture.image

APoT在每一段采样区间都能插入新的量化采样点

搞懂这个过程后,我们再来看看设计 和 这两个数值的意义。

仍然假设 ,那么当 的时候,,此时 会包含 4 个 ,而每个 则变成长度为 2 的序列。换句话说,最后总的量化采样点仍然是 16 个,但此时每个采样点的情况都不同了:

这四个序列组合相加得到的采样点集合为:

把这个集合中的数值按照从小到大的顺序排列,得到的序列集合是:

此时 。

细心的读者可能已经发现,这种情况下的 APoT 其实就是均匀量化

当 的时候,此时 只包含 1 个 ,而这个 则是一个长度 16 的序列:

此时的 APoT 则退化为 PoT。

因此我们可以得出一个结论: 其实是用来控制采样点的拓展程度的,当 的时候,APoT 其实等价于均匀量化,当 的时候,APoT 则退化为 PoT 量化。

而 则决定每个 序列的大小。而序列大小会进一步影响硬件计算开销。不过遗憾的是,我对硬件这块的实现不是很了解,论文中也没有详细介绍 APoT 在芯片里面该如何实现,所以只能暂时略过了。

上面这套计算流程只适用于 是偶数的情况,如果 是奇数,需要做一点特殊处理,论文的做法是单独再拆出一项去组合相加:

picture.image

这里不再赘述。

两个trick

APoT 中引入了两个 trick。

其中一个是让网络在训练的过程中,自己学习出 的值。

前面说到,对于同一个 weight 或者 feature 中的浮点数 ,我们是在 这个区间去量化的,超过这个区间的数值则直接截断。 的取值既可以直接取 weight/feature 中数值的最大值,也可以人为设置。论文则是采用了 PACT 文章的方法,让网络自己学出合适的 。不过在梯度回传的时候,稍做了一点修改。

另一个 trick 是 weight normalization。前面提到,不管是 PoT 还是 APoT,其实量化采样点更多的集中在 0 附近,因此,需要尽可能保证 weight 或者 feature 的数值分布靠近 0,最理想的就是以 0 为均值的高斯分布了。所以作者在训练网络的过程中,强行加入一个约束,用类似 batch norm 的方式对 weight 也做了一遍归一化,称为 weight norm。而 feature 则直接用 batch norm 即可。

不过这两个 trick 并不是通用的。尤其是 weight norm,在很多情况下会导致网络的效果极其糟糕,我自己主要是做 low level vision 的任务,在这类任务中使用 weight norm 通常会产生极大的负作用。

总结

这篇文章主要介绍 PoT 这种非均匀量化的优缺点,以及 APoT 的改进。PoT 量化的优点是硬件实现简单,缺点是量化过程中存在 rigid resolution 的问题,而 APoT 主要是为了部分解决 rigid resolution 的问题,其基本思路是在原 PoT 的采样点上进行组合相加,从而使得采样点的拓展可以更加均衡化。

虽然 PoT/APoT 克服了线性量化的缺点,并且硬件实现上也很友好,但工业界在实际应用中更多的还是会用线性量化,我个人也只在海思的部分芯片上见过 PoT 这种量化形式。

究其原因,可能在于线性量化虽然中规中矩,但它原理上更加简单,在大部分情况下也适用了。而 PoT/APoT 虽然在某些情况下能获得更好的效果,但由于它的非均匀性是固定的,无法随着 weight/feature 的分布做调整,在有些时候效果可能更差。也就是说这玩意的整体收益相比均匀量化来说似乎不明显,因此大家也就没有太多的动力再针对它去设计一套硬件。

picture.image

扫码加入👉「集智书童」交流群

(备注: 方向+学校/公司+昵称 )

picture.image

picture.image

picture.image

picture.image

picture.image

picture.image

想要了解更多:

前沿AI视觉感知全栈知识👉「分类、检测、分割、关键点、车道线检测、3D视觉(分割、检测)、多模态、目标跟踪、NerF」

行业技术方案 👉「AI安防、AI医疗、AI自动驾驶」

AI模型部署落地实战 👉「CUDA、TensorRT、NCNN、OpenVINO、MNN、ONNXRuntime以及地平线框架」

欢迎扫描上方二维码,加入「集智书童-知识星球 」,日常分享论文、学习笔记、问题解决方案、部署方案以及全栈式答疑,期待交流!

免责声明

凡本公众号注明“来源:XXX(非集智书童)”的作品,均转载自其它媒体,版权归原作者所有,如有侵权请联系我们删除,谢谢。

点击下方“阅读原文 ”,

了解更多AI学习路上的 「武功秘籍」

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
KubeZoo: 轻量级 Kubernetes 多租户方案探索与实践
伴随云原生技术的发展,多个租户共享 Kubernetes 集群资源的业务需求应运而生,社区现有方案各有侧重,但是在海量小租户的场景下仍然存在改进空间。本次分享对现有多租户方案进行了总结和对比,然后提出一种基于协议转换的轻量级 Kubernetes 网关服务:KubeZoo,该方案能够显著降低多租户控制面带来的资源和运维成本,同时提供安全可靠的租户隔离性。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论