本文讲述了HAWQ系列的三部曲,HAWQ v1,v2,v3
故事会环节
大背景说一下就是模型越来越大,特别是输入分辨率越来越大,所以降低模型的大小提高速度非常重要,然后写了一堆现在大家怎么做的,其中一种方案就是量化。也就是本文的重点。然后指出来,所有的网络都量化到一个bit会降精度,所以提出混合精度量化,对敏感层用高精度,非敏感层用低精度。所以在V1当中,提出了整个系列的关键做法,使用海森矩阵,计算Hessian谱,确定量化水平。在V2当中,作者就V1中的一些不足继续补充。
V1存在几个缺点,(i) HAWQ 使用基于顶部 Hessian 特征值的启发式度量作为灵敏度的度量,它忽略了 Hessian 谱的其余部分;(ii) HAWQ 仅提供不同层的相对灵敏度,仍然需要手动选择混合精度设置;(iii) HAWQ 不考虑混合精度激活量化。为了解决这些问题,作者提出了V2,解决以上3个问题:(i)使用平均Hessian轨迹,而不是启发式算法。(ii)使用基于 Pareto-frontier 的方法自动确定不同层的位精度。(iii)开发了混合精度激活量化,提出了快速计算Hssian信息的方法,计算激活。
V2呢,当然也有几个缺点,(1)一个是虽然量化了,但是在推理过程中 的操作,还是一个浮点计算,在硬件上还是慢.(2)V2的Pareto-frontier在不同硬件上表现有差异。所以又提出了V3,解决这两个问题,(1)使用了移位操作来代替除法运算,使得整个网络是纯整数推理。(2)提出了使用一个整数规划来通过求方程得到到底解决到底使用什么精度配置的问题。
创新点:
总结三篇论文,最终能用的创新点其实是如下几个,其中有一些创新点已经被迭代掉了。
- 使用平均Hessian轨迹来计算层的灵敏度。(V2)
- 使用了移位操作来代替除法运算,使得整个网络是纯整数推理(V3)
- 使用整数规划来确定到底哪些层4bit,哪些层8bit
Method
对于已经被迭代掉的方法暂且放下不提,本文只考虑最后被应用的方法。
平均Hessian轨迹
这个证明非常长,作者写了2页纸来证明这个公式,有兴趣的小伙伴可以自行去论文阅读。虽然读了貌似也不大明白,建议直接看代码,比推理看着好理解多了。
经过一个很长很长的公式推理之后,论文得出了平均Hessian轨迹

近似一下,估算的公式可以被看做是

纯整数推理
简单来说,就是把一个 的值,用 毕竟,然后作为scale,优点是真的快,因为没有除法而且是纯整数。缺点是会进一步掉精度。

量化层选择
这一点简单来说,就是把一个模型部署在一个设备上,必然有权重大小,推理延迟,带宽限制。说白了就是前面用Hessian矩阵计算了灵敏度,得到了一个层从重要到不重要的排序,但是中间的临界点在哪里,那就说不准了。所以作者说,很科学,要使用一个整数规划,去计算不同层的权重大小,推理延迟,带宽限制。然后如下所示,通过解一个整数规划来计算到底哪些层用4bit,哪些用8bit

总结:
作者的核心观点在于一个假设,就是通过Hessian矩阵轨迹,可以得到一个层的灵敏度,从而得出哪些层可以用低精度,哪些需要高精度。之后的一系列改进,都是在这个基础上,怎么更快,怎么更准。于是设计了纯整数量化,做整数规划等等。本文最大的价值其实在我看来反而是最后一个,考虑到了工程部署的问题,学界做的真的能落地能应用的东西真的太少了。