Altifigence Academy

7 / 24 · 概念

アキュムレータ幅、丸め、飽和

バイアスがゼロの符号付きint8積9個に、符号付き18ビットは十分ですか。

累積には独自の幅が必要

8ビットのオペランドと8ビットの出力でも、アキュムレータが8ビットでよいとは限りません。符号付き8ビットコードの最大絶対値は128です。ゼロ点が0、項数Lなら、和の絶対値の保守的な上限はL×128×128にバイアスの絶対値を加えたものです。正の最大値がその上限を覆う符号付き幅を選びます。符号ビットも1ビットを使います。

幅の計算例

C=3、3×3カーネルならL=27です。両オペランドが−128では、各積は+16384、和は442368です。符号付き19ビットは262143まで、20ビットは524287まで表せます。後者はバイアス絶対値の許容量1000を含む上限443368も覆います。より小さいオペランド範囲を証明できれば幅を減らせますが、普通のテスト入力を数個試しても上限の証明にはなりません。

ゼロ点0の符号なしコードは255に達するため、128の仮定は使えません。まずA=max(abs(qmin−zx),abs(qmax−zx))を計算し、重みについて同様にBを求めます。L×A×B+abs(b)を使います。中心化自体にも保存コードより広いビット幅が必要な場合があります。

出力変換の順序を確定する

乗数はsx×sw/syです。乗数0.5、出力ゼロ点128では、アキュムレータ9は中間値4.5になり、偶数4に丸めて132を出力します。アキュムレータ11は5.5を6に丸めて134です。アキュムレータ−3は−1.5を−2に丸めます。切り捨て、ゼロ方向への切り捨て、算術右シフトは負数で異なります。演習では言語の既定丸め関数でなく、専用の最近接偶数丸めを使います。

int8出力では、変換した300は127、−300は−128に飽和します。上位ビットを落とすと無関係な値へ折り返します。クリップ前の値と飽和回数を記録します。ReLUの位置と、そこでのゼロの表現も契約に含めます。

大きな正負の和、完全な中間値、両飽和境界、大きなバイアスを検証します。広い参照値と小さすぎるアキュムレータを意図的に比較し、オーバーフローを露呈させます。実行可能な例はJavaScript整数の正確な範囲内に収めています。より大きな参照モデルでは、ホスト算術の精度も根拠を示す必要があります。

自分で考えてみましょう

バイアスがゼロの符号付きint8積9個に、符号付き18ビットは十分ですか。

解説を見る

正の上限は9×16384=147456で、18ビットの最大値131071を超えます。符号付き19ビットは262143まで表せます。

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