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)
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]
Q(x)=qi, if x∈(ti,ti+1]
其中,
t
i
,
t
i
+
1
t_{i}, \quad t_{i+1}
ti,ti+1 是两个量化的值。我们所需要存储的是下标,通过存储下标得到对应的值。
因为每层的激适输出都接近于高斯分布 (经过BN层之后, 就是高斯分布。而该方法是作用于点积操作后的BN层之后的),又因为ReLU是一个 half-wave rectifier,所以方法叫做 half-wave Gaussian quantized (HWGQ)。
反向传播近似
我们有三种方法来进行反向传播的近似
- 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. Q^′(x)={1,0, if x>0 otherwise
该方法和HWGQ存在 gradient mismatch,因为Q(x) 限定了量化的最大数t m ∘ _{m \circ} m∘
- 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. Q^c(x)=⎩⎨⎧qm,x,0,x>qmx∈(0,qm] otherwise
使用截断ReLU, 则不会在大于 q m 的数值上产生 dismatch 现象。 q_{m \text { 的数值上产生 dismatch 现象。 }} qm 的数值上产生 dismatch 现象。
- 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. Q^l(x)=⎩⎨⎧qm+log(x−τ),x,0,x>qmx∈(0,qm] otherwise
结果证明,截断式ReLU比较好用。
总结
HWGW-net是一种模型量化的方法,优点就是模型压缩的一贯优点,这里没有深入的去研究,日后可能来补全。