HWGQ-net学习记录

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 ) g(x)=\max (0, x)
前面已经提到了,我们在前向传播的过程中会使用量化器Q(x)去近似ReLU

前向传播近似

Q ( x ) = q i ,  if  x ( t i , t i + 1 ] Q(x)=q_{i}, \text { if } x \in\left(t_{i}, t_{i+1}\right]
其中, t i , t i + 1 t_{i}, \quad t_{i+1} 是两个量化的值。我们所需要存储的是下标,通过存储下标得到对应的值。

因为每层的激适输出都接近于高斯分布 (经过BN层之后, 就是高斯分布。而该方法是作用于点积操作后的BN层之后的),又因为ReLU是一个 half-wave rectifier,所以方法叫做 half-wave Gaussian quantized (HWGQ)。

在这里插入图片描述

反向传播近似

我们有三种方法来进行反向传播的近似

  1. Vanilla ReLU
    Q ^ ( x ) = { 1 ,  if  x > 0 0 ,  otherwise  \hat{Q}^{\prime}(x)=\left\{\begin{array}{ll} 1, & \text { if } x>0 \\ 0, & \text { otherwise } \end{array}\right.

该方法和HWGQ存在 gradient mismatch,因为Q(x) 限定了量化的最大数t m _{m \circ}

  1. Clipped ReLU
    Q ^ c ( x ) = { q m , x > q m x , x ( 0 , q m ] 0 ,  otherwise  \hat{Q}_{c}(x)=\left\{\begin{array}{ll} q_{m}, & x>q_{m} \\ x, & x \in\left(0, q_{m}\right] \\ 0, & \text { otherwise } \end{array}\right.

使用截断ReLU, 则不会在大于 q m  的数值上产生 dismatch 现象。  q_{m \text { 的数值上产生 dismatch 现象。 }}

  1. Log-tail ReLU
    Q ^ l ( x ) = { q m + log ( x τ ) , x > q m x , x ( 0 , q m ] 0 ,  otherwise  \hat{Q}_{l}(x)=\left\{\begin{array}{ll} q_{m}+\log (x-\tau), & x>q_{m} \\ x, & x \in\left(0, q_{m}\right] \\ 0, & \text { otherwise } \end{array}\right.

结果证明,截断式ReLU比较好用。

总结

HWGW-net是一种模型量化的方法,优点就是模型压缩的一贯优点,这里没有深入的去研究,日后可能来补全。

原创文章 113 获赞 80 访问量 3万+

猜你喜欢

转载自blog.csdn.net/python_LC_nohtyp/article/details/105890625