Closed2

CNN向けの量子化アルゴリズム

teppchanteppchan

Learned Step Size Quantization, 2019

愛称はLSQ。
浮動小数点データを整数データに割り当てるときに使うStep sizeを学習するタイプの量子化アルゴリズム。
対象とするモデルは、ResNetやVGG、SqueezeNextといったCNNモデル。

量子化

量子化前(Floating point)の値をv、量子化step sizeをs、量子化の最大値と最小値をそれぞれQ_NQ_Pとすると、量子化後の値\bar{v}は、

\bar{v}=\lfloor clip(v/s, -Q_N, Q_P)\rceil

\lfloor \cdot \rceilはnearest integer(一番近い整数値丸目)、clip(z, r_1, r_2)zr_1r_2の範囲にクリップする。
量子化ビット幅をbとすると、\bar{v}がunsigned integerの場合はQ_N=0, Q_P={2^b}-1、signed integerの場合はQ_N=2^{(b-1)}, Q_P=2^{(b-1)}-1となる。ReLU後のActivationはunsigned integerになるので後者、WeightやReLUがないSeparatable convolutionの出力の場合は前者になる。

量子化後の値を量子化前と同じスケールに直すと、
\hat{v}=\bar{v} \times s

Fig.1

Step size gradient

Step sizeに対するGradientは下記のように定義する。

\frac{\partial v}{\partial s} = \begin{cases} -v/s+\lfloor v/s \rceil & \text{if } -Q_N < v/s < Q_P \\ -Q_N & \text{if } v/s <= -Q_N \\ -Q_P & \text{if } v/s >= Q_P \end{cases}

LSQはTransition pointでGradientの値\frac{\partial v}{\partial s}が小さくなるため、Transition pointに量子化後の値が収束するようにStep sizeが収束する。

fig.2

実験結果

3ビット量子化で良好な結果を得ることができてる。

Tab.1

teppchanteppchan

LSQ+: Improving low-bit quantization through learnable offsets and better initialization, 2020

LSQではStep sizeを学習するアルゴリズムだったけど、LSQ+ではoffset parameterも学習するように拡張した。LSQは最小値と最大値が等しいSymmetricな範囲にしか対応できないが、LSQ+ではoffsetを加えることでAymmetricな範囲にも対応できるようにした。
さらにChannel単位でStep sizeとOffset parameterを持つことでより細かく量子化できる手法を提案した。

量子化

量子化前の値をx、Step sizeをs、Offset parameterを\beta、最小値最大値をそれぞれn, pとすると、整数値\bar{x}は、

\bar{x} = \left\lfloor clamp \left( \frac{x-\beta}{s}, n, p \right) \right\rceil

量子化後の値\hat{x}は、

\hat{x}=\bar{x}\times s + \beta

Step size sとOffset parameter \betaのGradientは下記のように定義する。

\begin{align} \frac{\partial \hat{x}}{\partial s} &= \frac{\partial \bar{x}}{\partial s} s + \hat{x} \\ &\approx \begin{cases} -\frac{x- \beta}{s} + \left\lfloor \frac{x-\beta}{s} \right\rceil &\text{if } n<\frac{x-\beta}{s} < p \\ n \text{ or } p & otherwise \\ \end{cases}\end{align}
\frac{\partial \hat{x}}{\partial \beta} = \frac{\partial \bar{x}}{\partial \beta} s + 1 \approx \begin{cases} 0 & \text{if } n<(x-\beta)/s<p \\ 1 & otherwise \\ \end{cases}

LSQと同じStraight-Through-Estimator (STE)を使った定義になっている。
つまり\partial \bar{x}/\partial s = 1, \partial \bar{x} / \partial \beta=1

tab.1

このスクラップは3ヶ月前にクローズされました