阅读笔记:ZeroQ: A Novel Zero Shot Quantization Framework
论文pdf:https://arxiv.org/abs/2001.00281
github:https://github.com/amirgholami/ZeroQ(官方实现)
https://github.com/rhhc/ZeroQ-MP(含混合精度的非官方实现)
1、What the problems the paper mentioned ?
在部署到应用的过程中,有些曾用于训练的涉及到隐私的数据集不再能够被访问了,例如医学数据,生物数据,用于推荐的用户数据。因此提出了DataFree的量化方法。
2、Summary of major innovations (intro)
- 提出一种用于生成蒸馏数据集的优化公式。
- 用上述的蒸馏数据来分析模型每一层对量化的敏感性。
- 可以用上述蒸馏数据集来确定量化的边界,还可以用一种叫做帕累托边界优化的方式来自动选择精度进行混合量化。
3、How about the important related works/papers?(related work)
4、What are some intriguing aspects of the paper?(design&implementation)
4.1 设计实现概述
蒸馏数据集:
min
x
r
∑
i
=
0
L
∥
μ
~
i
r
−
μ
i
∥
2
2
+
∥
σ
~
i
r
−
σ
i
∥
2
2
,
(1)
\min_{x^{r}}\sum_{i=0}^{L}\lVert\bm{\tilde{\mu}}_i^r-\bm{\mu}_i\rVert^2_2+\lVert\bm{\tilde{\sigma}}_i^r-\bm{\sigma}_i\rVert^2_2, \tag{1}
xrmini=0∑L∥μ~ir−μi∥22+∥σ~ir−σi∥22,(1)
μ ~ \bm{\tilde{\mu}} μ~和 σ ~ \bm{\tilde{\sigma}} σ~表示待生成的数据的均值和方差,后者是储存在BN层中的曾经用于训练的数据的均值方差,L表示层数。也就是说训练过程就是通过拟合每一层的均值和方差来生成模拟数据。
如果不需要混合精度,敏感度分析和帕累托最优都不用考虑了,直接根据蒸馏数据集,用每个batch的最大值最小值来确定量化边界即可。
敏感度分析:
Ω
i
(
k
)
=
1
N
∑
j
=
1
N
d
i
s
t
K
L
(
M
(
θ
;
x
j
)
,
M
(
θ
~
i
(
k
−
b
i
t
)
;
x
j
)
)
,
(2)
\Omega_i(k) = \frac 1N \sum_{j=1}^{N_{dist}} \mathbf{KL}(\Mu(\theta;x_j),\Mu(\tilde{\theta}_i(k- bit);x_j)) , \tag{2}
Ωi(k)=N1j=1∑NdistKL(M(θ;xj),M(θ~i(k−bit);xj)),(2)
使用的是KL散度分析每一层的敏感度。具体计算就是只让某一层的权重和激活量化,而其他所有层保持全精度,网络的输出和全精度网络的输出之间算KL散度。
帕累托边界:
首先是假定每一层之间的敏感度是相互独立的,然后设定每一层在有限个位宽中选择,例如{2,4,8}。那么随机采样可以选出许多中混合精度的量化,结合上一步算出的敏感度,可以得出每种混合方案的敏感度大小以及权重参数的大小。就可以画出下图:
注意在本文中,混合6比特(MP6)指的是通过2、4、8bit的混合方式得到和单精度6bit的权重size一样,这时的混合方式就是MP6。
给定一个模型大小的限制,
S
t
a
r
g
e
t
S_{target}
Starget。可以使用动态规划的方法,可以找到在该限制下敏感度总和最低的方案。官方代码没有给出实现细节,敏感度分析的细节也没有给出。另一份MP实现采用的是层序遍历结合剪枝,每一层按size从小到大排序,第一个保留,随后的size是越来越大的,因此若后面的收益没有更好,那就直接舍弃,收益更好则保留。理论上感觉复杂度有点大。实际上应该可以看成背包问题,用背包问题的方式来求解(不能确定,可尝试)。模型大小限制相当于背包大小,敏感度的相反数相当于价值。
帕累托最优:是指资源分配的一种理想状态,假定固有的一群人和可分配的资源,从一种分配状态到另一种状态的变化中,在没有使任何人境况变坏的前提下,使得至少一个人变得更好,这就是帕累托改进或帕累托最优化。帕累托最优状态就是不可能再有更多的帕累托改进的余地。
上图的最下面的边界线都是帕累托最优,不同的位置对应不同的size。
5. 总结
文章使用蒸馏的方法来得到和原始数据同分布的数据集,然后用于后续的量化中,很新颖。其实验结果,比当前最好的后量化方法DFQ要好一些。
然而,感觉选取量化的上下界挺粗糙的,用的每个batch的最大值最小值,用类似BN的那种方式在每个batch更新。其次假设各层敏感度都是相互独立的,这是个非常理想的状态。最后就是帕累托边界这个,瞬间觉得逼格高了很多,而具体上就是给定一个大小限制,然后动态规划找到最优。