原文链接:https://www.yuque.com/yahei/hey-yahei/quantization-data_free
欢迎转载&引用,但烦请注明出处~
Data-free指的是不需要数据,它可以是完全不依赖数据也不利用生成数据,也可以是利用某些手段来生成数据。在量化上,Data-free既可以用于后训练量化,也可以用于重训练量化。Data-free量化的研究主要是希望在真实数据未知的情况下,对输入进行离线量化操作,通常都是借助BN层的统计信息(均值、方差)来直接确定输入的量化参数,或者生成校准数据来校准得到量化参数。
动机
一般论文会解释说,在某些高隐私的应用场景下,比如医疗数据、医药数据、个人隐私数据等等,这些数据是难以获取甚至无法获取的——但对于模型训练者而言,我既然能用这些数据来训练网络了,为什么不能进一步用这些数据来做量化校准或者做重训练量化?我觉得可能更合理(但也不会很普适)的应用场景是某一方要提供专门的模型压缩服务,模型训练者又不想提供数据给第三方模型压缩服务商,不过如果模型压缩的服务方是以出售或提供工具的形式给模型训练者,那么这样的需求也是不存在的。
总的来说,Data-free的应用场景是很局限的,看似有需求但其实需求应该是比较弱的。不过这两年关于Data-free量化出了几篇论文,我们不妨也拿出来讨论一下。
DFQ
论文:《Data-Free Quantization Through Weight Equalization and Bias Correction (ICCV2019)》逐层量化权重、吸收输入量化的偏移项
参考:《ICCV2019高通Data-Free Quantization论文解读 | 知乎, IronBoy》
为了得到输入的量化参数,我们通常需要得到输入的一个截断范围,DFQ主要考虑“Conv+BN+ReLU”的结构,用BN层训练得到的 γ \gamma γ和 β \beta β参数(注意不是指数平滑平均得到的均值和标准差),来估计输入的范围。
回顾一下BN的过程
x ( i ) = x ( i ) − μ B σ B 2 + ϵ z ( i ) = γ x ( i ) + β \begin{aligned} \mathbb{ x^{(i)} } &= \frac{ x^{(i)} - \mu_B }{ \sqrt{\sigma^2_B + \epsilon} } \\ z^{(i)} &= \gamma \mathbb{ x^{(i)} } + \beta \end{aligned} x(i)z(i)=σB2+ϵx(i)−μB=γx(i)+β
BN层的输入首先被规范化到均值为0,方差为1的分布下,然后通过一个仿射变换,此时输出的均值为 β \beta β,标准差为 γ \gamma γ。DFQ提出,既然知道BN层输出后的均值和标准差,那么不妨用他们来确定截断范围 [ β i − n γ i , β i + n γ i ] [\beta_i-n\gamma_i, \beta_i+n\gamma_i] [βi−nγ