Altifigence Academy

8 / 24 · 実習

実習:量子化の契約を実行する

同じuint8設定で−40を量子化します。コードと逆量子化値は何ですか。どのアサーションを追加しますか。

目標と準備

コードへの写像、負の中間値、飽和、中心化した整数内積を実行します。ファイルにはNode.jsが必要で、外部パッケージは不要です。新しい空フォルダにquantize-lab.mjsを作り、以下のコードをコピーしてnode quantize-lab.mjsを実行します。Nodeがなければ予測表を手で完成させます。インストール済みDigital Design Studioに、この形式のファイルの作成・オープンをサポートする操作があれば、同じファイルをそこで手動作成して確認できます。この説明はDDS内での自動プロジェクト作成や実行を保証するものではありません。

実行前に予測する

スケール0.25、ゼロ点128では、−0.625は中間値−2.5になり、偶数−2に丸めてコード126になります。−0.375も126です。ゼロは128、0.375と0.625はともに130です。40は本来288になるため、uint8飽和で255に変わります。[126,126,128,130,130,255]を予測します。これらは負と正の中間値、実数ゼロ、クリップを区別します。

[130,126]を[2,−2]に中心化します。重み[3,−2]との和は10です。合成スケール0.125では実数1.25で、出力スケール0.25、ゼロ点128なら133です。このコードは数値契約の演習であり、モデルインポータや精度ベンチマークではありません。

最初にアサーションを変更せず実行します。次に0.625を0.875へ変えます。期待値を変える前に、中間値3.5が4に丸められコード132になると予測してください。roundEvenを一時的にMath.roundに置き換え、負の中間値のアサーションが失敗することを観察してから戻します。意図した失敗は、テストが要求動作を観測している証拠です。

最後に、飽和コード255を逆量子化します。31.75を表し、40に対する誤差は−8.25です。これは通常の半刻みの丸め上限を大きく超えます。スケール選択には範囲と分解能のトレードオフがあります。モデル精度の測定には別のモデルとデータセットが必要です。予測、コマンド出力、変更例の理由を記録します。

実行可能なファイル

javascript
import assert from 'node:assert/strict';
// An exact tie is handled with nearest-even, including negative input.
export function roundEven(v) {
  const f = Math.floor(v), d = v - f;
  return d < 0.5 ? f : d > 0.5 ? f + 1 : f % 2 === 0 ? f : f + 1;
}
export const quantize = (x, s, z) => Math.min(255, Math.max(0, roundEven(x / s) + z));
const values = [-0.625, -0.375, 0, 0.375, 0.625, 40];
const codes = values.map(x => quantize(x, 0.25, 128));
assert.deepEqual(codes, [126, 126, 128, 130, 130, 255]);
assert.equal(roundEven(-1.5), -2);
assert.equal(roundEven(-2.5), -2);
const xq = [130, 126], wq = [3, -2];
const acc = xq.reduce((sum, x, i) => sum + (x - 128) * wq[i], 0);
assert.equal(acc, 10);
assert.equal(acc * 0.25 * 0.5, 1.25);
assert.equal(quantize(1.25, 0.25, 128), 133);
console.log(JSON.stringify({codes, acc, real: 1.25, output: 133}));

自分で考えてみましょう

同じuint8設定で−40を量子化します。コードと逆量子化値は何ですか。どのアサーションを追加しますか。

解説を見る

範囲制限前のコードは−32なので0にクリップされます。逆量子化は(0−128)×0.25=−32です。負の飽和を網羅するため、quantize(−40,0.25,128)が0に等しいアサーションを追加します。

Lesson files

quantize-lab.mjs ↓

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