Altifigence Academy

6 / 24 · 概念

スケールとゼロ点

sx=0.25,zx=128で、パディングコードとq=132の実数値は何ですか。sw=0.5のとき0.75を表すバイアスコードは何ですか。

実数ゼロのコード

アフィン量子化は正のスケールsと整数のゼロ点zを使います。この整数の契約はx/sを最近接整数に丸め、完全な中間値なら偶数を選び、zを加え、記憶範囲に飽和させます。逆量子化ではコードをおよそs(q−z)と解釈します。実数を整数格子に写すと、一般に情報が失われます。

q=clip⁡(roundEven⁡(x/s)+z,qmin,qmax)q=\operatorname{clip}(\operatorname{roundEven}(x/s)+z,q_{min},q_{max})

s=0.25,z=128のuint8入力では、実数ゼロはコード128です。コード130と126は0.5と−0.5を表します。生のパディングコード0は代わりに−32を表してしまいます。生のコードを保持するバッファはパディングにzを挿入し、中心化済みコードを保持するバッファは整数ゼロを挿入します。データパスでこの変換位置を示してください。

内積の計算例

入力コード[130,126]から128を引いて中心化し、[2,−2]を得ます。重み[3,−2]はスケール0.5、ゼロ点0です。2×3+(−2)×(−2)=10を累積します。アキュムレータの実数スケールは0.25×0.5=0.125なので、実数結果は1.25です。出力スケール0.25、ゼロ点128ならコード133です。重みのゼロ点が非ゼロなら、それも乗算前に引く必要があります。

テンソル単位の量子化ではスケールを共有します。チャネル単位の重み量子化には、チャネル固有のバイアスと出力変換が必要です。2つの出力チャネルの重みスケールが0.5と0.25なら、アキュムレータのコード10はそれぞれ1.25と0.625を表します。ソフトウェアの柔軟性は、どちらの構成のハードウェア対応も保証しません。

0.625をスケール0.25で量子化すると中間値2.5になり、2へ丸めてコード130になります。逆量子化は0.5で、誤差は−0.125です。入力0.375も同じコードに写ります。量子化格子の誤差と飽和の誤差は異なり、範囲外入力のクリップは半スケール刻みを超えることがあります。整数規則をONNX QuantizeLinearと比較してください。この演習は意図的に小さなint8/uint8の部分集合だけを実装します。

自分で考えてみましょう

sx=0.25,zx=128で、パディングコードとq=132の実数値は何ですか。sw=0.5のとき0.75を表すバイアスコードは何ですか。

解説を見る

生のパディングはコード128で、q=132は1を表します。アキュムレータスケールは0.125なので、バイアスコードは0.75/0.125=6です。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。