6 / 24 · 概念
スケールとゼロ点
sx=0.25,zx=128で、パディングコードとq=132の実数値は何ですか。sw=0.5のとき0.75を表すバイアスコードは何ですか。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
実数ゼロのコード
アフィン量子化は正のスケールsと整数のゼロ点zを使います。この整数の契約はx/sを最近接整数に丸め、完全な中間値なら偶数を選び、zを加え、記憶範囲に飽和させます。逆量子化ではコードをおよそs(q−z)と解釈します。実数を整数格子に写すと、一般に情報が失われます。
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です。