HWGQ-net学习记录
概要介绍
HWGQ的全名是Half-wave Gaussian Quantization翻译过来就是半波高斯量子化,HWGW-net主要是针对激活值进行量化,以及使用近似的方法来拟合量化的损失(使得量化的损失和梯度匹配)。 也是模型量化一种方法
这个网络结构会在前向传播的时候使用近似于ReLU函数的量化器,在反向传播使用合适的分段线性函数,来解决前向传播和反向传播的不匹配问题。(以前的前向传播多了个量化过程,而反向传播不作处理)
对于量化的影响而言,激活值的量化比权重的量化要大很多(因为量化损失大很多)。作者认为这是因为激活值量化之后,还要经过激活函数的作用,这样就会产生不可微分算子,产生很小的梯度(梯度饱和)。
以前的方法,forward model和反向计算梯度的方法不匹配,所以不能保证得到很好的性能,很可能得到一个次优解。(因为forward时,要经过一个量化操作,而backward时按原模型处理,所以会出现forward和backward模型不匹配现象)
Half-wave Gaussian Quantization
ReLU
g(x)=max(0,x)
前面已经提到了,我们在前向传播的过程中会使用量化器Q(x)去近似ReLU
前向传播近似
Q(x)=qi, if x∈(ti,ti+1]
其中,
ti,ti+1 是两个量化的值。我们所需要存储的是下标,通过存储下标得到对应的值。
因为每层的激适输出都接近于高斯分布 (经过BN层之后, 就是高斯分布。而该方法是作用于点积操作后的BN层之后的),又因为ReLU是一个 half-wave rectifier,所以方法叫做 half-wave Gaussian quantized (HWGQ)。
反向传播近似
我们有三种方法来进行反向传播的近似
- Vanilla ReLU
Q^′(x)={1,0, if x>0 otherwise
该方法和HWGQ存在 gradient mismatch,因为Q(x) 限定了量化的最大数t
m∘
- Clipped ReLU
Q^c(x)=⎩⎨⎧qm,x,0,x>qmx∈(0,qm] otherwise
使用截断ReLU, 则不会在大于
qm 的数值上产生 dismatch 现象。
- Log-tail ReLU
Q^l(x)=⎩⎨⎧qm+log(x−τ),x,0,x>qmx∈(0,qm] otherwise
结果证明,截断式ReLU比较好用。
总结
HWGW-net是一种模型量化的方法,优点就是模型压缩的一贯优点,这里没有深入的去研究,日后可能来补全。