量子化は、人工知能のモデルを小さくする技術として広く知られるようになった。学習済みモデルでは、数十億から数千億個に及ぶ重みが数値として保存されている。重みを 32 ビットや 16 ビットの浮動小数点数から、8 ビットや 4 ビットの形式へ変換すれば、重み本体が占める保存容量を減らせる。メモリから読み出すデータ量も減るため、対応する演算回路や推論処理を使える環境では、実行時のメモリ消費や処理時間も削減できる。
ただし、「32 ビットの小数を 4 ビットの整数へ丸める」という説明だけでは、量子化後のモデルがなぜ動作を維持できるのか、同じ 4 ビットでも方式によって結果が異なるのはなぜか、どの値を高い精度で残すべきかを説明できない。4 ビットで表現できる状態は最大でも 16 種類である。それに対して、量子化前の重みははるかに多くの値を取る。多数の異なる重みを 16 種類の状態へ対応させる以上、どこかで異なる値を同じものとして扱わなければならない。
量子化によって最初に失われるのは、小数点以下の桁そのものではない。元の空間に存在した値どうしの区別が失われる。近い値を同じ代表値へまとめれば、保存量を減らしても計算結果を大きく変えずに済む可能性がある。一方で、モデルの出力へ大きく影響する値まで同じ代表値へまとめれば、数値上の差が小さくても性能は低下する。量子化の成否は、ビット数だけでなく、どの差を残し、どの差を捨てたかによって決まる。
この問題は人工知能の登場によって生まれたものではない。量子化の理論は、音声通信で連続する音圧を有限個の振幅へ変換する問題、画像を有限個の濃淡で表す問題、計算機で実数を有限精度の数として扱う問題、確率分布を有限個の代表点で近似する問題として研究されてきた。Gray と Neuhoff の包括的な調査は、量子化の歴史を 19 世紀末の丸め誤差研究まで遡り、通信、信号処理、情報理論、数値計算の中で発展した理論を整理している[1]。
分野によって対象は異なる。音声では振幅を有限段階へ分け、画像では色や明るさを有限個の値へまとめ、確率論では連続分布を有限個の点で近似し、ニューラルネットワークでは重みや活性値を低ビット形式へ移す。それでも、各分野で行われている操作には共通する構造がある。入力として存在する多数の状態を、保存または処理できる少数の状態へ対応させることである。
量子化は、有限の表現能力に収めるために、元の空間に存在した区別の一部を捨てる操作と定義できる。整数への変換は、その操作を実装する代表的な方法の一つである。量子化後の値が整数であっても、その整数は元の数値そのものではなく、代表値や量子化領域を指す番号として使われることが多い。この区別を出発点として、量子化を写像、確率、幾何、情報量、有限精度計算、ニューラルネットワークの順に捉え直すと、低ビット化の仕組みだけでなく、「量子化」という名称が量子力学とどのような関係にあるのかも整理できる。
1. 小数を整数にするだけでは量子化を説明できない
1.1 丸めによって消えるのは桁ではなく区別である
0.121、0.123、0.126 という 3 個の数を、0.125 という一つの値で代表させる場面を考える。表示だけを見れば、小数点以下の細かな桁を省略したように見える。しかし、処理後に失われているのは文字としての末尾の数字ではない。0.121 と 0.123 が異なるという情報、0.123 と 0.126 が異なるという情報を、量子化後の値から判定できなくなっている。
元の値を \(x\)、量子化する処理を \(Q\) と書くと、この例は次のように表せる。
Q(0.121)=Q(0.123)=Q(0.126)=0.125
\]
\(Q\) は量子化器を表す。左辺にある 3 個の入力は互いに異なるが、右辺では同じ出力へ集約されている。入力の桁数が減ったことは表面的な結果にすぎない。数学的に起きているのは、異なる複数の入力を同じ出力へ対応させる多対一の変換である。
| 元の値 | 量子化後の値 | 量子化後に判定できること | 量子化後に判定できないこと |
|---|---|---|---|
| 0.121 | 0.125 | 0.125 で代表される範囲に入っていたことは判定できる。 | 元の値が 0.121 であったことは特定できない。 |
| 0.123 | 0.125 | 0.125 で代表される範囲に入っていたことは判定できる。 | 元の値が 0.123 であったことは特定できない。 |
| 0.126 | 0.125 | 0.125 で代表される範囲に入っていたことは判定できる。 | 元の値が 0.126 であったことは特定できない。 |
同じ構造は、小数以外の対象にも現れる。年齢を 0 歳から 9 歳、10 歳から 19 歳という階級へまとめれば、17 歳と 18 歳は異なる整数であっても同じ階級へ入る。位置情報を 1 km 四方の格子へまとめれば、異なる緯度と経度が同じ格子番号になる。画像の色を 256 色へ減らせば、元は少し異なっていた複数の色が同じ色番号になる。
これらの例では、元の値が整数か小数か、一次元か二次元かは本質ではない。量子化器は入力空間をいくつかの領域へ分け、同じ領域に入った入力へ同じ出力を割り当てる。年齢階級なら 10 年ごとの区間、位置情報なら地図上の格子、画像なら色空間内の領域が量子化の単位になる。
量子化の中心は、数値の形式を変更することよりも、どこに区別の境界を置くかにある。0.1249 と 0.1251 のように非常に近い値でも、境界の両側にあれば別の代表値へ割り当てられる。一方で、同じ領域に入るよう設計されていれば、それより大きな差を持つ値が同じ出力になる場合もある。量子化後に残る情報は、元の値そのものではなく、元の値がどの領域に属していたかという情報である。
1.2 標本化、量子化、符号化は別の操作である
連続する音声をデジタルデータへ変換する過程では、標本化、量子化、符号化という複数の操作が行われる。この三つは連続して実行されるため一括して「デジタル化」と呼ばれることがあるが、それぞれが制限している対象は異なる。
音声を物理現象として見ると、空気の圧力が時間とともに連続的に変化している。記録するためには、まずどの時刻で圧力を測るかを決め、その時刻で得た圧力をどの数値として表すかを決め、最後にその数値をどのビット列として保存するかを決める必要がある。
| 操作 | 制限する対象 | 音声の例 | 失われる可能性がある情報 |
|---|---|---|---|
| 標本化 | 時間や空間のどの位置で値を観測するかを制限する。 | 連続する音圧を 1 秒間に 48,000 回測定する。 | 測定時刻と測定時刻の間で起きた変化を直接は記録できない。 |
| 量子化 | 観測した値をどの段階で表現するかを制限する。 | 各時点の音圧を、有限個の振幅値のいずれかへ対応させる。 | 同じ振幅段階へ入った音圧どうしの細かな差を区別できない。 |
| 符号化 | 量子化後の状態をどの記号列で記録するかを決める。 | 各振幅値へ固定長または可変長のビット列を割り当てる。 | 可逆な符号化であれば、量子化後の状態そのものは失われない。 |
標本化は、時間軸または空間軸に沿って、どこを観測するかを決める。1 秒間に 48,000 回測定する場合、隣接する測定点の間隔は約 20.8 マイクロ秒になる。標本化によって連続する時間から有限個の観測時点が選ばれるが、各時点で得られる振幅値は、この段階ではまだ連続値として考えられる。
量子化は、標本化によって得た各時点の振幅を、有限個の代表値へ対応させる。たとえば、ある時点で測定した音圧が 0.121、別の時点では 0.123 であっても、両方を同じ振幅段階へ割り当てる場合がある。時間上の測定位置は別々に残っていても、振幅方向の細かな差は失われる。
符号化は、量子化後の振幅段階へ記録用の記号を割り当てる。16 個の振幅段階があるなら、各段階を 4 ビットの固定長符号で表せる。頻繁に現れる段階へ短い符号を割り当てる可変長符号を使うこともできる。符号化の役割は、すでに選ばれた状態を記録可能な形式へ変換することであり、量子化によって失われた振幅差を復元することではない。
この順序を逆から見ると、各操作の責任範囲が明確になる。ビット列を完全に復号できれば、量子化後の振幅値までは戻せる。しかし、その振幅値から量子化前の音圧を一意に取り出すことはできない。また、すべての量子化値を正しく復元できても、標本化されなかった時刻の音圧が直接記録されているわけではない。
人工知能のモデルでも同じ区別が必要になる。重みを有限個の代表値へ割り当てる処理が量子化であり、その代表値や番号を 4 ビットずつ詰めて保存する処理が符号化である。モデルファイルが小さくなる結果だけを見れば両者は一体に見えるが、量子化はどの値を同一視するかを決め、符号化はその結果をどのビット列で記録するかを決めている。
1.3 量子化後の整数は元の値ではなく領域の番号である
量子化後の値として整数 7 が保存されていても、元の値が数値として 7 であったとは限らない。整数 7 は、量子化器が用意した 8 番目の代表値、または 8 番目の領域を指す番号として使われる場合がある。整数を使う理由は、有限個の状態を少ないビットで効率よく区別できるからである。
たとえば、0.120 以上 0.130 未満の値をコード 7 へ対応させ、コード 7 の代表値を 0.125 と定めたとする。この関係は次のようになる。
| 対象 | 値 | 役割 |
|---|---|---|
| 量子化領域 | 0.120 以上 0.130 未満 | 同じコードへ集約する入力値の範囲を定める。 |
| コード | 7 | 量子化領域または代表値を識別する番号として保存する。 |
| 代表値 | 0.125 | コード 7 を数値計算へ戻すときに使用する近似値である。 |
入力が 0.121 なら、量子化器はその値が指定された領域に入ることを確認し、コード 7 を出力する。計算時には、コード 7 に対応する代表値 0.125 を使用する。この処理では、0.121 を整数 7 という数値へ置き換えて計算しているのではない。0.121 が所属する領域を整数 7 で記録し、必要なときに 0.125 という代表値へ置き直している。
ニューラルネットワークで使われる低ビット量子化では、代表値を直接表として保持する場合もあれば、整数コード、尺度、基準点を組み合わせて代表値を計算する場合もある。どちらの場合も、低ビット整数は元の重みそのものではなく、近似された重みを再構成するための記号である。この構造を区別しないと、「4 ビット整数で計算する」という説明と、「4 ビットで保存した重みを高い精度の演算へ展開して使う」という説明が混同される。
1.4 量子化は非可逆である
0.121、0.123、0.126 が同じコード 7 に変換された後、コード 7 だけから元の値を特定することはできない。この関係は次のように書ける。
Q(0.121)=Q(0.123)=Q(0.126)=7
\]
量子化器 \(Q\) の出力が 7 であることは分かっても、入力が 0.121、0.123、0.126 のどれであったかは決められない。逆向きにたどろうとすると、一つの出力に対して複数の入力候補が存在するためである。
コード 7 から代表値 0.125 を出力する処理を、量子化の逆変換または逆量子化と呼ぶことがある。しかし、この処理は量子化前の値を復元しているわけではない。コード 7 に対して事前に定めた代表値を置き直している。元の入力が 0.121 であっても 0.126 であっても、出力は同じ 0.125 になる。
量子化前の値を \(x\)、コードを \(q\)、再構成した値を \(\hat{x}\) とすると、処理の流れは次のように表せる。
x \longrightarrow q \longrightarrow \hat{x}
\]
\(x\) は元の入力、\(q\) は量子化後のコード、\(\hat{x}\) はコードから作り直した代表値である。量子化が情報を失わなければ \(\hat{x}=x\) となるが、多対一の量子化では一般に次の関係になる。
\hat{x}\neq x
\]
元の値と代表値の差は量子化誤差になる。0.121 を 0.125 で代表させた場合、差の大きさは 0.004 である。0.126 を同じ値で代表させた場合、差の大きさは 0.001 になる。同じコードへ入った値であっても、代表値からの距離は同じとは限らない。
非可逆性は、量子化の欠点だけを表しているわけではない。多数の入力を少数のコードへまとめるから、保存に必要な状態数を減らせる。状態数が減るから、少ないビットで記録できる。少ないビットで記録できるから、保存容量、通信量、メモリからの読み出し量を減らせる。この利益は、元の値を完全に復元できないことと同じ多対一構造から生じている。
量子化の利益と損失は別々の現象ではない。区別を捨てることが保存量を減らし、同じ区別を捨てたことが誤差を生む。圧縮率と精度が交換関係になるのは、実装の性能が不足しているからではなく、有限個のコードへ多数の入力を対応させる操作そのものが非可逆だからである。
1.5 有限ビットは多対一対応を避けられなくする
量子化が多対一になる理由は、有限ビットで区別できる状態数に上限があるためである。1 ビットで表せる状態は 0 と 1 の 2 種類、2 ビットでは 4 種類、4 ビットでは 16 種類、8 ビットでは 256 種類になる。ビット数を \(b\) とすると、表現できるビット列の総数 \(N\) は次の式で与えられる。
N=2^b
\]
\(b\) は一つの値を保存するために使うビット数、\(N\) はそのビット数で区別できる状態数である。4 ビットなら \(2^4=16\) となるため、異なるコードは 16 個しか用意できない。
| ビット数 | 表現できる状態数 | 量子化上の意味 |
|---|---|---|
| 1 ビット | 2 | 入力全体を 2 個の領域へ分け、それぞれを一つのコードで代表する。 |
| 2 ビット | 4 | 入力全体を最大 4 個の領域へ分けられる。 |
| 4 ビット | 16 | 入力全体を最大 16 個のコードで区別できる。 |
| 8 ビット | 256 | 4 ビットより細かな区別を残せるが、保存量は増える。 |
一方、0 以上 1 以下の実数だけを考えても、その範囲には有限個では数え切れないほど多くの値が存在する。4 ビットの 16 個のコードで、この実数区間のすべての値を一対一に表すことはできない。少なくとも一つのコードには、複数の実数を対応させる必要がある。
これは特定の量子化方式に由来する制約ではない。丸め方を変えても、代表値を不均等に配置しても、入力分布を学習しても、4 ビットで区別できるコードが 16 個である事実は変わらない。方式によって変更できるのは、どの入力を同じコードへまとめるか、16 個のコードを入力空間のどこへ配分するかである。
値が 0 の周辺へ集中しているなら、その周辺へ多くの代表値を配置し、まれにしか現れない大きな値の範囲を粗く分ける設計が考えられる。すべての値が一様に現れるなら、等間隔の代表値が適する場合がある。モデルの出力へ強く影響する値が分かっているなら、その値を高い精度で残す設計も可能になる。ビット数が状態数を制約し、その制約の中で代表値の配置を選ぶことが、量子化器設計の出発点になる。
量子化を「小数を整数にする処理」と捉えると、整数への変換方法だけが論点になる。有限個のコードによって入力空間を分割する処理と捉えると、検討すべき対象は変わる。どこに境界を置くか、各領域をどの値で代表するか、入力がどの程度の確率で各領域へ入るか、誤差をどの尺度で評価するかが量子化器の性能を決める。
この段階で、量子化の最小構造を次のように整理できる。元の入力空間があり、その空間を有限個の領域へ分割し、各領域へコードを割り当て、コードから計算用の代表値を再構成する。入力空間、領域、コード、代表値の関係を数学的に定義することで、量子化を丸め操作から一般的な写像の問題へ拡張できる。
2. 量子化器は入力空間をセルへ分ける写像である
2.1 量子化器を符号化器と復号器へ分ける
量子化を数学的に記述するには、元の値、保存されるコード、計算に使う代表値を分ける必要がある。元の入力が属する集合を \(X\)、保存可能なコードの集合を \(I\)、復号後に使用する代表値の集合を \(C\) とする。
入力をコードへ対応させる写像を符号化器 \(E\)、コードから代表値を取り出す写像を復号器 \(D\) と書く。量子化器 \(Q\) は、この二つを順番に適用する合成写像として表せる。
E:X\rightarrow I
\]
D:I\rightarrow C
\]
Q=D\circ E:X\rightarrow C
\]
\(X\) は入力空間、\(I\) はコード集合、\(C\) は再構成値の集合である。合成を表す \(D\circ E\) は、最初に \(E\) を適用し、その出力へ \(D\) を適用することを意味する。入力 \(x\in X\) に対する量子化結果は、次の順序で得られる。
x\xrightarrow{E}i\xrightarrow{D}c_i
\]
\(x\) は元の入力、\(i\) は保存されるコード、\(c_i\) はコード \(i\) に対応する代表値である。全体としては次の関係になる。
Q(x)=D(E(x))
\]
たとえば、0.120 以上 0.130 未満の値をコード 7 へ割り当て、コード 7 の代表値を 0.125 とする。このとき、入力 0.123 に対して符号化器は 7 を返し、復号器は 7 から 0.125 を返す。
E(0.123)=7
\]
D(7)=0.125
\]
Q(0.123)=D(E(0.123))=0.125
\]
この分解によって、整数コード 7 と代表値 0.125 が別の対象であることが明確になる。コード 7 は保存や通信のための記号であり、0.125 は数値計算へ戻すときの近似値である。量子化後に整数を保存していても、元の値を整数 7 として扱っているわけではない。
| 構成要素 | 数学的表記 | 役割 | 具体例 |
|---|---|---|---|
| 入力空間 | \(X\) | 量子化前の値が属する集合である。 | 実数直線、画像の色ベクトル、ニューラルネットワークの重み行列などが該当する。 |
| コード集合 | \(I\) | 保存または通信に使用できる有限個の記号を集めた集合である。 | 4 ビットなら最大 16 個、8 ビットなら最大 256 個のコードを持つ。 |
| 代表値集合 | \(C\) | 各コードを数値やベクトルとして解釈するときに使用する値の集合である。 | 0.125 のような実数や、複数成分を持つ代表ベクトルが該当する。 |
| 符号化器 | \(E\) | 入力がどのコードに属するかを決める。 | 0.123 をコード 7 へ対応させる。 |
| 復号器 | \(D\) | コードに対応する代表値を返す。 | コード 7 から代表値 0.125 を返す。 |
| 量子化器 | \(Q=D\circ E\) | 入力を最終的な代表値へ対応させる。 | 0.123 を 0.125 へ近似する。 |
入力空間 \(X\) は実数直線に限られない。画像の一画素を赤、緑、青の 3 成分で表すなら、入力は三次元ベクトルになる。音声の一定区間をまとめて扱うなら、複数時点の振幅を並べたベクトルが入力になる。ニューラルネットワークでは、一つの重みだけでなく、複数の重みをまとめたブロックや行列全体を量子化の対象にできる。
コード集合 \(I\) は、量子化器が区別できる状態を表す。4 ビットなら 16 通りのビット列を作れるため、最大 16 個のコードを利用できる。コードを \(0,1,\ldots,15\) という整数で表すことは多いが、数学的には各要素を区別できればよい。コードが整数であることより、コード集合が有限であることに意味がある。
代表値集合 \(C\) は、コードを元の計算領域へ戻すために使う。代表値は等間隔に並ぶ場合もあれば、入力分布に合わせて不均等に置かれる場合もある。一つの尺度と基準点から代表値を計算する方式も、代表値を表として直接保持する方式も、写像 \(D:I\rightarrow C\) として同じ形で記述できる。
符号化器と復号器を分ける理由は、両者が別の設計問題を担うからである。符号化器は、どの入力を同じコードへまとめるかを決める。復号器は、まとめられた入力群をどの値で代表するかを決める。入力の分け方が同じでも代表値を変えれば誤差は変わり、代表値が同じでも境界の位置を変えれば各コードへ入る入力が変わる。
2.2 セルは「同じものとして扱う範囲」を表す
符号化器 \(E\) がコード \(i\) を返す入力の集合を、量子化セル \(R_i\) と呼ぶ。集合を条件によって定義する記法を使うと、次のように表せる。
R_i=\{x\in X\mid E(x)=i\}
\]
縦線 \(\mid\) は「という条件を満たす」という意味である。この式は、入力空間 \(X\) のうち、符号化器によってコード \(i\) へ割り当てられる入力をすべて集めた集合が \(R_i\) であることを示す。
実数を一様な間隔で量子化する場合、セルは区間になる。たとえば、\(-0.5\) 以上 \(0.5\) 未満の値をコード 0 へ対応させるなら、セル \(R_0\) は次の区間である。
R_0=[-0.5,0.5)
\]
この記法では、左端の \(-0.5\) は範囲に含み、右端の \(0.5\) は含まない。\(-0.4\)、0、0.49 はいずれも \(R_0\) に属するため、同じコードへ変換される。
E(-0.4)=E(0)=E(0.49)=0
\]
セル内部にある値の差は、符号化後には残らない。\(-0.4\) と 0.49 の差は 0.89 あるが、両者が同じセルに入る限り、コードだけから区別することはできない。一方、0.49 と 0.51 の差は 0.02 しかなくても、0.5 に境界があれば別のコードへ割り当てられる。
量子化器が保存する区別は、入力値どうしの距離だけでは決まらない。セル境界のどちら側に位置するかによって決まる。同じセルの内部では差を捨て、境界を越えたときに初めて別の状態として扱う。
| 入力の組 | 数値上の差 | セルの関係 | 量子化後の扱い |
|---|---|---|---|
| -0.4 と 0.49 | 0.89 | 両方とも \([-0.5,0.5)\) に属する。 | 同じコードへ変換され、差は保存されない。 |
| 0.49 と 0.51 | 0.02 | 0.5 を境界として異なるセルに属する。 | 異なるコードへ変換され、区別が保存される。 |
この例から、量子化器は「近い値を同じものとして扱う装置」とだけ説明できないことが分かる。最近傍量子化では近さがセルを決めるが、どの距離を使うか、代表値をどこへ置くか、境界上の値をどちらへ割り当てるかを先に決める必要がある。
高次元空間では、セルは区間ではなく領域になる。二次元の位置情報を格子へ量子化する場合、セルは正方形や長方形になる。色ベクトルを代表色へ量子化する場合、セルは色空間内の三次元領域になる。ベクトル量子化で最近傍の代表点を選ぶ場合、各セルは代表点を母点とするボロノイ領域になる。
セルの形状が変わっても、その役割は変わらない。一つのセルに属するすべての入力は、量子化後には同じコードで表現される。セルは、量子化器が「この範囲の差は保存しない」と決めた領域である。
2.3 セル全体は入力空間の分割を作る
符号化器がすべての入力へ一つのコードを割り当てるなら、量子化セルの集まりは入力空間 \(X\) 全体を覆う。コード集合を \(I\) とすると、すべてのセルの和集合は \(X\) になる。
\bigcup_{i\in I}R_i=X
\]
記号 \(\bigcup\) は複数の集合をまとめた和集合を表す。この式は、どの入力 \(x\in X\) も、少なくとも一つのセルへ入ることを意味する。入力がどのセルにも属さなければ、符号化器はその入力に対するコードを返せない。
異なるコードに対応するセルは、互いに重ならない。コード \(i\) とコード \(j\) が異なるとき、次の関係が成り立つ。
R_i\cap R_j=\varnothing\qquad(i\neq j)
\]
\(\cap\) は共通部分、\(\varnothing\) は要素を持たない空集合を表す。一つの入力が同時に二つの異なるセルへ属すると、符号化器がどちらのコードを返すべきか決められない。そのため、セル境界上の値をどちらへ含めるかを含めて、各入力の割当てを一意にする必要がある。
たとえば実数直線を次の 3 個のセルへ分ける。
R_0=(-\infty,-0.5)
\]
R_1=[-0.5,0.5)
\]
R_2=[0.5,\infty)
\]
この分割では、\(-0.5\) は \(R_1\)、0.5 は \(R_2\) に含まれる。半開区間を使うことで、境界上の値が二つのセルへ重複して入ることを防いでいる。
量子化セルの集合が入力空間を覆い、互いに重ならないとき、その集合族は \(X\) の分割を作る。量子化器を設計することは、入力空間を有限個の領域へ分割し、各領域へコードと代表値を割り当てることに等しい。
| 分割の条件 | 数式 | 量子化器としての意味 |
|---|---|---|
| 全域性 | \(\bigcup_{i\in I}R_i=X\) | すべての入力が少なくとも一つのコードへ割り当てられる。 |
| 排他性 | \(R_i\cap R_j=\varnothing\) | 一つの入力が二つの異なるコードへ同時に割り当てられない。 |
| 代表値の割当て | \(D(i)=c_i\) | 各セルに一つの再構成値が対応する。 |
実際の量子化器では、用意したコードがすべて使われるとは限らない。入力分布によっては、どの入力も入らない空のセルが生じる場合がある。そのコードは数学上の集合 \(I\) には存在していても、実際の入力に対しては出力されない。量子化器が実質的に使用している状態数は、空でないセルの個数になる。
2.4 代表値とセル境界は別々に決める
各コード \(i\) に対応する代表値を \(c_i\) と書くと、復号器は次のように定義できる。
D(i)=c_i
\]
セル \(R_i\) に入った入力は、すべて代表値 \(c_i\) へ量子化される。
Q(x)=c_i\qquad(x\in R_i)
\]
この式は、量子化器がセルの分割と代表値の割当てによって完全に記述できることを示す。どのセルへ入るかを符号化器が決め、そのセルに対応する代表値を復号器が返す。
セル境界と代表値は関連するが、同一ではない。セルを固定したまま代表値を変えることも、代表値を固定したまま境界を変えることもできる。
たとえば、セルを \([0,1)\) とし、この範囲を一つの値で代表させる場合を考える。代表値を 0 にすれば、0 に近い入力の誤差は小さいが、1 に近い入力の誤差は大きくなる。代表値を 0.5 にすれば、区間の両端に対する最大誤差を均等にできる。入力が 0 の周辺に集中しているなら、平均誤差を減らすために 0.5 より小さい代表値を選ぶ方がよい場合もある。
| 設計変更 | 変わるもの | 変わらないもの | 誤差への影響 |
|---|---|---|---|
| 代表値を変更する | 各セルをどの値で近似するかが変わる。 | どの入力が同じコードへ入るかは変わらない。 | セル内部の入力に対する再構成誤差が変わる。 |
| セル境界を変更する | 各コードへ割り当てられる入力の範囲が変わる。 | 代表値を固定していれば復号後の候補値は変わらない。 | どの入力がどの代表値へ近似されるかが変わる。 |
最近傍量子化では、入力を最も近い代表値へ割り当てる。その場合、代表値を配置するとセル境界が導かれる。一次元で隣接する代表値が \(c_i\) と \(c_{i+1}\) なら、通常のユークリッド距離では両者の中点が境界になる。
t_i=\frac{c_i+c_{i+1}}{2}
\]
\(t_i\) は二つの代表値から等距離にある点である。中点より \(c_i\) 側の入力は \(c_i\) へ、中点より \(c_{i+1}\) 側の入力は \(c_{i+1}\) へ割り当てられる。
ただし、距離以外の損失を使う場合や、入力ごとに重要度が異なる場合は、境界が単純な中点になるとは限らない。量子化器のセルは、使用する損失関数と代表値によって決まる。代表値の配置だけを見ても、量子化器全体の性質は確定しない。
2.5 同値関係として読む
量子化後に同じコードを持つ入力どうしを、量子化器にとって同じものと定める。入力 \(x\) と \(y\) の関係を、次のように定義する。
x\sim_Q y
\quad\Longleftrightarrow\quad
E(x)=E(y)
\]
記号 \(\sim_Q\) は、「量子化器 \(Q\) の下で同値である」という関係を表す。右辺は、\(x\) と \(y\) が同じコードへ変換されることを意味する。
この関係は、同値関係に必要な 3 個の性質を満たす。
| 性質 | 数式 | 量子化器における意味 |
|---|---|---|
| 反射性 | \(x\sim_Q x\) | どの入力も、自分自身と同じコードを持つ。 |
| 対称性 | \(x\sim_Q y\Rightarrow y\sim_Q x\) | \(x\) と \(y\) が同じコードなら、\(y\) と \(x\) も同じコードである。 |
| 推移性 | \(x\sim_Q y,\ y\sim_Q z\Rightarrow x\sim_Q z\) | \(x\)、\(y\)、\(z\) が同じコードでつながるなら、3 個すべてが同じセルに属する。 |
反射性は、\(E(x)=E(x)\) が常に成り立つため成立する。対称性は、\(E(x)=E(y)\) なら \(E(y)=E(x)\) でもあるため成立する。推移性は、\(E(x)=E(y)\) かつ \(E(y)=E(z)\) なら \(E(x)=E(z)\) となるため成立する。
この同値関係によって、入力空間 \(X\) は複数の同値類へ分かれる。同値類とは、量子化後には区別されない入力をすべて集めた集合である。入力 \(x\) を含む同値類を \([x]\) と書くと、次のように定義できる。
[x]=\{y\in X\mid y\sim_Q x\}
\]
この集合は、\(x\) と同じコードへ変換される入力をすべて含む。量子化セル \(R_i\) と同値類は、同じ分割を異なる立場から記述している。コード \(i\) から見ればセル \(R_i\) であり、入力 \(x\) から見れば同値類 \([x]\) である。
たとえば \(-0.5\) 以上 0.5 未満の入力をコード 0 へ変換する場合、0.2 を含む同値類は次の区間になる。
[0.2]=[-0.5,0.5)
\]
0.2、0.3、\(-0.4\) は実数として異なるが、この量子化器の下では同じ同値類に属する。量子化後の処理は、これらを個別の実数としてではなく、一つの状態として扱う。
2.6 商集合は量子化後に残った世界を表す
同値関係によって作られた同値類の集合を、商集合と呼ぶ。量子化器による同値関係を使うと、商集合は次のように書ける。
X/{\sim_Q}
\]
この商集合の要素は、元の入力値ではなく同値類である。量子化前の入力空間 \(X\) では、0.121、0.123、0.126 は 3 個の異なる要素だった。3 個が同じコードへ入る量子化器を適用すると、商集合では一つの同値類として現れる。
量子化器が見ている世界は、元の \(X\) そのものではない。\(X\) に存在した細かな違いを取り除き、量子化器が残した区別だけで構成された \(X/{\sim_Q}\) である。
| 空間 | 要素 | 区別できること |
|---|---|---|
| 入力空間 \(X\) | 量子化前の個々の入力値 | 0.121、0.123、0.126 を別々の値として区別できる。 |
| 商集合 \(X/{\sim_Q}\) | 量子化後に同じものとみなされる入力の集合 | 3 個の値が同じセルに属することは分かるが、セル内部の差は区別できない。 |
| コード集合 \(I\) | 同値類へ付けた有限個のラベル | どの同値類に属するかを少ないビットで記録できる。 |
| 代表値集合 \(C\) | 各同値類を計算上代表する値 | 同値類を一つの近似値として後続計算へ渡せる。 |
商集合とコード集合は密接に対応する。空でない各量子化セルへ一つずつ異なるコードを割り当てるなら、商集合の要素と実際に使用されるコードの間には一対一の対応がある。コードは、同値類そのものを保存する代わりに付けた短い名前と解釈できる。
この見方によって、量子化を整数丸めから切り離せる。年齢を年代へまとめる場合、同じ年代に属する年齢が同値類を作る。地理座標を格子へまとめる場合、同じ格子に入る位置が同値類を作る。画像を代表色へ減色する場合、同じ代表色へ割り当てられる色が同値類を作る。クラスタリングでは、同じクラスタ番号を持つデータが同値類を作る。
ただし、何らかの分類を行えば常に工学的な量子化と呼ぶわけではない。量子化として扱う場面では、有限または離散的なコードへ入力を対応させ、元の値の代わりにそのコードや代表値を保存、通信、計算に使う。分類によって導入された同値関係が、元の連続値や高精度値の表現を置き換えることが量子化の機能になる。
商集合として読むと、量子化による情報損失を明確に記述できる。失われた情報は、代表値と元の値の数値差だけではない。同じ同値類に入った要素どうしを識別する能力そのものが失われている。量子化誤差は、この失われた区別が数値計算上どの程度の影響を持つかを測る一つの方法である。
2.7 確率と平均誤差を扱うにはセルを測定可能にする
入力を確率変数として扱う場合、各セルへ入力が入る確率を計算する必要がある。セル \(R_i\) に入る確率は、次のように表せる。
P(X\in R_i)
\]
この確率を定義するには、各セルが確率論上の事象として扱える集合でなければならない。実数上の区間や、高次元空間の通常の幾何学的領域は、この条件を満たすように定義できる。
量子化後にコード \(i\) が出現する確率を \(p_i\) とすると、次の関係になる。
p_i=P(X\in R_i)
\]
コードの出現確率は、符号化器が決めるセルと、入力の確率分布の両方によって決まる。同じ量子化器でも入力分布が変われば、各コードの出現頻度は変わる。同じ入力分布でもセル境界を動かせば、各セルが受け取る確率質量が変わる。
たとえば入力が 0 の周辺へ集中しているなら、0 の周辺にあるセルのコードが頻繁に出現する。すべてのセルを同じ幅にしても、コードの出現確率は均等にならない。逆に、各セルが同程度の確率を受け取るように境界を配置すれば、セル幅は入力分布の密度に応じて変化する。
平均量子化誤差も、セルごとに計算できる。元の値と代表値の差を二乗して評価する場合、平均二乗誤差は概念的に次の形になる。
\mathbb{E}\left[(X-Q(X))^2\right]
\]
\(\mathbb{E}\) は確率分布に従った平均、\(X\) は量子化前の確率変数、\(Q(X)\) は量子化後の代表値である。この平均は、値が頻繁に現れる領域の誤差を強く反映する。まれな入力で大きな誤差が生じても、出現確率が低ければ平均への寄与は小さい。
量子化器を写像として定義した段階では、すべてのセル分割と代表値配置が候補になる。確率分布と誤差尺度を加えると、その中からどの量子化器が目的に適しているかを比較できる。入力空間の分割が量子化器の構造を決め、入力分布と損失関数がその構造の評価基準を与える。
量子化器の数学的な最小構成は、入力空間 \(X\)、有限のコード集合 \(I\)、セル分割 \(\{R_i\}\)、代表値集合 \(C\)、符号化器 \(E\)、復号器 \(D\) から成る。多対一の符号化器が入力空間へ同値関係を導入し、その同値類をコードで記録し、代表値によって計算領域へ戻す。この構造を基礎に置くことで、次に扱う一様量子化を、単なる四捨五入ではなく、特定の規則でセルと代表値を配置した量子化器として分析できる。
3. 一様量子化では刻み幅と表現範囲が誤差を決める
3.1 一定間隔の代表値を置く
量子化器の中で最も基本的な形は、実数直線上へ一定間隔で代表値を並べる一様量子化器である。隣接する代表値の間隔を刻み幅 \(\Delta\) とすると、代表値は次のように配置される。
\ldots,-2\Delta,-\Delta,0,\Delta,2\Delta,\ldots
\]
\(\Delta\) は、量子化後に区別できる最小の変化量を表す。刻み幅が 0.25 なら、代表値は \(\ldots,-0.50,-0.25,0,0.25,0.50,0.75,\ldots\) と並ぶ。元の入力がこの格子上にない場合、量子化器は近くにある代表値の一つへ入力を対応させる。
入力 \(x\) を最も近い代表値へ割り当て、表現可能範囲の上限と下限をいったん考えない場合、一様量子化器は次の式で表せる。
Q(x)=
\Delta
\operatorname{round}
\left(
\frac{x}{\Delta}
\right)
\]
\(x\) は量子化前の値、\(\Delta\) は刻み幅、\(\operatorname{round}\) は最も近い整数へ丸める関数である。最初に \(x\) を \(\Delta\) で割ると、入力が格子の何段目に位置するかが得られる。その値を整数へ丸め、最後に \(\Delta\) を掛けることで、対応する代表値へ戻す。
\(\Delta=0.25\) のとき、入力 0.61 は次のように量子化される。
\frac{0.61}{0.25}=2.44
\]
\operatorname{round}(2.44)=2
\]
Q(0.61)=0.25\times2=0.50
\]
入力 0.68 では、格子上の位置が 2.72 になるため、整数 3 へ丸められる。
\frac{0.68}{0.25}=2.72
\]
\operatorname{round}(2.72)=3
\]
Q(0.68)=0.25\times3=0.75
\]
| 入力 | 格子上の位置 | 整数コード | 代表値 | 量子化誤差 |
|---|---|---|---|---|
| 0.61 | \(0.61/0.25=2.44\) | 2 | 0.50 | 元の値との差は 0.11 になる。 |
| 0.68 | \(0.68/0.25=2.72\) | 3 | 0.75 | 元の値との差は -0.07 になる。 |
| -0.61 | \(-0.61/0.25=-2.44\) | -2 | -0.50 | 元の値との差は -0.11 になる。 |
刻み幅を小さくすれば、隣接する代表値の距離が縮まり、入力に近い値を選びやすくなる。たとえば \(\Delta=0.25\) では 0.61 を 0.50 で表すが、\(\Delta=0.10\) なら 0.60 で表せる。表現可能範囲が同じなら、刻み幅を小さくするほど多くの代表値が必要になる。
一様量子化器は、入力分布にかかわらず、すべての場所へ同じ密度で代表値を配置する。値がほぼ均等に現れる場合には扱いやすいが、入力が狭い範囲へ集中している場合には、ほとんど使われない領域にも同じ数の段階を割り当てる。一定間隔という単純さは、計算と保存を容易にする一方、入力分布に応じた表現能力の配分を行わないという制約を持つ。
3.2 セル境界と量子化誤差
隣接する代表値のうち、どちらへ入力を割り当てるかを決める位置がセル境界になる。代表値が \(k\Delta\) と \((k+1)\Delta\) にある場合、通常の最近傍量子化では、その中点が境界になる。
t_k=
\frac{k\Delta+(k+1)\Delta}{2}
=
\left(k+\frac{1}{2}\right)\Delta
\]
\(t_k\) は、二つの代表値から等距離にある点である。この境界より左側の入力は \(k\Delta\) へ、右側の入力は \((k+1)\Delta\) へ対応する。境界上の値をどちらへ割り当てるかは、丸め規則によって決まる。
代表値 \(k\Delta\) に対応するセルは、概ね次の区間になる。
R_k=
\left[
\left(k-\frac{1}{2}\right)\Delta,
\left(k+\frac{1}{2}\right)\Delta
\right)
\]
セルの幅は \(\Delta\) であり、代表値はその中央に置かれている。入力がセルの中央にあれば誤差は 0 になる。入力が境界へ近づくほど代表値との差は大きくなり、境界の直前で絶対誤差は \(\Delta/2\) に近づく。
表現可能範囲の内部で、最も近い代表値へ丸める場合、量子化誤差を次のように定義する。
e(x)=x-Q(x)
\]
\(e(x)\) は元の入力から量子化後の代表値を引いた差である。\(e(x)\) が正なら代表値は元の入力より小さく、負なら代表値は元の入力より大きい。絶対値だけを見れば、セル内部では次の上限が成り立つ。
|e(x)|\leq\frac{\Delta}{2}
\]
この上限は、入力が表現可能範囲内にあり、最近傍の代表値へ割り当てられる場合のものである。範囲外の入力を端へ固定するクリッピングが起きると、誤差は \(\Delta/2\) を超える。
| 入力位置 | 代表値との関係 | 量子化誤差 |
|---|---|---|
| セル中央 | 入力が代表値と一致する。 | 誤差は 0 になる。 |
| セル中央と境界の間 | 入力は代表値と境界の間にある。 | 絶対誤差は 0 より大きく \(\Delta/2\) より小さい。 |
| セル境界付近 | 入力は隣接する二つの代表値からほぼ等距離にある。 | 絶対誤差は \(\Delta/2\) に近づく。 |
| 表現可能範囲外 | 最も近い代表値ではなく端の代表値へ固定される。 | 絶対誤差は \(\Delta/2\) を超える可能性がある。 |
刻み幅を半分にすれば、範囲内で生じる最大絶対誤差も半分になる。ただし、利用できるコード数を変えずに刻み幅だけを半分にすると、覆える実数範囲も半分になる。細かな値の違いを保存する能力と、広い値の範囲を表す能力は、有限個のコードを取り合う関係にある。
3.3 中央に 0 を置くか、境界を置くか
代表値を一定間隔で並べても、その格子を原点に対してどこへ置くかによって量子化器の性質は変わる。代表値の一つとして 0 を持つ配置は mid-tread 型、0 をセル境界に置く配置は mid-rise 型と呼ばれる。
mid-tread 型では、0 を中心とするセルが存在する。刻み幅を \(\Delta\) とすると、概ね \(-\Delta/2\) 以上 \(\Delta/2\) 未満の入力が 0 へ対応する。
Q(x)=0
\qquad
\left(
-\frac{\Delta}{2}
\leq x\lt
\frac{\Delta}{2}
\right)
\]
0 を正確に表現できるため、値が 0 の周辺へ集中するデータに適しやすい。ニューラルネットワークの重みや疎な信号では、0 または極めて小さな値が多い場合がある。そのような分布では、0 を代表値として持つことで、小さな値を一つの状態へまとめられる。
一方で、0 の周辺にある値は正負を問わず同じ 0 へ集約される。刻み幅が大きいと、後続計算で意味を持つ微小な値まで消える可能性がある。勾配更新のように、小さな値を繰り返し蓄積する処理では、各回の微小値が 0 へ量子化されると更新そのものが停止することがある。
mid-rise 型では、0 が二つのセルの境界になる。正の微小値は正側の代表値へ、負の微小値は負側の代表値へ割り当てられる。代表値は概ね次の位置に並ぶ。
\ldots,
-\frac{3\Delta}{2},
-\frac{\Delta}{2},
\frac{\Delta}{2},
\frac{3\Delta}{2},
\ldots
\]
正負の微小値を区別できる一方で、0 自体を代表値として持たない。入力が厳密に 0 であっても、丸め規則に従って \(-\Delta/2\) または \(\Delta/2\) のどちらかへ移される。
| 配置 | 0 の位置 | 利点 | 失敗条件 |
|---|---|---|---|
| mid-tread 型 | 0 が代表値になる。 | 0 を正確に表現でき、ゼロ近傍の値を一つの状態へまとめられる。 | 微小な正負の値が 0 へ消え、更新や小信号が失われる場合がある。 |
| mid-rise 型 | 0 がセル境界になる。 | 正の微小値と負の微小値を異なる代表値へ分けられる。 | 0 を正確に表現できず、ゼロ入力にも量子化誤差が生じる。 |
この違いは、代表値の間隔が同じでも量子化器の動作が同じにならないことを示す。刻み幅は格子の細かさを決めるが、原点に対する配置は、どの値を正確に表現し、どの値を同じセルへまとめるかを決める。0 を保存すべきか、微小な正負を区別すべきかによって、適切な配置は変わる。
3.4 アフィン量子化では尺度とゼロ点を使う
実際の計算機では、代表値を無限に並べることはできない。利用可能な整数コードの範囲を決め、その整数範囲を実数の表現範囲へ対応させる必要がある。ニューラルネットワークで広く使われるアフィン量子化は、尺度 \(s\) とゼロ点 \(z\) を使って、この対応関係を定める。
実数 \(x\) を整数コード \(q\) へ移す処理は、次の形で表せる。
q=
\operatorname{clip}
\left(
\operatorname{round}
\left(
\frac{x}{s}
\right)
+z,
q_{\min},
q_{\max}
\right)
\]
量子化後の整数コードから実数の代表値 \(\hat{x}\) を再構成する処理は、次のようになる。
\hat{x}=s(q-z)
\]
| 記号 | 意味 | 役割 |
|---|---|---|
| \(x\) | 量子化前の実数 | 整数コードへ変換する入力である。 |
| \(q\) | 量子化後の整数コード | 有限ビットで保存または演算に使用する。 |
| \(s\) | 尺度 | 整数コードが 1 増えたとき、再構成値がどれだけ増えるかを定める。 |
| \(z\) | ゼロ点 | 実数の 0 をどの整数コードへ対応させるかを定める。 |
| \(q_{\min}\) | 整数コードの下限 | 利用可能な最小コードを定める。 |
| \(q_{\max}\) | 整数コードの上限 | 利用可能な最大コードを定める。 |
| \(\operatorname{clip}\) | 範囲制限 | 下限より小さい値を下限へ、上限より大きい値を上限へ固定する。 |
尺度 \(s\) は、一様量子化における刻み幅 \(\Delta\) に相当する。たとえば \(s=0.02\) なら、隣接する整数コードが表す実数値の差は 0.02 になる。コードが 1 増えるたびに、再構成値も 0.02 ずつ増える。
ゼロ点 \(z\) は、実数の 0 を整数格子上のどこへ置くかを決める。実数 \(x=0\) を量子化式へ代入すると、丸め前の値は \(z\) になる。
q=
\operatorname{round}
\left(
\frac{0}{s}
\right)
+z
=z
\]
復号すると、実数の 0 が再び得られる。
\hat{x}
=
s(z-z)
=
0
\]
この性質により、ゼロ点が整数として正しく設定されていれば、実数の 0 を量子化後も正確に表現できる。ニューラルネットワークでは、0 が乗算や加算において特別な役割を持つため、0 を誤差なく表現できることが計算上の利点になる。
たとえば、\(s=0.02\)、\(z=0\) のとき、コード 3 の再構成値は次のようになる。
\hat{x}
=
0.02(3-0)
=
0.06
\]
この整数 3 は、数値 3.0 を意味していない。尺度とゼロ点を通して解釈した結果、0.06 という代表値を指している。
ゼロ点が 8 の場合、同じコード 3 は負の代表値になる。
\hat{x}
=
0.02(3-8)
=
-0.10
\]
同じ整数コードでも、尺度とゼロ点が変われば再構成値は変わる。整数コードだけを取り出しても、量子化前の数値領域における意味は確定しない。
3.5 尺度とゼロ点は表現範囲から決まる
アフィン量子化では、実数側の表現範囲 \([x_{\min},x_{\max}]\) と整数コードの範囲 \([q_{\min},q_{\max}]\) を対応させる。両端を一致させる基本的な尺度は、次の式で求められる。
s=
\frac{x_{\max}-x_{\min}}
{q_{\max}-q_{\min}}
\]
分子は実数側の範囲幅、分母は整数コード側の段階数を表す。実数範囲が広いほど尺度は大きくなり、整数コードの数が多いほど尺度は小さくなる。
ゼロ点は、実数の 0 が対応する整数位置から求める。
z_{\mathrm{real}}
=
q_{\min}
–
\frac{x_{\min}}{s}
\]
\(z_{\mathrm{real}}\) は計算上得られる実数値であるが、実際のゼロ点は整数コードでなければならないため、整数へ丸めて範囲内へ固定する。
z=
\operatorname{clip}
\left(
\operatorname{round}(z_{\mathrm{real}}),
q_{\min},
q_{\max}
\right)
\]
8 ビット符号なし整数の範囲 \(0\) から \(255\) を使い、実数範囲 \([-1,3]\) を表す場合を考える。尺度は次のようになる。
s=
\frac{3-(-1)}
{255-0}
=
\frac{4}{255}
\approx0.01569
\]
ゼロ点の丸め前の値は次のとおりである。
z_{\mathrm{real}}
=
0-
\frac{-1}{0.01569}
\approx63.75
\]
整数へ丸めれば、ゼロ点は概ね 64 になる。
z=64
\]
この量子化器では、整数コード 64 が実数の 0 を表す。整数範囲のうち、0 から 63 までが負の実数へ、64 から 255 までが 0 以上の実数へ割り当てられる。実数範囲が正側へ広いため、整数コードも正側へ多く配分される。
尺度とゼロ点を計算しても、指定した実数範囲の両端と 0 を同時に完全一致させられない場合がある。ゼロ点を整数へ丸めるため、片方の端に小さなずれが生じるからである。アフィン量子化は、連続する実数範囲と離散した整数格子を対応させるため、どこかで丸めを必要とする。
3.6 対称量子化と非対称量子化
表現範囲を 0 の周囲へ対称に置く方式を対称量子化、入力の最小値と最大値に合わせて範囲を移動させる方式を非対称量子化と呼ぶ。両者は同じビット数を使っても、整数コードを実数空間のどこへ配分するかが異なる。
対称量子化では、実数側の範囲を概ね次のように取る。
[-a,a]
\]
\(a\) は、量子化対象の絶対値の最大値などから決める。符号付き整数を使う場合、ゼロ点は通常 0 に固定される。再構成式は単純化され、次の形になる。
\hat{x}=sq
\]
ゼロ点を引く処理が不要になるため、積和演算を単純に構成しやすい。重みの分布が 0 を中心として正負へおおむね対称なら、正側と負側へ同程度のコードを割り当てることにも無駄が少ない。
ただし、整数コードの個数が正負で完全に対称とは限らない。たとえば符号付き 8 ビット整数は通常 \(-128\) から 127 までを持ち、負側が 1 段階多い。実装によっては \(-127\) から 127 までだけを使い、対称性を優先する代わりに 1 個のコードを使用しない場合がある。
非対称量子化では、入力の最小値 \(x_{\min}\) と最大値 \(x_{\max}\) に整数範囲を合わせる。0 が範囲内にある場合、ゼロ点を移動させて 0 を整数コードの一つへ対応させる。
| 方式 | 範囲の決め方 | ゼロ点 | 利点 | 失敗条件 |
|---|---|---|---|---|
| 対称量子化 | 0 を中心として正負へ同じ実数範囲を取る。 | 通常は 0 に固定する。 | 復号式と積和演算を単純化しやすい。 | 値が片側へ偏ると、反対側のコード範囲がほとんど使われない。 |
| 非対称量子化 | 観測した最小値と最大値へ整数範囲を合わせる。 | 実数の 0 に対応する整数位置へ移動する。 | 偏った実数範囲へ利用可能なコードを集中できる。 | ゼロ点補正が演算へ入り、積和計算や実装が複雑になる。 |
たとえば値が 0 から 6 の範囲にしか現れない場合、対称量子化で \([-6,6]\) を割り当てると、負の範囲へ割り当てたコードが使われない。8 ビットの 256 段階を使っていても、実際に利用するのは正側の約半分になる。その結果、0 から 6 の範囲を表す刻み幅は、非対称量子化より粗くなる。
非対称量子化なら、整数範囲全体を 0 から 6 へ対応させられる。同じ 8 ビットでも実数側の刻み幅を小さくできるため、範囲内の丸め誤差を減らせる。ReLU などを通過し、負の値を持たない活性値では、この性質が有効になる。
一方、行列積で非対称量子化された二つの値を掛ける場合、ゼロ点を含む補正項が現れる。実数値 \(x\) と \(w\) を、それぞれ整数コード \(q_x\)、\(q_w\)、尺度 \(s_x\)、\(s_w\)、ゼロ点 \(z_x\)、\(z_w\) で表すと、積は次の形になる。
xw
\approx
s_xs_w
(q_x-z_x)
(q_w-z_w)
\]
括弧を展開すると、整数コード同士の積だけでなく、ゼロ点との積や定数項も計算に含まれる。ゼロ点が 0 の対称量子化では、これらの補正項が消える。非対称量子化が範囲を効率よく使える一方、演算経路を複雑にする理由は、この補正にある。
どちらを選ぶかは、量子化誤差だけでは決まらない。対象の分布、0 の表現、整数演算の実装、演算器が対応する形式、変換にかかる費用を合わせて評価する必要がある。
3.7 有限のコード数が表現範囲を作る
一様量子化器を実際の有限ビット形式として使う場合、整数コードには下限 \(q_{\min}\) と上限 \(q_{\max}\) がある。再構成可能な実数も、そのコード範囲に応じた有限区間へ制限される。
アフィン量子化の再構成式から、表現可能な最小値と最大値は次のように求められる。
\hat{x}_{\min}
=
s(q_{\min}-z)
\]
\hat{x}_{\max}
=
s(q_{\max}-z)
\]
たとえば 4 ビット符号付き整数として \(-8\) から 7 までを使い、\(s=0.1\)、\(z=0\) とする。この場合、表現可能な範囲は次のようになる。
\hat{x}_{\min}
=
0.1\times(-8)
=
-0.8
\]
\hat{x}_{\max}
=
0.1\times7
=
0.7
\]
刻み幅は 0.1 であるため、この範囲内では \(-0.8,-0.7,\ldots,0.6,0.7\) という 16 個の代表値を利用できる。
尺度を 0.2 に広げれば、表現可能範囲は \(-1.6\) から 1.4 へ広がる。その代わり、隣接する代表値の間隔も 0.2 へ広がる。範囲内の値を表現する精度は低下する。
| 尺度 | 4 ビット符号付き整数での表現範囲 | 隣接代表値の差 | 帰結 |
|---|---|---|---|
| 0.05 | -0.40 から 0.35 | 0.05 | 狭い範囲を細かく表せるが、少し大きな値でも範囲外になる。 |
| 0.10 | -0.80 から 0.70 | 0.10 | 範囲と細かさの中間的な配分になる。 |
| 0.20 | -1.60 から 1.40 | 0.20 | 広い範囲を覆えるが、範囲内の丸め誤差が大きくなる。 |
ビット数と尺度を固定すると、表現範囲と刻み幅は同時に決まる。刻み幅を独立に小さくしながら、同じコード数で表現範囲だけを広げることはできない。有限個の代表値を密に置けば狭い範囲しか覆えず、広く置けば値の間隔が粗くなる。
3.8 範囲外の値はクリッピングされる
量子化前の値が表現可能範囲を超えると、対応する整数コードを用意できない。アフィン量子化では、範囲外の値を最小コードまたは最大コードへ固定する。これがクリッピングである。
整数へ丸めた結果を \(q^\ast\) とすると、クリッピングは次のように定義できる。
\operatorname{clip}
\left(q^\ast,q_{\min},q_{\max}\right)
=
\begin{cases}
q_{\min} & q^\ast \lt q_{\min} \\
q^\ast & q_{\min} \leq q^\ast \leq q_{\max} \\
q_{\max} & q^\ast > q_{\max}
\end{cases}
\]
4 ビット符号付き整数、\(s=0.1\)、\(z=0\) の量子化器では、表現可能な最大値は 0.7 である。入力 0.74 は最も近い代表値 0.7 へ対応し、誤差は比較的小さい。入力 2.0 も同じ 0.7 へ固定されるが、誤差は大きくなる。
| 入力 | 丸め前のコード | クリッピング後のコード | 再構成値 | 誤差 |
|---|---|---|---|---|
| 0.64 | 6.4 を丸めて 6 | 6 | 0.6 | 範囲内の丸め誤差は -0.04 になる。 |
| 0.74 | 7.4 を丸めて 7 | 7 | 0.7 | 範囲内の丸め誤差は -0.04 になる。 |
| 2.00 | 20 | 上限の 7 | 0.7 | クリッピング誤差は -1.3 になる。 |
| -2.00 | -20 | 下限の -8 | -0.8 | クリッピング誤差は 1.2 になる。 |
範囲内で生じる誤差は、代表値の間隔による粒状誤差である。範囲外の値を端へ固定することで生じる誤差は、過負荷誤差またはクリッピング誤差である。両者は原因も大きさも異なる。
表現範囲を広げると、範囲外へ出る値が減るため、クリッピング誤差は減少する。同じビット数のまま範囲を広げれば刻み幅が増えるため、通常の値に対する粒状誤差は増える。表現範囲を狭めると逆の関係になる。
| 範囲設定 | 粒状誤差 | クリッピング誤差 | 失敗の形 |
|---|---|---|---|
| 広すぎる範囲 | 刻み幅が大きくなり、頻出値の細かな差を表せない。 | 範囲外の値は減る。 | 外れ値を守るために通常値の精度を失う。 |
| 狭すぎる範囲 | 範囲内では細かな値を表せる。 | 大きな値が端へ固定され、大きな誤差が生じる。 | 通常値の精度を優先する代わりに外れ値を破壊する。 |
外れ値が少数だけ存在する分布では、この交換関係が顕著になる。最大絶対値に合わせて範囲を決めると、少数の外れ値が尺度を大きくし、残りの大部分に対する刻み幅を粗くする。一定割合の外れ値をクリップすれば、中央に集中する値へ細かな代表値を配分できるが、切り捨てた外れ値が計算へ強く影響する場合には性能が低下する。
範囲選択は、すべての値を収めることではなく、粒状誤差とクリッピング誤差の合計を目的に応じて抑える問題になる。入力分布だけでなく、外れ値が後続計算へ与える影響まで評価しなければ、適切な範囲は決まらない。
3.9 ビット数は代表値の総数を決める
一つの値へ \(b\) ビットを割り当てると、使用できるコード数は最大で \(2^b\) 個になる。
N=2^b
\]
\(N\) はコード数、\(b\) はビット数である。表現範囲の幅を \(L\) とし、両端を含む \(N\) 個の代表値を等間隔に配置するなら、刻み幅は概ね次の関係を持つ。
\Delta
\approx
\frac{L}{N-1}
=
\frac{L}{2^b-1}
\]
ビット数を 1 増やすとコード数は 2 倍になる。同じ表現範囲を保つなら、刻み幅は概ね半分になる。最近傍丸めの最大絶対誤差も概ね半分になる。
| ビット数 | コード数 | 同じ範囲における相対的な刻み幅 | 保存量 |
|---|---|---|---|
| 2 ビット | 4 | 代表値が少なく、刻み幅は大きい。 | 1 値当たり 2 ビットを使う。 |
| 4 ビット | 16 | 2 ビットより細かな 16 段階を使える。 | 1 値当たり 4 ビットを使う。 |
| 8 ビット | 256 | 4 ビットより 16 倍多い代表値を配置できる。 | 1 値当たり 8 ビットを使う。 |
| 16 ビット | 65,536 | 同じ範囲を極めて細かな段階へ分けられる。 | 1 値当たり 16 ビットを使う。 |
ビット数を増やせば誤差は減りやすいが、保存容量、メモリ帯域、通信量も増える。ビット数を減らせばコード数が急速に減るため、セルの幅を広げるか、表現範囲を狭めるか、非一様な代表値配置を使う必要が生じる。
4 ビット量子化が 16 ビット表現の 4 分の 1 の保存量になるという説明は、各値のコード本体だけを比較した理論値である。実際には、尺度、ゼロ点、グループ境界、量子化されない値などの付加情報を保存する。そのため、モデルファイル全体や実行時メモリが厳密に 4 分の 1 になるとは限らない。
3.10 一様量子化器の設計変数は独立ではない
一様量子化器を定める主な要素は、ビット数、尺度、ゼロ点、整数コード範囲、実数側の表現範囲、原点に対する格子配置である。これらは別々の記号で表されるが、自由に独立して決められるわけではない。
ビット数を決めるとコード数が決まる。実数側の表現範囲を決めると、そのコード数で範囲を分割する尺度が決まる。尺度とゼロ点を決めると、各整数コードが表す代表値とセル境界が決まる。セル境界が決まれば、どの入力が丸められ、どの入力がクリップされるかが決まる。
| 設計変数 | 直接決めるもの | 後続して決まるもの |
|---|---|---|
| ビット数 | 利用可能なコード数を決める。 | 同じ表現範囲に配置できる代表値の密度を制限する。 |
| 表現範囲 | どの実数をクリッピングせずに扱えるかを決める。 | ビット数が固定されていれば尺度と粒状誤差が決まる。 |
| 尺度 | 隣接する代表値の間隔を決める。 | 範囲内の最大丸め誤差と覆える実数幅が決まる。 |
| ゼロ点 | 整数格子上で実数の 0 を置く位置を決める。 | 正負の実数へ何個のコードを配分するかが決まる。 |
| 格子配置 | 0 を代表値にするか、境界にするかを決める。 | 微小な正負の値を保存するか、0 へ集約するかが決まる。 |
一様量子化で生じる誤差は、刻み幅だけから決まらない。範囲内の値にはセル幅に応じた丸め誤差が生じ、範囲外の値にはクリッピング誤差が生じる。0 の配置によって微小値の扱いが変わり、ゼロ点によって正負へのコード配分が変わる。
同じ 4 ビット量子化という名称でも、尺度、ゼロ点、表現範囲、対称性、グループ単位が異なれば、作られるセル分割と代表値集合は異なる。ビット数は量子化器が使える状態数を示すだけであり、その状態を入力空間のどこへ配置したかまでは示さない。
一様量子化器は、有限個のコードを一定間隔の格子へ配置することで、量子化の構造を最も明瞭に示す。格子を細かくすれば範囲内の誤差が減り、格子を広げれば大きな値を扱える。限られたコード数の中で両方を同時に最大化できないため、量子化器は入力分布と後続計算に合わせて設計される。次に必要になるのは、各入力がどの程度の頻度で現れ、そこで生じた誤差をどの尺度で評価するかという確率的な分析である。
4. 量子化誤差は常に独立な雑音になるわけではない
4.1 量子化誤差は入力と代表値の差である
元の値を \(x\)、量子化後に再構成された代表値を \(\hat{x}=Q(x)\) とする。本稿では、量子化誤差 \(e\) を元の値から再構成値を引いた差として定義する。
e=x-\hat{x}
\]
\(e\) が正なら、再構成値は元の値より小さい。\(e\) が負なら、再構成値は元の値より大きい。文献によっては符号を逆にして \(e=\hat{x}-x\) と定義する場合もあるが、絶対誤差や二乗誤差を扱う限り、評価結果は変わらない。
刻み幅を \(\Delta\) とする一様量子化器で、入力を最も近い代表値へ割り当てる場合を考える。表現可能範囲の内部では、各代表値を中心として幅 \(\Delta\) のセルが作られる。セル中央では入力と代表値が一致するため、誤差は 0 になる。入力がセル境界へ近づくほど誤差は増え、境界直前では絶対値が \(\Delta/2\) に近づく。
|e|\leq\frac{\Delta}{2}
\]
この上限は、入力が表現可能範囲内にあり、最近傍の代表値へ丸められる場合に限って成り立つ。入力が範囲外へ出て端の代表値に固定されると、誤差は \(\Delta/2\) を超えて増加する。
たとえば、刻み幅が 0.25 で、代表値として 0.50 と 0.75 が並んでいる場合、両者の境界は 0.625 になる。入力 0.61 は 0.50 へ、入力 0.64 は 0.75 へ量子化される。
| 入力 | 再構成値 | 量子化誤差 | 誤差の意味 |
|---|---|---|---|
| 0.50 | 0.50 | 0 | 入力が代表値と一致しているため、情報のずれは生じない。 |
| 0.61 | 0.50 | 0.11 | 再構成値が元の値より 0.11 小さい。 |
| 0.64 | 0.75 | -0.11 | 再構成値が元の値より 0.11 大きい。 |
| 0.75 | 0.75 | 0 | 次の代表値と一致しているため、誤差は再び 0 になる。 |
入力を連続的に増加させると、誤差は代表値の位置で 0 になり、セル境界へ向かって直線的に増減し、境界を越えた瞬間に符号が反転する。無限に続く一様量子化器では、この形が刻み幅 \(\Delta\) ごとに繰り返される。量子化誤差は、最初から無秩序な乱数として発生しているのではなく、入力と量子化器の決定規則から一意に定まる周期的な非線形関数である。
4.2 粒状誤差と過負荷誤差は発生原因が異なる
量子化誤差は、入力が表現可能範囲の内部にある場合と、範囲を超えた場合とで性質が変わる。範囲内のセルで最近傍の代表値へ丸めることで生じる誤差を粒状誤差と呼ぶ。入力が表現可能範囲を超え、最小値または最大値へ固定されることで生じる誤差を過負荷誤差と呼ぶ。
| 誤差 | 発生条件 | 主な原因 | 大きさ |
|---|---|---|---|
| 粒状誤差 | 入力が表現可能範囲内にある。 | 有限間隔で配置された代表値のどれかへ入力を丸める。 | 最近傍量子化では通常、絶対値が \(\Delta/2\) 以下になる。 |
| 過負荷誤差 | 入力が表現可能範囲を超える。 | 利用できるコードがないため、端の代表値へ入力を固定する。 | 入力が範囲外へ離れるほど増え、\(\Delta/2\) を大きく超え得る。 |
量子化器の表現範囲を \([a,b]\) とすると、入力 \(x\) がこの範囲内にあるときは粒状誤差が生じる。入力が \(a\) より小さい場合は最小代表値へ、\(b\) より大きい場合は最大代表値へ固定されるため、過負荷誤差が生じる。
平均二乗誤差を使う場合、全体の歪みは、範囲内の誤差と範囲外の誤差へ分けて考えられる。表現可能範囲を \(A\) とすると、次の形になる。
D=
\mathbb{E}
\left[
e^2\mathbf{1}_{\{X\in A\}}
\right]
+
\mathbb{E}
\left[
e^2\mathbf{1}_{\{X\notin A\}}
\right]
\]
\(\mathbb{E}\) は確率分布に従った平均、\(\mathbf{1}\) は条件が成立したときに 1、成立しないときに 0 となる指示関数である。第 1 項は表現範囲内で生じる粒状誤差、第 2 項は範囲外で生じる過負荷誤差の寄与を表す。
表現範囲を広げると、範囲外へ出る入力が減るため、過負荷誤差は小さくなりやすい。しかし、ビット数が同じなら、広い範囲を同じ個数の代表値で覆う必要がある。隣接する代表値の間隔が広がり、通常の入力に対する粒状誤差が増える。
表現範囲を狭めると、代表値を狭い領域へ密に配置できるため、範囲内の粒状誤差は小さくなる。その代わり、少し大きな入力でも範囲外へ出るようになり、端の代表値へ固定される。外れ値が後続計算へ強く影響する場合、発生頻度が低くても大きな過負荷誤差が最終結果を支配することがある。
| 範囲設定 | 粒状誤差への影響 | 過負荷誤差への影響 | 典型的な失敗 |
|---|---|---|---|
| 表現範囲を広く取る | 刻み幅が広がり、頻出する通常値の細かな違いを失いやすい。 | 範囲外の入力が減るため、クリッピングは起きにくい。 | 少数の外れ値を収めるために、大多数の値の精度を落とす。 |
| 表現範囲を狭く取る | 範囲内では代表値が密になり、通常値を細かく表現できる。 | 外れ値が端へ固定され、大きな誤差を生じやすい。 | 平均的な精度を優先した結果、重要な外れ値を破壊する。 |
量子化範囲の選択は、最大値と最小値を機械的に収める作業ではない。粒状誤差と過負荷誤差を、入力分布と用途に応じて配分する最適化問題である。外れ値が数値上は大きくても後続計算への影響が小さいなら、一定量をクリップした方が全体の誤差を減らせる場合がある。反対に、まれな外れ値が制御判断やモデル出力を決めるなら、平均誤差が多少増えても表現範囲へ残す必要がある。
4.3 平均二乗誤差は誤差の大きさを一つの数へ集約する
量子化器の誤差を評価する代表的な尺度が平均二乗誤差である。入力を確率変数 \(X\)、量子化後の再構成値を \(Q(X)\) とすると、平均二乗誤差 \(D\) は次の式で定義される。
D=
\mathbb{E}
\left[
\left(
X-Q(X)
\right)^2
\right]
\]
\(X-Q(X)\) は各入力で生じる量子化誤差である。その値を二乗することで正負を打ち消し、大きな誤差へより大きな重みを与える。最後に入力分布に従って平均することで、量子化器全体を一つの数値として評価する。
誤差を二乗するため、誤差が 2 倍になると、その入力が平均へ与える寄与は 4 倍になる。誤差が 10 倍なら寄与は 100 倍になる。この性質により、少数の大きな誤差を強く罰する尺度として利用できる。
たとえば、二つの量子化器が 4 個の入力に対して次の誤差を生じたとする。
| 量子化器 | 4 個の入力に対する誤差 | 誤差二乗の合計 | 平均二乗誤差 |
|---|---|---|---|
| 量子化器 A | 0.2、0.2、0.2、0.2 | 0.16 | 0.04 になる。 |
| 量子化器 B | 0、0、0、0.4 | 0.16 | 0.04 になる。 |
両者の平均二乗誤差は同じである。しかし、量子化器 A はすべての入力を少しずつ変え、量子化器 B は 3 個の入力を正確に保つ代わりに 1 個を大きく変えている。平均二乗誤差だけを見れば、この違いは消える。
音声では、誤差が広い周波数へ分散する場合と、特定の周波数へ集中して周期的な音として聞こえる場合とで、知覚上の影響が異なる。制御では、平均的に小さな誤差でも、同じ方向へ偏り続ければ制御量が徐々にずれる。ニューラルネットワークでは、ほとんど使われない重みの大きな誤差より、頻繁に大きな活性値と掛け合わされる方向の小さな誤差が出力へ強く現れる場合がある。
平均二乗誤差は、誤差の大きさを測る一つの尺度である。誤差がどの入力で発生したか、正負のどちらへ偏ったか、入力と相関しているか、時間や周波数のどこへ集中したかは直接表さない。
4.4 誤差の評価には大きさ以外の観点も必要になる
量子化器の用途によっては、平均二乗誤差に加えて別の尺度を確認する必要がある。どの尺度が必要になるかは、量子化後の値を何に使うかによって決まる。
| 評価尺度 | 測定する性質 | 見つけられる失敗 |
|---|---|---|
| 平均誤差 | \(\mathbb{E}[e]\) によって誤差の方向的な偏りを測る。 | 小さな誤差が同じ方向へ蓄積し、全体がずれる現象を見つけられる。 |
| 平均絶対誤差 | \(\mathbb{E}[|e|]\) によって誤差の絶対的な大きさを平均する。 | 二乗によって外れ値が過度に強調される影響を抑えて評価できる。 |
| 最大絶対誤差 | \(\sup |e|\) によって最悪の場合の誤差を測る。 | 平均は小さくても、一度の大誤差が許されない用途を評価できる。 |
| 入力との相関 | \(\mathbb{E}[Xe]\) などによって、入力と誤差の連動を測る。 | 入力の形に追従して誤差が周期的または系統的に現れる場合を検出できる。 |
| 誤差のスペクトル | 誤差エネルギーが時間周波数上のどこへ分布するかを測る。 | 平均誤差が小さくても、可聴帯域や特定周波数へ誤差が集中する場合を識別できる。 |
| 処理結果の損失 | 量子化後の値を使った最終計算の変化を測る。 | 数値上は小さな誤差が、分類、生成、制御などの結果を大きく変える場合を評価できる。 |
量子化器の数値誤差を小さくすることと、最終用途の誤差を小さくすることは一致しない場合がある。入力 \(x\) を量子化し、その後に関数 \(f\) を適用するなら、用途上の影響は \(x-Q(x)\) だけではなく、次の差に現れる。
f(x)-f(Q(x))
\]
関数 \(f\) が入力の変化に鈍感なら、比較的大きな量子化誤差があっても出力はほとんど変わらない。関数 \(f\) が特定の方向へ敏感なら、元の値との差が小さくても出力が大きく変化する。
量子化器を後続計算から切り離して評価すると、数値上は優れた方式が用途上は失敗する場合がある。平均二乗誤差は基本的な比較尺度になるが、最終判断には誤差の偏り、位置、相関、時間構造、後続計算の感度を加える必要がある。
4.5 量子化誤差は決定論的に入力へ依存する
決定論的な量子化器では、同じ入力へ常に同じ出力が返る。量子化誤差も入力によって一意に決まり、同じ入力を繰り返せば同じ誤差が繰り返される。
一定値 \(x_0\) を繰り返し入力する場合、量子化後の値 \(Q(x_0)\) も一定である。誤差は毎回同じ値になる。
e_n=x_0-Q(x_0)
\]
\(n\) は時刻または入力番号を表す。誤差が一定なら、その平均は 0 にならず、入力から独立な雑音とも呼べない。元の信号へ一定のずれが加わった状態になる。
入力が一定速度で増加するランプ信号なら、量子化誤差はセル内部で直線的に変化し、境界を越えるたびに跳ぶ鋸歯状の系列になる。入力が正弦波なら、量子化器の非線形性によって誤差にも周期構造が生まれ、元の周波数と関係する高調波や離散的な周波数成分が現れる場合がある。
| 入力 | 量子化誤差の性質 | 独立雑音モデルとのずれ |
|---|---|---|
| 一定値 | 誤差も一定値になる。 | 平均 0 のランダム雑音ではなく、固定された偏りになる。 |
| ゆっくり変化する値 | 同じセルにいる間は似た誤差が続く。 | 隣接時刻の誤差が強く相関する。 |
| 一定速度のランプ | 刻み幅に対応した鋸歯状の誤差が繰り返される。 | 誤差に明確な周期と規則性が残る。 |
| 周期信号 | 入力周期と量子化格子の関係に応じた周期成分が生じる。 | 誤差エネルギーが特定周波数へ集中し得る。 |
| 複雑に変化する広帯域信号 | 多数のセルを不規則に横断し、誤差の規則性が目立ちにくくなる。 | 一定条件下では独立雑音に近い近似が有効になる。 |
入力と誤差が相関していると、量子化による影響は単なる背景雑音として現れない。音声では周期的な歪みとして聞こえ、画像では輪郭に沿った帯状模様として見え、反復計算では同じ方向の誤差が蓄積する可能性がある。
量子化器が非線形であることも、この相関を生む。線形写像なら入力の加算や定数倍に対して出力も同じ関係を保つが、丸めを含む量子化器は一般に次の性質を満たさない。
Q(x+y)=Q(x)+Q(y)
\]
Q(\alpha x)=\alpha Q(x)
\]
小さな入力変化が同じセル内に収まれば、量子化後の値は変わらない。反対に、境界をわずかに越えるだけで、出力は刻み幅 1 段分だけ跳ぶ。この不連続な応答が、入力の構造を量子化誤差へ写し取る。
4.6 「量子化雑音」は条件付きの確率モデルである
Bennett は量子化された信号のスペクトルを解析し、高分解能の条件下で量子化誤差を雑音として扱う理論を発展させた[2]。この解析は、量子化誤差を常に入力から独立した乱数と定義したものではない。入力が量子化格子に対して十分に複雑に変化し、多数のセルを横断する場合に、決定論的な誤差系列を確率的な雑音として近似する。
一様量子化器で、誤差が区間 \([-\Delta/2,\Delta/2]\) に一様に分布すると仮定する。このとき誤差の平均は 0 になり、分散は次の値になる。
\mathbb{E}[e]=0
\]
\mathbb{E}[e^2]
=
\frac{\Delta^2}{12}
\]
\(\Delta^2/12\) は、一様量子化器で必ず成立する恒等式ではない。誤差がセル内へ一様に分布し、入力との相関を無視でき、クリッピングがほとんど起きないという条件を置いた場合の結果である。
たとえば一定値を入力すると、誤差は一つの値に集中するため、一様分布にはならない。入力の振幅が刻み幅より小さく、同じセルからほとんど動かない場合も、誤差は限られた範囲へ偏る。入力周期と刻み幅の関係が単純なら、特定の誤差系列が繰り返される。
| 仮定 | 仮定が果たす役割 | 破れた場合の帰結 |
|---|---|---|
| 入力が多数のセルを横断する | セル内のさまざまな位置が現れ、誤差が一つの値へ集中することを防ぐ。 | 入力が一つのセルに留まると、誤差が一定値または狭い範囲へ偏る。 |
| 入力が刻み幅に対して十分に複雑に変化する | 量子化格子との単純な周期関係を弱める。 | 周期信号では、誤差に周期成分や高調波が現れ得る。 |
| クリッピングがほとんど起きない | 誤差を \([-\Delta/2,\Delta/2]\) の範囲で扱える。 | 過負荷誤差が生じると、誤差分布の裾が大きくなり、\(\Delta^2/12\) の近似から外れる。 |
| 誤差と入力の相関を無視できる | 量子化器を信号へ独立雑音を加えるモデルとして扱える。 | 相関が残ると、信号依存の歪みや周期模様として現れる。 |
雑音モデルには、量子化器を線形な信号経路と加法雑音へ分離できる利点がある。量子化後の値を、元の値と雑音の和として次のように表せる。
Q(X)=X-E
\]
この形を使えば、信号処理や通信理論で用いられる雑音解析を適用できる。ただし、\(E\) を入力から独立した白色雑音として扱えるかは、入力と量子化器に関する仮定に依存する。
白色雑音とは、周波数ごとの強度が平坦で、異なる時刻の誤差に相関がないと近似できる雑音である。量子化誤差が一定値、周期列、鋸歯状波になる場合には、この条件を満たさない。平均二乗誤差が同じでも、誤差が広い周波数へ分散する場合と、一つの周波数へ集中する場合では結果が異なる。
4.7 信号対量子化雑音比は誤差を信号との比で表す
量子化誤差の大きさだけでは、その誤差が信号に対して大きいか小さいかを判断できない。振幅 100 の信号に誤差 0.1 が加わる場合と、振幅 0.01 の信号に同じ誤差が加わる場合では、相対的な影響が異なる。
信号の平均電力と量子化誤差の平均電力の比を、信号対量子化雑音比として表す。入力の平均が 0 に近い場合、線形比は次のように書ける。
\mathrm{SQNR}
=
\frac{\mathbb{E}[X^2]}
{\mathbb{E}[e^2]}
\]
分子は信号の平均二乗値、分母は量子化誤差の平均二乗値である。この比が大きいほど、信号に対して量子化誤差が小さい。
デシベルで表す場合は、常用対数を使って次のように変換する。
\mathrm{SQNR}_{\mathrm{dB}}
=
10
\log_{10}
\left(
\frac{\mathbb{E}[X^2]}
{\mathbb{E}[e^2]}
\right)
\]
同じ量子化器でも、入力信号の振幅が小さくなると、信号対量子化雑音比は低下する。刻み幅が固定されている場合、微小信号は少数のセルしか使わず、量子化誤差が信号本体と同程度になるからである。
反対に、入力振幅を大きくして表現可能範囲を有効に使えば、信号電力に対する粒状誤差の割合は小さくなる。ただし、振幅を増やしすぎてクリッピングが始まると、過負荷誤差が急増する。信号対量子化雑音比を高めるには、刻み幅を小さくするだけでなく、入力分布と表現範囲を適合させる必要がある。
4.8 誤差を雑音として扱うか、構造として扱うかは用途で変わる
量子化誤差を独立雑音として近似できれば、解析は大幅に単純になる。平均、分散、周波数特性を使って、通信品質や信号処理性能を計算できる。しかし、入力と誤差の相関が結果へ影響する用途では、雑音近似だけでは失敗の形を説明できない。
音声では、広帯域へ分散した小さな誤差より、特定周波数へ集中した周期的な誤差の方が目立つ場合がある。画像では、同じ平均二乗誤差でも、無秩序な細粒状の誤差と、滑らかな階調に沿って現れる帯状模様とでは知覚上の影響が異なる。制御では、平均 0 の誤差と一定方向へ偏った誤差で、長期的な状態のずれが変わる。
ニューラルネットワークでも、量子化誤差を各重みへ独立に加わる雑音として近似できる場合はある。しかし、同じ尺度を共有する重み群、特定方向へ集中する活性値、複数層を通過する誤差の増幅を考えると、誤差はモデルの構造と無関係ではない。個々の重み誤差が小さくても、同じ出力方向へ重なると大きな変化になる。
量子化誤差は、量子化器、入力分布、時間または空間上の入力構造、後続計算の組合せから生じる。量子化器だけを見て、誤差が白色か、独立か、平均 0 かを決めることはできない。
一様量子化器の刻み幅から \(\Delta^2/12\) を計算する方法は、高分解能でクリッピングが少なく、入力が量子化格子に対して十分に複雑な場合には有効である。入力が一定値、微小信号、周期信号、外れ値を含む分布である場合には、実際の誤差系列、分布、相関、スペクトルを確認する必要がある。
量子化誤差を理解するには、誤差の大きさだけでなく、その誤差がどこに現れ、何と連動し、後続処理でどう変化するかを区別しなければならない。平均二乗誤差は量子化器を比較する基準を与えるが、その基準が最適な量子化器を決めるには、入力がどの確率で現れ、どの誤差を強く罰するかを定める必要がある。次に扱う最適量子化では、入力分布と損失関数を明示し、限られた代表値をどこへ配置すべきかを決定する。
5. 最適な量子化器は確率分布と損失関数で変わる
5.1 等間隔の代表値が最適になるとは限らない
一様量子化器は、入力が現れる頻度にかかわらず、実数直線上へ同じ間隔で代表値を配置する。計算規則が単純で、整数演算へ移しやすいという利点を持つ。一方で、有限個の代表値を入力分布の低い領域にも同じ密度で配置するため、値が特定範囲へ集中している場合には、利用可能なコードを有効に配分できない。
たとえば、入力値の 90% が -0.1 から 0.1 に集中し、残りの 10% だけが -1 から 1 まで広く分布している場合を考える。16 個の代表値を -1 から 1 まで等間隔に並べると、刻み幅は概ね 0.13 になる。入力の大半が存在する -0.1 から 0.1 の範囲には、数個の代表値しか配置されない。
この配置では、ほとんど入力されない外側の領域にも多数のコードが割り当てられる。そのコードは表現可能範囲を広げるためには役立つが、平均誤差を決める大多数の入力にはほとんど利用されない。中央付近へ代表値を集めれば、同じ 16 個のコードでも、頻繁に現れる値をより細かく区別できる。
| 代表値の配置 | 中央の高密度領域 | 外側の低密度領域 | 平均誤差への帰結 |
|---|---|---|---|
| 等間隔配置 | 入力が集中していても、他の領域と同じ間隔で代表値を置く。 | 入力がほとんど現れない場所にも同じ密度で代表値を置く。 | 使用頻度の低い範囲へコードを消費し、頻出値の解像度が不足する場合がある。 |
| 非一様配置 | 入力が頻繁に現れる場所へ代表値を密に置く。 | まれな値が現れる場所では代表値の間隔を広げる。 | まれな値の誤差を許容する代わりに、確率加重された平均誤差を減らせる。 |
入力が現れる確率を考慮すると、量子化器が最小化すべき対象は、実数直線上の最大間隔ではなく、各入力の発生確率で重み付けした誤差になる。入力がほとんど現れない領域で誤差を小さくしても、平均への寄与は限られる。反対に、入力が集中する領域で小さな誤差を繰り返せば、その誤差は平均へ大きく寄与する。
入力の確率密度を \(f_X(x)\)、量子化器を \(Q\)、二乗誤差を評価尺度とすると、平均二乗誤差は積分によって次のように表せる。
D(Q)
=
\int_{-\infty}^{\infty}
\left(
x-Q(x)
\right)^2
f_X(x)\,dx
\]
\(f_X(x)\) は、値 \(x\) の周辺に入力が現れる密度を表す。量子化誤差が同じ大きさでも、\(f_X(x)\) が大きい領域で生じた誤差は平均歪みへ強く反映される。代表値の配置は、数値範囲だけでなく、入力がどこへどの程度の頻度で現れるかに合わせて決める必要がある。
Panter と Dite は、高分解能の条件下で、信号の確率密度に応じて量子化段階を配置した場合の歪みを解析した[3]。この解析では、入力密度の高い場所へ量子化点を多く配置し、密度の低い場所では間隔を広げることで、同じ量子化レベル数でも平均二乗誤差を減らせることが示される。
非一様量子化は、外側の値を無視する方式ではない。有限個のコードを、平均歪みへの寄与に応じて配分する方式である。まれな値が後続計算に重大な影響を持つ場合には、発生確率だけで配置を決めると失敗する。確率が低くても損失が大きい入力には、歪み関数を通じて高い重みを与える必要がある。
5.2 歪み関数が「近い代表値」の意味を決める
量子化器の良さを比較するには、元の値 \(x\) と再構成値 \(\hat{x}\) の違いを、どの尺度で評価するかを定める必要がある。この評価規則を歪み関数 \(d(x,\hat{x})\) と呼ぶ。
入力を確率変数 \(X\)、量子化器を \(Q\) とすると、量子化器全体の平均歪みは次の式で表せる。
D(Q)
=
\mathbb{E}
\left[
d\left(
X,Q(X)
\right)
\right]
\]
\(\mathbb{E}\) は、入力分布に従って平均を取ることを表す。歪み関数は一つの入力に対する損失を定め、期待値はその損失を入力の発生確率で重み付けして集約する。
平均二乗誤差を使う場合、歪み関数は次のようになる。
d(x,\hat{x})
=
(x-\hat{x})^2
\]
差を二乗するため、大きな誤差へ強い罰を与える。誤差が 2 倍になると損失は 4 倍になり、誤差が 10 倍になると損失は 100 倍になる。少数の大きな誤差を避けたい場合に扱いやすく、微分可能であるため最適化もしやすい。
平均絶対誤差を使う場合は、次の歪み関数になる。
d(x,\hat{x})
=
|x-\hat{x}|
\]
絶対誤差では、損失が誤差の大きさに比例して増える。二乗誤差ほど外れ値を強く罰しないため、少数の大きな誤差に引きずられにくい。代表値をどこへ置くべきかという条件も、平均二乗誤差の場合とは変わる。
| 歪み関数 | 数式 | 誤差への重み付け | 代表値の性質 |
|---|---|---|---|
| 二乗誤差 | \((x-\hat{x})^2\) | 大きな誤差を二乗して強く罰する。 | セルを固定した場合、条件付き平均が最適になる。 |
| 絶対誤差 | \(|x-\hat{x}|\) | 誤差の大きさに比例して罰する。 | セルを固定した場合、条件付き中央値が最適になる。 |
| 最大誤差 | \(\sup |x-\hat{x}|\) | 平均ではなく最悪の場合の誤差を評価する。 | 各セルにおける最大偏差を抑える配置が必要になる。 |
| 用途固有の損失 | 用途によって定義する。 | 数値差ではなく、最終結果への影響を罰する。 | 代表値は入力距離ではなく、処理結果を保つ位置へ置かれる。 |
「最も近い代表値」という規則は、距離または損失を定めて初めて意味を持つ。実数の二乗誤差なら、数直線上の距離が小さい代表値を選べばよい。しかし、高次元ベクトルではユークリッド距離、重み付き距離、方向の差など複数の尺度が考えられる。
たとえば、二次元ベクトル \(x=(x_1,x_2)\) に対し、第 1 成分の誤差を第 2 成分より 10 倍強く評価する歪み関数は、次のように書ける。
d(x,\hat{x})
=
10(x_1-\hat{x}_1)^2
+
(x_2-\hat{x}_2)^2
\]
この場合、数値上のユークリッド距離が最も短い代表値が、損失を最小にするとは限らない。第 1 成分をよく保存できる代表値の方が、全体として小さな歪みを持つ。
音声では、すべての周波数の誤差が同じように知覚されるわけではない。画像でも、平坦な領域と輪郭付近では同じ数値誤差の見え方が異なる。制御では、特定の状態を過小評価する誤差と過大評価する誤差が同じ危険度を持たない場合がある。
ニューラルネットワークでは、重みそのものの数値差ではなく、量子化後のモデル出力や損失関数の変化を歪みとして評価できる。数値として近い重みでも、頻繁に大きな活性値と掛けられる方向にあれば、出力へ大きく影響する。反対に、数値差が大きくても、ほとんど利用されない方向ならモデルの振る舞いは変わりにくい。
確率分布は、どの入力がどれだけ頻繁に現れるかを決める。歪み関数は、その入力を誤って表したときにどれだけ損失を課すかを決める。最適量子化器は、この二つを組み合わせた期待損失によって定まる。
5.3 最適化する対象は代表値とセル境界の両方である
量子化器は、入力空間を分けるセルと、各セルに割り当てる代表値から構成される。最適な量子化器を求めるには、代表値だけでなく、どの入力をどのセルへ入れるかも決めなければならない。
代表値を \(c_1,c_2,\ldots,c_N\)、対応するセルを \(R_1,R_2,\ldots,R_N\) とする。平均歪みは、セルごとの積分へ分けて次のように書ける。
D
=
\sum_{i=1}^{N}
\int_{R_i}
d(x,c_i)
f_X(x)\,dx
\]
\(N\) は利用する代表値の個数、\(R_i\) は代表値 \(c_i\) へ割り当てる入力領域、\(f_X(x)\) は入力の確率密度である。各セルに入る入力について、代表値との歪みを計算し、確率密度で重み付けして合計する。
この式には、二種類の設計変数が含まれる。一つはセル分割 \(\{R_i\}\)、もう一つは代表値集合 \(\{c_i\}\) である。
| 設計対象 | 決める内容 | 誤差への影響 |
|---|---|---|
| セル境界 | どの入力を同じコードへまとめるかを決める。 | 各代表値が担当する入力範囲と確率質量が変わる。 |
| 代表値 | セル内の入力をどの値で再構成するかを決める。 | セル内部で生じる各入力の歪みが変わる。 |
代表値を動かせば、どの入力に近いかが変わるため、適切なセル境界も変わる。セル境界を動かせば、各セルへ入る入力分布が変わるため、適切な代表値も変わる。両者は独立に一度ずつ決めれば終わる関係ではない。
平均二乗誤差を使い、代表値を固定した場合、各入力は最も近い代表値へ割り当てるのが最適になる。一方、セルを固定した場合には、各代表値をセル内の条件付き平均へ置くのが最適になる。この二条件を同時に満たす配置が、局所的に最適な量子化器になる。
5.4 代表値を固定すると最近傍条件が導かれる
代表値 \(c_1,c_2,\ldots,c_N\) が固定されているとする。入力 \(x\) を代表値 \(c_i\) へ割り当てた場合の二乗誤差は、次の値になる。
(x-c_i)^2
\]
この入力だけに注目すれば、二乗誤差を最小にするには、絶対距離 \(|x-c_i|\) が最も小さい代表値を選べばよい。代表値 \(c_i\) に対応するセルは、次の条件で定義できる。
R_i
=
\left\{
x:
|x-c_i|
\leq
|x-c_j|
\quad
\text{for all }j
\right\}
\]
この式は、すべての代表値 \(c_j\) と比較し、\(c_i\) が最も近い入力を集めた集合が \(R_i\) であることを示す。同じ距離にある境界上の入力をどちらへ割り当てるかは、別途規則を定めればよい。確率密度が連続している場合、有限個の境界点が平均歪みへ与える影響は通常 0 になる。
一次元で代表値 \(c_i\) と \(c_{i+1}\) が隣接している場合、二乗誤差の下では両者の中点が境界になる。
t_i
=
\frac{c_i+c_{i+1}}{2}
\]
境界 \(t_i\) より左側では \(c_i\) の方が近く、右側では \(c_{i+1}\) の方が近い。代表値の間隔が不均等なら、セル幅も不均等になる。
この条件は、入力確率の高い方向へ直接境界を動かすものではない。代表値を固定した状態では、各入力に対する損失を最小化する割当てが最近傍になる。確率分布は、次に代表値を更新するときに作用する。
歪み関数が二乗誤差でない場合、最近傍の意味も変わる。一般の歪み関数では、入力 \(x\) を損失 \(d(x,c_i)\) が最も小さい代表値へ割り当てる。
R_i
=
\left\{
x:
d(x,c_i)
\leq
d(x,c_j)
\quad
\text{for all }j
\right\}
\]
数値上の距離ではなく、指定した損失の下で最も不利益が小さい代表値を選ぶ条件である。
5.5 セルを固定すると重心条件が導かれる
次に、セル \(R_i\) を固定し、そのセルを一つの代表値 \(c_i\) で再構成する場合を考える。平均二乗誤差の下では、セル \(R_i\) が全体の歪みへ与える寄与は次のようになる。
D_i(c_i)
=
\int_{R_i}
(x-c_i)^2
f_X(x)\,dx
\]
この式を代表値 \(c_i\) について最小化する。微分して 0 と置くと、次の関係が得られる。
\frac{dD_i}{dc_i}
=
-2
\int_{R_i}
(x-c_i)
f_X(x)\,dx
=
0
\]
式を整理すると、最適な代表値は次の条件付き平均になる。
c_i
=
\mathbb{E}
\left[
X
\mid
X\in R_i
\right]
\]
右辺は、入力がセル \(R_i\) に入ったという条件の下での平均を表す。幾何学的には、セル内の確率質量の重心に代表値を置く条件である。
セルの区間中央と、条件付き平均は一致するとは限らない。入力がセル内で一様に分布していれば中央が平均になる。しかし、セル内でも左側へ入力が集中しているなら、最適代表値は左へ移動する。
たとえばセルが \([0,1]\) で、入力が一様に現れるなら、条件付き平均は 0.5 になる。
c
=
\int_0^1 x\,dx
=
\frac{1}{2}
\]
同じセルでも、入力密度が 0 の周辺へ集中していれば、最適代表値は 0.5 より小さくなる。セルの幾何学的中央ではなく、入力確率の重心が二乗誤差を最小にする。
| セル内の入力分布 | 幾何学的中央 | 条件付き平均 | 最適代表値 |
|---|---|---|---|
| 左右対称な分布 | 分布の対称軸に位置する。 | 幾何学的中央と一致する。 | セル中央へ置かれる。 |
| 左側へ集中する分布 | セルの幅だけから決まる。 | 幾何学的中央より左へ移る。 | 入力が多い左側へ置かれる。 |
| 右側へ集中する分布 | セルの幅だけから決まる。 | 幾何学的中央より右へ移る。 | 入力が多い右側へ置かれる。 |
絶対誤差を最小化する場合には、最適な代表値は条件付き平均ではなく条件付き中央値になる。損失関数が変われば、同じセルと同じ入力分布でも最適代表値が変わる。重心条件は量子化一般の普遍的条件ではなく、二乗誤差を採用した場合の条件である。
5.6 Lloyd–Max 法は境界と代表値を交互に更新する
最近傍条件は、代表値を固定したときの最適なセルを与える。重心条件は、セルを固定したときの最適な代表値を与える。両方を同時に直接解くことが難しい場合、片方を固定してもう片方を更新する操作を交互に繰り返す。
一次元の平均二乗誤差量子化では、概ね次の手順になる。
| 段階 | 処理 | 歪みへの作用 |
|---|---|---|
| 初期化 | 代表値 \(c_1,\ldots,c_N\) を初期位置へ置く。 | 探索を開始する量子化器を定める。 |
| 境界更新 | 各入力を最も近い代表値へ割り当て、セルを作る。 | 固定された代表値に対して最小損失の割当てを得る。 |
| 代表値更新 | 各代表値を、そのセル内の条件付き平均へ移す。 | 固定されたセルに対して平均二乗誤差を最小化する。 |
| 収束判定 | 代表値または歪みの変化が十分小さいか確認する。 | 変化が残る場合は境界更新へ戻る。 |
代表値を固定して境界を最近傍条件で更新すれば、同じ代表値のまま不適切な割当てを続ける場合より歪みは増えない。セルを固定して代表値を条件付き平均へ更新した場合も、更新前より二乗誤差は増えない。この二操作を交互に繰り返すため、歪みは単調に減少するか、少なくとも増加しない。
Max は、有限個の量子化レベルによって平均歪みを最小化する条件を示した[4]。Lloyd は、最近傍条件と重心条件を交互に満たす反復法を体系化した[5]。両者を合わせた設計法は、Lloyd–Max 量子化として知られている。
一様量子化では、セル幅と代表値間隔がすべて同じになる。Lloyd–Max 法では、入力分布に応じてセル幅と代表値間隔が変化する。入力が集中する場所ではセルが狭くなり、入力の少ない場所では広くなる。
5.7 反復法は大域最適解を保証しない
Lloyd–Max 法では、各更新が現在の量子化器に対する歪みを減らす。しかし、歪みが減り続けることと、可能なすべての量子化器の中で最小の歪みへ到達することは同じではない。
量子化器の最適化では、代表値を動かすとセル境界が変わり、境界を越えた入力が別の代表値へ割り当てられる。この割当ての変化は連続的ではない。目的関数には複数の局所的な谷が生じ、初期配置によって異なる解へ収束することがある。
たとえば入力分布が複数の山を持つ場合、初期代表値が一つの山へ集中すると、反復後も別の山を十分に表現できない配置へ留まる可能性がある。代表値の一部がほとんど入力を受け取らない空セルになる場合もある。
| 失敗要因 | 発生する現象 | 量子化器への影響 |
|---|---|---|
| 初期値の偏り | 代表値が入力分布の一部へ集中する。 | 別の高密度領域へ十分な代表値を配置できない。 |
| 複数の分布峰 | 代表値をどの峰へ何個割り当てるかに複数の候補が生じる。 | 異なる局所解へ収束し、最終歪みが変わる。 |
| 空セル | ある代表値へ入力が一つも割り当てられない。 | 条件付き平均を計算できず、コードの一部が利用されない。 |
| 有限標本 | 学習データ上の分布と実際の入力分布が一致しない。 | 学習時には小さな歪みでも、運用時には誤差が増える。 |
局所解の影響を減らすため、複数の初期値から反復を実行し、最終歪みが最も小さい解を選ぶ方法がある。入力分位点、一様配置、無作為抽出など、異なる初期化方法を比較することもできる。空セルが生じた場合には、代表値を高誤差領域へ再配置する処理が必要になる。
学習データから量子化器を設計する場合には、標本分布への過適合も起こり得る。観測したデータに合わせて代表値を細かく配置しても、運用時の分布が変われば、その配置は最適でなくなる。量子化器の設計では、最適化誤差だけでなく、分布推定の誤差と分布変化も評価対象になる。
5.8 コンパンディングは非一様量子化を一様量子化へ変換する
非一様な代表値配置は、入力を非線形に変換してから一様量子化し、復号時に逆変換する方法でも実現できる。この方法をコンパンディングと呼ぶ。
入力 \(x\) へ単調な圧縮関数 \(g\) を適用し、その結果を一様量子化器 \(Q_{\mathrm{u}}\) へ入力する。復号後に逆関数 \(g^{-1}\) を適用すると、全体の量子化器は次のようになる。
Q(x)
=
g^{-1}
\left(
Q_{\mathrm{u}}
\left(
g(x)
\right)
\right)
\]
圧縮関数 \(g\) は、細かく表現したい入力領域を変換後の広い範囲へ引き伸ばし、粗く表現してよい領域を狭く圧縮する。変換後には等間隔で量子化していても、元の実数空間へ戻すと代表値間隔は非一様になる。
たとえば、0 の周辺を引き伸ばす変換を使えば、小さな入力に対して細かな代表値を配置できる。大きな入力は圧縮されるため、広いダイナミックレンジを有限個のコードへ収められる。
| 段階 | 処理 | 量子化上の役割 |
|---|---|---|
| 圧縮 | 入力へ非線形関数 \(g\) を適用する。 | 入力空間の各領域へ割り当てる解像度を変える。 |
| 一様量子化 | 変換後の値を一定間隔の代表値へ対応させる。 | 単純な量子化器で有限コードへ変換する。 |
| 伸張 | 逆関数 \(g^{-1}\) によって元の値域へ戻す。 | 元の空間上で非一様に配置された代表値を得る。 |
コンパンディングは、入力分布に合わせた非一様量子化を、変換と一様量子化の組合せとして実装する。変換関数が入力分布に適合していれば平均誤差を減らせるが、分布が想定から外れると代表値の配分も不適切になる。
5.9 最適性は平均誤差以外の制約でも変わる
平均歪みだけを最小化すると、計算量、保存形式、最悪誤差、コードの使用頻度は直接制約されない。実用上の量子化器では、これらの条件も同時に満たす必要がある。
| 制約 | 制約が必要になる理由 | 最適量子化器への影響 |
|---|---|---|
| 固定ビット数 | 各値を一定幅で保存し、並列に処理する必要がある。 | 出現確率が低いコードも同じビット数を消費する。 |
| 平均ビット数 | 頻出コードへ短い符号を割り当てて圧縮率を上げる。 | 歪みだけでなく、コード出現確率と符号長が設計へ入る。 |
| 最大誤差 | 一度の大きな誤差が許されない用途がある。 | 平均歪みが多少増えても、広い範囲を均等に保護する配置が必要になる。 |
| 演算効率 | 任意の代表値より、整数格子上の値の方が高速に計算できる場合がある。 | 理論上の最適配置より、ハードウェアで処理しやすい構造を選ぶ。 |
| 分布変化への耐性 | 設計時と運用時で入力分布が変わる可能性がある。 | 一つの分布に過度に特化せず、範囲や代表値へ余裕を持たせる。 |
平均二乗誤差を最小化した非一様量子化器が、常に実用上最適になるわけではない。任意の代表値を表として保持すると、尺度一つで記述できる一様量子化器より付加情報が増える。代表値探索も必要になり、整数の積和演算へ直接写せない場合がある。
ニューラルネットワークでは、数値誤差を小さくする配置と、高速な行列積を実行できる配置の間に差がある。任意の非一様コード表が重みを精密に近似しても、対応する演算カーネルがなければ、計算前に高精度形式へ展開する必要がある。数値的最適性とシステム上の最適性は分けて評価しなければならない。
5.10 確率分布と損失関数が量子化器の判断基準を作る
量子化器へ与えられたコード数だけでは、代表値をどこへ置くべきかは決まらない。入力分布が、どの領域へ表現能力を多く配分すべきかを示す。歪み関数が、どの種類の誤差を強く避けるべきかを示す。
同じ入力分布であっても、二乗誤差を使えば条件付き平均が代表値になり、絶対誤差を使えば条件付き中央値が代表値になる。同じ歪み関数であっても、入力分布が変わればセル境界と代表値は移動する。
最適量子化器の基本問題は、利用できる代表値数を \(N\) として、次の期待歪みを最小にするセル分割と代表値集合を求めることである。
\min_{\{R_i,c_i\}_{i=1}^{N}}
\sum_{i=1}^{N}
\int_{R_i}
d(x,c_i)
f_X(x)\,dx
\]
この式では、入力分布 \(f_X(x)\)、歪み関数 \(d(x,c_i)\)、セル \(R_i\)、代表値 \(c_i\) が一つの問題へ結び付く。入力が頻繁に現れ、誤った再構成による損失が大きい領域には、細かなセルと適切な代表値を配置する必要がある。
Max と Lloyd の条件は、量子化器設計を「近い値へ丸める」という説明から、確率加重された損失を最小化する問題へ移した。Gersho は、この構造をスカラー量子化から高次元の量子化へ接続する原理として整理した[6]。
ここまでの議論では、入力を個々の数値として扱ってきた。しかし、確率分布を前提に量子化器を設計すると、量子化後に変化するのは個々の値だけではない。各セルに存在した確率質量が一つの代表点へ集められ、連続分布そのものが有限個の点からなる離散分布へ変わる。次章では、量子化を確率分布の有限支持近似として捉え直す。
6. 確率分布そのものを有限個の点で近似する
6.1 個々の値から分布全体へ視点を移す
前章までは、入力 \(x\) をどの代表値へ割り当てるかという、一つの値に対する操作を中心に見てきた。しかし、量子化器へ入力される値が確率分布に従うなら、量子化によって変わるのは個々の値だけではない。入力がどの領域へどの程度の確率で現れるかという、分布全体の形も変わる。
確率変数 \(X\) が確率分布 \(\mu\) に従うとする。量子化器 \(Q\) が代表点 \(c_1,\ldots,c_N\) だけを出力するなら、量子化後の確率変数 \(Q(X)\) は、この有限個の値だけを取る離散確率変数になる。
量子化器が入力空間をセル \(R_1,\ldots,R_N\) に分け、セル \(R_i\) に入った値を代表点 \(c_i\) へ移す場合、量子化後に \(c_i\) が現れる確率は次の値になる。
P(Q(X)=c_i)
=
P(X\in R_i)
=
\mu(R_i)
\]
\(\mu(R_i)\) は、元の確率分布がセル \(R_i\) に割り当てていた確率質量である。セル内部にあった個々の位置の違いは失われ、そのセルに含まれていた確率が代表点 \(c_i\) へ集められる。
| 量子化前 | 量子化後 | 失われる情報 | 残る情報 |
|---|---|---|---|
| セル \(R_i\) の内部に連続的または多数の値が分布する。 | セル内の確率質量が代表点 \(c_i\) へ集約される。 | セル内部で値がどの位置にあったかという情報が失われる。 | 入力がセル \(R_i\) に入る確率 \(\mu(R_i)\) は、代表点の出現確率として残る。 |
たとえば、標準正規分布に従う実数を、負、0 付近、正という 3 個の領域へ分ける。負の領域を代表点 -1、中央を 0、正の領域を 1 で表せば、連続的な正規分布は、-1、0、1 の 3 点だけに確率を持つ離散分布へ変わる。
量子化前には、-0.2 と -2.0 は異なる値であり、それぞれ異なる密度を持つ位置にあった。両方が同じ負側のセルに入れば、量子化後には同じ -1 になる。元の分布が持っていた滑らかな形は、各セルの確率質量を有限個の代表点へ集めた分布へ置き換わる。
6.2 押し出し測度は量子化後の分布を表す
確率分布 \(\mu\) を量子化器 \(Q\) によって変換した分布を、押し出し測度と呼ぶ。記号では \(Q_{\#}\mu\) と書く。
Q_{\#}\mu
=
\sum_{i=1}^{N}
\mu(R_i)\delta_{c_i}
\]
\(Q_{\#}\mu\) は、量子化後の確率分布である。記号 \(\delta_{c_i}\) は、代表点 \(c_i\) の位置だけに全質量を置く点質量を表す。係数 \(\mu(R_i)\) は、その点へ置かれる確率の大きさである。
この式を具体的に読むと、次の操作を表している。
| 数式の要素 | 意味 | 量子化における役割 |
|---|---|---|
| \(\mu\) | 量子化前の確率分布 | 入力がどの領域へどの程度の確率で現れるかを表す。 |
| \(R_i\) | 代表点 \(c_i\) に対応する量子化セル | 同じ代表点へ集約される入力の集合を表す。 |
| \(\mu(R_i)\) | セル \(R_i\) に含まれる確率質量 | 量子化後に代表点 \(c_i\) が現れる確率になる。 |
| \(\delta_{c_i}\) | 点 \(c_i\) だけに質量を持つ分布 | セル全体を一つの代表点へ置き換える。 |
| \(Q_{\#}\mu\) | 量子化後の分布 | 有限個の代表点だけを支えに持つ離散分布になる。 |
押し出し測度の定義は、有限個の代表点を使う場合だけに限られない。一般の可測集合 \(A\) に対して、量子化後の分布が \(A\) に置く確率は次のように定義される。
(Q_{\#}\mu)(A)
=
\mu\left(Q^{-1}(A)\right)
\]
\(Q^{-1}(A)\) は、量子化した結果が集合 \(A\) に入る元の入力をすべて集めた集合である。量子化後にある代表点が現れる確率を知りたければ、その代表点へ写される量子化前の領域が持つ確率を調べればよい。
量子化を分布の変換として見る利点は、個々の入力誤差だけでなく、量子化後の統計的性質を直接扱えることにある。代表値の平均、分散、出現確率、エントロピーは、押し出し測度 \(Q_{\#}\mu\) から計算できる。
6.3 量子化は連続分布を有限支持分布へ変える
確率分布が正の確率を置く点や領域の集合を、その分布の台または支持と呼ぶ。正規分布のような連続分布は、実数直線上の広い範囲を支持に持つ。一方、量子化後の分布は代表点 \(c_1,\ldots,c_N\) だけに確率を置く。
量子化後の分布の支持は、次の有限集合に含まれる。
\operatorname{supp}(Q_{\#}\mu)
\subseteq
\{c_1,\ldots,c_N\}
\]
用意した代表点の一部へ入力が一度も割り当てられない場合、その点の確率は 0 になるため、実際の支持は \(N\) 点より少なくなる。すべてのセルが正の確率質量を持つなら、量子化後の分布は \(N\) 個の点を支持に持つ。
この変換によって、連続的または高精度な分布を有限個の状態として扱える。期待値や積分を、代表点についての有限和で近似できる。
量子化前の確率変数 \(X\) に対する関数 \(f\) の期待値は、次の積分で表される。
\mathbb{E}[f(X)]
=
\int f(x)\,d\mu(x)
\]
量子化後の値 \(Q(X)\) を使えば、対応する期待値は有限和になる。
\mathbb{E}[f(Q(X))]
=
\sum_{i=1}^{N}
f(c_i)\mu(R_i)
\]
連続分布に対する積分が、代表点での関数値と各セルの確率を使った和へ変わる。量子化は、確率分布を保存・通信する技術であると同時に、連続的な期待値計算を有限個の評価点へ置き換える数値近似にもなる。
6.4 分布近似としての量子化誤差を定義する
確率分布を有限個の点で近似するとき、どの代表点集合が元の分布へ最も近いかを評価する必要がある。代表点集合を \(C=\{c_1,\ldots,c_N\}\) とし、入力 \(x\) から最も近い代表点までの距離を次のように書く。
d(x,C)
=
\min_{c\in C}
\|x-c\|
\]
\(\|x-c\|\) は入力と代表点の距離である。実数なら絶対値、高次元ベクトルならユークリッドノルムなどを使う。最小値を取ることで、入力を集合 \(C\) の中で最も近い代表点へ割り当てた場合の誤差が得られる。
距離の \(r\) 乗を分布全体で平均し、その \(r\) 乗根を取った量を、\(L^r\) 型の量子化誤差として定義できる。代表点数を最大 \(N\) 個に制限したときの最小誤差は、次の式で表される。
e_{N,r}(\mu)
=
\inf_{|C|\leq N}
\left(
\int
\min_{c\in C}
\|x-c\|^r
\,d\mu(x)
\right)^{1/r}
\]
この式に含まれる各要素には、次の役割がある。
| 記号 | 意味 | 量子化上の解釈 |
|---|---|---|
| \(N\) | 利用できる代表点数の上限 | 有限の表現能力を表す。 |
| \(r\) | 距離を何乗して評価するかを決める指数 | 大きな誤差をどの程度強く罰するかを決める。 |
| \(C\) | 代表点の集合 | 量子化後に使用できる値を表す。 |
| \(\min_{c\in C}\|x-c\|\) | 入力から最も近い代表点までの距離 | 最近傍量子化で生じる一つの入力に対する誤差になる。 |
| \(\int \cdots d\mu(x)\) | 入力分布に従った平均 | 頻繁に現れる領域の誤差を強く反映する。 |
| \(\inf\) | 可能な代表点集合の中で得られる下限 | 最大 \(N\) 個の代表点で到達可能な最良の誤差を表す。 |
\(r=2\) なら、二乗距離を平均して平方根を取るため、平均二乗誤差に対応する。\(\,r=1\) なら平均絶対距離になる。\(r\) を大きくすると、大きな誤差を持つ入力の影響が強くなる。
この定義では、特定の一様量子化器や整数形式を前提としていない。代表点の配置は自由であり、入力空間が一次元である必要もない。確率分布を最大 \(N\) 個の点で近似するときに、理論上どこまで誤差を小さくできるかを表している。
6.5 量子化誤差は代表点数と分布の形に依存する
代表点数 \(N\) を増やせば、元の分布をより細かく近似できる。代表点集合 \(C\) へ新しい点を追加しても、既存の点を使い続けることはできるため、最適量子化誤差は通常増加しない。
e_{N+1,r}(\mu)
\leq
e_{N,r}(\mu)
\]
ただし、代表点を 2 倍にしても、誤差が必ず半分になるとは限らない。誤差の減り方は、入力空間の次元、分布の滑らかさ、密度の集中、使用する距離の次数によって変わる。
一次元で狭い区間に集中する分布なら、少数の代表点でも比較的小さな誤差を得られる。高次元空間へ広く分布するデータでは、同じ代表点数を使っても、各方向へ十分な解像度を配分できない。
| 分布の性質 | 代表点配置への影響 | 量子化誤差への帰結 |
|---|---|---|
| 狭い領域へ集中する分布 | 代表点を集中領域へ密に配置できる。 | 少数の代表点でも平均誤差を小さくしやすい。 |
| 広い範囲へ分散する分布 | 代表点を広い領域へ配分する必要がある。 | 同じ代表点数ではセルが広くなり、誤差が増えやすい。 |
| 複数の峰を持つ分布 | 各峰へ何個の代表点を配分するかを決める必要がある。 | 配分を誤ると、一部の峰が粗く近似される。 |
| 重い裾を持つ分布 | まれな大きな値を覆うため、外側にも代表点が必要になる。 | 外れ値を保護すると中央領域の解像度が低下する。 |
| 高次元分布 | 空間全体を覆うために多数の代表点が必要になる。 | 代表点数を増やしても、一方向当たりの解像度が上がりにくい。 |
分布の量子化では、代表点をどこへ置くかだけでなく、分布のどの特徴を保存したいかも明示する必要がある。平均二乗距離を小さくする代表点集合が、裾の確率、分位点、極端値の発生確率を正確に再現するとは限らない。
金融リスクの計算で損失分布の上側の裾が重要なら、平均誤差の小ささだけで中央へ代表点を集中させると、まれな大損失を粗く近似する。平均的な入力をよく表す量子化器と、極端な事象をよく表す量子化器は同じにならない。
6.6 分布の量子化は数値積分を有限和へ変える
確率分布を有限個の代表点へ量子化すると、期待値を有限和で近似できる。計算したい関数を \(f\) とすると、元の期待値は次の形である。
\mathbb{E}[f(X)]
=
\int f(x)\,d\mu(x)
\]
量子化後の確率変数 \(Q(X)\) を使えば、次の有限和で近似できる。
\mathbb{E}[f(X)]
\approx
\mathbb{E}[f(Q(X))]
=
\sum_{i=1}^{N}
\mu(R_i)f(c_i)
\]
各代表点 \(c_i\) で関数を一度評価し、その値へセルの確率 \(\mu(R_i)\) を掛けて合計する。連続分布上で無数の入力を扱う代わりに、最大 \(N\) 回の関数評価で近似できる。
この近似が正確になるかどうかは、量子化誤差だけでなく、関数 \(f\) が入力変化にどの程度敏感かによって決まる。\(f\) が急激に変化する領域を粗く量子化すると、入力距離が小さくても関数値の誤差が大きくなる。
関数 \(f\) がリプシッツ連続であり、ある定数 \(L\) に対して次の関係を満たすとする。
|f(x)-f(y)|
\leq
L\|x-y\|
\]
このとき、期待値近似の誤差は、量子化距離によって上から評価できる。
\left|
\mathbb{E}[f(X)]
–
\mathbb{E}[f(Q(X))]
\right|
\leq
L\,
\mathbb{E}
\left[
\|X-Q(X)\|
\right]
\]
右辺は、関数の感度 \(L\) と平均量子化距離の積である。量子化誤差が同じでも、急激に変化する関数では期待値誤差が大きくなり、滑らかな関数では小さくなる。
6.7 数値計算では分布を量子化して状態数を減らす
確率分布の量子化は、信号を保存する目的だけでなく、確率的な計算を有限状態へ変えるためにも使われる。連続的な確率変数や確率過程を有限個の代表状態で近似すれば、積分、期待値、遷移、最適化を有限和や有限行列として計算できる。
| 応用分野 | 量子化する対象 | 有限化による効果 | 主な失敗条件 |
|---|---|---|---|
| 数値積分 | 連続確率分布 | 積分を代表点上の重み付き有限和へ置き換える。 | 関数が急変する領域へ代表点が不足すると近似誤差が増える。 |
| 確率微分方程式 | 確率過程の状態や増分 | 連続状態の確率過程を有限状態の遷移として近似する。 | 時間経過とともに量子化誤差が蓄積または増幅する。 |
| 金融工学 | 資産価格、金利、損失分布 | 期待収益、価格、リスク量を有限個の状態で計算する。 | 裾の事象を粗くすると、まれな大損失を過小評価する。 |
| 施設配置 | 需要地点の空間分布 | 需要分布を有限個の代表地点へまとめ、配置問題として解く。 | 距離以外の交通条件や容量制約を無視すると実用上の損失が増える。 |
| 機械学習 | 連続潜在表現や特徴分布 | 有限コードブックを使って離散表現へ変換する。 | 頻度の高い表現へコードが集中し、少数パターンが失われる場合がある。 |
これらの応用で共通するのは、連続分布を有限個の代表状態へ変えることで、計算可能な状態数へ収める点である。元の分布を完全に保存することはできないため、最終計算へ影響する方向の誤差を小さくする必要がある。
6.8 分布どうしの距離として量子化を評価する
量子化前の分布 \(\mu\) と量子化後の分布 \(Q_{\#}\mu\) を直接比較することもできる。個々の入力と代表値の距離を平均する量子化誤差は、元の分布から量子化後の分布へ確率質量を移動させる費用として解釈できる。
同じ入力 \(X\) と量子化後の値 \(Q(X)\) を一組として考えれば、元の分布 \(\mu\) と量子化後の分布 \(Q_{\#}\mu\) の間に結合が作られる。この結合の下での平均移動距離は、次の量になる。
\mathbb{E}
\left[
\|X-Q(X)\|^r
\right]
\]
最適輸送で使われる Wasserstein 距離は、二つの分布の確率質量をどのように対応づければ、移動費用を最小にできるかを測る。量子化器 \(Q\) が作る対応は、その候補の一つになる。
量子化後の分布を \(\nu=Q_{\#}\mu\) とすれば、概念的には次の関係が得られる。
W_r(\mu,\nu)
\leq
\left(
\mathbb{E}
\left[
\|X-Q(X)\|^r
\right]
\right)^{1/r}
\]
\(W_r\) は次数 \(r\) の Wasserstein 距離である。右辺は、各入力を量子化器が指定した代表点へ移す費用を平均した値である。Wasserstein 距離は、より有利な対応があればそれを選べるため、この量子化器による費用以下になる。
最近傍量子化で、代表点集合が固定されている場合には、量子化器は各入力を最も近い代表点へ送る。この構造は、連続分布を有限支持分布へ近似する最適輸送問題と密接に結び付く。
6.9 量子化後の分布は平均や分散も変える
量子化器は分布の支持を有限化するだけでなく、平均、分散、裾、対称性などの統計量も変える。量子化後の平均は次の有限和になる。
\mathbb{E}[Q(X)]
=
\sum_{i=1}^{N}
c_i\mu(R_i)
\]
元の平均は次の値である。
\mathbb{E}[X]
=
\int x\,d\mu(x)
\]
両者の差は、平均量子化誤差と関係する。
\mathbb{E}[X]
–
\mathbb{E}[Q(X)]
=
\mathbb{E}[X-Q(X)]
=
\mathbb{E}[e]
\]
量子化誤差の平均が 0 でなければ、量子化後の分布の平均は元の分布からずれる。正負対称の分布を対称量子化する場合には平均のずれが打ち消されることがあるが、偏った分布や非対称なクリッピングでは系統的なバイアスが生じる。
分散も変化する。小さな値を同じ代表点へ集めると分散が減る場合があり、確率的な量子化やディザを加えると分散が増える場合がある。平均二乗誤差だけを小さくしても、平均や分散を正確に保存できるとは限らない。
| 統計的性質 | 量子化による変化 | 影響が現れる用途 |
|---|---|---|
| 平均 | 誤差に方向的な偏りがあると、量子化後の平均がずれる。 | 反復計算、制御、勾配更新などでずれが蓄積する。 |
| 分散 | 値を中央へ集約すれば減少し、乱数を加えれば増加する場合がある。 | 不確実性評価、確率的最適化、信号電力の評価に影響する。 |
| 裾の確率 | 外れ値をクリップすると、極端値の発生確率が失われる。 | 金融リスク、安全率、障害確率の評価に影響する。 |
| 相関 | 複数変数を成分ごとに量子化すると、変数間の関係が変わる場合がある。 | 多変量解析、時系列、ニューラルネットワークの中間表現に影響する。 |
分布を量子化するときは、どの統計量を保存すべきかを目的に応じて決める必要がある。平均二乗距離を最小化する代表点集合が、平均、分散、裾の確率をすべて最良に保存するわけではない。
6.10 ディザは量子化誤差の分布を設計する
決定論的な量子化器では、同じ入力へ同じ誤差が生じる。そのため、入力が一定値や周期信号であれば、誤差にも一定の偏りや周期構造が現れる。量子化前に意図的な乱数を加えるディザは、この入力依存性を制御する方法である。
ディザを表す確率変数を \(U\) とすると、入力 \(X\) へ \(U\) を加えてから量子化する。
Y=Q(X+U)
\]
この処理では、一つの入力 \(x\) に対して量子化結果が毎回同じになるとは限らない。加えられた乱数によって、隣接する代表値のどちらへ割り当てられるかが変化する。
ディザは、一回の再構成値を必ず元の入力へ近づける処理ではない。乱数を加えるため、一回ごとの絶対誤差や二乗誤差が増える場合もある。その代わり、決定論的な量子化で生じる入力依存の偏り、周期的なひずみ、誤差の相関を弱められる。
| ディザなし | ディザあり | 変化する性質 |
|---|---|---|
| 同じ入力は常に同じ代表値へ写される。 | 同じ入力でも乱数に応じて量子化結果が変わり得る。 | 誤差の決定論的な反復が弱まる。 |
| 一定入力では一定の誤差が続く。 | 誤差が複数の値へ分散する。 | 固定バイアスを統計的な揺らぎへ変えられる場合がある。 |
| 周期入力では周期的な量子化ひずみが生じ得る。 | 誤差エネルギーがより広い周波数へ分散する。 | 規則的なひずみが雑音に近い性質へ変わる。 |
Schuchman は、ディザの確率分布が一定の条件を満たすとき、量子化誤差を入力から独立にできることを示した[7]。これは、任意の乱数を加えれば自動的に独立性が得られるという意味ではない。量子化器の刻み幅とディザ分布の特性関数の関係が条件を満たす必要がある。
Lipshitz、Wannamaker、Vanderkooy は、音響信号における量子化とディザの理論を整理し、ディザなしの量子化誤差を無条件に白色雑音とみなす説明の限界を示している[8]。小振幅の音声では、量子化誤差が信号と相関して規則的なひずみとして聞こえる場合がある。適切なディザは、このひずみを確率的な雑音へ変える。
6.11 加算型ディザと減算型ディザでは出力が異なる
ディザには、量子化前に加えた乱数を復号後にも残す方式と、復号後に同じ乱数を差し引く方式がある。
乱数を加えたまま出力する加算型の処理は、次の形になる。
\hat{X}=Q(X+U)
\]
この場合、量子化誤差だけでなく、加えたディザ自体も出力へ残る。入力依存のひずみを弱められる一方、雑音電力は増加する。
復号後に同じディザを差し引く減算型ディザでは、次のように処理する。
\hat{X}
=
Q(X+U)-U
\]
量子化器へ入れる前には乱数を加えるが、出力側でその乱数を差し引く。送信側と受信側で同じディザを共有できれば、ディザそのものを出力から除きながら、量子化誤差の統計的性質を制御できる。
| 方式 | 再構成式 | 利点 | 制約 |
|---|---|---|---|
| 加算型ディザ | \(\hat{X}=Q(X+U)\) | 送受信側で乱数を共有しなくても使用できる。 | 加えたディザが出力雑音として残る。 |
| 減算型ディザ | \(\hat{X}=Q(X+U)-U\) | 条件を満たせば、入力と独立した量子化誤差を作りやすい。 | 復号側が同じディザ値を知る必要がある。 |
ディザの目的は誤差そのものを消すことではない。誤差を、入力に従属した規則的なひずみから、解析可能な確率分布へ変えることにある。平均誤差、分散、独立性、周波数分布のうち、どの性質を優先するかによって、適切なディザ方式は変わる。
6.12 確率的量子化は分布の期待値を保存できる
ディザと近い発想として、入力を隣接する代表値へ確率的に割り当てる方法がある。入力 \(x\) が代表値 \(a\) と \(b\) の間にあり、\(a\lt x\lt b\) とする。次の確率で量子化すれば、量子化後の期待値を元の入力と一致させられる。
Q(x)
=
\begin{cases}
a & \text{確率 }\dfrac{b-x}{b-a}\\
b & \text{確率 }\dfrac{x-a}{b-a}
\end{cases}
\]
期待値を計算すると、次の関係になる。
\mathbb{E}[Q(x)]
=
a\frac{b-x}{b-a}
+
b\frac{x-a}{b-a}
=
x
\]
一回の量子化結果は \(a\) または \(b\) であり、通常は元の値 \(x\) と一致しない。それでも、多数回の平均では元の値を保存する。量子化誤差の期待値は 0 になる。
\mathbb{E}[x-Q(x)]=0
\]
決定論的な最近傍丸めでは、小さな値が繰り返し 0 へ落とされ、更新が系統的に失われる場合がある。確率的量子化では、一回ごとには 0 になっても、一定の確率で隣接する非ゼロ値へ切り上げられるため、長期的な期待値を保てる。
ただし、期待値が正しいことは分散が小さいことを意味しない。確率的量子化はバイアスを減らす代わりに、量子化結果へ確率的な揺らぎを導入する。反復計算や学習では、このバイアスと分散の交換を評価する必要がある。
6.13 分布の量子化では何を保存するかを選ばなければならない
確率分布を有限個の点へ近似すると、元の分布が持っていたすべての性質を同時に保存することはできない。代表点数が有限であるため、密度の細かな形、平均、分散、裾の確率、相関構造の間で表現能力を配分する必要がある。
平均二乗距離を最小化する量子化器は、入力の大部分を数値的に近く表す。しかし、まれな外れ値や分布の裾を正確に残す保証はない。平均を保存する確率的量子化器は、各回の出力分散を増やす場合がある。入力との独立性を得るディザは、出力へ追加の雑音を導入する。
| 保存したい性質 | 有効な設計 | 代わりに生じる制約 |
|---|---|---|
| 平均距離の小ささ | 入力密度に応じて代表点を配置する。 | まれな領域や裾の表現が粗くなる場合がある。 |
| 期待値の不偏性 | 確率的丸めを使う。 | 一回ごとの量子化結果に分散が生じる。 |
| 入力と誤差の独立性 | 条件を満たすディザを使用する。 | 追加の雑音または乱数共有が必要になる。 |
| 極端値の確率 | 裾へ代表点を確保し、クリッピングを抑える。 | 中央領域の代表点密度が下がる。 |
| 計算量の削減 | 少数の代表点で分布を近似する。 | 期待値や遷移の近似誤差が増える。 |
量子化を分布近似として見ると、誤差は個々の値のずれだけでは説明できない。量子化後の分布が、元の分布のどの性質を保持し、どの性質を変えたかを確認する必要がある。
確率分布の量子化は、連続的な確率質量を有限個の代表点へ集約する。各セル内部の位置情報を捨てる代わりに、代表点とその確率だけで分布を扱えるようにする。この有限化によって、保存、通信、積分、確率過程の計算を簡略化できるが、残すべき統計量に応じて代表点配置と誤差尺度を選ばなければならない。
ここまでは、代表点集合を有限個の点として扱い、各入力を最も近い点へ対応させる構造を中心に見てきた。入力が複数の成分を持つ場合、代表点は高次元空間内のベクトルになり、各セルは区間ではなく幾何学的な領域になる。次章では、分布の量子化を高次元空間へ拡張し、コードブック、ボロノイ分割、クラスタリングとの関係を扱う。
7. ベクトル量子化では空間をボロノイ領域へ分ける
7.1 成分ごとの量子化は成分間の関係を利用できない
これまで扱ってきたスカラー量子化は、一つの実数を一つの代表値へ対応させる。画像の色、音声の一定区間、ニューラルネットワークの重みブロックのように、一つの対象が複数の数値から構成される場合には、入力をベクトルとして扱える。
二次元ベクトルを次のように書く。
x=(x_1,x_2)
\]
\(x_1\) と \(x_2\) を別々のスカラー量子化器へ入力する方法を、成分ごとの量子化とする。それぞれの成分に \(M\) 個の代表値を用意すれば、二次元空間には最大 \(M^2\) 個の代表点が縦横の格子状に並ぶ。
たとえば各成分に 4 個の代表値を使うと、代表点は 16 個になる。
C=C_1\times C_2
\]
\(C_1\) は第 1 成分の代表値集合、\(C_2\) は第 2 成分の代表値集合、記号 \(\times\) は二つの集合の直積を表す。代表点集合 \(C\) は、各成分の代表値をすべて組み合わせた格子になる。
成分ごとの量子化は、各座標を独立に処理できるため単純である。しかし、入力の各成分が独立に変化するとは限らない。たとえば、二つの成分がおおむね次の関係を持つとする。
x_2\approx x_1
\]
この場合、データは二次元平面全体へ広がらず、左下から右上へ伸びる細い帯の周辺に集中する。格子状の代表点を置くと、この帯から離れた場所にも多数のコードが割り当てられる。
| 方式 | 代表点の配置 | 成分間の相関 | コード利用上の帰結 |
|---|---|---|---|
| 成分ごとの量子化 | 各座標の代表値を組み合わせた格子状の配置になる。 | 各成分を独立に処理するため、斜め方向などの関係を直接利用しない。 | データが現れない領域にも代表点が置かれ、コードの一部がほとんど使われない。 |
| ベクトル量子化 | 入力分布に沿って任意の位置へ代表ベクトルを配置できる。 | 複数成分の組合せを一つの状態として扱う。 | データが集中する方向へ代表点を配分し、同じコード数で平均誤差を減らせる場合がある。 |
成分ごとの量子化が捨てるのは、個々の成分の精度だけではない。どの \(x_1\) とどの \(x_2\) が同時に現れやすいかという、成分間の依存関係を代表点配置へ反映できない。
ベクトル量子化では、二つの成分をまとめた \(x=(x_1,x_2)\) を一つの入力として扱う。代表値も一つの数ではなく、同じ次元を持つ代表ベクトルになる。
c_i=(c_{i1},c_{i2})
\]
代表ベクトルをデータが集中する斜め方向へ並べれば、入力分布から離れた格子点を減らし、有限個のコードを実際に現れる組合せへ集中できる。成分間の相関を利用できることが、スカラー量子化を組み合わせる方式とベクトル量子化の主要な差になる。
7.2 コードブックは利用可能な代表ベクトルの集合である
ベクトル量子化で使用する代表ベクトルの集合を、コードブックと呼ぶ。代表ベクトルが \(N\) 個ある場合、コードブック \(C\) は次のように表せる。
C=
\{c_1,c_2,\ldots,c_N\}
\subset
\mathbb{R}^d
\]
\(d\) は入力ベクトルの次元、\(N\) は代表ベクトルの個数である。入力 \(x\) も各代表ベクトル \(c_i\) も、\(d\) 個の成分を持つ。
符号化器は、入力ベクトルをコードブック内の一つの代表ベクトルへ対応させる。保存されるのは通常、代表ベクトルの全成分ではなく、コードブック内の番号 \(i\) である。復号器は番号 \(i\) から代表ベクトル \(c_i\) を返す。
E(x)=i
\]
D(i)=c_i
\]
Q(x)=D(E(x))=c_i
\]
| 構成要素 | 内容 | 役割 |
|---|---|---|
| 入力ベクトル | \(x\in\mathbb{R}^d\) | 量子化前の複数成分を一つの対象として表す。 |
| コードブック | \(C=\{c_1,\ldots,c_N\}\) | 量子化後に利用できる代表ベクトルを保持する。 |
| コード | \(i\in\{1,\ldots,N\}\) | 代表ベクトルそのものの代わりに、有限ビットで保存する番号になる。 |
| 符号化器 | \(E(x)=i\) | 入力に対応する代表ベクトルの番号を選ぶ。 |
| 復号器 | \(D(i)=c_i\) | 番号から代表ベクトルを取り出す。 |
コードブックに \(N\) 個の代表ベクトルがある場合、固定長で番号を保存するためには、概ね \(\log_2 N\) ビットが必要になる。たとえば代表ベクトルが 256 個なら、各入力ベクトルを 8 ビットの番号で表せる。
ただし、復号側は同じコードブックを保持していなければならない。コード番号 17 だけを保存しても、17 番目の代表ベクトルが何であるかを知らなければ復元できない。コード本体の保存量に加えて、コードブック自体の保存量が必要になる。
入力ベクトルの個数が多ければ、コードブックを一度保存して多数の入力から参照できるため、全体として圧縮になる。入力数が少ない場合や、コードブックが巨大な場合には、コードブックの付加情報が圧縮効果を相殺する。
7.3 最近傍規則が各代表点の担当領域を作る
平均二乗距離を小さくするベクトル量子化では、入力をコードブック内で最も近い代表ベクトルへ割り当てる。ユークリッド距離を使う場合、量子化器は次のように書ける。
Q(x)
=
c_{i^\ast}
\]
i^\ast
=
\operatorname*{argmin}_{1\leq i\leq N}
\|x-c_i\|
\]
\(\operatorname*{argmin}\) は、値そのものの最小値ではなく、最小値を与える番号を返す。\(i^\ast\) は入力 \(x\) から最も近い代表ベクトルの番号である。
距離の二乗を使っても、選ばれる代表ベクトルは変わらない。
\operatorname*{argmin}_{i}
\|x-c_i\|
=
\operatorname*{argmin}_{i}
\|x-c_i\|^2
\]
平方根は距離の大小関係を変えないため、計算では二乗距離を比較することが多い。二次元のユークリッド距離の二乗は、次の形になる。
\|x-c_i\|^2
=
(x_1-c_{i1})^2
+
(x_2-c_{i2})^2
\]
各成分の差を二乗して足し合わせた値が小さい代表ベクトルを選ぶ。この規則により、コードブック内の各代表点には、それを最も近いとする入力領域が割り当てられる。
7.4 最近傍領域はボロノイ分割になる
代表ベクトル \(c_i\) に最も近い入力の集合を \(V_i\) とすると、次のように定義できる。
V_i
=
\left\{
x\in\mathbb{R}^d:
\|x-c_i\|
\leq
\|x-c_j\|
\quad
\text{for all }j
\right\}
\]
\(V_i\) は、代表点 \(c_i\) のボロノイ領域である。各入力は、最も近い代表点のボロノイ領域へ属する。
一次元では、隣接する代表値の中点がセル境界になった。二次元以上では、二つの代表点から等距離にある点の集合が境界になる。ユークリッド距離を使う場合、この境界は二つの代表点を結ぶ線分の垂直二等分面になる。
代表点 \(c_i\) と \(c_j\) の境界は、次の条件を満たす。
\|x-c_i\|^2
=
\|x-c_j\|^2
\]
二乗を展開すると、\(x\) の二次項が両辺で打ち消され、次元に応じた直線または超平面の式になる。
2(c_j-c_i)^\mathsf{T}x
=
\|c_j\|^2-\|c_i\|^2
\]
\((c_j-c_i)^\mathsf{T}x\) はベクトルの内積を表す。二次元では境界が直線、三次元では平面、さらに高い次元では超平面になる。
| 入力次元 | 代表点間の境界 | ボロノイセルの形 |
|---|---|---|
| 1 次元 | 隣接する代表値の中点になる。 | 区間になる。 |
| 2 次元 | 二つの代表点を結ぶ線分の垂直二等分線になる。 | 多角形になる。 |
| 3 次元 | 二つの代表点から等距離にある平面になる。 | 多面体になる。 |
| \(d\) 次元 | 二つの代表点から等距離にある超平面になる。 | 高次元の凸多面体になる。 |
各ボロノイ領域の内部にある入力は、その領域の母点である代表ベクトルへ量子化される。領域内部の細かな位置は失われ、どのボロノイ領域に属していたかという情報だけがコードとして残る。
ボロノイ分割は、代表点を配置した後に最近傍規則から導かれる。境界を独立に自由配置しているわけではない。代表点を動かせば、周囲の境界も動き、各領域へ入る入力が変わる。
7.5 使用する距離が変わればセルの形も変わる
ボロノイ領域の形は、代表点の位置だけでなく、入力と代表点の違いを測る距離によって変わる。ユークリッド距離では円形または球形の等距離面を使うが、すべての成分を同じ尺度で評価することが適切とは限らない。
成分ごとに重要度が異なる場合、正定値行列 \(M\) を使った重み付き距離を定義できる。
d_M(x,c)
=
\sqrt{
(x-c)^\mathsf{T}
M
(x-c)
}
\]
\(M\) は、各方向の誤差をどの程度強く評価するかを定める。特定方向の誤差へ大きな重みを与えると、その方向に細いセルが作られ、代表点がより細かく配置される。
たとえば第 1 成分を第 2 成分より 10 倍強く評価するなら、距離の二乗を次のように定義できる。
d(x,c)^2
=
10(x_1-c_1)^2
+
(x_2-c_2)^2
\]
この距離では、第 1 成分のわずかな差が全体の距離へ大きく影響する。ユークリッド距離で最も近い代表点と、重み付き距離で最も近い代表点が異なる場合がある。
| 距離 | 誤差の評価 | セル形状への影響 |
|---|---|---|
| ユークリッド距離 | すべての方向を同じ尺度で評価する。 | 通常のボロノイ多面体を作る。 |
| 重み付き距離 | 方向または成分ごとに異なる重要度を与える。 | 高い重みを持つ方向へ細長いセルを作る。 |
| 用途固有の歪み | 数値距離ではなく、最終処理の損失を評価する。 | 境界は単純な超平面にならない場合がある。 |
ベクトル量子化における「最も近い代表点」は、距離を指定しなければ決まらない。入力空間の幾何は、元から一つに定まっているのではなく、量子化で保存したい性質に応じて選ばれる。
7.6 平均二乗距離では代表点が領域の重心になる
ボロノイ領域 \(V_i\) を固定した状態で、平均二乗距離を最小にする代表ベクトル \(c_i\) を求める。領域 \(V_i\) による歪みは次のように表せる。
D_i(c_i)
=
\int_{V_i}
\|x-c_i\|^2
\,d\mu(x)
\]
\(\mu\) は入力分布である。この式を \(c_i\) について最小化すると、代表ベクトルは領域内の条件付き平均になる。
c_i
=
\mathbb{E}
\left[
X
\mid
X\in V_i
\right]
\]
高次元でも、一次元の Lloyd–Max 量子化と同じ重心条件が現れる。違いは、平均を一つの数ではなくベクトルの各成分について計算する点にある。
c_i
=
\left(
\mathbb{E}[X_1\mid X\in V_i],
\ldots,
\mathbb{E}[X_d\mid X\in V_i]
\right)
\]
ボロノイ領域の幾何学的中心と、確率質量の重心は一致するとは限らない。領域内部で入力が片側へ集中していれば、代表ベクトルもその側へ移る。
最近傍条件と重心条件を同時に満たす量子化器では、各代表点が自分のボロノイ領域の重心に位置する。このような分割を重心ボロノイ分割と呼ぶ。
| 条件 | 固定する対象 | 更新する対象 | 結果 |
|---|---|---|---|
| 最近傍条件 | 代表ベクトルを固定する。 | 各入力の割当てを更新する。 | 代表点を母点とするボロノイ領域が作られる。 |
| 重心条件 | 各入力の割当てを固定する。 | 代表ベクトルを更新する。 | 各代表点が担当領域の確率重心へ移る。 |
7.7 k-means は経験分布に対するベクトル量子化器を作る
実際には、入力分布 \(\mu\) を数式として正確に知っているとは限らない。代わりに、観測された学習データを使って代表ベクトルを設計する。
学習データを \(x_1,\ldots,x_m\)、コードブックを \(c_1,\ldots,c_N\) とする。経験的な平均二乗歪みは次のように表せる。
D_{\mathrm{emp}}
=
\frac{1}{m}
\sum_{n=1}^{m}
\min_{1\leq i\leq N}
\|x_n-c_i\|^2
\]
\(m\) は学習データ数である。各データ点から最も近い代表ベクトルまでの二乗距離を求め、その平均を最小化する。
この最適化に対して、次の二操作を交互に繰り返す。
| 段階 | 処理 | 量子化器上の意味 |
|---|---|---|
| 割当て | 各学習データを最も近い代表ベクトルへ割り当てる。 | 現在のコードブックからボロノイ領域を作る。 |
| 更新 | 各代表ベクトルを、割り当てられたデータの平均へ移す。 | 各セルの経験的な重心を新しい代表値とする。 |
| 反復 | 割当てと更新を、変化が小さくなるまで繰り返す。 | 最近傍条件と重心条件を交互に満たす。 |
この反復は、k-means クラスタリングと同じ数式を持つ。Linde、Buzo、Gray は、学習データからベクトル量子化器のコードブックを設計する反復法を示した[9]。
k-means では、データを似た群へ分け、各群の特徴を調べることが目的になる場合が多い。ベクトル量子化では、各入力を有限個のコードで表し、再構成誤差を抑えることが目的になる。
| 観点 | クラスタリング | ベクトル量子化 |
|---|---|---|
| 主な目的 | データ内の群構造を発見し、分類や解釈に利用する。 | 有限個の代表ベクトルで入力を近似し、保存量や計算量を減らす。 |
| 出力 | クラスタ割当てと各クラスタの中心を得る。 | コード番号と復号に使うコードブックを得る。 |
| 評価 | 群の分離、解釈可能性、下流タスク性能なども評価対象になる。 | 再構成歪み、符号量、探索計算量が中心になる。 |
| 数学的共通点 | 経験分布を有限個の中心で近似する。 | 経験分布を有限個の代表ベクトルで近似する。 |
同じアルゴリズムを使っても、クラスタ番号を意味のある分類として解釈する必要はない。ベクトル量子化におけるコード番号は、再構成値を選ぶための記号であり、人間が理解できる分類名を持つとは限らない。
7.8 反復設計は初期値と学習データに依存する
k-means 型の反復では、割当てと重心更新を行うたびに経験歪みは増加しない。しかし、可能なすべてのコードブックの中で最小の歪みを持つ大域最適解へ到達する保証はない。
代表ベクトルの初期位置によって、異なる局所解へ収束することがある。特に、入力分布が複数の峰を持つ場合や、コード数が多い場合には、どの領域へ何個の代表ベクトルを配分するかに複数の候補が生じる。
| 失敗要因 | 発生する現象 | 量子化結果への影響 |
|---|---|---|
| 初期配置の偏り | 複数の代表点が同じ高密度領域へ集中する。 | 別の領域へ代表点が不足し、大きな再構成誤差が残る。 |
| 空のセル | ある代表点へ学習データが一つも割り当てられない。 | そのコードが使用されず、重心を計算できない。 |
| 有限標本 | 学習データが実際の入力分布を十分に表さない。 | 学習時の歪みは小さくても、運用時の誤差が増える。 |
| 分布変化 | 設計後に入力の頻度や相関が変化する。 | 以前は適切だった代表点配置が、現在の入力に合わなくなる。 |
| 外れ値 | 少数の遠いデータが重心を引き寄せる。 | 大多数の通常データに対する代表点配置がずれる。 |
初期値依存を減らすため、複数の初期配置から学習し、最終歪みが最も小さいコードブックを選ぶ方法がある。空セルが生じた場合には、誤差の大きな領域へ代表点を再配置する処理が必要になる。
学習データにだけ適合したコードブックは、実際の入力分布が異なると性能を失う。ベクトル量子化器は、コードブックを作った時点の経験分布に対して最適化されるため、代表性の低いデータから学習すれば、その偏りもコードブックへ固定される。
7.9 ベクトル量子化は相関を利用する代わりに探索量を増やす
成分ごとの量子化では、各成分について近い代表値を探せばよい。ベクトル量子化では、入力ベクトルとコードブック内の各代表ベクトルとの距離を比較する。
入力次元を \(d\)、コードブックの大きさを \(N\) とすると、単純な全探索では一つの入力について概ね \(N\) 回の距離計算が必要になる。各距離計算には \(d\) 成分の差と加算が必要であるため、計算量は概ね次の規模になる。
O(Nd)
\]
代表ベクトルを増やせば再構成誤差を減らしやすいが、探索時間とコードブック容量が増える。入力次元を高くすれば成分間の広い相関を利用できるが、一回の距離計算と学習に必要なデータ量が増える。
| 設計変更 | 期待できる効果 | 増加する費用 |
|---|---|---|
| 代表ベクトル数を増やす | 空間を細かく分割し、再構成誤差を減らしやすい。 | コードブック容量、探索回数、学習時間が増える。 |
| 入力次元を増やす | より多くの成分間相関を一つのコードで利用できる。 | 距離計算、必要学習量、空間を覆う代表点数が増える。 |
| 入力を小さなブロックへ分割する | 探索とコードブック保存を小さくできる。 | ブロックをまたぐ成分間相関を利用できなくなる。 |
ベクトル量子化の利点は、高次元空間を一つのコードで表すことにある。同じ性質が、実装上の主要な費用も生む。任意の高次元コードブックを使えば表現力は高いが、コード数と次元が増えるほど探索と記憶が難しくなる。
7.10 ベクトル量子化の本体は高次元空間の有限分割にある
ベクトル量子化は、複数の数値をまとめて丸めるだけの処理ではない。高次元空間へ有限個の代表点を置き、指定した距離または損失に従って、入力空間を各代表点の担当領域へ分ける操作である。
ユークリッド距離と最近傍規則を使えば、担当領域はボロノイ分割になる。平均二乗距離を使えば、各代表点は担当領域の確率重心へ置かれる。学習データからこの配置を求める反復は、k-means と同じ数理構造を持つ。
成分ごとの量子化では、各座標の区別を独立に捨てる。ベクトル量子化では、入力ベクトル全体の分布を見て、どの組合せを同じものとして扱うかを決める。成分間の相関を利用できるため、同じコード数でも再構成誤差を減らせる場合がある。
その代わり、代表点の学習、コードブックの保存、最近傍探索に費用がかかる。高次元化すると、空間を十分な細かさで覆うために必要な代表点数も急増する。任意のコードブックをそのまま使う方式は高い表現力を持つが、実際の計算系では規模が制約になる。
この制約を緩和するには、入力ベクトルを複数の部分へ分ける、コードブックへ格子や直積の構造を持たせる、複数段階に分けて残差を量子化するといった方法が必要になる。次章では、高次元ベクトル量子化の探索と保存を現実的な規模へ収めるため、コードブックへ構造を導入する方法を扱う。
8. 構造化量子化は高次元の探索を分解する
8.1 任意のコードブックは探索と保存の両方で大きくなる
ベクトル量子化では、入力ベクトルとコードブック内のすべての代表ベクトルとの距離を比較し、最も近いものを選ぶ。入力の次元を \(d\)、コードブックに含まれる代表ベクトル数を \(N\) とすると、単純な全探索では、一つの入力につき概ね \(N\) 回の距離計算が必要になる。
ユークリッド距離の二乗を使う場合、一つの代表ベクトルとの距離は次の式で求める。
\|x-c_i\|^2
=
\sum_{j=1}^{d}
(x_j-c_{ij})^2
\]
\(x\) は入力ベクトル、\(c_i\) は \(i\) 番目の代表ベクトル、\(d\) は次元数である。一つの距離を求めるには、各成分について差、二乗、加算を行う。すべての代表ベクトルを調べる場合、計算量は概ね次の規模になる。
O(Nd)
\]
128 次元の入力に 65,536 個の代表ベクトルを用意した場合、単純な探索では一つの入力につき約 838 万成分分の差を評価する。
128\times65,536
=
8,388,608
\]
入力ベクトルが大量に存在する場合、この探索を入力ごとに繰り返す。代表ベクトル数を増やせば空間を細かく分割できるが、探索量も比例して増える。
コードブック自体の保存量も増える。各代表ベクトルが \(d\) 個の成分を持ち、各成分を \(b\) ビットで保存するなら、コードブックの理論保存量は次のようになる。
Ndb
\]
128 次元、65,536 個の代表ベクトル、各成分を 32 ビット浮動小数点数で保存する場合、必要なデータ量は次の値になる。
65,536\times128\times32
=
268,435,456\ \text{bit}
\]
これは約 32 MiB に相当する。一つのコードブックだけなら保存可能な大きさに見えても、層、ブロック、データ種別ごとに別のコードブックを持てば総量は増える。探索時にはコードブックをメモリから繰り返し読み出すため、容量だけでなくメモリ帯域とキャッシュ効率も制約になる。
| 増加させる要素 | 期待できる効果 | 直接増える費用 | 二次的な影響 |
|---|---|---|---|
| 代表ベクトル数 \(N\) | 入力空間を細かなセルへ分け、再構成誤差を減らしやすい。 | 探索候補数とコードブック容量が増える。 | コードブックの読み出し量が増え、キャッシュへ収まりにくくなる。 |
| 入力次元 \(d\) | 多くの成分間相関を一つのコードで表現できる。 | 一回の距離計算と代表ベクトル保存量が増える。 | 必要な学習データ量が増え、空間全体を覆う代表点数も増えやすい。 |
| 代表値の精度 \(b\) | コードブック自体の丸め誤差を小さくできる。 | コードブック容量と読み出し量が増える。 | 低精度演算器だけで探索を完結できない場合がある。 |
高次元の任意コードブックが持つ問題は、理論上の最適代表点を求めにくいことだけではない。学習時には代表点とセル割当てを反復的に更新する必要があり、推論時には大規模な最近傍探索が必要になる。高い表現力をそのまま維持すると、量子化によって削減したい保存量や計算量を、コードブックと探索が再び消費する。
8.2 構造化量子化は許される代表点集合を制限する
構造化量子化は、大規模な任意コードブックと完全に同じ代表点集合を、単に高速に探索する方法ではない。代表点が取り得る形に制約を加え、保存と探索が容易な部分集合だけを候補として使う。
制約のないベクトル量子化では、\(N\) 個の代表ベクトルを高次元空間内の任意の位置へ置ける。構造化量子化では、代表ベクトルを複数部分の組合せ、規則格子、複数段階の和、木構造上の経路などとして表す。
許されるコードブック全体を \(\mathcal{C}\)、構造制約を満たすコードブックの集合を \(\mathcal{C}_{\mathrm{structured}}\) とすると、次の包含関係になる。
\mathcal{C}_{\mathrm{structured}}
\subseteq
\mathcal{C}
\]
構造付きの候補集合は、無制約の候補集合より小さい。同じ歪み関数に対して最適化した場合、構造制約付き量子化器の最小歪みは、無制約量子化器より小さくなることはない。
\min_{C\in\mathcal{C}}
D(C)
\leq
\min_{C\in\mathcal{C}_{\mathrm{structured}}}
D(C)
\]
左辺は任意のコードブックを許した場合の最小歪み、右辺は構造制約を課した場合の最小歪みである。構造化は理論上の表現力を減らす代わりに、探索量、保存量、学習量を削減する。
| 観点 | 無制約ベクトル量子化 | 構造化量子化 |
|---|---|---|
| 代表点配置 | 高次元空間内の任意位置へ代表点を置ける。 | 直積、格子、和、木などの構造を満たす位置に限られる。 |
| 理論上の歪み | 同じ代表点数なら、より小さな歪みへ到達できる可能性がある。 | 構造制約により、最適配置を表現できない場合がある。 |
| コードブック保存 | すべての高次元代表ベクトルを直接保存する。 | 小さな部分コードブックや生成規則だけを保存できる。 |
| 探索 | 多数の高次元代表ベクトルを比較する。 | 低次元探索、段階探索、規則計算へ分解できる。 |
構造化量子化の評価では、再構成誤差だけを比較すると判断を誤る。量子化器によって削減されたデータ量から、コードブック、索引、探索処理、復号処理の費用を差し引く必要がある。わずかに歪みが増えても、探索量が数桁減るなら、システム全体では構造化方式が有利になる。
8.3 直積量子化は高次元ベクトルを部分空間へ分ける
直積量子化では、\(d\) 次元の入力ベクトルを \(m\) 個の部分ベクトルへ分割する。各部分ベクトルを別の低次元コードブックで量子化し、各部分の代表ベクトルを連結して全体を再構成する。
入力ベクトルを次のように分ける。
x=
\left(
x^{(1)},
x^{(2)},
\ldots,
x^{(m)}
\right)
\]
\(x^{(j)}\) は \(j\) 番目の部分ベクトルである。各部分空間にコードブック \(C_j\) を用意し、個別に量子化する。
Q(x)
=
\left(
Q_1(x^{(1)}),
Q_2(x^{(2)}),
\ldots,
Q_m(x^{(m)})
\right)
\]
各部分コードブックが \(K\) 個の代表ベクトルを持つ場合、組合せとして表現できる全体の代表ベクトル数は次の値になる。
K^m
\]
たとえば 128 次元ベクトルを 8 個の 16 次元部分へ分け、各部分に 256 個の代表ベクトルを用意する。この組合せによって表現できる全体の代表ベクトル数は、形式上は次の値になる。
256^8
=
2^{64}
\]
この膨大な全組合せを高次元コードブックとして直接保存する必要はない。保存するのは、8 個の部分コードブックだけである。各部分コードブックは 256 個の 16 次元ベクトルから成るため、保存する成分数は次の値になる。
8\times256\times16
=
32,768
\]
もし \(2^{64}\) 個の 128 次元代表ベクトルを直接保存しようとすれば不可能な規模になるが、直積構造を使えば、部分コードブックの組合せとして暗黙的に表現できる。
探索も部分ごとに分解される。各部分について 256 個の候補との距離を計算するなら、比較する成分数は概ね次の規模になる。
8\times256\times16
=
32,768
\]
65,536 個の 128 次元代表ベクトルを直接探索する場合の約 838 万成分分と比べると、探索量を大幅に減らせる。
| 項目 | 単一コードブック | 直積量子化 |
|---|---|---|
| 入力の扱い | 高次元ベクトル全体を一つの単位として量子化する。 | 入力を複数の低次元部分へ分けて量子化する。 |
| コードブック | 高次元代表ベクトルを直接保存する。 | 複数の小さな部分コードブックを保存する。 |
| 表現可能な組合せ | 保存した代表ベクトルの個数に等しい。 | 部分コードブックの代表値数の積になる。 |
| 探索 | すべての高次元候補を比較する。 | 部分空間ごとの小さな探索へ分解する。 |
| 主な損失 | 探索と保存が大きくなる。 | 部分空間をまたぐ相関を直接利用できない。 |
8.4 部分空間の分け方が直積量子化の誤差を決める
直積量子化は、異なる部分ベクトルを独立に近似する。入力の相関が部分空間の内部に収まっていれば効率がよい。一方、強く相関する成分を別々の部分へ分けると、その関係をコードブックへ反映できない。
たとえば、成分 \(x_1\) と \(x_{65}\) が強く相関しているにもかかわらず、前半 64 次元と後半 64 次元へ分けると、二つの成分は別々のコードブックで処理される。各部分コードブックは、相手側の値を見ずに代表ベクトルを選ぶ。
部分ベクトル間の距離が加法的に分解できる場合、全体の二乗誤差は各部分の誤差の和になる。
\|x-Q(x)\|^2
=
\sum_{j=1}^{m}
\left\|
x^{(j)}
–
Q_j(x^{(j)})
\right\|^2
\]
計算上は扱いやすいが、各部分の選択が独立であるため、全体として最適な組合せを利用しているわけではない。入力分布が部分空間の直積に近い場合には損失が小さいが、複雑な方向へ相関している場合には歪みが増える。
| 分割方法 | 利点 | 失敗条件 |
|---|---|---|
| 隣接成分をまとめる | 配列上で連続する成分を簡単に切り分けられる。 | 相関方向が配列順と一致しなければ、関連成分が別部分へ分かれる。 |
| 相関の強い成分をまとめる | 部分コードブック内で依存関係を利用できる。 | 相関推定と成分並べ替えが必要になり、分布変化へ弱くなる。 |
| 変換後に均等分割する | 回転や線形変換で相関を分散させてから量子化できる。 | 変換行列の保存と適用に追加費用がかかる。 |
直積量子化の歪みは、各部分コードブックの性能だけでは決まらない。入力空間をどの軸で、どの次元数へ分割したかが、捨てられる相関を決める。探索を分解するために導入した部分空間の境界が、量子化誤差の新しい原因になる。
8.5 変換量子化は量子化前に座標系を変える
入力成分が強く相関している場合、量子化前に線形変換を適用し、相関を減らした座標系へ移す方法がある。入力ベクトル \(x\) に変換行列 \(T\) を適用し、変換後の値を量子化する。
y=Tx
\]
\hat{x}
=
T^{-1}Q(y)
\]
変換 \(T\) が直交行列なら、逆変換は転置行列で与えられる。
T^{-1}=T^\mathsf{T}
\]
主成分分析のような変換を使えば、分散の大きな方向と小さな方向を分離できる。分散の大きな成分へ多くのビットや代表値を割り当て、変化の小さな成分を粗く量子化できる。
直積量子化の前に回転変換を入れる場合、元の座標軸に沿っていた相関を各部分へ均等に分散させることもできる。部分空間をまたぐ相関が減れば、独立な部分量子化による損失を抑えやすい。
| 段階 | 処理 | 目的 |
|---|---|---|
| 変換 | 入力 \(x\) を別の座標系 \(y=Tx\) へ移す。 | 相関、分散、方向ごとの重要度を量子化しやすい形へ変える。 |
| 量子化 | 変換後の成分または部分ベクトルを量子化する。 | 有限個のコードで変換後の空間を近似する。 |
| 逆変換 | 量子化後の値を元の座標系へ戻す。 | 元の入力空間における近似値を再構成する。 |
変換量子化では、量子化器だけでなく変換行列も表現系の一部になる。変換が入力分布へ適合していれば歪みを減らせるが、分布が変われば以前の変換が有効とは限らない。変換と逆変換の計算量も、量子化による削減効果へ含めて評価する必要がある。
8.6 格子量子化は規則から代表点を生成する
格子量子化では、代表点を個別に列挙せず、規則的な格子として定義する。生成行列を \(G\)、整数ベクトルを \(k\in\mathbb{Z}^d\) とすると、格子 \(\Lambda\) は次のように表せる。
\Lambda
=
\{Gk\mid k\in\mathbb{Z}^d\}
\]
\(\mathbb{Z}^d\) は \(d\) 次元の整数ベクトル全体、\(G\) は整数格子を実数空間へ写す生成行列である。代表点は生成規則から得られるため、各点の全成分をコードブックとして保存する必要がない。
最も単純な格子は、各成分を独立に一定間隔で量子化する直交格子である。二次元では正方格子、三次元では立方格子になる。より効率的に空間を覆うため、六角形に近いセルを持つ格子や高次元格子も利用できる。
格子量子化の符号化では、入力から最も近い格子点を求める。格子の対称性や周期性を利用できれば、任意コードブックの全探索より効率よく最近傍点を計算できる。
| 観点 | 任意コードブック | 格子量子化 |
|---|---|---|
| 代表点の保存 | 各代表ベクトルを直接保存する。 | 生成行列や格子規則を保存する。 |
| セル形状 | 入力分布に応じて不規則なボロノイ領域を作れる。 | 格子構造に由来する規則的なセルが繰り返される。 |
| 分布適合性 | 代表点を任意位置へ置ける。 | 規則的配置のため、局所的な密度差へ直接適合しにくい。 |
| 探索 | 多数の候補との距離比較が必要になる。 | 格子固有の最近傍計算法を利用できる。 |
格子構造は、コードブック容量と探索を削減する一方、入力分布に応じて代表点密度を局所的に変える自由を失う。入力が空間全体へおおむね一様に分布する場合には適合しやすいが、複数の峰や強い密度差を持つ分布では、使われない格子点が増える。
格子量子化へ非線形変換や領域制限を組み合わせれば、分布への適合性を高められる。しかし、その場合には変換、境界処理、索引付けの費用が加わる。
8.7 残差量子化は近似しきれなかった成分を次段へ渡す
残差量子化では、一度に高精度な代表ベクトルを選ぶ代わりに、複数段階のコードブックを使って入力を順番に近似する。第 1 段で粗い代表ベクトルを選び、その近似で残った誤差を第 2 段で量子化する。
入力を \(x\)、第 1 段の量子化器を \(Q_1\) とする。第 1 段の近似値は次の値になる。
\hat{x}_1=Q_1(x)
\]
第 1 段で残った誤差を残差 \(r_1\) とする。
r_1=x-\hat{x}_1
\]
第 2 段では、元の入力ではなく残差 \(r_1\) を量子化する。
\hat{r}_1=Q_2(r_1)
\]
2 段階の再構成値は、二つの代表ベクトルの和になる。
\hat{x}_2
=
Q_1(x)
+
Q_2\left(x-Q_1(x)\right)
\]
一般に \(L\) 段の残差量子化では、各段の代表ベクトルを加算して入力を再構成する。
\hat{x}
=
\sum_{\ell=1}^{L}
c_{i_\ell}^{(\ell)}
\]
\(c_{i_\ell}^{(\ell)}\) は、第 \(\ell\) 段で選ばれた代表ベクトルである。各段が \(K\) 個の候補を持つなら、組合せとしては最大 \(K^L\) 通りの再構成値を表せる。
| 段階 | 入力 | 出力 | 役割 |
|---|---|---|---|
| 第 1 段 | 元のベクトル \(x\) | 粗い近似 \(Q_1(x)\) | 入力の大きな構造を表現する。 |
| 第 2 段 | 残差 \(x-Q_1(x)\) | 残差の近似 | 第 1 段で残った誤差を補正する。 |
| 後続段 | 直前までの残差 | より細かな補正 | 段階を追加するほど再構成精度を高める。 |
残差量子化では、各段のコードブックを比較的小さく保ちながら、多数の組合せを表現できる。必要な精度に応じて使用段数を変えられるため、粗い近似だけを使う場合と、複数段の補正を使う場合を同じ表現系で扱える。
8.8 残差量子化では前段の選択が後段の問題を決める
残差量子化の各段は独立ではない。第 1 段がどの代表ベクトルを選ぶかによって、第 2 段へ渡される残差の分布が変わる。前段の選択が不適切なら、後段は大きく偏った残差を補正しなければならない。
逐次的に最も近い代表ベクトルを選ぶ貪欲な符号化では、各段で現在の残差を最も小さくする候補を選ぶ。しかし、その選択が最終的な複数段の再構成誤差を最小にするとは限らない。
第 1 段で少し誤差の大きい候補を選んだ方が、第 2 段のコードブックと組み合わせた最終誤差が小さくなる場合がある。段ごとの局所最適と、全段を通した大域最適は一致しない。
| 符号化方法 | 探索方法 | 利点 | 失敗条件 |
|---|---|---|---|
| 貪欲探索 | 各段で現在の残差に最も近い代表ベクトルを選ぶ。 | 段数と候補数に比例する比較的小さな探索で済む。 | 前段の局所的な最良選択が、最終再構成では不利になる場合がある。 |
| 組合せ探索 | 複数段の候補の組合せを同時に比較する。 | より小さな最終誤差を得られる可能性がある。 | 候補数が段数に対して指数的に増える。 |
| ビーム探索 | 各段で有望な複数候補だけを残して探索する。 | 貪欲探索より広く、全組合せ探索より小さな探索で済む。 | 途中で捨てた候補が最終的な最良組合せだった可能性が残る。 |
残差量子化は探索を段階へ分解するが、段階間の依存を消すわけではない。構造によって計算量を抑えた代わりに、符号化順序と探索幅が再構成誤差を左右する。
8.9 階層量子化は候補を木構造で絞り込む
階層量子化では、コードブックを木構造として組織する。最初の段階では粗い領域を選び、その領域の内部で次の候補を選ぶ。深い階層へ進むほど、入力空間を細かく区別する。
各節点が \(B\) 個の子候補を持ち、木の深さが \(L\) である場合、葉の数は最大で次の値になる。
B^L
\]
葉をすべて直接比較する代わりに、各階層で \(B\) 個の候補だけを比較するなら、単一路径をたどる探索量は概ね次の規模になる。
O(BL)
\]
たとえば分岐数 16、深さ 4 の木は最大 65,536 個の葉を持つ。全葉を比較すれば 65,536 候補だが、各階層で 16 候補だけを比較して一つの経路を選ぶなら、比較回数は概ね 64 回になる。
| 階層 | 選択内容 | 空間上の意味 |
|---|---|---|
| 上位階層 | 大きな領域または粗い代表点を選ぶ。 | 入力空間の大分類を決める。 |
| 中間階層 | 選択済み領域の内部をさらに分割する。 | 探索対象を局所領域へ限定する。 |
| 葉階層 | 最終的な代表ベクトルを選ぶ。 | 入力の再構成値とコードを確定する。 |
階層探索の弱点は、上位階層で誤った枝を選ぶと、別の枝にある最良代表点へ到達できないことにある。上位の判断は粗い代表値だけを使うため、局所的には近く見えた枝が、葉まで調べると最適でない場合がある。
複数の枝を残すビーム探索を使えば、この誤りを減らせる。探索幅を広げるほど精度は上がるが、計算量も増える。階層量子化の性能は、木の構造だけでなく、分岐数、深さ、探索幅によって決まる。
8.10 構造化方式は同じ符号長でも異なる代表点集合を作る
量子化後のコードへ同じビット数を使っても、構造によって表現できる代表点集合は異なる。64 ビットのコードを一つの巨大コードブックの番号として使う場合と、8 個の 8 ビット部分コードとして使う場合では、どちらもコード本体は 64 ビットである。
単一コードブック方式では、最大 \(2^{64}\) 個の高次元代表ベクトルから一つを選ぶことになる。しかし、それだけの代表ベクトルを保存、学習、探索することは現実的ではない。
直積量子化では、8 個の部分コードブックから一つずつ代表ベクトルを選ぶ。形式上の組合せ数は同じ \(2^{64}\) でも、表現できる代表点は部分コードブックの直積として生成されるものに限られる。
残差量子化では、複数段の代表ベクトルの和として再構成値を作る。同じ組合せ数であっても、直積量子化とは異なる幾何学的配置になる。
| 方式 | コードの解釈 | 代表点の生成方法 | 表現上の制約 |
|---|---|---|---|
| 単一コードブック | 一つの番号で高次元代表ベクトルを指定する。 | 代表ベクトルを個別に保存する。 | 保存と探索が可能な個数までしか代表点を持てない。 |
| 直積量子化 | 複数部分のコードを連結する。 | 部分代表ベクトルを連結する。 | 部分空間の直積で表せる代表点に限られる。 |
| 残差量子化 | 複数段のコードを順に指定する。 | 各段の代表ベクトルを加算する。 | 段階的な和で表せる代表点に限られる。 |
| 階層量子化 | 木の根から葉までの経路を指定する。 | 選択した葉または経路上の情報から代表値を得る。 | 木構造で到達可能な代表点に限られる。 |
符号長だけを比較しても、量子化器の表現力は分からない。各ビットが一つの巨大コードブックを選ぶために使われるのか、複数部分、複数段、階層経路へ分けて使われるのかによって、入力空間の分割は変わる。
8.11 構造化量子化の費用は歪みだけでは評価できない
構造化量子化を評価するときは、再構成歪み、コード長、コードブック容量、符号化時間、復号時間を分けて測る必要がある。
総保存量は、入力ごとのコード本体と、量子化器を共有するための付加情報から成る。
S_{\mathrm{total}}
=
S_{\mathrm{codes}}
+
S_{\mathrm{codebooks}}
+
S_{\mathrm{metadata}}
\]
\(S_{\mathrm{codes}}\) は量子化された各入力のコード、\(S_{\mathrm{codebooks}}\) は代表ベクトルや生成規則、\(S_{\mathrm{metadata}}\) は分割位置、尺度、木構造などの情報である。
入力数が多ければ、コードブックの保存費用を多数の入力で共有できる。入力数が少ない場合には、量子化コードを小さくしても、コードブックの付加情報が全体を占める。
| 評価項目 | 確認する内容 | 見落とした場合の誤判断 |
|---|---|---|
| 再構成歪み | 元の入力と復号後の値がどの程度異なるかを測る。 | 高速でも目的に必要な情報を失う方式を選ぶ。 |
| コード本体 | 一つの入力を何ビットで表せるかを測る。 | 付加情報を無視して圧縮率を過大評価する。 |
| コードブック容量 | 代表値、変換行列、木構造を保存する費用を測る。 | 入力数が少ない環境で圧縮効果が消える。 |
| 符号化時間 | 入力からコードを選ぶ探索量を測る。 | 保存量は減っても、変換処理が実用時間を超える。 |
| 復号時間 | コードから代表値を作る処理量を測る。 | 頻繁な復号が必要な処理で実行時間が増える。 |
| メモリアクセス | コードブックや表をどの程度読み出すかを測る。 | 演算回数は少なくても、メモリ帯域が律速になる。 |
理論上の再構成誤差が少し小さい方式でも、巨大なコードブックと全探索を必要とするなら、量子化による計算資源削減という目的に適さない。反対に、歪みが少し増えても、小さな表と加算だけで復号できる方式は、実行環境によって有利になる。
8.12 高次元化は構造化しても完全には解消できない
構造化量子化は探索を分解するが、高次元空間そのものの難しさを消すわけではない。入力次元が増えると、同じ代表点数で一方向当たりに確保できる解像度は低下する。
各方向を \(M\) 段階で区別する \(d\) 次元の直積格子には、次の個数の代表点が必要になる。
N=M^d
\]
逆に、利用可能な代表点数が \(N\) 個なら、一方向当たりの段階数は概ね次の値になる。
M=N^{1/d}
\]
代表点数 \(N=65,536=2^{16}\) の場合を考える。1 次元なら 65,536 段階を使える。2 次元なら一方向当たり 256 段階、16 次元なら一方向当たり 2 段階に相当する。
| 次元 \(d\) | 総代表点数 \(N\) | 一方向当たりの段階数 \(N^{1/d}\) | 帰結 |
|---|---|---|---|
| 1 | 65,536 | 65,536 | 一つの軸を非常に細かく分割できる。 |
| 2 | 65,536 | 256 | 各軸へ 8 ビット相当の段階を配分できる。 |
| 4 | 65,536 | 16 | 各軸へ 4 ビット相当の段階しか配分できない。 |
| 16 | 65,536 | 2 | 各方向を粗く二分する程度の解像度になる。 |
直積量子化は、この指数的な組合せを暗黙的に表現する。しかし、部分空間ごとに必要な代表点数が減る代わりに、部分空間をまたぐ相関を捨てる。残差量子化は複数段の和で多数の組合せを作るが、段間依存と探索近似を導入する。
構造化は、高次元量子化の費用を別の形へ移す。探索量を下げれば表現可能な代表点配置が制限され、コードブックを小さくすれば独立性や加法性の仮定が増える。次元の呪いは、探索アルゴリズムだけの問題ではなく、高次元空間を有限個の領域で覆うために必要な状態数から生じる。
8.13 構造化量子化は表現力と計算可能性の境界を決める
任意コードブックは、同じ代表点数なら入力分布へ最も自由に適合できる。一方で、高次元になるほど学習、保存、探索が難しくなる。構造化量子化は、直積、格子、変換、残差、階層という制約を導入し、量子化器を実際に計算できる形へ変える。
直積量子化は、高次元の選択を複数の低次元選択へ分ける。格子量子化は、代表点を規則から生成して明示的なコードブックを減らす。残差量子化は、一つの大きな選択を複数段の補正へ分ける。階層量子化は、全候補探索を木に沿った局所探索へ変える。
これらの方式は、無制約の最適解を別の計算方法で正確に求めているわけではない。代表点集合に異なる構造を課し、それぞれ異なる近似空間を作っている。方式ごとの再構成誤差は、その探索アルゴリズムだけでなく、許された代表点配置の違いから生じる。
Gersho は、高次元ブロック量子化の漸近的性質を分析し、次元を増やしたときのセル形状と歪みの関係を扱った[10]。Gersho と Gray は、ベクトル量子化、構造化コードブック、探索方法、信号圧縮の関係を体系化している[11]。
構造化量子化の帰結は、探索を速くすることだけではない。有限の保存量と計算量で扱える量子化器の範囲を定め、その範囲の外にある代表点配置を候補から捨てることである。量子化器が捨てる区別は、入力値の差だけではない。構造を導入した時点で、量子化器自身が取り得た設計上の区別も捨てている。
次に必要になるのは、代表点数を増やしたとき、量子化誤差がどの速さで減るかという評価である。高分解能の極限では、入力分布、空間次元、セル形状が量子化誤差の減少率を決める。次章では、Bennett 積分、点密度、Zador 型の漸近式を通じて、有限個のセルで高次元空間を覆う幾何学的な限界を扱う。
9. 高レート極限では誤差の減り方を次元が支配する
9.1 代表点数を増やせば誤差は減るが、減少率は一定ではない
量子化器が使用できる代表点数を増やすと、入力空間をより細かなセルへ分割できる。各入力と代表点の距離は短くなり、最適な配置を選べば量子化誤差は減少する。しかし、代表点数を 2 倍にしたときに誤差がどれだけ減るかは、空間の次元と歪みの定義によって変わる。
確率分布 \(\mu\) を最大 \(N\) 個の代表点で近似し、距離の \(r\) 乗を平均する場合の最小歪みを、次のように定義する。
D_{N,r}(\mu)
=
\inf_{|C|\leq N}
\int
\min_{c\in C}
\|x-c\|^r
\,d\mu(x)
\]
\(C\) は代表点集合、\(N\) は利用できる代表点数、\(r\) は誤差を何乗で評価するかを示す。前章まで使用した量子化誤差 \(e_{N,r}(\mu)\) との関係は、次のとおりである。
e_{N,r}(\mu)
=
D_{N,r}(\mu)^{1/r}
\]
\(D_{N,r}\) は距離の \(r\) 乗を平均した歪みであり、\(e_{N,r}\) はその \(r\) 乗根を取った距離尺度である。二乗誤差を使う場合は \(r=2\) となり、\(D_{N,2}\) が平均二乗誤差、\(e_{N,2}\) がその平方根に対応する。
入力分布が \(d\) 次元空間上で十分に規則的であり、代表点数 \(N\) が大きい高レート領域では、最適な \(r\) 乗歪みは概略として次の速さで減少する。
D_{N,r}(\mu)
\asymp
C N^{-r/d}
\]
\(\asymp\) は、\(N\) を大きくしたときに、両辺の比が 0 や無限大へ発散せず、定数倍の範囲で同じ次数を持つことを表す。\(C\) は、入力分布、距離、次元、最適セルの幾何学的形状に依存する定数である。
指数 \(-r/d\) の分子には、誤差を何乗で測るかを示す \(r\) が入り、分母には空間次元 \(d\) が入る。同じ二乗誤差でも、一次元なら \(N^{-2}\)、二次元なら \(N^{-1}\)、100 次元なら \(N^{-0.02}\) という異なる減少率になる。
| 空間次元 | 二乗歪みの漸近次数 | 代表点数を 2 倍にした場合 | 誤差減少の特徴 |
|---|---|---|---|
| 1 次元 | \(N^{-2}\) | 歪みは概ね \(1/4\) になる。 | 代表点の追加によって誤差が急速に減る。 |
| 2 次元 | \(N^{-1}\) | 歪みは概ね \(1/2\) になる。 | 一次元より緩やかだが、代表点数の増加が直接効く。 |
| 10 次元 | \(N^{-0.2}\) | 歪みは概ね 0.87 倍になる。 | 代表点を倍増しても減少は約 13% にとどまる。 |
| 100 次元 | \(N^{-0.02}\) | 歪みは概ね 0.986 倍になる。 | 代表点を倍増しても減少は約 1.4% にとどまる。 |
この次数則は、代表点数を増やすことの効果が次元によって変わる理由を示す。同じ数の代表点を追加しても、高次元では各方向へ十分な解像度を配分できない。量子化器の学習方法や探索アルゴリズムを改善しても、有限個の点で高次元空間を覆うという幾何学的制約は残る。
9.2 次元の呪いは空間を覆うセル数から生じる
次数 \(N^{-r/d}\) が現れる理由は、入力空間を有限個の小さなセルで覆る場合を考えると理解できる。各座標方向を \(M\) 段階へ分ける \(d\) 次元の直積格子では、必要なセル数は次の値になる。
N=M^d
\]
利用できるセル数を \(N\) として、一方向当たりの分割数を逆算すると、次のようになる。
M=N^{1/d}
\]
一方向当たりのセル幅は、概ね \(M^{-1}\) に比例するため、次の次数を持つ。
\Delta
\asymp
N^{-1/d}
\]
代表点までの距離もセル幅と同じ次数になる。距離の \(r\) 乗を歪みとして使えば、歪みは次の次数になる。
D_{N,r}
\asymp
\Delta^r
\asymp
N^{-r/d}
\]
この導出は直積格子を使った概略であるが、最適なセル形状を使った場合にも、次元に対する指数 \(-r/d\) は維持される。より効率的なセル形状は定数 \(C\) を小さくできるが、指数そのものは変えられない。
各方向を 10 段階で表す例では、必要な代表点数は次のように増加する。
| 次元 | 一方向当たりの段階数 | 必要な代表点数 | 保存に必要な固定長コード |
|---|---|---|---|
| 1 次元 | 10 | \(10\) | 少なくとも 4 ビットが必要になる。 |
| 2 次元 | 10 | \(10^2=100\) | 少なくとも 7 ビットが必要になる。 |
| 10 次元 | 10 | \(10^{10}\) | 少なくとも 34 ビットが必要になる。 |
| 100 次元 | 10 | \(10^{100}\) | 約 333 ビットのコード空間が必要になる。 |
高次元量子化が難しい直接原因は、同じ細かさで各方向を分けるためのセル数が次元に対して指数的に増えることである。セル数が指数的に増えるため、コードブックの保存、学習データ、最近傍探索も増える。探索アルゴリズムの費用は、この幾何学的なセル数増加から派生する。
9.3 歪みを一定割合だけ減らすための代表点数も指数的に増える
高レート則を使うと、歪みを一定割合だけ減らすために必要な代表点数を計算できる。二乗歪みを例に取り、現在の歪みを半分にしたいとする。
D_N
\asymp
C N^{-2/d}
\]
代表点数を倍率 \(a\) だけ増やしたときの歪み比は、次のようになる。
\frac{D_{aN}}{D_N}
\asymp
a^{-2/d}
\]
歪みを半分にする条件は、次の式になる。
a^{-2/d}
=
\frac{1}{2}
\]
これを \(a\) について解くと、必要な代表点数の倍率は次のようになる。
a
=
2^{d/2}
\]
| 次元 | 二乗歪みを半分にする代表点数の倍率 | 帰結 |
|---|---|---|
| 1 次元 | \(\sqrt{2}\) 倍 | 代表点を約 1.41 倍にすればよい。 |
| 2 次元 | 2 倍 | 代表点を倍増すると歪みが半分になる。 |
| 10 次元 | 32 倍 | 歪みを半分にするだけでコードブックが 32 倍になる。 |
| 100 次元 | \(2^{50}\) 倍 | 約 1,126 兆倍の代表点が必要になる。 |
100 次元で代表点を 2 倍にしても誤差がほとんど減らないという現象と、歪みを半分にするために代表点数が約 1,126 兆倍必要になるという現象は、同じ指数則の表現である。高次元では、コードブックを少し拡大する程度では空間の被覆密度がほとんど変わらない。
9.4 代表点数とビット数の関係では 1 ベクトル当たりと 1 次元当たりを分ける
固定長コードを使い、代表点数が \(N\) 個ある場合、一つのベクトルを表すビット数 \(R\) は次の関係を持つ。
R=\log_2 N
\]
逆に、\(R\) ビットを使えるなら、代表点数は次の値になる。
N=2^R
\]
これを高レート則へ代入すると、歪みはビット数に対して次のように減少する。
D_R
\asymp
C2^{-rR/d}
\]
\(R\) は 1 ベクトル全体に割り当てるビット数である。次元 \(d\) が増えても \(R\) を固定する場合、1 次元当たりに使えるビット数は減少する。その結果、指数 \(-rR/d\) の絶対値が小さくなり、歪みが下がりにくくなる。
1 次元当たりのビット数を \(\rho\) とすると、次の関係になる。
\rho=\frac{R}{d}
\]
\(R=d\rho\) を高レート則へ代入すると、次の形になる。
D_\rho
\asymp
C2^{-r\rho}
\]
この式では、指数に次元 \(d\) が現れない。1 次元当たりのビット数を一定に保つなら、総ビット数 \(R\) を次元に比例して増やしているためである。高次元で誤差が減らないという説明は、総代表点数またはベクトル全体のビット数を固定した比較である。
| 比較条件 | 固定する量 | 次元増加時のビット配分 | 歪みへの影響 |
|---|---|---|---|
| 代表点数固定 | \(N\) | 1 次元当たりの識別能力が減る。 | 指数 \(-r/d\) が小さくなり、誤差が減りにくくなる。 |
| ベクトル全体のビット数固定 | \(R\) | 1 次元当たりのビット数 \(R/d\) が減る。 | 高次元ほど一方向当たりの解像度が粗くなる。 |
| 1 次元当たりのビット数固定 | \(\rho=R/d\) | 総ビット数を次元に比例して増やす。 | 主要な指数は \(2^{-r\rho}\) となるが、総保存量は増える。 |
一次元の一様量子化で二乗誤差を使い、表現範囲と入力条件が同じなら、ビット数を 1 増やすと代表値数が 2 倍になり、刻み幅は概ね半分になる。二乗誤差は刻み幅の二乗に比例するため、歪みは概ね \(1/4\) になる。
信号対量子化雑音比へ換算すると、1 ビット追加するごとに約 6.02 dB 改善するという近似が得られる。
10\log_{10}4
\approx
6.02\ \mathrm{dB}
\]
この 6 dB 則は、範囲内の一様量子化、十分な分解能、クリッピングの無視、入力と誤差の統計的条件を前提とする。任意の低ビット量子化や高次元ベクトル量子化で無条件に成立する規則ではない。
9.5 高分解能近似ではセル内部の密度を一定とみなす
高レート理論は、代表点数が十分に多く、各量子化セルが小さい状況を扱う。セルが小さければ、その内部では入力の確率密度が大きく変化しないと近似できる。
一次元の入力密度を \(f(x)\) とし、位置 \(x\) の周辺にどの程度の密度で代表点を配置するかを点密度関数 \(\lambda(x)\) で表す。点密度関数は次のように正規化する。
\lambda(x)\geq0
\]
\int\lambda(x)\,dx=1
\]
代表点数が \(N\) 個なら、位置 \(x\) の周辺にある単位長さ当たりの代表点数は概ね \(N\lambda(x)\) になる。その場所のセル幅 \(\Delta(x)\) は、点密度の逆数として次のように近似できる。
\Delta(x)
\approx
\frac{1}{N\lambda(x)}
\]
点密度が高い場所ではセルが狭くなり、入力を細かく表現できる。点密度が低い場所ではセルが広くなり、誤差を許容する代わりに代表点を節約する。
セル内で密度 \(f(x)\) がほぼ一定であり、代表値をセル中央へ置くとする。幅 \(\Delta\) のセルが持つ二乗歪みは、概ね次の値になる。
f(x)
\int_{-\Delta/2}^{\Delta/2}
u^2\,du
=
\frac{f(x)\Delta^3}{12}
\]
\(u\) はセル中央からのずれを表す。セル一つ当たりの歪みは幅の 3 乗に比例するが、単位区間内にあるセル数は幅の逆数に比例する。全体を積分すると、一様ではない細かなセル配置に対する高分解能近似は次の形になる。
D_N
\approx
\frac{1}{12N^2}
\int
\frac{f(x)}
{\lambda(x)^2}
\,dx
\]
この式は Bennett 積分と呼ばれる高分解能解析の形である[2]。入力密度 \(f(x)\) が高い場所で点密度 \(\lambda(x)\) を大きくすると、その領域の歪みを下げられる。一方、点密度には総量 1 という制約があるため、ある領域へ代表点を増やすと、別の領域では減らさなければならない。
9.6 最適な点密度は確率密度そのものには比例しない
Bennett 積分を最小化する点密度 \(\lambda(x)\) を求めると、二乗誤差の場合には次の関係が得られる。
\lambda^\ast(x)
\propto
f(x)^{1/3}
\]
最適な代表点密度は、入力の確率密度 \(f(x)\) そのものではなく、その 3 乗根に比例する。入力密度が 8 倍になっても、最適な代表点密度は 2 倍になる。
入力が多い場所へ代表点を増やす必要はあるが、出現確率に完全比例させると、高密度領域へ代表点を集中させすぎる。低密度領域のセルが極端に広がり、そこで生じる二乗誤差が大きくなる。3 乗根という指数は、高密度領域の頻度と、低密度領域で増える距離の二乗を均衡させた結果である。
最適点密度を Bennett 積分へ代入すると、一次元の高レート二乗歪みは次の形になる。
D_N
\approx
\frac{1}{12N^2}
\left(
\int
f(x)^{1/3}
\,dx
\right)^3
\]
この式では、\(N^{-2}\) が代表点数に対する減少率を示し、括弧内の積分が入力分布の形による定数を決める。Panter と Dite は、非一様な量子化段階を入力密度に応じて配置した場合の高分解能歪みを解析した[3]。
| 入力密度 | 最適点密度 | セル幅 | 量子化上の帰結 |
|---|---|---|---|
| 高い領域 | \(f(x)^{1/3}\) に従って増える。 | 点密度の逆数に従って狭くなる。 | 頻出値を細かな代表値で近似する。 |
| 低い領域 | 高密度領域より少なくなる。 | 広くなる。 | まれな入力の誤差を許容して代表点を節約する。 |
| 密度が 0 の領域 | 理想化された点密度も 0 になり得る。 | 入力が現れないためセルを置く必要がない。 | コードを実際の確率質量がある領域へ集中できる。 |
一般の \(d\) 次元空間で距離の \(r\) 乗を使う場合、最適な点密度は概略として次の形を持つ。
\lambda^\ast(x)
\propto
f(x)^{d/(d+r)}
\]
次元 \(d\) が大きくなると、指数 \(d/(d+r)\) は 1 に近づく。高次元では、代表点密度が入力密度へより近い割合で配分される。ただし、この関係は高分解能で局所セルが十分小さいという前提の下で得られる。
9.7 Zador 型の漸近式は次数と定数を分ける
入力分布が \(d\) 次元空間上で確率密度 \(f\) を持ち、必要な正則性とモーメント条件を満たす場合、最適 \(r\) 乗量子化歪みは、より具体的に次の形で表される。
D_{N,r}(\mu)
\sim
J_{r,d}
N^{-r/d}
\left(
\int_{\mathbb{R}^d}
f(x)^{d/(d+r)}
\,dx
\right)^{(d+r)/d}
\]
\(\sim\) は、\(N\) を無限に大きくしたときに両辺の比が 1 へ近づくことを表す。これは \(\asymp\) より強い関係である。
| 式の要素 | 意味 | 決めているもの |
|---|---|---|
| \(N^{-r/d}\) | 代表点数に対する基本的な減少率 | 次元と歪み次数によって決まり、分布の細部には依存しない。 |
| \(J_{r,d}\) | 次元、距離、局所セル形状に由来する定数 | 同じ次数の中で、セルがどれだけ効率よく空間を覆うかを表す。 |
| \(f(x)^{d/(d+r)}\) | 入力密度を量子化に適した指数で重み付けした量 | 分布のどこへ代表点を集中させるかを反映する。 |
| 積分全体 | 入力分布の形が持つ量子化困難性 | 同じ次元と代表点数でも分布によって異なる定数を与える。 |
この形は Zador 型の漸近式として知られ、確率分布の量子化理論では、代表点数に対する誤差率と分布依存の定数を分けて扱う。Graf と Luschgy は、最適代表点の存在、量子化誤差の漸近挙動、絶対連続分布や特異分布に対する結果を体系化している[12]。
同じ \(d\) 次元で同じ \(r\) を使えば、規則的な絶対連続分布は共通して \(N^{-r/d}\) という次数を持つ。一方、密度の集中、裾の重さ、支持領域の形によって定数部分は変わる。次数が同じであっても、有限の \(N\) で生じる実際の誤差には大きな差があり得る。
9.8 セル形状は減少率ではなく定数を改善する
高レート領域では、各セルが非常に小さくなる。滑らかな確率密度の下では、局所的なセル内部で密度をほぼ一定とみなし、セルの形状が持つ正規化二次モーメントによって歪みを評価できる。
同じ体積を持つセルでも、代表点から遠い角や細長い部分を持つ形状は、平均距離を大きくする。質量が代表点の周辺へ均等に集まる形状ほど、同じセル体積で小さな二乗歪みを持つ。
二次元では、正方形より正六角形に近いセルの方が平面を効率よく覆い、平均二乗距離の定数を小さくできる。高次元では、効率のよい格子やセル形状を求める問題が量子化定数へ現れる。
| セルの性質 | 代表点からの距離 | 高レート歪みへの影響 |
|---|---|---|
| 等方的で丸みに近い | 体積を代表点の周辺へ集めやすい。 | 正規化された平均距離を小さくしやすい。 |
| 細長い | 特定方向に代表点から遠い領域を持つ。 | その方向の二乗距離が増え、定数が大きくなる。 |
| 不規則で尖っている | 一部の入力が代表点から大きく離れる。 | セル体積が同じでも平均歪みが増える。 |
Gersho は、高次元の漸近的に最適な量子化器では、局所セルが尺度を除いて共通する効率的な形へ近づき、各セルが総歪みへほぼ同程度に寄与するという原理を提示した[10]。Gersho と Gray は、この幾何学的視点をベクトル量子化と信号圧縮の体系の中で整理している[11]。
高次元におけるセル形状の主張は、すべての次元と分布について完全に解決された定理として扱えるものではない。最適格子や最適セル形状は次元によって異なり、一般次元の厳密な形は未解決部分を含む。確定している次数 \(N^{-r/d}\) と、最適セル形状に関する幾何学的予想や個別次元の結果は分けて読む必要がある。
9.9 周囲の空間次元と分布が実際に持つ次元は一致しない場合がある
入力ベクトルが \(d\) 個の成分を持っていても、確率分布が \(d\) 次元空間全体へ広がっているとは限らない。100 次元ベクトルであっても、成分間に強い制約があり、実際のデータが二次元の曲面付近に集中している場合がある。
量子化誤差の漸近次数を決める次元は、座標数としての周囲の次元ではなく、分布が確率質量を持つ集合の幾何学的次元になる場合がある。一般の確率測度に対しては、誤差の減少率から量子化次元を考える。
概念的には、量子化次元 \(s\) が存在する場合、次のような関係で特徴付けられる。
D_{N,r}
\approx
N^{-r/s}
\]
絶対連続な \(d\) 次元分布では通常 \(s=d\) になる。低次元多様体上に分布する場合や、自己相似的な特異分布では、\(s\) が周囲の空間次元より小さくなることがある。
| 分布の状態 | 周囲の次元 | 誤差率を支配する候補 | 注意点 |
|---|---|---|---|
| 空間全体へ滑らかに広がる | \(d\) | 通常は \(d\) 次元の高レート則になる。 | 密度とモーメントに関する条件が必要になる。 |
| 低次元平面上に厳密に存在する | 座標数は大きくてもよい。 | 平面の次元が誤差率へ現れる。 | 平面に直交する方向の変動が本当に 0 である必要がある。 |
| 低次元多様体の周辺へ小さな雑音を伴って分布する | 周囲の次元は高い。 | 粗い解像度では低次元、細かな解像度では高次元に見える場合がある。 | 代表点数によって観測される有効次元が変わり得る。 |
| 特異分布や自己相似分布 | 周囲の次元とは異なり得る。 | 分布固有の量子化次元が現れる。 | 絶対連続分布用の密度積分をそのまま適用できない。 |
高次元データへ変換や部分空間分割を適用する理由の一つは、入力が実際に持つ低次元構造を見つけ、量子化が必要とする有効次元を下げることにある。ただし、低次元構造を仮定して捨てた方向に小さくても重要な変動があれば、その情報は再構成できない。
9.10 高レート近似が有効になる条件を確認する
高レート漸近式は、代表点数を無限に増やした極限で誤差がどの次数で減るかを示す。有限のコード数に対する正確な誤差を直接与える式ではない。
高分解能近似では、主に次の条件が必要になる。
| 条件 | 近似上の役割 | 条件が破れた場合 |
|---|---|---|
| 代表点数が十分に多い | 各セルを小さくし、局所近似を成立させる。 | 少数の大きなセルでは漸近的なセル形状や点密度が現れない。 |
| セル内で確率密度が緩やかに変化する | セル内部の密度をほぼ一定として積分を近似する。 | 密度が急変する境界や峰では局所誤差の近似が崩れる。 |
| 過負荷誤差が十分に小さい | 各入力を局所的な最近傍セルで扱う。 | 外れ値のクリッピングが総歪みを支配する。 |
| 分布が必要なモーメント条件を満たす | 期待歪みと漸近定数を有限に保つ。 | 重い裾によって平均歪みや定数が発散する場合がある。 |
| 使用する距離とセル形状が局所的に安定する | 同じ幾何学的定数を各局所領域へ適用する。 | 場所ごとに異なる損失や不連続な制約があると単純な式にならない。 |
4 ビット量子化では、代表値は最大でも 16 個である。スカラー量子化で分布が滑らかなら高レート近似が傾向を示す場合はあるが、外れ値、強い非対称性、複数の峰、クリッピングがあると定数項のずれが大きくなる。
高次元ベクトルを 16 個や 256 個の代表点で量子化する場合、各セルは広い領域を担当する。セル内で密度が一定という前提や、局所セルが共通形状へ近づくという前提は成立しにくい。高レート式から得られるのは、代表点数と次元の構造的な関係であり、有限コードブックの実測歪みを置き換える値ではない。
9.11 外れ値と複数峰は漸近定数と有限レート性能を変える
入力分布が一つの滑らかな峰を持つ場合、代表点は密度に応じて連続的に配置される。複数の峰が大きく離れている場合には、各峰へ何個の代表点を割り当てるかという離散的な選択が生じる。
代表点数が少ないと、一つの峰へ代表点を追加するか、別の峰へ最初の代表点を置くかで歪みが大きく変わる。この段階では、点密度を連続関数として扱う高レート近似より、各峰への整数個のコード配分が性能を支配する。
重い裾を持つ分布では、まれな大きな入力が平均二乗誤差へ強く寄与する。裾へ代表点を配置すると中央の解像度が下がり、配置しなければ過負荷誤差が増える。高レート次数が同じでも、分布依存の定数と有限 \(N\) での誤差は大きくなる。
| 分布の特徴 | 高レート理論上の扱い | 有限レートで生じる問題 |
|---|---|---|
| 滑らかな単峰分布 | 点密度近似を適用しやすい。 | 代表点が少ない場合には中心と裾の配分差が残る。 |
| 複数峰分布 | 十分な代表点があれば各峰へ密度に応じて配分される。 | 少数コードでは峰ごとの整数配分によって結果が不連続に変わる。 |
| 重い裾 | 必要なモーメントが有限なら漸近理論を適用できる。 | 少数の外れ値が尺度や平均二乗誤差を支配する。 |
| 密度の不連続 | 不連続点を除く局所領域では近似できる場合がある。 | 境界付近のセルが異なる密度領域をまたぎ、局所一定近似から外れる。 |
漸近次数は、代表点数を増やしたときの長期的な傾向を比較するために使う。有限ビットで量子化器を設計するときには、実際の入力標本を使って、平均誤差、最大誤差、クリッピング率、セル使用率を測定する必要がある。
9.12 構造化量子化は指数則を消さず、扱える単位へ分解する
前章で扱った直積量子化は、高次元ベクトルを複数の低次元部分へ分ける。これは、高次元全体に対する巨大なコードブックを作る代わりに、次元の呪いを複数の小さな問題へ分配する操作である。
全体の次元を \(d\)、部分空間数を \(m\)、各部分の次元を \(d/m\) とする。各部分に \(K\) 個の代表点を用意すると、全体の組合せ数は \(K^m\) になる。一方、探索は各部分で \(K\) 候補を調べればよいため、概ね \(mK\) 回へ分解できる。
ただし、各部分量子化器が持つ誤差率は、部分次元 \(d/m\) によって決まる。部分次元を小さくすれば、代表点追加による誤差減少は速くなる。その代わり、部分空間をまたぐ相関を利用できなくなる。
| 分割 | 各部分の次元 | 量子化上の利点 | 失う構造 |
|---|---|---|---|
| 分割なし | \(d\) | 全成分間の相関を一つのコードブックで利用できる。 | 探索と必要代表点数が高次元の指数則に従って増える。 |
| 少数の大きな部分 | 比較的大きい。 | 部分内の広い相関を利用できる。 | コードブックと探索は依然として大きくなる。 |
| 多数の小さな部分 | 比較的小さい。 | 各量子化器の学習と探索を小さくできる。 | 部分をまたぐ相関を独立として扱う。 |
構造化量子化が成功するのは、高次元全体の自由な代表点配置を維持したまま高速化したからではない。利用する相関の範囲を限定し、低次元問題へ変換することで、高レート則の分母に現れる次元を小さくしたからである。
9.13 高レート則は理論限界ではなく量子化器族の漸近性能を示す
\(N^{-r/d}\) という次数は、有限個の代表点を使って最近傍的に分布を近似する量子化問題の漸近性能を示す。これは、情報源を任意に長い系列としてまとめ、確率的な符号化まで許した場合の情報理論的下限と同一ではない。
代表点数 \(N\) から固定長コードを作れば、1 ベクトル当たりのビット数は \(\log_2 N\) になる。しかし、各代表点の出現確率が不均等なら、すべてのコードを同じ長さで保存する必要はない。頻出コードへ短い符号を割り当てれば、平均ビット数を減らせる。
同じ代表点集合でも、固定長符号を使う場合と可変長符号を使う場合では、平均レートが異なる。高レート量子化理論で使う \(N\) は表現可能な状態数を示すが、その状態を実際に何ビットで記録するかは符号化方式によって変わる。
| 評価対象 | 主な変数 | 示す内容 |
|---|---|---|
| 高レート量子化 | 代表点数 \(N\)、次元 \(d\)、歪み次数 \(r\) | 有限個の代表点で分布を近似したときの漸近誤差を示す。 |
| 固定長符号化 | \(\log_2 N\) | すべての代表点番号を同じ長さで記録するためのビット数を示す。 |
| 可変長符号化 | コード出現確率と符号長 | 頻度差を利用した平均ビット数を示す。 |
| レート歪み理論 | 相互情報量と許容歪み | 任意に長いブロック処理を含む理論上の最小レートを示す。 |
量子化によって状態数を減らす操作と、その状態をビット列へ割り当てる操作を分ける必要がある。代表点を \(N\) 個にしただけでは、圧縮後の実際のビット数は確定しない。次章では、量子化と符号化の役割を分離し、固定長符号、可変長符号、出力エントロピーの関係を扱う。
10. 量子化と符号化は別の操作である
10.1 量子化は状態を減らし、符号化は状態へビット列を割り当てる
量子化と符号化は、連続して実行されることが多いため、一つの圧縮処理としてまとめて説明されやすい。しかし、両者が変換する対象と、そこで失われる情報は異なる。
入力空間を \(X\)、量子化後のコード集合を \(I\) とする。量子化の符号化器 \(E\) は、入力を有限個の状態へ対応させる。
E:X\rightarrow I
\]
量子化では、異なる複数の入力が同じ状態へ写される。入力 \(x\) と \(y\) が異なっていても、同じ量子化セルに入れば次の関係になる。
E(x)=E(y)
\]
この時点で、\(x\) と \(y\) の違いは失われる。量子化後の状態だけから、どちらが元の入力だったかを判定できない。
符号化は、量子化後の各状態 \(i\in I\) へビット列を割り当てる。ビット列全体の集合を \(\{0,1\}^{\ast}\) とし、符号化写像を \(B\) と書けば、次の形になる。
B:I\rightarrow\{0,1\}^{\ast}
\]
\(\{0,1\}^{\ast}\) は、0 と 1 から作られる有限長のビット列全体を表す。状態 0 に 00、状態 1 に 01、状態 2 に 10 といった割当てが符号化に当たる。
符号が一意に復号できるよう設計されていれば、ビット列から量子化後の状態 \(i\) を完全に復元できる。符号化によってビット列の長さが変わっても、状態 \(i\) 自体は失われない。
| 操作 | 入力 | 出力 | 情報損失 | 主な目的 |
|---|---|---|---|---|
| 量子化 | 連続値、多数の離散値、高次元ベクトル | 有限個の状態または代表値 | 同じセルに入った入力どうしの区別を失う。 | 表現する状態数を減らし、許容歪みの範囲へ情報を集約する。 |
| 符号化 | 量子化後の有限個の状態 | 保存または通信に使うビット列 | 一意に復号可能な符号なら、量子化後の状態は失わない。 | 状態の出現確率や構造を利用して、平均ビット数を減らす。 |
量子化による損失と、符号化による圧縮効果は別々に評価する必要がある。量子化後の状態数が少なくても、非効率な符号を割り当てれば保存量は増える。反対に、符号化が理論限界に近くても、量子化時に重要な入力差を失っていれば元の情報は戻らない。
10.2 固定長符号では状態数が 1 コード当たりのビット数を決める
量子化後に \(N\) 個の状態があり、すべての状態へ同じ長さのビット列を割り当てる場合を考える。必要なビット数 \(b\) は、少なくとも次の条件を満たさなければならない。
2^b\geq N
\]
この条件を満たす最小の整数 \(b\) は、次の式で求められる。
b=
\left\lceil
\log_2 N
\right\rceil
\]
記号 \(\lceil\cdot\rceil\) は、値以上の最小の整数へ切り上げることを表す。状態数が 16 個なら \(\log_2 16=4\) であるため、各状態を 4 ビットで表せる。
| 状態数 | 必要な固定長ビット数 | 利用可能なビット列数 | 未使用のビット列 |
|---|---|---|---|
| 2 | 1 ビット | 2 | 存在しない。 |
| 3 | 2 ビット | 4 | 1 個のビット列が余る。 |
| 16 | 4 ビット | 16 | 存在しない。 |
| 17 | 5 ビット | 32 | 15 個のビット列が余る。 |
状態数が 2 のべき乗でなければ、固定長符号には使用されないビット列が生じる。17 状態を区別するには 5 ビットが必要だが、5 ビットでは 32 通りを表せる。利用する状態は 17 個だけであっても、各状態へ一律に 5 ビットを割り当てる。
固定長符号のビット数は、各状態がどの程度の頻度で現れるかには依存しない。ほぼ毎回現れる状態も、一度しか現れない状態も、同じ長さのビット列を使用する。この単純さによって、データ位置を直接計算しやすく、並列処理や無作為アクセスも行いやすい。
一方で、出現確率に大きな偏りがある場合には、まれな状態と頻出状態へ同じ符号長を割り当てるため、平均的には余分なビットを使用する。
10.3 量子化セルと入力分布がコードの出現確率を決める
量子化後の状態の確率は、符号化方式だけからは決まらない。入力分布と量子化セルの配置によって決まる。
量子化器が入力空間をセル \(R_1,\ldots,R_N\) へ分け、セル \(R_i\) を状態 \(i\) へ対応させるとする。入力確率分布を \(\mu\) とすれば、状態 \(i\) の出現確率 \(p_i\) は次の値になる。
p_i
=
P(E(X)=i)
=
P(X\in R_i)
=
\mu(R_i)
\]
同じ符号集合を使っていても、セル境界を移動すれば、各セルが受け取る確率質量が変わる。同じ量子化器でも、入力分布が変われば状態の出現確率は変わる。
| 変更する対象 | 直接変わるもの | 符号化への影響 |
|---|---|---|
| 入力分布 | 各セルへ入る入力頻度が変わる。 | コード確率が変わり、最適な可変長符号も変わる。 |
| セル境界 | 各状態が担当する入力範囲が変わる。 | コード確率と量子化歪みが同時に変わる。 |
| 代表値 | 各セル内の再構成誤差が変わる。 | セル割当てを変えなければ、コード確率は直接には変わらない。 |
| 符号語の割当て | 各状態を表すビット列の長さが変わる。 | 平均符号長は変わるが、量子化歪みは変わらない。 |
量子化器と符号器を別々に設計する場合、最初に量子化器が状態確率 \(p_i\) を作り、その確率に合わせて符号器がビット列を割り当てる。量子化器を変更すると符号器の前提も変わるため、最終的な保存量を評価するには両方を通した測定が必要になる。
10.4 エントロピーは状態の不確実性を平均情報量として表す
量子化後の状態 \(i\) が確率 \(p_i\) で現れるとする。その状態を観測したときの情報量は、次の値で表される。
-\log_2 p_i
\]
頻繁に現れる状態では \(p_i\) が大きいため、情報量は小さくなる。まれな状態では \(p_i\) が小さいため、情報量は大きくなる。
各状態の情報量を出現確率で平均した値が、量子化出力のエントロピーである。
H(Q(X))
=
-\sum_{i=1}^{N}
p_i\log_2 p_i
\]
対数の底が 2 であるため、エントロピーの単位はビットになる。エントロピーは、量子化後の状態を可逆に表現するときに必要となる平均情報量の基準を与える。
すべての状態が同じ確率 \(1/N\) で現れる場合、エントロピーは次の値になる。
H(Q(X))
=
-\sum_{i=1}^{N}
\frac{1}{N}
\log_2\frac{1}{N}
=
\log_2 N
\]
16 状態がすべて同じ確率なら、エントロピーは 4 ビットになる。
H(Q(X))=\log_2 16=4
\]
この場合、固定長 4 ビット符号は、状態確率の偏りを利用して短縮できる余地を持たない。
一方、16 状態のうち一つが確率 0.9 で現れ、残りの 15 状態が残りの確率 0.1 を均等に分ける場合を考える。
p_0=0.9
\]
p_i=\frac{0.1}{15}
\qquad
(i=1,\ldots,15)
\]
この分布のエントロピーは、約 0.86 ビットになる。
H
=
-0.9\log_2 0.9
–
15\frac{0.1}{15}
\log_2\frac{0.1}{15}
\approx
0.86
\]
| 状態分布 | 状態数 | 固定長符号 | エントロピー | 意味 |
|---|---|---|---|---|
| 16 状態が一様 | 16 | 4 ビット | 4 ビット | すべての状態が同程度に予測困難であり、短縮余地が小さい。 |
| 1 状態が 90% | 16 | 4 ビット | 約 0.86 ビット | 頻出状態が予測しやすく、平均符号長を大きく減らせる可能性がある。 |
状態数が同じでも、確率分布が異なればエントロピーは変わる。量子化器が作った状態数だけでは、圧縮後の平均ビット数を判断できない。
10.5 エントロピーは個々の符号長ではなく平均符号長の基準になる
状態 \(i\) へ長さ \(\ell_i\) ビットの符号語を割り当てるとする。平均符号長 \(L\) は次の式で表される。
L
=
\sum_{i=1}^{N}
p_i\ell_i
\]
頻出状態に短い符号語を割り当てれば、その短さが平均へ強く反映される。まれな状態へ長い符号語を割り当てても、出現確率が小さければ平均への影響は限られる。
一意に復号可能な二進符号では、平均符号長を無条件にエントロピーより短くすることはできない。適切な接頭符号を設計すれば、平均符号長 \(L\) は次の範囲へ収められる。
H(Q(X))
\leq
L
\lt
H(Q(X))+1
\]
エントロピーが 0.86 ビットであっても、各状態を一つずつ独立した整数ビット長の符号語で表す場合、平均符号長を厳密に 0.86 ビットへ一致させられるとは限らない。符号語の長さは 1 ビット、2 ビットという整数でなければならないためである。
複数の状態を長いブロックとしてまとめて符号化すれば、1 状態当たりの平均符号長をエントロピーへ近づけられる。Shannon は、確率分布と可逆符号化に必要な平均符号長の関係を定式化した[13]。
| 量 | 内容 | 注意点 |
|---|---|---|
| 自己情報量 | 一つの状態 \(i\) が持つ \(-\log_2 p_i\) ビットの情報量である。 | 実際の符号語長が必ずこの実数値になるわけではない。 |
| エントロピー | 自己情報量を確率で平均した理論的な基準である。 | 単独状態の整数長符号では、端数分の差が残る場合がある。 |
| 平均符号長 | 実際に割り当てた符号語長を出現確率で平均した値である。 | 符号構造、ブロック長、確率推定の精度に依存する。 |
エントロピーはファイルサイズそのものではない。実際の保存量には、符号表、モデル確率、ブロック境界、データ終端などの付加情報も含まれる。データ量が少ない場合には、この付加情報がエントロピーによる短縮効果を上回ることもある。
10.6 可変長符号には一意に区切れる構造が必要になる
可変長符号では、状態ごとに符号語の長さが異なる。単に頻出状態へ短いビット列を割り当てるだけでは、連結したビット列を一意に区切れない場合がある。
たとえば、状態 A に 0、状態 B に 01 という符号を割り当てる。ビット列 01 を受け取ったとき、それが状態 B を表すのか、状態 A の 0 に別の状態を表す 1 が続いたものなのかを、符号表だけでは判断できない。
一つの符号語が別の符号語の先頭部分にならない符号を、接頭符号と呼ぶ。接頭符号では、ビット列を先頭から読むだけで各符号語の終端を確定できる。
| 符号語集合 | 接頭符号 | 復号上の状態 |
|---|---|---|
| 0、10、11 | 該当する。 | どの符号語も別の符号語の先頭部分ではなく、順番に一意に復号できる。 |
| 0、01、11 | 該当しない。 | 0 が 01 の先頭部分であり、連結された系列の区切りが曖昧になる。 |
二進接頭符号の符号語長 \(\ell_i\) は、Kraft の不等式を満たす必要がある。
\sum_{i=1}^{N}
2^{-\ell_i}
\leq
1
\]
短い符号語は、符号木の大きな領域を占有する。1 ビットの符号語を一つ使えば、先頭がそのビットで始まるすべての長いビット列を、別の符号語として使えなくなる。短い符号語を多数の状態へ割り当てることはできない。
頻出状態へ短い符号語を与えると、残りの状態には長い符号語を割り当てる必要がある。可変長符号が平均符号長を減らせるのは、短い符号語を頻繁に使い、長い符号語をまれにしか使わないためである。
10.7 量子化後の状態数とエントロピーは同じ情報を表さない
代表値数が \(N\) 個なら、量子化出力のエントロピーは最大でも \(\log_2 N\) ビットになる。
H(Q(X))
\leq
\log_2 N
\]
等号が成立するのは、すべての状態が同じ確率で現れる場合である。出現確率が偏るほど、エントロピーは小さくなる。
代表値を増やした場合、表現できる状態数は増える。しかし、追加した代表値がほとんど使われないなら、エントロピーの増加は小さい。反対に、既存の高確率セルを複数の同程度の確率を持つセルへ分割すると、出力の不確実性が増え、エントロピーも増加する。
あるセルを二つへ分割し、元の確率 \(p\) を \(p_1+p_2=p\) とする。分割前のエントロピー寄与は次の値である。
-p\log_2 p
\]
分割後の寄与は次の値になる。
-p_1\log_2 p_1
–
p_2\log_2 p_2
\]
両方の確率が正なら、分割後の寄与は分割前以上になる。量子化セルを細かく分ければ、再構成歪みは減りやすい一方、どの細分セルに入ったかという追加情報を記録する必要が生じる。
| 量子化器の変更 | 歪みへの傾向 | エントロピーへの傾向 |
|---|---|---|
| セルを細分化する | 入力に近い代表値を選びやすくなり、歪みは減りやすい。 | 区別する状態が増えるため、エントロピーは増加または維持される。 |
| 複数セルを統合する | 異なる入力を同じ代表値へまとめるため、歪みは増えやすい。 | 区別する状態が減り、エントロピーは減少または維持される。 |
| 低確率領域だけを細分化する | その領域の誤差を減らせる。 | 出現頻度が低いため、平均レートの増加は小さい場合がある。 |
| 高確率領域を細分化する | 頻出値の誤差を減らし、平均歪みへ強く作用する。 | 頻繁に追加状態を区別するため、平均レートも増えやすい。 |
量子化器の状態数は、利用可能なコードの上限を表す。エントロピーは、その状態が実際にどの程度予測困難な順序で現れるかを表す。両者を区別することで、「4 ビット量子化」と「平均 4 ビットで保存される量子化出力」が同じ命題ではないことが明確になる。
10.8 固定レート量子化は状態数を先に制約する
固定レート量子化では、一つの入力へ割り当てるコード長を先に決める。1 入力当たり \(b\) ビットを使うなら、利用可能な状態数は最大 \(2^b\) 個になる。
N\leq2^b
\]
この制約の下で、代表値とセル境界を選び、平均歪みを最小化する。
\min_Q D(Q)
\qquad
\text{subject to}
\qquad
|I|\leq2^b
\]
すべての入力が同じビット数を使うため、各入力の保存位置を計算しやすい。出現確率が変化しても、コード長は変わらない。復号側は、固定位置からコードを読み取り、対応する代表値を取り出せる。
その代わり、頻出状態とまれな状態へ同じビット数を使う。出力分布が大きく偏っていても、その偏りは保存量の削減に利用されない。
10.9 エントロピー制約量子化は歪みと平均レートを同時に最適化する
可変長符号を前提にする場合、状態数だけでなく、各状態の出現確率が平均レートを決める。エントロピー制約量子化では、量子化歪みと量子化出力のエントロピーを同じ目的関数へ入れる。
J(Q)
=
D(Q)
+
\lambda H(Q(X))
\]
\(D(Q)\) は平均歪み、\(H(Q(X))\) は量子化出力のエントロピー、\(\lambda\) は歪みとレートの交換を定める係数である。
| 項 | 小さくした場合の効果 | 反対側に生じる傾向 |
|---|---|---|
| 歪み \(D(Q)\) | 入力に近い代表値を増やし、再構成精度を高める。 | 区別する状態が増え、出力エントロピーも増えやすい。 |
| エントロピー \(H(Q(X))\) | 少数の高確率状態へ入力を集中させ、平均符号長を短くする。 | 広い入力領域を同じ代表値へまとめ、歪みが増えやすい。 |
| 係数 \(\lambda\) | 大きくするとレート削減を強く優先する。 | 小さくすると歪み削減を強く優先する。 |
\(\lambda\) は無次元の単なる重みとは限らない。歪みの単位が値の二乗で、エントロピーの単位がビットなら、\(\lambda\) は 1 ビット増やすことと引き換えに、どの程度の歪み減少を価値あるものとするかを表す。
目的関数を最小化して得られる量子化器は、固定された状態数の中で最小歪みを持つ量子化器とは異なる場合がある。ほとんど使用されない代表値は、歪みをわずかに減らしても、符号表や状態識別の費用に見合わないと判断される場合がある。
10.10 レート項を加えるとセル割当てにも状態確率が入る
固定レートで平均二乗誤差だけを最小化する場合、代表値を固定すると、各入力は数値的に最も近い代表値へ割り当てられる。
エントロピー制約を加える場合、入力を状態 \(i\) へ割り当てる費用には、歪みだけでなく、その状態を符号化するレートも含まれる。状態 \(i\) の理想的な符号長を \(-\log_2 p_i\) と近似すると、入力 \(x\) を状態 \(i\) へ割り当てる費用は概念的に次の形になる。
d(x,c_i)
–
\lambda\log_2 p_i
\]
\(d(x,c_i)\) は入力と代表値の歪み、\(-\log_2 p_i\) は状態 \(i\) の情報量である。確率の高い状態は短い符号で表しやすいため、レート項が小さくなる。確率の低い状態は長い符号を必要とするため、レート項が大きくなる。
入力が二つの代表値から同程度の距離にある場合、エントロピー制約量子化では、出現確率の高い状態へ割り当てる方が目的関数を小さくできる場合がある。セル境界は、代表値間の単純な中点ではなく、代表値との歪みと状態確率の両方によって決まる。
| 量子化方式 | 入力 \(x\) の割当て基準 | セル境界を決める要因 |
|---|---|---|
| 固定レート二乗誤差量子化 | 最も近い代表値を選ぶ。 | 隣接する代表値の位置によって決まる。 |
| エントロピー制約量子化 | 歪みと推定符号長の合計が最小になる状態を選ぶ。 | 代表値の位置に加え、各状態の出現確率によって移動する。 |
この構造により、頻出状態のセルが広がり、まれな状態のセルが縮小することがある。広いセルは多くの入力を集め、状態確率をさらに高める。状態確率が高くなると符号長が短くなり、レート上の利点も増える。
代表値、セル境界、状態確率、符号長は相互に依存する。固定レート量子化のように代表値とセルだけを更新するのではなく、各状態の確率と符号長を含めて反復的に設計する必要がある。
10.11 同じ歪みでもコード確率が異なれば保存量は変わる
二つの量子化器が同じ平均二乗誤差を持っていても、量子化後の状態分布が異なれば、可変長符号化後の平均ビット数は変わる。
量子化器 A が 16 個の状態をほぼ均等に使う場合、エントロピーは 4 ビットに近くなる。量子化器 B が同じ 16 状態を持っていても、一つの状態へ入力の大部分が集中するなら、エントロピーは 4 ビットより大幅に小さくなる可能性がある。
| 量子化器 | 代表値数 | 平均歪み | 出力分布 | 可変長符号化後の傾向 |
|---|---|---|---|---|
| 量子化器 A | 16 | 量子化器 B と同程度 | 各状態がほぼ均等に現れる。 | エントロピーが 4 ビットに近く、固定長符号から短縮しにくい。 |
| 量子化器 B | 16 | 量子化器 A と同程度 | 少数の状態へ確率が集中する。 | 頻出状態へ短い符号を割り当て、平均符号長を減らしやすい。 |
平均歪みだけを最小化すると、出力状態が均等に使われるか、偏って使われるかは直接制約されない。可変長符号を使うシステムでは、同じ歪みを持つ候補の中でも、低い出力エントロピーを持つ量子化器が小さな保存量を実現できる。
反対に、固定長の配列として無作為アクセスする場合には、状態確率が偏っていても 1 要素当たりのビット数は変わらない。低いエントロピーを持つ量子化器が、固定長形式でも自動的に小さくなるわけではない。
10.12 可変長符号は平均を短くする代わりに位置を不定にする
固定長符号では、\(k\) 番目の値が始まるビット位置を、コード長から直接計算できる。各コードが \(b\) ビットなら、先頭から概ね \(kb\) ビットの位置へ移動すればよい。
可変長符号では、前の状態が何ビットで符号化されたかによって、次の状態の開始位置が変わる。途中の状態へ直接アクセスするには、先頭から復号するか、一定間隔で索引を持つ必要がある。
| 観点 | 固定長符号 | 可変長符号 |
|---|---|---|
| 1 状態当たりの長さ | すべて同じになる。 | 状態の出現確率に応じて異なる。 |
| 平均保存量 | 確率の偏りを利用できない。 | 頻出状態へ短い符号を割り当てて減らせる。 |
| 無作為アクセス | 開始位置を直接計算しやすい。 | 境界情報または索引が必要になる。 |
| 並列復号 | コード境界が既知であり、分割しやすい。 | 符号境界の依存により、分割方法が複雑になる。 |
| 破損の影響 | 誤りが一つの固定区画へ留まりやすい。 | ビット欠落によって後続の符号境界までずれる場合がある。 |
可変長符号が理論上小さな平均ビット長を持っていても、復号処理、索引、並列性を含めたシステム全体で有利とは限らない。保存量を最小化する設計と、計算時に直接利用しやすい設計は異なる。
10.13 確率モデルが実際の分布とずれると平均符号長が増える
可変長符号では、各状態の出現確率を推定し、その確率に合わせて符号長を決める。設計時の確率を \(q_i\)、実際の出現確率を \(p_i\) とする。符号長を概ね \(-\log_2 q_i\) とすると、実際の平均符号長は次の交差エントロピーで評価される。
-\sum_i p_i\log_2 q_i
\]
この値は、実際の分布のエントロピーと、分布のずれを表す Kullback–Leibler ダイバージェンスの和へ分けられる。
-\sum_i p_i\log_2 q_i
=
H(p)
+
D_{\mathrm{KL}}(p\|q)
\]
\(H(p)\) は実際の状態分布のエントロピー、\(D_{\mathrm{KL}}(p\|q)\) は設計分布 \(q\) が実際の分布 \(p\) からどれだけずれているかを表す非負の量である。
確率推定が正確なら \(p_i=q_i\) となり、追加費用は 0 になる。分布が変化すると \(D_{\mathrm{KL}}(p\|q)\) が増え、同じ量子化出力でも平均符号長が長くなる。
| 状態 | 符号設計 | 実際の帰結 |
|---|---|---|
| 設計分布と実分布が一致する | 頻度に適合した符号長を割り当てる。 | 平均符号長をエントロピーへ近づけやすい。 |
| 頻出状態が変化する | 以前の頻出状態へ短い符号が残る。 | 現在頻出する状態が長い符号を使い、平均符号長が増える。 |
| 未知の状態が現れる | 既存の符号表に対応がない。 | 逃避符号や符号表更新が必要になる。 |
量子化器も入力分布に合わせて設計されている場合、分布変化は二重の影響を持つ。代表値とセル境界が現在の入力に合わなくなって歪みが増え、コード確率も変わって平均符号長が増える。設計時のレートと歪みだけでなく、運用時の分布変化を含めて評価する必要がある。
10.14 コードブックと符号表の保存量も総レートへ含まれる
量子化後のコード列だけを数えても、データ全体の保存量は確定しない。復号に必要な代表値、尺度、セル構造、符号表、確率モデルも保存または共有する必要がある。
総保存量は概念的に次のように分けられる。
S_{\mathrm{total}}
=
S_{\mathrm{quantized\ codes}}
+
S_{\mathrm{codebook}}
+
S_{\mathrm{coding\ model}}
+
S_{\mathrm{index}}
\]
| 保存対象 | 内容 | 必要になる理由 |
|---|---|---|
| 量子化コード列 | 各入力がどの代表値へ対応したかを表す。 | 個々の量子化結果を復元する。 |
| コードブック | 各量子化コードに対応する代表値を保持する。 | コード番号から数値またはベクトルを再構成する。 |
| 符号モデル | ビット列と量子化状態の対応、または状態確率を保持する。 | 可変長符号を一意に復号する。 |
| 索引 | ブロック境界や途中位置への参照情報を保持する。 | 無作為アクセスや並列復号を可能にする。 |
入力数が十分に多ければ、コードブックや符号表の費用を多数の入力で共有できる。短いデータ列や小さなブロックごとに別の符号表を持つ場合には、付加情報の比率が大きくなる。
エントロピーが低いことは、コード列本体を小さくできる可能性を示す。最終的なファイルサイズや通信量は、付加情報を含めた総量で評価しなければならない。
10.15 エントロピー制約は量子化器の形そのものを変える
量子化と符号化を完全に独立した後処理として考えるなら、最初に最小歪みの量子化器を作り、その出力へ最適な可変長符号を付ければよい。しかし、平均レートに上限がある場合には、符号化費用を量子化器の設計段階へ戻す必要がある。
頻出状態を作るために広いセルを設ければ、その状態へ短い符号を割り当てられる。広いセルでは入力と代表値の距離が増えるため、歪みは増える。細かなセルを追加すれば歪みを減らせるが、新しい状態を区別するために平均レートが増える。
固定レート量子化では、各状態へ同じ符号長を割り当てるため、セルの出現確率は目的関数へ直接入らない。エントロピー制約量子化では、セルの確率質量が符号長を通じて評価される。代表値、セル境界、状態確率、符号語長を一つの設計問題として扱う必要がある。
Gish と Pierce は、高レート領域における効率的な量子化と平均符号長の関係を分析した[14]。高レート近似では、固定長符号を使う量子化と、出力エントロピーを利用する量子化とで、最適なセル配置と達成できる定数が異なる。
10.16 量子化と符号化を分けるとレートの意味が明確になる
量子化器が \(N\) 個の状態を持つことから直接分かるのは、固定長で状態番号を記録するなら最大で \(\lceil\log_2 N\rceil\) ビット必要になるということである。実際の平均ビット数は、状態確率、符号方式、ブロック化、付加情報によって変わる。
量子化は、元の入力空間にあった区別を減らす。符号化は、残された区別をどのビット列で表すかを決める。量子化後の状態を正確に復号できても、量子化時に捨てた区別は戻らない。
| 段階 | 決定するもの | 理論上の評価量 | 失敗の形 |
|---|---|---|---|
| 量子化 | どの入力を同じ状態として扱うかを決める。 | 平均歪み、最大誤差、用途固有損失を使う。 | 重要な入力差を同じ代表値へまとめる。 |
| 状態分布 | 各量子化コードがどの確率で現れるかが決まる。 | エントロピーで不確実性を測る。 | 分布変化によって想定したコード頻度が崩れる。 |
| 符号化 | 各状態をどのビット列で記録するかを決める。 | 平均符号長と復号可能性を評価する。 | 符号境界、索引、付加情報によって実際の費用が増える。 |
状態数、エントロピー、平均符号長は、それぞれ異なる量である。状態数は量子化器が残した候補の個数を示し、エントロピーはその候補の出現がどの程度予測困難かを示し、平均符号長は実際の符号方式が使用するビット数を示す。
この区別を置くと、量子化器の代表点数を増やせば歪みを減らせる一方、区別すべき状態が増えて必要レートも増えるという関係を定式化できる。次章では、特定の量子化器や符号方式を越え、許容する歪みを達成するために最低何ビット必要になるかを、レート歪み理論によって扱う。
11. レート歪み理論は必要ビット数の下限を与える
11.1 許容誤差から必要情報量を逆算する
量子化器を設計するときは、通常、利用できるビット数を先に決め、その範囲で誤差を小さくする。4 ビットなら最大 16 状態、8 ビットなら最大 256 状態を用意し、代表値とセル境界を調整する。この順序を逆にし、平均歪みを \(D\) 以下へ抑えるためには、理論上少なくとも何ビット必要かを問うのがレート歪み理論である。
入力を確率変数 \(X\)、復号後の値を \(\hat{X}\)、両者の違いを測る歪み関数を \(d(X,\hat{X})\) とする。許容する平均歪みを \(D\) としたとき、レート歪み関数は次の式で定義される。
R(D)
=
\inf_{
p(\hat{x}\mid x):
\mathbb{E}[d(X,\hat{X})]\leq D
}
I(X;\hat{X})
\]
条件付き分布 \(p(\hat{x}\mid x)\) は、元の値 \(x\) を観測したときに、どの再構成値 \(\hat{x}\) をどの確率で出力するかを表す。決定論的な量子化器は、一つの入力に対して一つの再構成値を選ぶ特殊な場合である。レート歪み理論では、確率的な再構成も含め、平均歪みの条件を満たすすべての対応を候補にする。
\(I(X;\hat{X})\) は、元の値 \(X\) と再構成値 \(\hat{X}\) の相互情報量である。再構成値を知ることで元の値についてどれだけ不確実性が減るかを測り、平均では何ビット分の区別を再構成側へ残す必要があるかを表す。
| 記号 | 意味 | レート歪み理論における役割 |
|---|---|---|
| \(X\) | 符号化前の情報源 | 保存または通信したい元の値を表す。 |
| \(\hat{X}\) | 復号後の再構成値 | 有限レートで受信側へ残す近似値を表す。 |
| \(d(X,\hat{X})\) | 一つの入力と再構成値の歪み | どの違いを大きな損失として扱うかを定める。 |
| \(D\) | 許容する平均歪み | 再構成品質に課す上限を表す。 |
| \(p(\hat{x}\mid x)\) | 入力から再構成値を作る確率的な規則 | 歪み条件を満たす候補となる再構成方法を表す。 |
| \(I(X;\hat{X})\) | 入力と再構成値の相互情報量 | 再構成品質を達成するために残す必要がある平均情報量を測る。 |
| \(R(D)\) | 歪み \(D\) を達成する最小レート | どの符号化方式でも下回れない漸近的な基準を与える。 |
許容歪み \(D\) を小さくすると、互いに近い入力も別々に再構成しなければならない。再構成値が元の入力について保持する情報量は増え、必要レート \(R(D)\) も増加する。大きな歪みを許せば、多数の入力を同じ再構成値へまとめられるため、必要レートは減少する。
Shannon は、再構成品質の基準を伴う情報源符号化を定式化し、許容歪みと必要レートの境界を示した[15]。この境界は、特定の丸め式やコードブックに依存せず、情報源の確率分布と歪み関数から定まる。
11.2 相互情報量は再構成側へ残した区別を測る
相互情報量は、離散確率変数の場合、次のように表せる。
I(X;\hat{X})
=
\sum_{x,\hat{x}}
p(x,\hat{x})
\log_2
\frac{
p(x,\hat{x})
}{
p(x)p(\hat{x})
}
\]
\(p(x,\hat{x})\) は入力と再構成値の同時確率、\(p(x)\) と \(p(\hat{x})\) はそれぞれの周辺確率である。入力と再構成値が独立なら、同時確率は \(p(x)p(\hat{x})\) に等しくなり、相互情報量は 0 になる。再構成値を見ても元の入力について何も分からない状態である。
再構成値が元の入力を完全に特定するなら、相互情報量は入力が持つ不確実性の全量へ近づく。離散情報源を無歪みで再構成する場合、必要な情報量は情報源のエントロピーに対応する。
相互情報量は、エントロピーを使って次のようにも書ける。
I(X;\hat{X})
=
H(X)-H(X\mid\hat{X})
\]
\(H(X)\) は再構成値を見る前の入力の不確実性、\(H(X\mid\hat{X})\) は再構成値を見た後にも残る不確実性である。両者の差が、再構成値によって明らかになった情報量になる。
量子化によって複数の入力を同じ再構成値へまとめると、\(\hat{X}\) を知ってもセル内部の入力を区別できない。条件付きエントロピー \(H(X\mid\hat{X})\) が残り、相互情報量は小さくなる。細かなセルを使えば残る不確実性は減るが、その区別を伝えるためのレートが増える。
| 再構成の状態 | \(H(X\mid\hat{X})\) | \(I(X;\hat{X})\) | 量子化上の意味 |
|---|---|---|---|
| 元の入力を完全に再構成する | 0 になる。 | \(H(X)\) に等しくなる。 | 入力が持つ区別をすべて保存する。 |
| 複数の入力を同じ値へまとめる | セル内部の不確実性が残る。 | \(H(X)\) より小さくなる。 | 一部の区別を捨て、必要レートを減らす。 |
| 入力と無関係な一定値を再構成する | \(H(X)\) に等しくなる。 | 0 になる。 | 入力について何も伝えない代わりに、レートを 0 にできる。 |
相互情報量は、再構成値の候補数だけを測っているわけではない。再構成値がどの確率で現れ、元の入力とどの程度結び付いているかを含めて評価する。16 個の代表値を用意していても、大部分の入力が一つの代表値へ集約されるなら、相互情報量は 4 ビットより小さくなり得る。
11.3 レート歪み理論は長い入力列をまとめた符号化を考える
レート歪み関数の操作的な意味を理解するには、一つの値だけでなく、長さ \(n\) の入力列をまとめて符号化する必要がある。入力列を次のように書く。
X^n
=
(X_1,X_2,\ldots,X_n)
\]
符号化器 \(f_n\) は、この入力列を有限個のメッセージの一つへ対応させる。利用可能なメッセージ数を \(M_n\) とする。
f_n:
\mathcal{X}^n
\rightarrow
\{1,2,\ldots,M_n\}
\]
復号器 \(g_n\) は、受け取ったメッセージ番号から長さ \(n\) の再構成列を作る。
g_n:
\{1,2,\ldots,M_n\}
\rightarrow
\hat{\mathcal{X}}^n
\]
一つの入力記号当たりのレートは、次の値で表される。
R_n
=
\frac{1}{n}
\log_2 M_n
\]
\(\log_2 M_n\) はブロック全体の番号を固定長で表すためのビット数であり、それをブロック長 \(n\) で割ることで、1 記号当たりのビット数が得られる。
一記号ごとの歪み関数を \(d(x,\hat{x})\) とする場合、ブロック全体の平均歪みは次のように定義する。
d_n(x^n,\hat{x}^n)
=
\frac{1}{n}
\sum_{k=1}^{n}
d(x_k,\hat{x}_k)
\]
このブロック歪みを確率分布に従って平均し、許容値 \(D\) 以下へ抑える。
\mathbb{E}
\left[
d_n(X^n,\hat{X}^n)
\right]
\leq
D
\]
| 構成要素 | 役割 | 一値量子化との違い |
|---|---|---|
| 入力ブロック \(X^n\) | 複数の入力をまとめて符号化する単位になる。 | 各値を独立に量子化せず、列全体の典型的な構造を利用できる。 |
| メッセージ数 \(M_n\) | ブロック全体を区別するコード数を表す。 | 一記号当たりの状態数ではなく、長い系列の候補を表す。 |
| レート \(R_n\) | ブロックの符号量を一記号当たりへ換算する。 | 整数ビット長の端数を長いブロックへ分散できる。 |
| 平均ブロック歪み | 列全体で許容する再構成誤差を測る。 | 各入力で同じ誤差上限を満たす必要はなく、平均として制御できる。 |
長いブロックを使うと、頻繁に現れる典型的な入力列へコードを集中できる。まれな列へ同じ密度でコードを割り当てる必要はない。各値を独立に量子化する方式より、情報源の確率構造を広く利用できる。
11.4 符号化定理は達成可能性と逆定理から成る
レート歪み理論の中心は、\(R(D)\) が単なる最適化式ではなく、実際の符号化で達成できる境界であることにある。符号化定理は、達成可能性と逆定理という二方向の主張から構成される。
達成可能性は、レート \(R\) が \(R(D)\) より大きければ、十分に長いブロックを使うことで、1 記号当たりの平均レートを \(R\) 以下、平均歪みを \(D\) 以下へ近づける符号が存在することを示す。
R>R(D)
\]
逆定理は、レート \(R\) が \(R(D)\) より小さいなら、どれほど巧妙な符号化器と復号器を使っても、十分長い系列について平均歪み \(D\) を安定して達成できないことを示す。
R\lt R(D)
\]
| 主張 | 条件 | 結論 |
|---|---|---|
| 達成可能性 | 使用レートが \(R(D)\) より大きい。 | 十分長いブロックを使えば、平均歪み \(D\) に近い符号を構成できる。 |
| 逆定理 | 使用レートが \(R(D)\) より小さい。 | 平均歪み \(D\) を達成する符号は存在しない。 |
この二方向がそろうことで、\(R(D)\) は既知方式の中で最小のレートではなく、許されたすべての長ブロック符号を含む理論境界になる。新しい量子化方式が考案されても、同じ情報源、同じ歪み関数、同じ平均歪み条件の下では、この境界を下回れない。
11.5 レート歪み関数は歪みが増えるほど減少する
許容歪みを大きくすれば、符号化器が満たすべき条件は緩くなる。歪み \(D_1\) が \(D_2\) 以下であるとき、\(D_1\) を達成する再構成方法は、より緩い \(D_2\) の条件も満たす。
D_1\leq D_2
\]
そのため、レート歪み関数は単調非増加になる。
R(D_1)
\geq
R(D_2)
\]
レート歪み関数は通常、下に凸な関数になる。二つの異なる符号化方式を時間的に使い分けることで、それぞれのレートと歪みの加重平均を達成できるためである。
方式 1 が \((R_1,D_1)\)、方式 2 が \((R_2,D_2)\) を達成するとする。割合 \(\alpha\) で方式 1、残り \(1-\alpha\) で方式 2 を使えば、平均的には次の点を達成できる。
R
=
\alpha R_1+(1-\alpha)R_2
\]
D
=
\alpha D_1+(1-\alpha)D_2
\]
この時間共有によって、二つの達成可能点を結ぶ線分上も達成可能になる。レート歪み曲線が、その線分より上へ膨らむことはない。
| 性質 | 数理的内容 | 量子化上の意味 |
|---|---|---|
| 単調非増加 | 許容歪みを増やすと必要レートは増えない。 | 多くの区別を捨てるほど、伝えるべき情報量を減らせる。 |
| 凸性 | 二つの符号方式を混合した中間点も達成できる。 | レートと歪みの交換は、局所的に急激な優劣反転を起こさない。 |
| 非負性 | \(R(D)\geq0\) になる。 | 必要情報量は負にはならない。 |
曲線の傾きは、追加のレートによって歪みをどの程度減らせるかを表す。歪みをわずかに減らすために大量の追加ビットが必要な領域では、曲線の絶対傾斜が大きくなる。
11.6 レート 0 で達成できる歪みには上限がある
レートを 0 にする場合、符号化器は入力に応じた情報を何も送れない。復号器は、入力に関係なく一つの固定値 \(\hat{x}_0\) を出力する。
この条件で達成できる最小平均歪みは、次の値になる。
D_{\max}
=
\inf_{\hat{x}_0}
\mathbb{E}
\left[
d(X,\hat{x}_0)
\right]
\]
許容歪み \(D\) が \(D_{\max}\) 以上なら、何も送らず固定値を出力するだけで条件を満たせる。
R(D)=0
\qquad
(D\geq D_{\max})
\]
二乗誤差の場合、固定値として入力の平均を選ぶと平均二乗誤差が最小になる。
\hat{x}_0
=
\mathbb{E}[X]
\]
このときの歪みは入力の分散になる。
D_{\max}
=
\mathbb{E}
\left[
(X-\mathbb{E}[X])^2
\right]
=
\operatorname{Var}(X)
\]
絶対誤差なら、最適な固定再構成値は入力分布の中央値になる。レート 0 の端点でも、選択した歪み関数によって最適な代表値が変わる。
11.7 無歪み再構成の必要レートは情報源の種類で変わる
許容歪みを 0 に近づけると、元の入力をより正確に再構成する必要がある。離散情報源を完全に復元する場合、レート歪み関数は情報源エントロピーへ近づく。
R(0)=H(X)
\]
これは、歪み 0 が入力と再構成値の完全一致を要求する場合の関係である。量子化による損失を許さないため、通常の可逆情報源符号化と同じ問題になる。
連続確率変数を二乗誤差 0 で厳密に再構成するには、一般に無限の精度が必要になる。実数には任意に細かな違いが存在し、そのすべてを有限ビットで区別できないためである。
\lim_{D\rightarrow0}
R(D)
=
\infty
\]
| 情報源 | 歪み 0 の意味 | 必要レート |
|---|---|---|
| 有限離散情報源 | 元の記号を完全に復元する。 | 情報源エントロピーが基準になる。 |
| 連続情報源 | 実数値を誤差なく完全に復元する。 | 一般に有限レートでは達成できない。 |
連続値を有限ビットへ量子化する以上、歪みを完全に 0 にはできない。有限ビット量子化の問題は、どの誤差も生じさせないことではなく、許容できる歪みとレートの境界上で、どの区別を残すかを決めることになる。
11.8 ガウス情報源ではレート歪み関数を明示できる
平均 0、分散 \(\sigma^2\) のガウス情報源を考える。
X\sim\mathcal{N}(0,\sigma^2)
\]
歪み関数として二乗誤差を使う。
d(x,\hat{x})
=
(x-\hat{x})^2
\]
この場合、レート歪み関数は次の形になる。
R(D)
=
\begin{cases}
\dfrac{1}{2}
\log_2
\left(
\dfrac{\sigma^2}{D}
\right)
&
0\lt D\lt \sigma^2
\\
0
&
D\geq\sigma^2
\end{cases}
\]
許容歪み \(D\) が分散 \(\sigma^2\) 以上なら、入力を送らず、平均値 0 を出力するだけで条件を満たせる。許容歪みを分散より小さくすると、必要レートは対数的に増加する。
この式を歪みについて解くと、レート \(R\) で達成可能な最小歪みは次の形になる。
D(R)
=
\sigma^2 2^{-2R}
\]
レートを 1 ビット増やすたびに、理論上の歪みは \(1/4\) になる。
\frac{D(R+1)}{D(R)}
=
2^{-2}
=
\frac{1}{4}
\]
| レート | 理論歪み | 分散に対する比 |
|---|---|---|
| 0 ビット | \(\sigma^2\) | 入力分散と同じ歪みになる。 |
| 1 ビット | \(\sigma^2/4\) | 0 ビット時の 4 分の 1 になる。 |
| 2 ビット | \(\sigma^2/16\) | 0 ビット時の 16 分の 1 になる。 |
| 4 ビット | \(\sigma^2/256\) | 0 ビット時の 256 分の 1 になる。 |
この結果は、任意の 4 ビット一様量子化器が必ず \(\sigma^2/256\) の歪みを達成するという意味ではない。任意に長いブロック、最適なコードブック、理想的な符号化を許したときの下限である。有限次元のスカラー量子化、クリッピング、固定長整数形式といった制約を加えると、実際の歪みは通常この値より大きくなる。
11.9 量子化器の動作点はレート歪み平面上の一点になる
実際の量子化器を評価するときは、平均レート \(R_Q\) と平均歪み \(D_Q\) を測定できる。この量子化器は、レート歪み平面上の一点 \((R_Q,D_Q)\) として表される。
レート歪み関数 \(R(D)\) は、各歪みに対する達成可能領域の下端を作る。実際の量子化器は、この境界上または境界より上に位置する。
R_Q
\geq
R(D_Q)
\]
同じ歪み \(D_Q\) に対する理論最小レートとの差を、レート損失として測れる。
\Delta R
=
R_Q-R(D_Q)
\]
同じレート \(R_Q\) に対する理論最小歪みとの差を、歪み損失として測ることもできる。
\Delta D
=
D_Q-D^\ast(R_Q)
\]
\(D^\ast(R)\) は、レート歪み関数を逆向きに見たときの理論最小歪みである。
| 比較方法 | 固定する量 | 測定する隔たり | 解釈 |
|---|---|---|---|
| レート損失 | 達成歪み \(D_Q\) | \(R_Q-R(D_Q)\) | 同じ品質を得るために理論下限より何ビット多く使っているかを示す。 |
| 歪み損失 | 使用レート \(R_Q\) | \(D_Q-D^\ast(R_Q)\) | 同じビット数で理論下限よりどれだけ大きな誤差が残っているかを示す。 |
たとえば、ある量子化器が平均 4 ビットで歪み 0.01 を達成したとする。同じ情報源と歪み関数に対する \(R(0.01)\) が 3 ビットなら、レート損失は 1 ビットになる。
\Delta R
=
4-3
=
1\ \mathrm{bit}
\]
この 1 ビットは、セル形状、有限ブロック長、固定長符号、探索近似、実装形式などによって生じた余分なレートをまとめて表す。絶対的な歪みだけでは分からない、理論限界に対する効率を評価できる。
11.10 スカラー量子化と長ブロック量子化の間には形状損失がある
一つの値を独立に量子化するスカラー量子化は、入力空間を一次元区間へ分ける。長い入力ブロックをまとめて量子化する場合は、高次元空間を複雑なセルで分割できる。
高次元セルは、同じ体積でも代表点からの平均距離を小さくできる形状を選べる。さらに、情報源の典型的な系列へコードを集中し、まれな系列へ同じ密度でコードを配分せずに済む。
このため、最適なスカラー量子化と可変長符号を組み合わせても、一般にはレート歪み限界へ完全には一致しない。高レートのガウス情報源と二乗誤差では、最適なエントロピー制約スカラー量子化と理論限界の間に、漸近的な定数差が残る。
この差は、ビット数を増やせば絶対歪みとともに小さくなるが、同じ歪みに必要なレートの差としては一定量残る。高次元ベクトル量子化では、セル形状を改善することでこの隔たりを縮められる。
| 量子化単位 | 利用できる構造 | 理論限界との関係 | 実装上の費用 |
|---|---|---|---|
| スカラー量子化 | 各値の確率分布を利用する。 | セルが区間に限られ、形状損失が残る場合がある。 | 符号化、復号、無作為アクセスが比較的単純になる。 |
| 低次元ベクトル量子化 | 短い範囲の相関と高次元セル形状を利用する。 | スカラー量子化より限界へ近づける場合がある。 | コードブックと最近傍探索が必要になる。 |
| 長ブロック符号化 | 長い系列の統計構造と典型集合を利用する。 | ブロック長を増やすことでレート歪み限界へ近づく。 | 遅延、メモリ、探索空間、符号設計の費用が増える。 |
レート歪み限界へ近づくには、量子化する単位を大きくし、入力列の依存関係を広く利用する必要がある。その結果、処理の遅延と計算量も増える。理論上の効率と、逐次処理や低遅延という運用条件は交換関係になる。
11.11 情報源に依存関係がある場合は系列全体の構造がレートを変える
単一の確率変数に対する式
R(D)
=
\inf
I(X;\hat{X})
\]
は、各入力が独立に同じ分布から生じる無記憶情報源で、歪みが一記号ごとに加法的である場合に、長ブロック問題を一文字の最適化へ縮約した形である。
時系列、音声、画像、ニューラルネットワークの重み列では、隣接する値が独立とは限らない。過去の値から次の値を予測できるなら、新しい値を表すために必要な追加情報量は小さくなる。
依存関係を持つ情報源では、長さ \(n\) の系列に対するレート歪み関数を、ブロック全体の平均歪み制約の下で定義する。
R_n(D)
=
\frac{1}{n}
\inf_{P_{\hat{X}^n|X^n}:\mathbb{E}[d_n(X^n,\hat{X}^n)]\leq D}
I(X^n;\hat{X}^n)
\]
定常性など必要な条件の下で極限が存在する場合、情報源のレート歪み関数は次の形になる。
R(D)
=
\lim_{n\rightarrow\infty}
R_n(D)
\]
入力系列の相関を利用できれば、各値を独立に量子化する場合より必要レートを減らせる。
| 情報源 | 利用できる予測構造 | レートへの影響 |
|---|---|---|
| 独立同分布 | 別の入力から現在値を予測できない。 | 一文字の分布と歪み関数が主な基準になる。 |
| 時間相関を持つ信号 | 過去の値から現在値を予測できる。 | 予測残差だけを量子化することで必要レートを減らせる。 |
| 空間相関を持つ画像 | 周囲の画素から対象画素を予測できる。 | 局所構造を利用するブロック符号化が有利になる。 |
| 相関するベクトル列 | 成分間とブロック間の両方に依存関係がある。 | 成分独立量子化より、変換やベクトル量子化で低いレートを達成できる。 |
情報源の依存関係を無視して各値を独立に量子化すると、予測可能な差まで毎回コードとして記録する。レート歪み理論は、情報源の統計構造を利用した場合に到達可能な下限を示すため、単純な独立量子化との差が大きくなることがある。
11.12 歪み関数が変われば理論下限も変わる
レート歪み関数は、情報源の確率分布だけから決まるものではない。同じ情報源でも、歪み関数を変えれば、保存すべき区別が変わり、必要レートも変わる。
二乗誤差では、数値差の大きな再構成を強く罰する。絶対誤差では、外れ値への罰が二乗誤差より弱くなる。分類結果の一致を歪みとして使えば、数値が異なっていても分類が変わらない限り歪みを 0 と定義できる。
| 歪み関数 | 保存を要求する区別 | 下限への影響 |
|---|---|---|
| 二乗誤差 | 大きな数値差を特に避ける。 | 外れ値や高感度方向を保つためのレートが増えやすい。 |
| 絶対誤差 | 数値差に比例して誤差を評価する。 | 二乗誤差より外れ値への配分を抑えた下限になる場合がある。 |
| 知覚歪み | 人間が識別できる違いを優先して保存する。 | 数値差が大きくても知覚されにくい方向を低レートで表せる場合がある。 |
| タスク損失 | 分類、生成、制御などの最終結果を保存する。 | タスクに影響しない数値差を捨てることで必要レートを減らせる。 |
異なる歪み関数から得た \(R(D)\) を、数値 \(D\) だけで直接比較することはできない。歪み 0.01 が何を意味するかが異なるためである。量子化方式の理論下限を論じるには、情報源、歪み関数、平均条件を同時に固定する必要がある。
11.13 レート歪み関数は実装目標であって実装仕様ではない
レート歪み関数は、許容歪みに対して最低限必要となる情報量を示す。しかし、そのレートを達成する具体的な整数形式、セル境界、コードブック、探索方法を直接与えるものではない。
理論上の達成には、十分に長いブロック、大規模なコードブック、最適に近い符号化探索が必要になる場合がある。実際のシステムには、有限ブロック長、処理遅延、メモリ容量、演算形式、並列性、無作為アクセスという制約がある。
| 実装制約 | 理論限界から離れる理由 | 実際の帰結 |
|---|---|---|
| 有限ブロック長 | 長い系列の典型的な構造を十分に平均化できない。 | 同じ歪みに必要な平均レートが増える。 |
| 探索時間 | 巨大なコードブックから最良の再構成列を選べない。 | 近似探索や構造化コードブックによる追加歪みが生じる。 |
| 処理遅延 | 長い入力ブロックが集まるまで符号化を開始できない。 | 低遅延用途では短いブロックを選び、符号効率を下げる。 |
| 固定長形式 | 状態確率の偏りを可変長符号へ反映できない。 | 出力エントロピーより大きなビット数を使用する。 |
| ハードウェア制約 | 任意の代表値や複雑な復号規則を直接処理できない。 | 規則的な整数格子を使い、数値的な最適性を一部失う。 |
| 無作為アクセス | 長ブロックや可変長符号では途中位置を直接復号しにくい。 | 索引、固定区画、独立ブロックによる付加レートが必要になる。 |
理論限界との差が存在しても、そのすべてが実装上の欠陥を意味するわけではない。低遅延、単純な演算、局所的な復号、障害時の独立性を得るために、一定のレート損失や歪み損失を受け入れる場合がある。
11.14 レート歪み限界は量子化方式を共通尺度で比較する
一様量子化、非一様量子化、ベクトル量子化、構造化量子化は、それぞれ異なるセル配置、コードブック、探索方法を使う。そのままでは、ビット数と数値誤差を個別に比較するだけになり、情報源に対してどの程度効率的かを判断しにくい。
レート歪み関数を基準に置けば、各方式を同じ情報源、同じ歪み関数、同じ平均条件の下で比較できる。
| 方式 | 限界との差を生む主な要因 | 限界へ近づくための方向 |
|---|---|---|
| 一様スカラー量子化 | 入力分布にかかわらず等間隔のセルを使う。 | 尺度と範囲を分布へ適合させる。 |
| 非一様スカラー量子化 | 一値ずつ独立に量子化し、セル形状が区間に限られる。 | 入力密度とエントロピーに応じてセルを設計する。 |
| ベクトル量子化 | 有限次元コードブックと有限探索に制約される。 | ブロック次元と代表点数を増やし、相関とセル形状を利用する。 |
| 構造化量子化 | 探索を減らすため、許される代表点配置を制限する。 | 入力構造に適した分解と変換を選ぶ。 |
ある方式が別の方式より小さな誤差を持っていても、使用レートが大きければ効率が高いとは限らない。別の方式が少ないビットを使っていても、許容歪みを超えていれば目的を満たさない。レートと歪みの組を理論境界と比較することで、保存量と再構成品質を同時に評価できる。
11.15 理論下限が示すのは保存すべき区別の最小量である
レート歪み関数は、入力を何ビット整数へ変換するかを直接決める式ではない。指定された確率分布と歪み関数の下で、許容歪み \(D\) を守るには、元の入力に存在した区別を平均何ビット分だけ残さなければならないかを示す。
歪みを小さくすると、同じものとして扱える入力の範囲が狭くなる。量子化セルを細かくし、多くの再構成状態を区別する必要があるため、レートは増える。歪みを大きく許せば、広い範囲の入力を同じ状態へまとめられ、必要な区別は減る。
実際の量子化器がレート歪み限界より多くのビットを使う理由は、有限ブロック、単純なセル、固定長符号、探索制約、演算形式にある。これらの制約を緩めれば理論限界へ近づけるが、計算量、遅延、メモリ、実装複雑性が増える。
レート歪み理論によって、量子化は単に値を粗くする処理ではなくなる。許容できる損失を先に定義し、その損失条件の下で残すべき情報量の最小値を求める問題になる。有限ビット形式は、この情報理論上の境界を、実際の数値表現と演算装置の中で近似する具体的な実装である。
次章では、量子化を施す前から計算機の数値体系自体が有限個の表現可能値しか持たないことを扱う。浮動小数点数、固定小数点数、丸め規則、指数部と仮数部の配分を確認すると、通常の数値計算も、実数を有限集合へ対応させる量子化の上で成立していることが明確になる。
12. 有限精度数はそれ自体が量子化された数体系である
12.1 実数を有限集合へ写す時点で量子化が生じる
数学上の実数は、任意に細かな違いを持つ。二つの実数の間には、さらに別の実数が存在する。一方、有限ビットの数値形式が表現できる値は有限個しかない。実数を計算機へ格納するには、無数の候補から有限個の表現可能値の一つを選ばなければならない。
ある数値形式が表現できる有限値の集合を \(F\) とし、実数 \(x\) を近くの表現可能値へ写す丸め写像を \(\operatorname{fl}\) と書く。
\operatorname{fl}:\mathbb{R}\rightarrow F
\]
この写像では、異なる複数の実数が同じ有限精度数へ対応する。したがって、有限精度表現は、実数直線を各表現可能値に対応するセルへ分ける量子化器として読める。
実数 \(x\) が数値形式 \(F\) で正確に表現できるなら、次の関係になる。
\operatorname{fl}(x)=x
\]
正確に表現できなければ、指定された丸め規則によって、近くにある表現可能値の一つが選ばれる。
\operatorname{fl}(x)\neq x
\]
このときの表現誤差を、次のように定義できる。
e_{\mathrm{repr}}
=
x-\operatorname{fl}(x)
\]
有限精度数が量子化と異なるのではない。固定小数点数や浮動小数点数は、代表点の配置規則が数値形式としてあらかじめ定められた量子化器である。
12.2 固定小数点数は一定間隔の格子を作る
固定小数点数では、小数点の位置を形式全体で固定する。小数部分へ \(f\) ビットを割り当てる場合、表現可能値は整数 \(k\) を使って次の形になる。
x_k
=
k2^{-f}
\]
隣接する表現可能値の間隔は、どの位置でも一定である。
\Delta
=
2^{-f}
\]
小数部分が 8 ビットなら、刻み幅は次の値になる。
\Delta
=
2^{-8}
=
\frac{1}{256}
=
0.00390625
\]
実数 \(x\) を最も近い固定小数点数へ丸める処理は、表現範囲外の処理を省けば次のように書ける。
Q_{\mathrm{fixed}}(x)
=
2^{-f}
\operatorname{round}
\left(
2^f x
\right)
\]
これは刻み幅 \(\Delta=2^{-f}\) の一様量子化器と同じ式である。入力を刻み幅で割り、最も近い整数コードを選び、刻み幅を掛けて代表値へ戻している。
最近傍丸めを使い、入力が表現可能範囲内にある場合、絶対誤差は通常、刻み幅の半分以下になる。
\left|
x-Q_{\mathrm{fixed}}(x)
\right|
\leq
2^{-(f+1)}
\]
| 小数部のビット数 | 刻み幅 | 範囲内の最大丸め誤差 | 性質 |
|---|---|---|---|
| 4 ビット | \(2^{-4}=0.0625\) | 0.03125 以下になる。 | 表現点は粗いが、小数部に必要なビット数は少ない。 |
| 8 ビット | \(2^{-8}=0.00390625\) | 0.001953125 以下になる。 | 4 ビットより細かな絶対差を表現できる。 |
| 16 ビット | \(2^{-16}\) | \(2^{-17}\) 以下になる。 | 細かな絶対精度を得られるが、整数部に使える範囲との配分が必要になる。 |
固定小数点数では、0 の近くでも大きな値の近くでも刻み幅は変わらない。そのため、絶対誤差の上限を一定に保ちやすい。一方、総ビット数が固定されているなら、小数部分を増やすほど整数部分へ使えるビットが減り、表現可能範囲は狭くなる。
たとえば符号を含む 16 ビットのうち、小数部分へ 8 ビットを使えば、細かさは \(2^{-8}\) になるが、大きな整数を表す能力は限られる。小数部分を 4 ビットへ減らせば刻み幅は粗くなる代わりに、より大きな絶対値を表せる。
固定小数点数では、表現範囲と絶対解像度がビット配分によって直接交換される。この構造は、有限コード数の中で刻み幅と表現範囲を配分する一様量子化と同じである。
12.3 浮動小数点数は符号、指数、仮数で表現点を作る
浮動小数点数は、一定の刻み幅を実数直線全体へ適用しない。符号、指数、仮数を組み合わせ、値の大きさに応じて刻み幅を変える。
正規化された二進浮動小数点数は、概念的に次の形で表せる。
x
=
(-1)^s
\left(
1.b_1b_2\ldots b_{p-1}
\right)_2
2^e
\]
\(s\) は符号、\(e\) は指数、\(b_1,\ldots,b_{p-1}\) は仮数部に保存される二進桁である。先頭の 1 を含む有効桁数を \(p\) とする。
| 構成要素 | 役割 | 量子化上の意味 |
|---|---|---|
| 符号 | 正負を区別する。 | 正側と負側へ表現点を配置する。 |
| 指数 | 値の大きさの尺度を決める。 | どの大きさの領域へ表現点を配置するかを切り替える。 |
| 仮数 | 同じ指数領域内の細かな位置を決める。 | 一つの大きさの範囲を何段階へ分けるかを決める。 |
同じ指数 \(e\) を持つ正規数は、区間 \([2^e,2^{e+1})\) に並ぶ。この区間は binade と呼ばれる。同じ binade の内部では、隣接する表現可能値の間隔は一定になる。
\Delta_e
=
2^{e-(p-1)}
\]
指数が 1 増えると値の範囲が 2 倍になり、隣接値の絶対間隔も 2 倍になる。
\Delta_{e+1}
=
2\Delta_e
\]
浮動小数点数は、各 binade の内部では一様量子化器として振る舞う。しかし、指数境界を越えると刻み幅が変わるため、実数直線全体では非一様量子化器になる。
12.4 浮動小数点数は絶対精度ではなく相対精度を保つ
精度 \(p\) の二進浮動小数点数では、1 の近くにある隣接値の間隔は次の値になる。
\varepsilon
=
2^{1-p}
\]
\(\varepsilon\) は、1 と 1 より大きい次の表現可能値との差として定義される機械イプシロンである。
最近傍丸めにおける相対誤差の上限を表す単位丸め誤差 \(u\) は、その半分になる。
u
=
2^{-p}
=
\frac{\varepsilon}{2}
\]
正規数の範囲にあり、オーバーフローやアンダーフローを起こさない値 \(x\) を最近傍へ丸める場合、概ね次の相対誤差モデルを使える。
\operatorname{fl}(x)
=
x(1+\delta)
\]
|\delta|
\leq
u
\]
固定小数点数では絶対誤差の上限が一定だった。浮動小数点数では、値の大きさに比例して絶対誤差の上限も変わる代わりに、正規数の範囲では相対誤差をおおむね一定に保つ。
| 数体系 | 概ね一定になる誤差 | 値が大きくなった場合 |
|---|---|---|
| 固定小数点 | 絶対誤差の上限が一定になる。 | 相対誤差は小さくなるが、表現可能範囲を超えやすい。 |
| 浮動小数点 | 正規数領域では相対誤差の上限がおおむね一定になる。 | 絶対間隔と絶対誤差が値の大きさに比例して増える。 |
binary32、一般に FP32 と呼ばれる形式では、有効精度は \(p=24\) ビットである。1 の近くにある隣接値の間隔は次の値になる。
2^{-23}
\approx
1.1920929\times10^{-7}
\]
一方、\(2^{20}\) 以上 \(2^{21}\) 未満の範囲では、隣接値の間隔は次の値になる。
2^{20-(24-1)}
=
2^{-3}
=
0.125
\]
FP32 は 1 の近くでは約 \(10^{-7}\) の差を区別できるが、約 100 万の大きさでは 0.125 より細かな差を保存できない。1,048,576 と 1,048,576.01 は、同じ FP32 値へ丸められる可能性がある。
binary16、一般に FP16 と呼ばれる形式では、有効精度は \(p=11\) ビットである。1 の近くの間隔は次の値になる。
2^{-10}
=
0.0009765625
\]
1024 の近くでは指数が 10 になるため、隣接値の間隔は 1 になる。
2^{10-(11-1)}
=
1
\]
FP16 では、1024 の近くにある 0.5 の差を保持できない。値の大きさに応じて刻み幅が変わることが、固定小数点量子化やアフィン整数量子化との主要な違いになる。
12.5 ULP は値の周辺における量子化刻みを表す
浮動小数点数の精度を説明するときは、ULP という単位が使われる。ULP は unit in the last place の略であり、対象値の周辺にある最下位桁 1 単位分の間隔を表す。
精度 \(p\) の正規化二進浮動小数点数で、値が区間 \([2^e,2^{e+1})\) にある場合、その周辺の 1 ULP は次の値になる。
\operatorname{ulp}(x)
=
2^{e-(p-1)}
\]
最近傍丸めでは、正確な値から丸め後の値までの誤差は、通常 0.5 ULP 以下になる。
\left|
x-\operatorname{fl}(x)
\right|
\leq
\frac{1}{2}
\operatorname{ulp}(x)
\]
ULP は値によって変わる。したがって、「誤差が 0.001 ある」という絶対値だけでは、浮動小数点として大きな誤差か小さな誤差かを判断できない。1 の近くで 0.001 の誤差は多数の ULP に相当するが、非常に大きな値の近くでは 1 ULP 未満の場合もある。
| 誤差表現 | 測定するもの | 有効な用途 |
|---|---|---|
| 絶対誤差 | \(|x-\hat{x}|\) を測る。 | 値そのものの差に物理的な意味がある場合に使いやすい。 |
| 相対誤差 | \(|x-\hat{x}|/|x|\) を測る。 | 値の大きさに対する精度を比較する場合に使いやすい。 |
| ULP 誤差 | 周辺の表現可能値間隔を基準に誤差を測る。 | 浮動小数点演算が正しく丸められたかを評価する場合に使いやすい。 |
12.6 正規数、非正規数、0 では表現点の構造が変わる
浮動小数点数の相対誤差モデルは、正規数の範囲では扱いやすい。しかし、0 の近くまで同じ指数構造を続けると、最小正規数より小さい値を一つも表現できず、値が突然 0 へ落ちる。
IEEE 754 の二進形式では、0 と最小正規数の間を埋めるために非正規数(subnormal number)を用意する。非正規数では、正規数にある先頭の暗黙の 1 を使わず、一定間隔で 0 の周辺へ表現点を配置する。
精度を \(p\)、正規数の最小指数を \(e_{\min}\) とすると、正の非正規数の刻み幅は次の値になる。
\Delta_{\mathrm{sub}}
=
2^{e_{\min}-(p-1)}
\]
非正規数領域では刻み幅が一定になるため、固定小数点数に近い構造を持つ。最小正規数から 0 へ近づくにつれて有効桁数は減るが、値が突然 0 になることを避けられる。この性質を段階的アンダーフローと呼ぶ。
| 領域 | 表現点の配置 | 誤差の性質 |
|---|---|---|
| 正規数 | 指数ごとに絶対間隔が変わる。 | 相対精度をおおむね一定に保てる。 |
| 非正規数 | 0 の周辺へ一定間隔で並ぶ。 | 絶対間隔は保たれるが、値が小さくなるほど相対精度が低下する。 |
| 0 | 正の 0 と負の 0 が存在する。 | 最小非正規数より小さな値は、丸めによって 0 になる場合がある。 |
FP32 の最小正規数は \(2^{-126}\)、最小正非正規数は \(2^{-149}\) である。FP16 の最小正規数は \(2^{-14}\)、最小正非正規数は \(2^{-24}\) である。
| 形式 | 有効精度 | 最小正規数 | 最小正非正規数 | 最大有限値 |
|---|---|---|---|---|
| binary16 | 11 ビット | \(2^{-14}\) になる。 | \(2^{-24}\) になる。 | 65,504 になる。 |
| binary32 | 24 ビット | \(2^{-126}\) になる。 | \(2^{-149}\) になる。 | 約 \(3.4028235\times10^{38}\) になる。 |
最小非正規数より小さな正確値は、丸め規則に応じて 0 または最小非正規数へ写される。これは小さな値に対するクリッピングまたは量子化と同じ多対一構造を持つ。
12.7 オーバーフローとアンダーフローは範囲外処理である
有限精度形式では、表現点の間隔だけでなく、表現可能範囲にも上限と下限がある。正確な演算結果の絶対値が最大有限値を超えると、オーバーフローが生じる。
丸め方式によって、オーバーフローした結果は符号付き無限大または最大有限値になる。異なる多数の実数が同じ端点や無限大へ対応するため、量子化におけるクリッピングと同じ情報損失が生じる。
正確な非ゼロ結果が正規数の最小値より小さくなると、非正規数領域へ入る。さらに小さくなり、表現可能な最小非正規数より下へ出ると、0 へ丸められる場合がある。
| 現象 | 発生条件 | 結果 | 量子化との対応 |
|---|---|---|---|
| 通常の丸め | 正確値が表現範囲内にある。 | 近くの有限精度数を選ぶ。 | セル内部の粒状誤差に対応する。 |
| オーバーフロー | 正確値が最大有限値の範囲を超える。 | 無限大または最大有限値になる。 | 上端へのクリッピングに対応する。 |
| 段階的アンダーフロー | 正確値が正規数の範囲より小さい。 | 非正規数として精度を減らしながら表現する。 | 0 付近だけ異なる細かさを持つ量子化へ移行する。 |
| 0 への丸め | 正確値が最小非正規数より十分小さい。 | 正または負の 0 になる。 | 微小値を 0 へ集約するセルに対応する。 |
浮動小数点演算の誤差を相対誤差だけで評価すると、0 の周辺を正しく扱えない。正確値が極めて小さい場合、絶対誤差は小さくても、相対誤差は大きくなり得る。正規数、非正規数、0、オーバーフローを分けて考える必要がある。
12.8 丸め規則はセル境界上の値をどちらへ送るか決める
正確な値が二つの表現可能値の間にある場合、どちらを選ぶかは丸め規則によって決まる。量子化器の代表点集合が同じでも、丸め規則が異なればセル境界上の割当てと誤差の偏りが変わる。
| 丸め方式 | 選択規則 | 誤差の性質 |
|---|---|---|
| 最近接偶数丸め | 最も近い値を選び、正確に中間なら最下位桁が偶数の候補を選ぶ。 | 中間値が繰り返された場合の方向的な偏りを抑えやすい。 |
| 0 方向丸め | 絶対値が小さくなる側を選ぶ。 | 正数では下向き、負数では上向きの偏りが生じる。 |
| 正の無限大方向丸め | 正確値以上の最小表現可能値を選ぶ。 | 丸め後の値が正確値を下回らない。 |
| 負の無限大方向丸め | 正確値以下の最大表現可能値を選ぶ。 | 丸め後の値が正確値を上回らない。 |
| 最近接外側丸め | 最も近い値を選び、正確に中間なら 0 から遠い候補を選ぶ。 | 中間値では絶対値を大きくする方向へ偏る。 |
通常の浮動小数点計算では、最近接偶数丸めが既定方式として広く使われる。単純に 5 以上を切り上げる方式では、中間値が頻繁に現れるデータで、丸め誤差が一方向へ蓄積する可能性がある。偶数側を選ぶことで、中間値を常に上側へ送る偏りを避ける。
方向丸めは、区間演算や誤差境界を構成する場合に利用できる。下限を負の無限大方向へ、上限を正の無限大方向へ丸めれば、正確な値を必ず含む区間を作れる。
丸め方式は、同じ有限集合への写像であっても、どの入力をどの代表値へ集めるかを変える。量子化器におけるセル境界規則に相当する。
12.9 IEEE 754 は表現形式だけでなく演算規則を定める
IEEE 754 は、浮動小数点数のビット配置だけを定めた規格ではない。二進形式と十進形式、基本演算の丸め、符号付き 0、無限大、非数、例外状態、形式間変換などを規定する[16]。
規定対象の基本演算では、概念上、最初に無限精度で正確な結果を求め、その値を指定された丸め方式によって目的形式へ丸めた結果と同じ値を返すことが求められる。この性質を正しい丸めと呼ぶ。
二つの浮動小数点数 \(x\) と \(y\) に演算 \(\circ\) を適用する場合、計算機が返す結果は概念的に次の形になる。
\operatorname{fl}(x\circ y)
\]
\(x\) と \(y\) がそれぞれ正確に表現できても、正確な演算結果 \(x\circ y\) が同じ形式で表現できるとは限らない。そのため、入力時の量子化だけでなく、演算を実行するたびに新しい丸めが発生する。
| 段階 | 正確な数学上の対象 | 有限精度計算で行われること |
|---|---|---|
| 入力変換 | 実数または高精度形式の値 | 目的形式の表現可能値へ丸める。 |
| 基本演算 | 正確な和、差、積、商など | 正確結果を目的形式へ丸める。 |
| 形式変換 | 変換元形式が表す数値 | 変換先形式で近い表現可能値を選ぶ。 |
| 保存 | 演算器内部の中間結果 | 保存先の形式が狭ければ再度丸める。 |
有限精度計算は、最初に一度だけ量子化した値へ正確な演算を続ける処理ではない。演算結果が表現可能集合から外れるたびに丸めが行われ、量子化誤差が計算経路へ繰り返し導入される。
12.10 無限大、非数、符号付き 0 は実数の代表点ではない
IEEE 754 のビットパターンには、有限実数を表す値だけでなく、正負の無限大、NaN、正負の 0 が含まれる。これらは通常の量子化代表値とは異なる役割を持つ。
| 特殊値 | 意味 | 通常の実数表現との違い |
|---|---|---|
| 正の無限大 | 正方向のオーバーフローや正数の 0 除算などを表す。 | 有限の実数代表値ではない。 |
| 負の無限大 | 負方向のオーバーフローなどを表す。 | 有限の実数代表値ではない。 |
| NaN | 未定義演算や不正な数値結果を表す。 | 数直線上の位置を持たず、大小比較も通常の数値規則に従わない。 |
| 正の 0 | 正側から 0 へ到達した結果などを表す。 | 数値比較では負の 0 と等しいが、一部の演算結果へ符号が影響する。 |
| 負の 0 | 負側から 0 へ到達した結果などを表す。 | 逆数などでは正の 0 と異なる符号の無限大を生じる。 |
たとえば数値比較では、正の 0 と負の 0 は等しい。
+0=-0
\]
しかし、逆数では符号が残る。
\frac{1}{+0}=+\infty
\]
\frac{1}{-0}=-\infty
\]
浮動小数点形式は、有限実数を近似する量子化集合に、演算状態を表す追加コードを組み合わせた数体系である。すべてのビットパターンを実数直線上の代表点として解釈することはできない。
12.11 有限精度演算では代数法則がそのまま成立しない
実数の加算では、結合法則が成り立つ。
(x+y)+z
=
x+(y+z)
\]
有限精度演算では、各加算の直後に丸めが入るため、括弧の位置によって中間結果が変わる。
\operatorname{fl}
\left(
\operatorname{fl}(x+y)+z
\right)
\neq
\operatorname{fl}
\left(
x+\operatorname{fl}(y+z)
\right)
\]
FP32 で \(x=2^{24}\)、\(y=1\)、\(z=-2^{24}\) とする。FP32 は \(2^{24}\) 付近で 1 の差を保持できないため、最初に \(x+y\) を計算すると \(2^{24}\) へ丸められる。
\operatorname{fl}(2^{24}+1)
=
2^{24}
\]
したがって、左側の計算結果は 0 になる。
\operatorname{fl}
\left(
\operatorname{fl}(2^{24}+1)-2^{24}
\right)
=
0
\]
一方、\(1-2^{24}\) は FP32 で正確に表現できるため、右側の計算結果は 1 になる。
\operatorname{fl}
\left(
2^{24}
+
\operatorname{fl}(1-2^{24})
\right)
=
1
\]
| 計算順序 | 最初の中間結果 | 最終結果 |
|---|---|---|
| \((2^{24}+1)-2^{24}\) | \(2^{24}+1\) が \(2^{24}\) へ丸められる。 | 0 になる。 |
| \(2^{24}+(1-2^{24})\) | \(1-2^{24}\) が正確に保持される。 | 1 になる。 |
これは演算器の故障ではない。有限個の表現点へ中間結果を写すため、実数上の代数変形が異なる量子化経路を通った結果である。
並列計算で加算順序が変わる場合、同じ入力値を使っていても最下位桁が変化することがある。有限精度計算では、数式だけでなく、評価順序と中間形式も結果の一部になる。
12.12 情報落ちは大きな値と小さな値を加えると現れる
浮動小数点加算では、二つの値の指数をそろえてから仮数を加える。指数差が大きい場合、小さい値の有効桁は右へ移動し、保持できる仮数桁の外へ押し出される。
大きな値 \(x\) に小さな値 \(y\) を加えたとき、\(y\) が \(x\) 周辺の 0.5 ULP より小さければ、加算結果が \(x\) と同じになる場合がある。
\operatorname{fl}(x+y)
=
x
\]
数学上は \(y\neq0\) であっても、有限精度演算では増分が消える。この現象は、小さな値が数として存在しないために起きるのではない。\(y\) 単独では表現できても、\(x+y\) の周辺では表現点の間隔が広いため、和の差を保持できない。
固定小数点量子化で小さな更新が刻み幅未満になり、同じ整数コードへ戻る現象と同じ構造を持つ。ニューラルネットワークの学習で低精度形式を使う場合、小さな勾配更新が大きな重みへ加算されても反映されないことがある。
12.13 FP32 から FP16 への変換は表現集合を縮小する量子化である
FP32 が表現できる有限値集合を \(F_{32}\)、FP16 が表現できる有限値集合を \(F_{16}\) とする。FP16 の表現可能値は FP32 より少なく、精度と指数範囲の両方が狭い。
FP32 から FP16 への変換は、概念的に次の写像になる。
Q_{32\rightarrow16}:
F_{32}
\rightarrow
F_{16}
\]
FP32 では異なる多数の値が、同じ FP16 値へ変換される。この変換は一般に逆写像を持たない。
x_1\neq x_2
\quad\text{でも}\quad
Q_{32\rightarrow16}(x_1)
=
Q_{32\rightarrow16}(x_2)
\]
FP16 で正確に表現できる値なら、変換後も数値は変わらない。二つの FP16 表現点の間にある値は、指定された丸め規則に従って一方へ写される。
FP16 の最大有限値を超える値は、丸め方式に応じて無限大または最大有限値へ変換される。極めて小さな値は非正規数または 0 になる。したがって、形式変換による誤差には、通常の丸め、アンダーフロー、オーバーフローという複数の形がある。
| FP32 の入力値 | FP16 変換時の処理 | 情報損失 |
|---|---|---|
| FP16 で正確に表現可能 | 同じ数値を持つ FP16 表現へ変換する。 | 数値上の損失は生じない。 |
| FP16 表現点の間にある | 近い FP16 表現へ丸める。 | FP16 の仮数精度より細かな差を失う。 |
| FP16 の正規範囲より小さい | 非正規数または 0 へ変換する。 | 有効桁が減少し、微小値が消える場合がある。 |
| FP16 の最大範囲より大きい | 無限大または最大有限値へ変換する。 | 大きさに関する区別を失う。 |
FP16 へ変換した後で FP32 へ戻しても、元の FP32 値は復元できない。FP32 への再変換は、FP16 代表値をより広い容器へ移すだけであり、FP16 変換時に失われた仮数桁や範囲外情報は戻らない。
Q_{16\rightarrow32}
\left(
Q_{32\rightarrow16}(x)
\right)
\neq
x
\]
この非可逆性は、整数コードから実数へ戻しても量子化前の値を復元できないことと同じである。
12.14 融合積和は中間丸めを減らす
積和演算 \(xy+z\) を通常の乗算と加算へ分けると、乗算結果と加算結果で二度の丸めが生じる。
\operatorname{fl}
\left(
\operatorname{fl}(xy)+z
\right)
\]
融合積和演算では、積 \(xy\) と加算 \(+z\) を一つの演算として扱い、正確な \(xy+z\) に対して最後に一度だけ丸める。
\operatorname{fma}(x,y,z)
=
\operatorname{fl}(xy+z)
\]
中間積を目的形式へ丸めないため、通常の乗算と加算を分ける場合より誤差を小さくできる。両者は数学上同じ式でも、丸め回数が異なるため、有限精度での結果は一致しない場合がある。
| 演算方式 | 丸め回数 | 誤差への影響 |
|---|---|---|
| 乗算後に加算 | 積と和で通常 2 回丸める。 | 積の丸め誤差が加算へ持ち越される。 |
| 融合積和 | 正確な積和に対して 1 回丸める。 | 中間丸めを避け、より正確な結果を得やすい。 |
有限精度計算の誤差は、使用する形式だけでは決まらない。同じ形式でも、演算をどの単位で丸めるかによって結果が変わる。
12.15 アフィン整数量子化と浮動小数点量子化は代表点配置が異なる
アフィン整数量子化では、尺度 \(s\) とゼロ点 \(z\) を使い、有限の整数コードへ実数値を対応させる。再構成値は次の形になる。
\hat{x}
=
s(q-z)
\]
同じ尺度を共有する範囲では、隣接する代表値の間隔は一定である。
\hat{x}_{q+1}-\hat{x}_q
=
s
\]
浮動小数点形式では、指数が変わると刻み幅も変わる。小さな値の周辺には表現点を密に置き、大きな値の周辺には広い間隔で置く。これは、値の大きさに応じて尺度を自動的に切り替える非一様量子化に相当する。
| 数体系 | 表現点の配置 | 誤差の基準 | 範囲の決め方 | 必要な付加情報 |
|---|---|---|---|---|
| 固定小数点 | 形式全体で一定間隔になる。 | 絶対誤差を一定に保ちやすい。 | 整数部と小数部のビット配分で固定する。 | 小数点位置または尺度を共有する必要がある。 |
| 浮動小数点 | 指数が大きいほど絶対間隔が広がる。 | 正規数領域で相対誤差を一定に保ちやすい。 | 指数部のビット数によって形式全体の範囲を定める。 | 各値が自分の指数を保持する。 |
| アフィン整数量子化 | 指定された実数範囲へ一定間隔で配置する。 | テンソルまたはグループ内の絶対誤差を制御する。 | 観測した最小値、最大値、外れ値処理などから決める。 | 尺度とゼロ点をテンソルやグループごとに保持する。 |
| 非一様コードブック | 分布や損失に合わせて不規則に配置する。 | 指定した分布と歪み関数に応じて変わる。 | 代表値集合そのものが表現範囲を決める。 | コードブックを保持する必要がある。 |
浮動小数点数では、各値が指数を持つため、値ごとに異なる尺度を選べる。その代わり、総ビット数の一部を指数へ使う。アフィン整数量子化では、複数の値が一つの尺度を共有するため、各コードのビットを仮数ではなく整数段階へ集中できる。
同じ 8 ビットでも、8 ビット浮動小数点形式と 8 ビット整数量子化では、表現可能値の配置、範囲、0 の扱い、演算方法が異なる。ビット数だけでは、量子化器の精度や適性を比較できない。
12.16 機械学習でいう量子化は数値形式の選択をデータへ適合させる
一般的な浮動小数点形式は、広い用途の数値を扱えるよう、指数範囲と仮数精度を形式全体で固定する。FP32 の表現点配置は、特定のニューラルネットワークや特定のテンソル分布に合わせて設計されたものではない。
機械学習で量子化と呼ばれる処理では、テンソル、チャネル、ブロックなどの単位ごとに、尺度、ゼロ点、コードブックを入力分布へ適合させる。値が狭い範囲に集中しているなら、その範囲へ有限コードを集中できる。
| 観点 | 標準的な浮動小数点形式 | 機械学習向け量子化 |
|---|---|---|
| 表現点の設計単位 | 形式全体で共通になる。 | テンソル、チャネル、グループなどの単位で変えられる。 |
| 分布への適合 | 特定データの最小値や最大値へ直接合わせない。 | 観測分布や学習結果に合わせて尺度や代表値を決める。 |
| 演算器 | 浮動小数点演算器が形式を直接処理する。 | 整数積和、低ビット演算、復号表など方式に応じた演算経路を使う。 |
| 付加情報 | 指数を各値のビット列に含む。 | 尺度、ゼロ点、コードブックを複数値で共有する。 |
FP32 から FP16 への変換も多対一写像であり、広い意味では量子化である。一方、機械学習の文脈で単に量子化と呼ぶ場合は、浮動小数点形式の縮小だけでなく、データ分布に合わせた整数表現や低ビットコードブックを指すことが多い。
両者の差は、一方だけが有限精度であることにはない。どちらも実数を有限集合へ写す。差は、代表点をどの規則で配置し、尺度をどの単位で共有し、演算器が量子化後の値をどの形式のまま処理するかにある。
12.17 有限精度計算では表現誤差と演算誤差を分ける
有限精度数を使った計算には、少なくとも二つの誤差源がある。一つは、入力を有限精度形式へ変換した時点で生じる表現誤差である。もう一つは、加算や乗算などの中間結果を丸めることで生じる演算誤差である。
正確な入力を \(x\)、最初に保存された値を \(\tilde{x}\) とすると、表現誤差は次の値になる。
e_{\mathrm{input}}
=
x-\tilde{x}
\]
関数 \(f\) を有限精度で計算した結果を \(\widehat{f}(\tilde{x})\) とすると、最終的な誤差は次のように分けられる。
f(x)-\widehat{f}(\tilde{x})
=
\left(
f(x)-f(\tilde{x})
\right)
+
\left(
f(\tilde{x})-\widehat{f}(\tilde{x})
\right)
\]
第 1 項は入力を量子化したことによる影響、第 2 項は有限精度演算による影響である。
| 誤差源 | 発生時点 | 主な原因 |
|---|---|---|
| 入力表現誤差 | 実数や高精度値を目的形式へ格納するとき | 目的形式の表現可能集合に正確な入力値が存在しない。 |
| 形式変換誤差 | FP32 から FP16 などへ変換するとき | 変換先形式の精度または表現範囲が小さい。 |
| 演算丸め誤差 | 加算、乗算、除算などを実行するとき | 正確な演算結果が目的形式で表現できない。 |
| 蓄積誤差 | 多数の有限精度演算を繰り返すとき | 各演算の丸め誤差が相殺、増幅、同方向への蓄積を起こす。 |
低精度形式へ変換した直後の再構成誤差が小さくても、後続演算で誤差が増幅される場合がある。反対に、個々の値に誤差があっても、後続計算がその方向へ鈍感なら最終結果はほとんど変わらない。
数値形式の評価では、変換直後の平均二乗誤差だけでなく、演算経路、丸め回数、値の大きさ、条件数、誤差の蓄積を確認する必要がある。
12.18 有限精度数は計算機が採用した量子化規則である
固定小数点数は、一定間隔の代表値を持つ一様量子化器である。浮動小数点数は、指数領域ごとに刻み幅を変え、絶対精度と引き換えに相対精度と広い表現範囲を得る非一様量子化器である。
IEEE 754 は、どのビットパターンを数値や特殊値として解釈するかだけでなく、正確な演算結果を有限集合へ戻す丸め規則を定める。そのため、浮動小数点計算は、量子化された入力を使うだけでなく、各演算結果を繰り返し量子化する計算になる。
FP32 から FP16 への変換、実数から固定小数点数への変換、テンソルから整数コードへの変換は、いずれも大きな表現集合から小さな表現集合への多対一写像である。変換後に高精度形式へ戻しても、失われた区別は復元できない。
数値形式どうしの違いは、有限精度かどうかではない。すべて有限精度である。違いは、表現点を一定間隔に置くか、値の大きさに応じて間隔を変えるか、データ分布に合わせて尺度を共有するか、任意のコードブックを使うかにある。
量子化を特別な圧縮処理としてだけ捉えると、通常の数値計算がすでに有限集合への写像の上で行われていることを見落とす。計算機上の数は実数そのものではない。表現形式が残すと決めた有限個の区別であり、丸め規則はその区別へ実数を割り当てる量子化器である。
13. 量子化誤差は計算過程で増幅も相殺もされる
13.1 比較すべきなのは入力誤差ではなく最終出力の変化である
量子化前の入力を \(x\)、量子化後の入力を \(\tilde{x}\) とする。本稿の符号規約では量子化誤差を \(e=x-\tilde{x}\) と定義する。後続計算へ加わる摂動を \(\varepsilon\) と書けば、次の関係になる。
\varepsilon
=
\tilde{x}-x
=
-e
\]
したがって、量子化後の入力は次のように表せる。
\tilde{x}
=
x+\varepsilon
\]
量子化によって加わる摂動は \(\varepsilon\) だが、量子化された値が後続計算 \(f\) へ入力される場合、最終的に比較すべき差は次の値になる。
\Delta f
=
f(x+\varepsilon)-f(x)
\]
入力空間で \(\varepsilon\) が小さくても、出力空間で \(\Delta f\) が小さいとは限らない。関数 \(f\) がその入力方向へ敏感なら、わずかな量子化摂動が大きな出力変化になる。反対に、関数がその方向の変化をほとんど無視するなら、入力誤差が比較的大きくても出力は変わらない。
たとえば、関数 \(f(x)=1000x\) では、入力誤差が 0.001 でも出力誤差は 1 になる。
f(x+0.001)-f(x)
=
1000\times0.001
=
1
\]
一方、一定関数 \(f(x)=c\) では、入力がどれだけ変化しても出力誤差は 0 である。
f(x+\varepsilon)-f(x)
=
c-c
=
0
\]
| 後続計算の性質 | 入力誤差への応答 | 量子化上の帰結 |
|---|---|---|
| 高感度 | 小さな入力変化が大きな出力変化になる。 | 量子化直後の誤差が小さくても、最終結果を保てない場合がある。 |
| 低感度 | 入力が変化しても出力がほとんど変わらない。 | 比較的大きな量子化摂動を許容できる場合がある。 |
| 方向依存 | 同じ大きさの誤差でも、方向によって出力への影響が変わる。 | 誤差ノルムだけでは量子化方式を評価できない。 |
量子化器の目的が保存後の値そのものを再現することであれば、\(\|\varepsilon\|\) を直接評価すればよい。しかし、その値を行列積、最適化、分類、制御などへ使用する場合には、後続計算を通した \(\|\Delta f\|\) を評価する必要がある。
13.2 微小な誤差の影響は微分によって近似できる
関数 \(f\) が入力 \(x\) の周辺で微分可能であり、量子化摂動 \(\varepsilon\) が十分に小さい場合、出力変化は一次近似によって表せる。
一変数関数では、Taylor 展開から次の関係が得られる。
f(x+\varepsilon)-f(x)
=
f'(x)\varepsilon
+
O(\varepsilon^2)
\]
\(f'(x)\) は点 \(x\) における関数の傾きである。一次の項 \(f'(x)\varepsilon\) が量子化摂動の主要な影響を表し、\(O(\varepsilon^2)\) は誤差の二乗以上の大きさを持つ高次項を表す。
\(|f'(x)|\) が大きければ、入力誤差は出力側で増幅される。\(|f'(x)|\) が 1 より小さければ、一次近似の範囲では誤差が縮小される。
多変数関数 \(f:\mathbb{R}^d\rightarrow\mathbb{R}^m\) では、微分の役割をヤコビ行列 \(J_f(x)\) が担う。
f(x+\varepsilon)-f(x)
=
J_f(x)\varepsilon
+
O(\|\varepsilon\|^2)
\]
ヤコビ行列は、入力の各方向への微小変化が、出力の各成分へどのように伝わるかを表す。量子化摂動の大きさが同じでも、ヤコビ行列が強く拡大する方向へ誤差が向いていれば、出力変化は大きくなる。
| 量 | 役割 | 量子化摂動との関係 |
|---|---|---|
| \(\varepsilon\) | 入力空間における量子化摂動を表す。 | 誤差の大きさと方向を持つ。 |
| \(J_f(x)\) | 点 \(x\) の周辺における後続計算の局所感度を表す。 | 入力誤差の各方向を出力空間へ拡大、縮小、回転させる。 |
| \(J_f(x)\varepsilon\) | 出力誤差の一次近似を表す。 | 量子化摂動が最終結果へ与える主要な影響になる。 |
| 高次項 | 非線形性による一次近似との差を表す。 | 誤差が大きい場合や急激に曲がる関数では無視できなくなる。 |
低ビット量子化では、\(\varepsilon\) が十分に小さいとは限らない。セル境界をまたぐ離散的な変化や、クリッピングによる大きな誤差では、一次近似だけで結果を正確に予測できない。微分による評価は局所的な感度を示すが、有限幅の量子化摂動に対しては実際の関数評価も必要になる。
13.3 Lipschitz 定数は出力誤差の上限を与える
関数 \(f\) が、対象範囲内の任意の入力 \(x\) と \(y\) に対して次の条件を満たすとする。
\|f(x)-f(y)\|
\leq
L\|x-y\|
\]
このような \(f\) を Lipschitz 連続と呼び、\(L\) を Lipschitz 定数と呼ぶ。量子化後の入力 \(y=x+\varepsilon\) を代入すると、出力誤差は次のように評価できる。
\|f(x+\varepsilon)-f(x)\|
\leq
L\|\varepsilon\|
\]
\(L\) は、対象範囲において入力誤差を最大で何倍まで拡大し得るかを表す。\(L\lt 1\) なら、その範囲では誤差が縮小される。\(L>1\) なら、入力誤差が増幅される可能性がある。
ただし、Lipschitz 定数は最悪方向と最悪位置を含む上限である。実際の入力と誤差方向に対する出力変化は、上限より大幅に小さい場合がある。
| 評価方法 | 示すもの | 制約 |
|---|---|---|
| 量子化摂動ノルム | 入力空間で失われた値の大きさを示す。 | 後続計算の感度を含まない。 |
| ヤコビ行列 | 特定の入力位置と誤差方向に対する局所的な変化を示す。 | 大きな誤差や強い非線形性では一次近似から外れる。 |
| Lipschitz 定数 | 対象領域全体における出力誤差の上限を示す。 | 最悪条件に基づくため、実際より過大な上限になる場合がある。 |
量子化設計では、誤差の平均だけでなく、後続計算が持つ局所感度と最悪感度を分けて確認する必要がある。平均的には影響が小さくても、特定の入力領域だけで感度が急増する場合には、その領域の量子化を細かくする必要がある。
13.4 行列積では誤差行列と入力方向の積が出力誤差になる
行列 \(A\in\mathbb{R}^{m\times n}\) と入力ベクトル \(x\in\mathbb{R}^n\) の積を考える。
y=Ax
\]
行列 \(A\) を量子化し、量子化後の行列を \(\tilde{A}\) とする。量子化摂動行列を \(E\) と書けば、次の関係になる。
\tilde{A}=A+E
\]
量子化後の行列を使った出力は、次の値になる。
\tilde{y}
=
\tilde{A}x
=
(A+E)x
\]
元の出力との差は次のとおりである。
\tilde{y}-y
=
(A+E)x-Ax
=
Ex
\]
行列量子化による出力誤差は、誤差行列 \(E\) そのものではなく、誤差行列が入力 \(x\) へ作用した結果 \(Ex\) である。
誤差行列 \(E\) の要素ごとの平均二乗誤差が小さくても、入力 \(x\) が \(E\) によって強く拡大される方向にあれば、出力誤差は大きくなる。反対に、\(x\) が \(E\) の零空間に属すれば、行列に量子化摂動が存在しても出力誤差は 0 になる。
Ex=0
\]
| 入力方向 | 誤差行列との関係 | 出力誤差 |
|---|---|---|
| 高感度方向 | 誤差行列によって大きく拡大される方向に近い。 | \(\|Ex\|\) が大きくなりやすい。 |
| 低感度方向 | 誤差行列による拡大が小さい方向に近い。 | \(\|Ex\|\) は小さくなる。 |
| 零空間 | 誤差行列を掛けると 0 になる。 | 行列量子化の影響が出力へ現れない。 |
行列要素の誤差を一様に評価する方法は、どの入力方向が実際に使われるかを考慮しない。入力分布が特定の部分空間へ集中している場合、その部分空間上の \(Ex\) を小さくする方が、行列全体の平均誤差を小さくするより有効な場合がある。
13.5 行列ノルムは最悪方向の誤差増幅を評価する
行列 \(E\) が入力を最大でどの程度拡大するかは、作用素ノルムによって評価できる。ユークリッドノルムに対応する行列ノルムは、次のように定義される。
\|E\|_2
=
\max_{x\neq0}
\frac{\|Ex\|_2}{\|x\|_2}
\]
この定義から、任意の入力 \(x\) に対して次の上限が成り立つ。
\|Ex\|_2
\leq
\|E\|_2\|x\|_2
\]
\(\|E\|_2\) は、誤差行列が入力を最も強く拡大する方向における倍率であり、最大特異値に等しい。
行列の全要素の誤差を測る Frobenius ノルムも利用できる。
\|E\|_F
=
\left(
\sum_{i,j}
E_{ij}^2
\right)^{1/2}
\]
Frobenius ノルムは誤差要素の二乗和を測るが、特定の入力方向に対する最大増幅を直接表すものではない。作用素ノルムと Frobenius ノルムは、異なる失敗を測っている。
| 評価量 | 測定対象 | 見つけやすい失敗 |
|---|---|---|
| 要素平均二乗誤差 | 行列要素ごとの量子化差を平均する。 | 行列全体へ広く分散した数値誤差を評価できる。 |
| Frobenius ノルム | 誤差行列の全要素が持つエネルギーを測る。 | 誤差総量が大きい行列を識別できる。 |
| 作用素ノルム | 入力を最も強く拡大する誤差方向を測る。 | 一部の入力方向だけで出力誤差が大きくなる場合を検出できる。 |
| 実入力上の誤差 | 観測された入力に対する \(\|Ex\|\) を測る。 | 運用時に実際に使用される方向への影響を評価できる。 |
量子化器の最悪誤差を抑えるなら作用素ノルムが有効であり、入力分布に対する平均的な出力誤差を抑えるなら、実際の入力を使った \(\mathbb{E}[\|EX\|^2]\) が直接的な評価になる。
13.6 行列と入力の両方を量子化すると誤差項が組み合わさる
行列 \(A\) だけでなく、入力ベクトル \(x\) も量子化する場合を考える。量子化後の値を次のように書く。
\tilde{A}=A+E
\]
\tilde{x}=x+\varepsilon
\]
量子化後の出力は次の値になる。
\tilde{y}
=
\tilde{A}\tilde{x}
=
(A+E)(x+\varepsilon)
\]
式を展開すると、次のようになる。
\tilde{y}
=
Ax
+
A\varepsilon
+
Ex
+
E\varepsilon
\]
元の出力 \(y=Ax\) との差は次のとおりである。
\tilde{y}-y
=
A\varepsilon
+
Ex
+
E\varepsilon
\]
| 誤差項 | 発生原因 | 性質 |
|---|---|---|
| \(A\varepsilon\) | 入力ベクトルの量子化摂動 | 元の行列 \(A\) が入力誤差を増幅または縮小する。 |
| \(Ex\) | 行列の量子化摂動 | 実際の入力方向に対する行列誤差の影響を表す。 |
| \(E\varepsilon\) | 行列誤差と入力誤差の相互作用 | 両方の誤差に比例する二次の項になる。 |
量子化摂動が十分に小さい場合、二次項 \(E\varepsilon\) は一次項より小さいとして省略できる場合がある。
\tilde{y}-y
\approx
A\varepsilon+Ex
\]
低ビット量子化やクリッピングによって誤差が大きい場合には、二次項を無視できない。行列と入力を個別に量子化して小さな誤差を確認しても、組合せた演算で同じ精度が保たれるとは限らない。
13.7 誤差は加算によって相殺も累積もする
複数の量子化摂動を加算する場合、最終誤差は各誤差の和になる。誤差を \(\varepsilon_1,\ldots,\varepsilon_n\) とすると、合計誤差は次の値である。
E_n
=
\sum_{i=1}^{n}
\varepsilon_i
\]
誤差の符号や方向が互いに打ち消し合えば、個々の誤差が存在しても合計は小さくなる。すべてが同じ方向へ偏れば、誤差は加算回数に応じて増加する。
各誤差が平均 0 で、互いに独立であると仮定すると、合計誤差の分散は各分散の和になる。
\operatorname{Var}(E_n)
=
\sum_{i=1}^{n}
\operatorname{Var}(\varepsilon_i)
\]
各誤差が同じ分散 \(\sigma_\varepsilon^2\) を持つなら、次の関係になる。
\operatorname{Var}(E_n)
=
n\sigma_\varepsilon^2
\]
標準偏差は次の速さで増える。
\sqrt{
\operatorname{Var}(E_n)
}
=
\sqrt{n}\sigma_\varepsilon
\]
一方、各誤差が同じ符号と大きさ \(\beta\) を持つ系統誤差なら、合計は \(n\) に比例する。
E_n=n\beta
\]
| 誤差の関係 | 合計誤差の傾向 | 量子化上の帰結 |
|---|---|---|
| 平均 0 で独立 | 標準偏差は概ね \(\sqrt{n}\) に比例して増える。 | 正負の誤差が部分的に相殺される。 |
| 同方向のバイアス | 誤差は概ね \(n\) に比例して増える。 | 小さな丸めの偏りでも、反復によって大きなずれになる。 |
| 負の相関 | 誤差が互いに打ち消され、合計が小さくなる場合がある。 | 個別誤差が大きくても最終結果では影響が減る。 |
| 正の相関 | 同じ方向の誤差が同時に現れやすい。 | 独立雑音を仮定した予測より大きな誤差になる。 |
一般には共分散を含め、次のようになる。
\operatorname{Var}(E_n)
=
\sum_{i=1}^{n}
\operatorname{Var}(\varepsilon_i)
+
2
\sum_{i\lt j}
\operatorname{Cov}
(\varepsilon_i,\varepsilon_j)
\]
量子化摂動を独立な雑音として扱えるかどうかによって、長い計算での誤差成長率は変わる。決定論的な丸め誤差が入力と相関している場合、\(\sqrt{n}\) 型の相殺を前提にできない。
13.8 内積では乗算誤差と累積誤差を分ける
ベクトル \(a\) と \(x\) の内積を考える。
s
=
a^\mathsf{T}x
=
\sum_{i=1}^{n}
a_i x_i
\]
量子化された値を次のように書く。
\tilde{a}_i=a_i+\alpha_i
\]
\tilde{x}_i=x_i+\beta_i
\]
量子化後の各積は次のようになる。
\tilde{a}_i\tilde{x}_i
=
a_i x_i
+
\alpha_i x_i
+
a_i\beta_i
+
\alpha_i\beta_i
\]
内積全体の入力量子化による誤差は、次の和になる。
\sum_{i=1}^{n}
\left(
\alpha_i x_i
+
a_i\beta_i
+
\alpha_i\beta_i
\right)
\]
さらに、各積と加算を有限精度で実行する場合には、演算丸め誤差が加わる。最終的な計算結果を \(\hat{s}\) とすると、概念的には次のように分けられる。
\hat{s}-s
=
\text{入力量子化による誤差}
+
\text{乗算丸め誤差}
+
\text{累積丸め誤差}
\]
| 誤差源 | 発生位置 | 影響を決める要因 |
|---|---|---|
| 入力量子化 | 内積へ入力する前 | 入力値と重みの量子化方式、尺度、クリッピングによって決まる。 |
| 乗算丸め | 各 \(a_i x_i\) を計算するとき | 乗算器の出力精度と正確な積の大きさによって決まる。 |
| 累積丸め | 積を部分和へ加えるたび | 加算回数、累積形式、加算順序、途中値の大きさによって決まる。 |
| 最終変換 | 累積結果を保存形式へ戻すとき | 出力形式の刻み幅と表現範囲によって決まる。 |
入力と重みを低精度で保存しても、積の計算と累積を同じ低精度で行う必要はない。保存形式、乗算形式、累積形式、出力形式を分けることで、誤差と計算費用を調整できる。
13.9 長い和では累積精度と加算順序が結果を変える
有限精度で \(n\) 個の値を順番に加算すると、各加算の後に丸めが入る。単位丸め誤差を \(u\) とし、\(ku\lt 1\) の範囲で次の量を定義する。
\gamma_k
=
\frac{ku}{1-ku}
\]
通常の丸め誤差モデルでは、\(n\) 個の値 \(t_1,\ldots,t_n\) を逐次加算した結果の絶対誤差は、概ね次の形で評価できる[17]。
\left|
\operatorname{fl}
\left(
\sum_{i=1}^{n}t_i
\right)
–
\sum_{i=1}^{n}t_i
\right|
\leq
\gamma_{n-1}
\sum_{i=1}^{n}|t_i|
\]
右辺には、正確な和の絶対値ではなく、各項の絶対値の和が現れる。正負の項が大きく打ち消し合う場合、正確な結果は小さくても、途中計算では大きな値を扱うため、相対誤差が大きくなる。
たとえば正確な和が次のように小さい場合を考える。
10^8+1-10^8=1
\]
低精度形式で \(10^8+1\) の差を保持できなければ、最初の加算で 1 が消え、最終結果は 0 になる。加算順序を変え、\(10^8-10^8\) を先に計算すれば、結果 1 を保持できる場合がある。
| 加算方法 | 特徴 | 誤差への影響 |
|---|---|---|
| 左から逐次加算 | 入力順に部分和へ加える。 | 部分和と次の項の大きさが大きく異なると、小さな項が失われやすい。 |
| 絶対値の小さい順 | 小さな値どうしを先に足す。 | 小さな寄与を大きな部分和へ直接加える回数を減らせる場合がある。 |
| 対にした加算 | 木構造で近い段階の部分和を組み合わせる。 | 逐次加算より誤差成長を抑え、並列化もしやすい。 |
| 補償付き加算 | 各加算で失われた低位部分を別の変数へ保持する。 | 追加演算と引き換えに累積誤差を小さくできる。 |
同じ量子化済み入力を使っても、加算順序と累積方式が異なれば最終結果は変わり得る。量子化後のデータ形式だけでなく、そのデータを処理する演算経路も精度設計の一部になる。
13.10 桁落ちは小さな絶対誤差を大きな相対誤差へ変える
近い二つの値を減算すると、共通する上位桁が打ち消される。入力がすでに丸め誤差を含んでいる場合、差として残る下位桁がその誤差に支配されることがある。この現象を桁落ちと呼ぶ。
正確な値を \(x\) と \(y\)、量子化摂動を \(\varepsilon_x\) と \(\varepsilon_y\) とする。量子化後の差は次の値になる。
(x+\varepsilon_x)
–
(y+\varepsilon_y)
=
(x-y)
+
(\varepsilon_x-\varepsilon_y)
\]
差 \(x-y\) が大きければ、誤差項の相対的な影響は小さい。\(x\) と \(y\) が非常に近く、正確な差が小さい場合には、\(\varepsilon_x-\varepsilon_y\) が結果と同程度またはそれ以上になる。
絶対誤差は小さくても、相対誤差は次の分母が小さいため大きくなる。
\frac{
|(\varepsilon_x-\varepsilon_y)|
}{
|x-y|
}
\]
| 計算状態 | 正確な結果 | 量子化摂動の相対的影響 |
|---|---|---|
| 異なる大きさの値を減算 | 差が十分に大きい。 | 入力誤差が小さければ相対誤差も小さくなりやすい。 |
| 近い値を減算 | 上位桁が打ち消され、差が小さくなる。 | 入力に含まれていた低位誤差が結果を支配しやすい。 |
| 同じ量子化セルの値を減算 | 量子化後には同じ代表値になり得る。 | 元は非ゼロだった差が 0 へ失われる。 |
差分、分散、数値微分、残差計算では、近い値の減算が頻繁に現れる。入力値そのものの相対誤差が小さくても、差分の相対誤差は大きくなり得るため、必要な精度は最終的に計算する差の大きさから決める必要がある。
13.11 条件数は問題そのものの入力感度を表す
計算問題が入力摂動へどの程度敏感かを、条件数によって評価する[17]。関数 \(f\) の相対条件数は、概念的には次の比の極限として定義できる。
\kappa_f(x)
=
\lim_{\delta\rightarrow0}
\sup_{\|\varepsilon\|\leq\delta\|x\|}
\frac{
\|f(x+\varepsilon)-f(x)\|/\|f(x)\|
}{
\|\varepsilon\|/\|x\|
}
\]
分母は入力の相対変化、分子は出力の相対変化である。条件数が大きい問題では、小さな相対入力誤差が大きな相対出力誤差へ変わり得る。
正則行列 \(A\) を使う連立一次方程式を考える。
Ax=b
\]
解は次の値になる。
x=A^{-1}b
\]
行列ノルムに対応する条件数は、次のように定義される。
\kappa(A)
=
\|A\|
\|A^{-1}\|
\]
\(\kappa(A)\) が大きい場合、\(A\) や \(b\) の小さな量子化摂動によって、解 \(x\) が大きく変化する可能性がある。
| 条件数 | 問題の性質 | 量子化への含意 |
|---|---|---|
| 小さい | 入力の小さな変化に対して出力も比較的小さく変化する。 | 低精度入力でも結果を維持しやすい。 |
| 大きい | 入力のわずかな変化が出力を大きく変える可能性がある。 | 量子化摂動が小さくても、最終結果の保証が難しい。 |
| 無限大または未定義 | 問題が特異点や不連続点にある。 | 任意に小さな誤差で結果が不定または大幅に変化し得る。 |
条件数は、特定のアルゴリズムが悪いことを示す量ではない。正確な計算を行える理想的なアルゴリズムであっても、入力自体が量子化されていれば、条件の悪い問題では出力誤差が大きくなる。
13.12 数値的安定性はアルゴリズムが追加する誤差を表す
条件数が問題そのものの感度を表すのに対し、数値的安定性は、選択した計算手順が有限精度演算によってどの程度の追加誤差を生じさせるかを表す。
アルゴリズムが返した結果を \(\hat{y}\) とする。ある小さな入力摂動 \(\delta x\) に対して次の関係を満たす場合、その計算は後退安定であると評価できる[17]。
\hat{y}
=
f(x+\delta x)
\]
計算結果は正確な \(f(x)\) ではないが、元の入力にごく小さな変更を加えた問題の正確解として説明できる。
前方誤差は、計算結果と真の結果の差である。
\|\hat{y}-f(x)\|
\]
後方誤差は、計算結果を正確解にするために入力をどれだけ変えればよいかを測る。
\|\delta x\|
\]
概念的には、前方相対誤差は条件数と後方相対誤差の積によって評価される。
\text{前方相対誤差}
\lesssim
\kappa_f(x)
\times
\text{後方相対誤差}
\]
| 問題の条件 | アルゴリズム | 結果 |
|---|---|---|
| 良条件 | 安定 | 小さな量子化摂動と丸め誤差から、小さな出力誤差を期待できる。 |
| 良条件 | 不安定 | 問題自体は扱いやすくても、計算手順が誤差を余分に増やす。 |
| 悪条件 | 安定 | アルゴリズムが最善でも、入力誤差が大きな出力誤差へ増幅される。 |
| 悪条件 | 不安定 | 問題の感度と計算手順の誤差が重なり、結果の信頼性が低下する。 |
量子化器の誤差評価は、条件数と安定性を分離して行う必要がある。量子化摂動を減らしても、不安定なアルゴリズムを使えば精度を失う。安定なアルゴリズムへ変更しても、問題が極端に悪条件なら高精度入力が必要になる。
13.13 反復計算では各段階のヤコビ行列が誤差を伝播させる
複数の計算を順番に適用する処理を考える。第 \(\ell\) 段の状態を \(x_\ell\)、変換を \(f_\ell\) とすると、正確な計算は次の形になる。
x_{\ell+1}
=
f_\ell(x_\ell)
\]
各段階で量子化や有限精度演算による誤差 \(\eta_\ell\) が加わる場合、計算結果は次のように表せる。
\tilde{x}_{\ell+1}
=
f_\ell(\tilde{x}_\ell)
+
\eta_\ell
\]
正確な状態との差を \(\delta_\ell=\tilde{x}_\ell-x_\ell\) とすると、微小誤差の一次近似は次のようになる。
\delta_{\ell+1}
\approx
J_{f_\ell}(x_\ell)\delta_\ell
+
\eta_\ell
\]
前段までに生じた誤差 \(\delta_\ell\) は、現在のヤコビ行列によって変換される。現在段で新たに生じた誤差 \(\eta_\ell\) が加わり、次段へ渡される。
最終段まで展開すると、早い段階で生じた誤差ほど、多数のヤコビ行列の積を通過する。
\delta_L
\approx
\sum_{k=0}^{L-1}
\left(
\prod_{j=k+1}^{L-1}
J_{f_j}(x_j)
\right)
\eta_k
\]
積の順序は、誤差が後続段を通過する順序に対応する。各段のヤコビ行列ノルムが 1 より大きい方向では誤差が増幅されやすく、1 より小さい方向では減衰しやすい。
| 計算経路 | 誤差伝播 | 量子化上の帰結 |
|---|---|---|
| 拡大的 | ヤコビ行列の積が特定方向を繰り返し拡大する。 | 初期段の小さな量子化摂動が後段で支配的になる。 |
| 収縮的 | 各段が誤差方向を縮小する。 | 前段の量子化摂動が後段で目立たなくなる。 |
| 方向選択的 | 一部の方向だけを拡大し、他の方向を抑える。 | 同じ誤差ノルムでも方向によって最終影響が異なる。 |
| 非線形境界付近 | わずかな誤差で活性領域や分岐結果が変わる。 | 一次近似では捉えにくい離散的な出力変化が生じる。 |
多段計算では、各値の局所的な量子化摂動を独立に最小化するだけでは最終誤差を最小化できない。後続段によって強く増幅される位置へ高い精度を割り当て、減衰する位置では低い精度を許容する設計が必要になる。
13.14 非線形な境界では微小誤差が離散的な結果を変える
後続計算が分類、比較、条件分岐などを含む場合、出力は入力に対して連続的に変化しないことがある。境界から十分離れた入力では、量子化摂動があっても結果は変わらない。境界付近では、極めて小さな誤差によって出力状態が切り替わる。
二つの値 \(g_1(x)\) と \(g_2(x)\) を比較し、大きい方を選ぶ処理を考える。元の入力では次の関係にあるとする。
g_1(x)>g_2(x)
\]
量子化後に差の符号が逆転すれば、選択結果も変わる。
g_1(x+\varepsilon)
\lt
g_2(x+\varepsilon)
\]
重要になるのは、各出力値の絶対誤差だけでなく、二つの候補の余裕である。
m(x)
=
g_1(x)-g_2(x)
\]
この余裕 \(m(x)\) が大きければ、一定範囲の量子化摂動に耐えられる。余裕が小さければ、数値誤差が小さくても判定結果が変わる。
| 入力位置 | 数値誤差 | 離散結果への影響 |
|---|---|---|
| 境界から遠い | 一定の量子化摂動が存在する。 | 出力値は変わっても、分類や分岐結果は維持されやすい。 |
| 境界付近 | 極めて小さな量子化摂動でもよい。 | 比較順序が逆転し、離散的な出力状態が変わり得る。 |
平均二乗誤差が小さい量子化器でも、判断境界付近の入力を多く誤る場合がある。最終用途が離散判断であるなら、値の再構成誤差だけでなく、境界からの余裕と判断結果の変化率を測る必要がある。
13.15 混合精度では保存、乗算、累積、出力を別々に設計する
低精度計算では、すべての処理を同じビット数で行う必要はない。値を保存する精度、乗算する精度、加算を蓄積する精度、最終結果を保存する精度を分けられる。
| 処理段階 | 精度が担う役割 | 低精度化した場合の主な影響 |
|---|---|---|
| 入力保存 | 元の値をどの刻み幅と範囲で保持するかを決める。 | 演算開始前から量子化摂動とクリッピング誤差が生じる。 |
| 乗算 | 二つの低精度値の積をどの精度で求めるかを決める。 | 正確な積より狭い形式へ丸めると、各積に追加誤差が生じる。 |
| 累積 | 多数の積や値を加算するときの部分和を保持する。 | 低精度では小さな加算項が消え、誤差が加算回数に応じて増える。 |
| 出力保存 | 高精度な中間結果を次段へどの形式で渡すかを決める。 | 演算が高精度でも、出力変換時に再び情報が失われる。 |
入力と重みを低ビットで保存すると、メモリ容量と読み出し量を減らせる。積をより広い形式で表し、長い和をさらに高い精度で累積すれば、保存精度を超える中間結果の範囲を確保し、加算誤差を抑えられる。
たとえば低ビット整数どうしの積は、各入力より多くのビットを必要とする。多数の積を加算する部分和は、さらに広い範囲を必要とする。入力と同じビット幅で積と和を保持すれば、値が正確であっても途中でオーバーフローする可能性がある。
混合精度設計の効果は、量子化コードのビット数だけでは判断できない。低精度値をどの演算器で処理し、どの形式へ累積し、いつ再量子化するかを含めて評価する必要がある。
13.16 高精度累積は入力量子化摂動を消すわけではない
累積精度を高くすれば、加算時に新しく生じる丸め誤差を減らせる。しかし、入力や重みを量子化した時点で失われた情報は復元できない。
量子化後の入力を \(\tilde{a}_i\) と \(\tilde{x}_i\) とする。積和を無限精度で計算できたとしても、得られる値は次の量である。
\sum_{i=1}^{n}
\tilde{a}_i\tilde{x}_i
\]
元の高精度な内積は次の値である。
\sum_{i=1}^{n}
a_i x_i
\]
両者の差は入力量子化によってすでに生じている。高精度累積が減らせるのは、量子化後の積を加える過程で新たに生じる誤差である。
| 誤差 | 高精度累積で低減できるか | 理由 |
|---|---|---|
| 入力量子化摂動 | 直接には低減できない。 | 演算開始前に元の値との差が確定している。 |
| 乗算丸め誤差 | 乗算結果を広い形式で保持すれば低減できる。 | 正確な積を狭い形式へ丸める回数を減らせる。 |
| 累積丸め誤差 | 低減できる。 | 部分和の低位桁と広い数値範囲を保持できる。 |
| 出力再量子化摂動 | 最終形式が低精度なら残る。 | 高精度な累積結果を有限個の出力値へ戻す必要がある。 |
高精度累積を採用しても結果が改善しない場合、誤差の主因は入力量子化やクリッピングにある可能性が高い。反対に、ベクトル長を増やすほど誤差が急増する場合には、累積精度や加算順序が主因になっている可能性がある。
13.17 量子化摂動の評価には計算経路ごとの誤差予算が必要になる
複数の量子化、形式変換、演算を含む計算では、最終誤差を一つの量子化器だけへ帰属させられない。処理経路ごとに、どの段階でどの誤差が生じ、後続計算でどの程度増幅されるかを分ける必要がある。
| 確認対象 | 測定内容 | 判断できること |
|---|---|---|
| 入力変換 | 量子化直後の絶対誤差、相対誤差、クリッピング率を測る。 | 表現形式そのものが失う情報量を確認できる。 |
| 局所感度 | ヤコビ行列、勾配、作用素ノルムなどを測る。 | どの値と方向の誤差が増幅されやすいかを確認できる。 |
| 演算過程 | 乗算精度、累積精度、加算順序、オーバーフローを確認する。 | 量子化後に追加される数値誤差を分離できる。 |
| 反復伝播 | 各段の誤差と最終出力への寄与を測る。 | 早い段階の誤差が増幅または減衰する経路を確認できる。 |
| 最終用途 | 出力誤差、判断結果、制御量、モデル損失などを測る。 | 数値誤差が実際の目的へ与える影響を評価できる。 |
各段階の誤差上限を単純に足せば安全側の評価になる場合があるが、実際の誤差は方向と相関によって相殺も増幅もされる。最悪誤差の保証と、入力分布上の平均性能は分けて測る必要がある。
誤差予算を配分する場合、すべての値へ同じビット数を与える必要はない。高感度な経路、条件の悪い演算、長く累積される値には高い精度を割り当て、後続計算で減衰する値には低い精度を割り当てられる。
13.18 量子化後の精度は量子化器と計算経路の組合せで決まる
量子化摂動の大きさだけから、最終結果の誤差を判断することはできない。入力誤差は、後続関数の微分、行列の特異方向、問題の条件数、演算順序、累積精度を通じて変化する。
同じノルムを持つ二つの量子化摂動でも、一方が高感度方向へ向かい、もう一方が低感度方向へ向かえば、出力への影響は異なる。複数の誤差が独立に正負へ分散すれば部分的に相殺されるが、同じ方向へ偏れば反復回数に比例して蓄積する。
条件の悪い問題では、安定したアルゴリズムを使っても入力量子化摂動が増幅される。不安定なアルゴリズムでは、良条件の問題であっても演算丸め誤差が余分に増える。問題の感度とアルゴリズムの安定性は別々に評価しなければならない。
低精度計算では、保存精度だけでなく、乗算精度、累積精度、出力精度を分ける必要がある。高精度累積は加算誤差を抑えるが、入力量子化時に失われた区別までは戻さない。
量子化器の良さは、元の値にどれだけ近い代表値を返したかだけでは決まらない。その代表値が計算経路を通った後、最終用途に必要な出力をどの程度保存したかによって決まる。量子化は表現形式の設計であると同時に、誤差が流れる計算経路全体の設計である。
14. 確率的丸めとディザは誤差の統計的性質を変える
14.1 最近傍丸めでは微小な更新が繰り返し失われる
最近傍丸めは、入力に最も近い表現可能値を常に選ぶ。同じ入力には同じ結果を返す決定論的な規則であり、一回の絶対誤差を小さくする点では自然である。しかし、表現間隔より小さな更新を反復する計算では、同じ方向の誤差を繰り返す場合がある。
表現可能値が整数だけであり、状態 \(w_t\) へ毎回 0.3 を加えた後に最近傍丸めするとする。
w_{t+1}
=
\operatorname{round}(w_t+0.3)
\]
初期値が \(w_0=0\) なら、最初の更新結果は次のようになる。
w_1
=
\operatorname{round}(0.3)
=
0
\]
次の更新でも状態は 0 のままであるため、同じ計算が繰り返される。
w_2
=
\operatorname{round}(0+0.3)
=
0
\]
したがって、何度更新しても状態は変化しない。
w_t=0
\]
丸めを行わなければ、10 回後の正確な値は 3.0 になる。
0.3\times10=3.0
\]
最近傍丸めでは各回の 0.3 が独立に 0 へ消えるため、複数回の小さな更新を合計した効果まで失われる。このように、0 の周辺で一定範囲の入力を 0 へ写す領域は、更新に対する不感帯として働く。
| 更新方法 | 各回の処理 | 10 回後の結果 | 誤差の性質 |
|---|---|---|---|
| 丸めなし | 0.3 をそのまま累積する。 | 3.0 になる。 | 表現誤差は生じない。 |
| 最近傍丸め | 各回の 0.3 を 0 へ丸める。 | 0 のままになる。 | 各回で同じ方向の誤差が生じ、更新全体が消える。 |
| 確率的丸め | 0.3 を確率に応じて 0 または 1 へ丸める。 | 一回ごとの結果は変動するが、期待値は 3.0 になる。 | 系統的な偏りを確率的な揺らぎへ変える。 |
最近傍丸めが常に偏っているわけではない。入力分布がセル中央に対して対称なら、全体平均として誤差が打ち消される場合もある。問題になるのは、同じ微小値や同じ方向の更新を繰り返し丸めるときである。決定論的な規則によって、誤差の符号も繰り返される。
14.2 確率的丸めは隣接する二つの表現値を確率で選ぶ
入力 \(x\) が、隣接する二つの表現可能値 \(a\) と \(b\) の間にあるとする。
a\lt x\lt b
\]
確率的丸めでは、入力から各代表値までの距離に応じて、\(a\) または \(b\) を選ぶ。
Q_{\mathrm{sr}}(x)
=
\begin{cases}
a
&
\text{確率 }
\dfrac{b-x}{b-a}
\\
b
&
\text{確率 }
\dfrac{x-a}{b-a}
\end{cases}
\]
\(x\) が \(a\) に近いほど \(a\) を選ぶ確率が高くなり、\(b\) に近いほど \(b\) を選ぶ確率が高くなる。入力が中点にあれば、両方を同じ確率で選ぶ。
表現可能値が 0 と 1 で、入力が 0.3 の場合には、次の割当てになる。
Q_{\mathrm{sr}}(0.3)
=
\begin{cases}
0 & \text{確率 }0.7\\
1 & \text{確率 }0.3
\end{cases}
\]
一回の結果は 0 または 1 であり、0.3 そのものにはならない。最近傍丸めより入力から遠い 1 を選ぶ場合もある。その代わり、長期的な平均が元の値と一致するように確率を設計している。
| 入力位置 | \(a\) を選ぶ確率 | \(b\) を選ぶ確率 | 動作 |
|---|---|---|---|
| \(x=a\) | 1 になる。 | 0 になる。 | 表現可能値はそのまま保存される。 |
| \(x=(a+b)/2\) | 1/2 になる。 | 1/2 になる。 | 二つの隣接値を同じ確率で選ぶ。 |
| \(x=b\) | 0 になる。 | 1 になる。 | 表現可能値はそのまま保存される。 |
14.3 確率的丸めは条件付き期待値を保存する
確率的丸めの期待値を計算すると、元の入力 \(x\) に一致する。
\mathbb{E}
\left[
Q_{\mathrm{sr}}(x)
\mid x
\right]
=
a\frac{b-x}{b-a}
+
b\frac{x-a}{b-a}
\]
分子を展開すると、次のようになる。
a(b-x)+b(x-a)
=
ab-ax+bx-ab
=
x(b-a)
\]
したがって、期待値は次の値になる。
\mathbb{E}
\left[
Q_{\mathrm{sr}}(x)
\mid x
\right]
=
x
\]
本稿の符号規約に従い、量子化誤差を次のように定義する。
\varepsilon
=
x-Q_{\mathrm{sr}}(x)
\]
その条件付き期待値は 0 になる。
\mathbb{E}[\varepsilon\mid x]
=
0
\]
この性質を不偏性と呼ぶ。入力 \(x\) を固定し、丸めの乱数だけについて平均すると、量子化後の値は元の値へ一致する。
0.3 の例では、期待値は次のとおりである。
\mathbb{E}
\left[
Q_{\mathrm{sr}}(0.3)
\right]
=
0\times0.7
+
1\times0.3
=
0.3
\]
不偏性は、一回の量子化結果が正確であることを意味しない。0 を選んだ場合の誤差は 0.3、1 を選んだ場合の誤差は -0.7 になる。
| 量子化結果 | 発生確率 | 誤差 | 期待値への寄与 |
|---|---|---|---|
| 0 | 0.7 になる。 | \(0-0.3=-0.3\) になる。 | \(-0.3\times0.7=-0.21\) になる。 |
| 1 | 0.3 になる。 | \(1-0.3=0.7\) になる。 | \(0.7\times0.3=0.21\) になる。 |
二つの寄与を足すと 0 になる。
-0.21+0.21=0
\]
最近傍丸めは一回の二乗誤差を最小にするが、同じ入力に対して同じ誤差を繰り返す。確率的丸めは一回ごとの誤差を増やす場合があるが、条件付き平均の偏りを取り除く。
14.4 不偏性と引き換えに量子化分散が生じる
確率的丸めでは、誤差の期待値は 0 になるが、誤差そのものは消えない。入力 \(x\) に対する条件付き誤差分散は、次の値になる。
\operatorname{Var}
\left(
Q_{\mathrm{sr}}(x)-x
\mid x
\right)
=
(x-a)(b-x)
\]
入力が表現可能値 \(a\) または \(b\) に一致すれば、分散は 0 になる。
(x-a)(b-x)=0
\]
分散は、入力が二つの代表値の中点にあるときに最大になる。刻み幅を \(\Delta=b-a\) とすると、中点での最大分散は次の値である。
\operatorname{Var}_{\max}
=
\frac{\Delta^2}{4}
\]
一方、最近傍丸めでは入力 \(x\) を固定すると結果も固定されるため、丸め乱数に関する分散は 0 である。ただし、決定論的な誤差が残る。
| 丸め方式 | 条件付きバイアス | 条件付き分散 | 主な交換関係 |
|---|---|---|---|
| 最近傍丸め | 入力によっては 0 にならず、同じ誤差が繰り返される。 | 入力を固定すれば 0 になる。 | 一回の距離を小さくする代わりに、系統的な偏りが残り得る。 |
| 確率的丸め | クリッピングがなければ条件付きで 0 になる。 | 隣接値の選択による揺らぎが生じる。 | 偏りを消す代わりに、各回の分散を増やす。 |
最適化や反復計算では、一定方向の小さな偏りが長期間蓄積するより、平均 0 の揺らぎとして分散する方が扱いやすい場合がある。確率的丸めが利用される理由は、一回ごとの再構成誤差が小さいからではなく、誤差を不偏な確率過程へ変えられるからである。
14.5 反復更新では微小な変化を期待値として累積できる
状態 \(w_t\) に更新量 \(\delta_t\) を加え、その結果を毎回確率的に丸める処理を考える。
w_{t+1}
=
Q_{\mathrm{sr}}
\left(
w_t+\delta_t
\right)
\]
丸め前の値を条件として不偏性が成立するなら、次の関係になる。
\mathbb{E}
\left[
w_{t+1}
\mid
w_t,\delta_t
\right]
=
w_t+\delta_t
\]
更新を繰り返し、クリッピングやオーバーフローがなく、各段階で適切な不偏丸めが行われるなら、期待値として更新の合計を保持できる。
\mathbb{E}[w_T]
=
w_0
+
\sum_{t=0}^{T-1}
\mathbb{E}[\delta_t]
\]
毎回 0.3 を加える例では、10 回後の状態は整数として変動するが、期待値は 3.0 になる。
\mathbb{E}[w_{10}]
=
0+10\times0.3
=
3.0
\]
一回の実行では 3 になるとは限らない。2 や 4 などになる場合がある。多数回の独立した実行を平均したとき、3.0 へ近づく。
この構造は、低精度で保持された重みへ微小な勾配更新を反映する場合に有効である。最近傍丸めでは常に 0 へ消える更新でも、確率的丸めなら更新量に比例する確率で隣接状態へ遷移する。
Gupta らは、確率的丸めを用いることで、16 ビット固定小数点演算によるニューラルネットワーク学習を検討した[18]。重要なのは、各更新を高精度に再現することではなく、微小な更新の長期的な寄与を系統的に消さないことである。
14.6 不偏性は表現範囲外では自動的に維持されない
確率的丸めの不偏性は、入力 \(x\) を挟む二つの表現可能値 \(a\) と \(b\) が存在する場合に成り立つ。入力が表現可能範囲を超え、端の値へクリップされる場合には、両側の代表値を選べない。
最大表現可能値を \(q_{\max}\) とし、入力がこれを超えるとする。
x>q_{\max}
\]
端へ固定する量子化器では、結果は常に \(q_{\max}\) になる。
Q(x)=q_{\max}
\]
期待誤差は次の値になり、0 にはならない。
\mathbb{E}[x-Q(x)]
=
x-q_{\max}
>
0
\]
| 入力状態 | 確率的丸め | 不偏性 |
|---|---|---|
| 隣接値の間 | 上下の代表値を距離に応じた確率で選べる。 | 条件付き期待値を入力へ一致させられる。 |
| 表現可能値と一致 | その値を確率 1 で選ぶ。 | 誤差も分散も 0 になる。 |
| 表現範囲外 | 片側の代表値が存在せず、端へ固定される。 | クリッピング誤差による偏りが残る。 |
確率的丸めを採用しても、尺度や表現範囲の選択が不要になるわけではない。外れ値によるクリッピングが頻繁に起きれば、不偏性を前提とした収束解析から外れる。
乱数生成の偏りや有限精度な確率計算も、実装上の不偏性を崩す可能性がある。理論上の確率を定義するだけでなく、その確率を実際の演算器でどの程度正確に実現できるかも確認する必要がある。
14.7 ディザは入力へ乱数を加えて量子化誤差の構造を変える
確率的丸めは、入力に応じた確率で隣接コードを直接選ぶ。ディザは、決定論的な量子化器へ入力する前に乱数 \(U\) を加える。
Y=Q(X+U)
\]
同じ入力 \(X=x\) でも、乱数 \(U\) が変われば量子化セルへの入り方が変わる。その結果、同じ決定論的量子化器を使っていても、量子化結果と誤差が確率的に変化する。
加えた乱数を出力側で残す方式では、再構成値は次の形になる。
\hat{X}
=
Q(X+U)
\]
この方式では、量子化誤差だけでなく、ディザ成分も出力へ含まれる。規則的な量子化ひずみを弱める代わりに、出力の雑音電力が増える。
復号側で同じ乱数を差し引く減算型ディザでは、次のように再構成する。
\hat{X}
=
Q(X+U)-U
\]
適切な量子化器とディザ分布を選べば、量子化誤差の分布を入力から独立にできる場合がある。ディザの目的は、一回の出力を必ず入力へ近づけることではない。入力に依存した周期的な誤差や固定バイアスを、制御された確率分布へ変えることである。
| 方式 | 乱数を入れる位置 | 主な目的 | 必要な条件 |
|---|---|---|---|
| 確率的丸め | 隣接コードを選ぶ判断自体を確率化する。 | 丸め結果の条件付き期待値を入力へ一致させる。 | 入力を挟む表現値と、距離に応じた選択確率が必要になる。 |
| 加算型ディザ | 量子化前の入力へ乱数を加える。 | 入力依存のひずみや周期構造を弱める。 | 目的に適したディザ分布を選ぶ必要がある。 |
| 減算型ディザ | 量子化前に加え、復号後に同じ乱数を差し引く。 | 量子化誤差の分布や入力からの独立性を制御する。 | 符号化側と復号側で同じディザを共有する必要がある。 |
確率的丸めとディザは、同じ代表値集合を使いながら誤差過程を変えるという点で共通する。ただし、確率的丸めは不偏なコード選択を直接設計し、ディザは量子化器へ入る位置を乱数で移動させる。両者は同じ処理ではない。
14.8 確率的量子化では誤差が平均 0 でも時間相関が残り得る
各時刻の量子化誤差が平均 0 であっても、異なる時刻の誤差が独立とは限らない。乱数生成器の状態、入力系列、共有尺度、誤差フィードバックなどによって、誤差間に相関が生じる場合がある。
時刻 \(t\) の誤差を \(\varepsilon_t\) とすると、不偏性は次の条件を表す。
\mathbb{E}[\varepsilon_t\mid x_t]=0
\]
一方、時間的な独立性には、異なる時刻の誤差について次のような関係が必要になる。
\mathbb{E}[\varepsilon_t\varepsilon_s]
=
0
\qquad
(t\neq s)
\]
前者だけから後者は導かれない。誤差が不偏でも正の相関を持てば、長期的な合計分散は独立な場合より大きくなる。
累積誤差を次のように書く。
E_T
=
\sum_{t=1}^{T}
\varepsilon_t
\]
その分散は、各時刻の分散と共分散の和になる。
\operatorname{Var}(E_T)
=
\sum_{t=1}^{T}
\operatorname{Var}(\varepsilon_t)
+
2
\sum_{1 \leq s \lt t \leq T}
\operatorname{Cov}\!\left(\varepsilon_s,\varepsilon_t\right)
\]
量子化誤差の期待値だけを確認しても、反復計算における揺らぎの増え方は分からない。分散、時間相関、入力との相関を分けて評価する必要がある。
14.9 分散学習では通信量と量子化分散を交換する
分散学習では、複数の計算機が局所的に求めた勾配や更新量を通信する。ベクトル次元が大きい場合、各成分を高精度浮動小数点数で送信すると、通信量が計算時間を支配することがある。
勾配ベクトルを \(g\)、通信前の量子化器を \(Q\) とする。不偏な確率的量子化器では、次の条件を置く。
\mathbb{E}[Q(g)\mid g]
=
g
\]
量子化誤差の大きさについては、概念的に次のような分散上界を与える。
\mathbb{E}
\left[
\|Q(g)-g\|^2
\mid g
\right]
\leq
\alpha
\|g\|^2
\]
\(\alpha\) は、ベクトル次元、量子化段階数、量子化方式に依存する係数である。量子化段階を減らせば送信するコードを短くできるが、通常は \(\alpha\) が大きくなり、量子化分散も増える。
確率的勾配降下法で、量子化勾配を使って次の更新を行うとする。
w_{t+1}
=
w_t
–
\eta_t Q(g_t)
\]
\(\eta_t\) は学習率である。不偏性が成立すれば、量子化乱数に関する条件付き期待更新は、高精度勾配を使った更新と一致する。
\mathbb{E}
\left[
w_{t+1}
\mid
w_t,g_t
\right]
=
w_t-\eta_t g_t
\]
一方、量子化によって更新の分散は増える。追加される揺らぎは、概ね次の量に比例する。
\eta_t^2
\mathbb{E}
\left[
\|Q(g_t)-g_t\|^2
\mid g_t
\right]
\]
| 量子化設定 | 通信量 | 量子化分散 | 学習への傾向 |
|---|---|---|---|
| 細かな量子化 | 多くのビットを必要とする。 | 比較的小さくなる。 | 高精度更新へ近づくが、通信削減効果は小さい。 |
| 粗い量子化 | 少ないビットで送信できる。 | 大きくなりやすい。 | 通信は軽くなるが、収束の揺らぎや必要反復回数が増える場合がある。 |
QSGD は、勾配を確率的に量子化して通信量を減らし、不偏性と量子化分散の上界を使って最適化の収束を分析した[19]。ここでの設計目的は、各勾配成分の絶対誤差を最小化することではない。通信量を減らしながら、学習アルゴリズムが扱える統計的な誤差条件を維持することである。
14.10 通信コード本体以外の付加情報も必要になる
確率的に量子化したベクトルを復号するには、各成分の離散コードだけでなく、尺度、ノルム、量子化段階数などを共有する場合がある。
総通信量は概念的に次のように分けられる。
B_{\mathrm{total}}
=
B_{\mathrm{codes}}
+
B_{\mathrm{scale}}
+
B_{\mathrm{metadata}}
\]
| 通信対象 | 内容 | 必要になる理由 |
|---|---|---|
| 量子化コード | 各成分または各ブロックが選んだ離散段階を表す。 | 量子化後の方向や大きさを復元する。 |
| 尺度やノルム | 整数コードを実数値として読むための基準を表す。 | 同じコードでもベクトルごとに異なる大きさを再構成する。 |
| メタデータ | 次元、ブロック境界、量子化方式などを表す。 | 受信側がコード列を正しく解釈する。 |
コード本体のビット数だけを比較すると、通信削減率を過大評価する場合がある。ベクトルが短い場合やブロックを細かく分ける場合には、尺度やメタデータの割合が大きくなる。
14.11 確率的丸めは再現性と乱数生成の費用を持つ
決定論的な最近傍丸めは、同じ入力と同じ計算順序なら同じ結果を返す。確率的丸めでは、乱数系列が異なれば量子化結果も変わる。
実験結果を再現するには、乱数生成器の方式、初期状態、乱数を消費する順序を固定する必要がある。並列実行では、スレッドや計算機ごとの処理順序が変わると、同じ初期シードでも乱数の割当てが変化する場合がある。
| 観点 | 最近傍丸め | 確率的丸め |
|---|---|---|
| 再現性 | 同じ入力には同じ結果を返す。 | 同じ乱数系列まで固定しなければ結果が変わる。 |
| 計算費用 | 近い代表値を比較すればよい。 | 選択確率の計算と乱数生成が必要になる。 |
| 誤差の偏り | 微小更新で同じ方向の偏りを繰り返す場合がある。 | 範囲内では条件付き期待誤差を 0 にできる。 |
| 誤差の分散 | 入力を固定すれば丸め結果の分散はない。 | 隣接値の確率選択による分散が生じる。 |
確率的丸めによって反復回数が増えたり、乱数生成が演算時間を支配したりすれば、低精度化による速度上の利点が小さくなる。数値精度だけでなく、乱数生成器を含む実装費用も評価する必要がある。
14.12 誤差の統計設計では不偏性だけを見ればよいわけではない
不偏性は重要な性質だが、それだけで量子化器の性能は決まらない。期待誤差が 0 でも、分散が極端に大きければ一回の計算結果は不安定になる。時間相関が強ければ、長期的な誤差が独立な場合より大きくなる。クリッピングが起きれば、不偏性そのものが失われる。
| 評価項目 | 確認する内容 | 見落とした場合の失敗 |
|---|---|---|
| 条件付き平均 | 入力を固定したとき、量子化誤差の期待値が 0 になるかを確認する。 | 同じ方向の更新が系統的に失われる可能性がある。 |
| 条件付き分散 | 一回の量子化結果がどの程度変動するかを確認する。 | 不偏でも計算結果の揺らぎが大きくなり得る。 |
| 時間相関 | 異なる時刻の誤差が連動していないかを確認する。 | 独立性を仮定した分散評価より誤差が大きくなる。 |
| 入力との相関 | 誤差が入力の大きさや方向へ依存していないかを確認する。 | 特定の信号や勾配方向だけが強く損なわれる。 |
| クリッピング率 | 表現範囲外へ出る入力の頻度を確認する。 | 不偏性を前提とした解析が成立しなくなる。 |
| 最終計算の損失 | 反復回数、収束速度、最終精度などを確認する。 | 量子化誤差の統計が良くても、用途上の性能が低下する場合がある。 |
14.13 丸め規則は代表値集合と同じ程度に量子化器を特徴付ける
決定論的丸め、確率的丸め、ディザ付き量子化は、同じ代表値集合を使っていても異なる誤差過程を作る。代表値が 0 と 1 の二つだけであっても、常に最近傍を選ぶ場合と、距離に応じた確率で選ぶ場合では、反復計算の結果が異なる。
最近傍丸めは、一回の入力に対して近い代表値を選ぶ。確率的丸めは、一回の誤差を増やす可能性を受け入れ、期待値の偏りを消す。ディザは、入力へ乱数を加えることで、量子化誤差の入力依存性や周波数構造を制御する。
どの方式が適切かは、平均二乗誤差だけでは決まらない。値を一度だけ保存する場合には最近傍丸めが適することが多い。微小な更新を長期間累積する場合には、不偏性が重要になる。周期的なひずみを避けたい場合には、ディザによる誤差分布の制御が必要になる。
量子化器を定義するには、代表点、セル境界、表現範囲だけでなく、入力からコードを選ぶ規則まで指定しなければならない。量子化によって何が失われるかは代表値集合が決めるが、その損失が偏り、分散、相関のどの形で現れるかは丸め規則が決める。
15. ニューラルネットワークでは量子化対象が一つではない
15.1 重み、活性値、勾配は異なる時間尺度で変化する
ニューラルネットワークは、一種類の数値だけで計算されているわけではない。学習によって更新される重み、入力ごとに生成される活性値、逆伝播で計算される勾配、過去の勾配を蓄積するオプティマイザー状態、生成中に保存される KV キャッシュなど、役割と分布の異なる数値が同じ計算経路に存在する。
これらは、値が変化する頻度、事前に分布を観測できる範囲、誤差が残り続ける時間、メモリと演算量への寄与が異なる。そのため、すべてを同じビット数、同じ尺度、同じ丸め規則で量子化することが最適とは限らない。
| 対象 | 変化する時点 | 分布の観測可能性 | 量子化で起こりやすい問題 |
|---|---|---|---|
| 重み | 推論時には固定され、学習時には更新される。 | 学習後であれば全要素を事前に調査できる。 | 重要な方向へ生じた誤差が、すべての入力に対して繰り返し作用する。 |
| 活性値 | 入力、層、トークンごとに変化する。 | 代表的な入力から推定できるが、将来入力の全範囲は確定しない。 | 入力依存の外れ値が固定された表現範囲を超え、クリッピングを起こす。 |
| 勾配 | 学習ステップごとに変化する。 | 学習の進行とともに尺度と分布が変わる。 | 微小な更新が 0 へ消えたり、確率的な揺らぎが増えたりする。 |
| オプティマイザー状態 | 学習中に反復的に更新される。 | 過去の勾配系列に依存し、時間とともに変化する。 | 小さな偏りが長期的に蓄積し、更新量の尺度や方向を変える。 |
| KV キャッシュ | 入力処理と自己回帰生成の進行に合わせて追加される。 | 生成前には長さと内容を確定できない。 | 長い文脈で量子化誤差が多数の注意計算へ継続的に利用される。 |
| 積と部分和 | 行列積や畳み込みの実行中に一時的に生成される。 | 入力形式と演算規則から範囲を評価できる。 | 入力より広い数値範囲を必要とし、低精度ではオーバーフローや累積誤差が生じる。 |
「モデルを 4 ビット化した」という表現だけでは、どの数値が 4 ビットなのかは分からない。重みの保存形式だけが 4 ビットで、計算前に FP16 へ復号している場合もある。重みと活性値を整数として保持し、整数積和を実行する場合もある。KV キャッシュや累積値が別の精度であれば、モデル全体が単一の 4 ビット数体系で動作しているわけではない。
15.2 量子化構成は対象と演算経路の組で記述する
ニューラルネットワークの量子化構成は、各対象の保存形式だけでなく、演算時にどの形式へ変換されるかを含めて記述する必要がある。行列積を例にすると、重み、活性値、積、累積値、出力がそれぞれ異なる形式を持ち得る。
量子化された重みを \(\tilde{W}\)、量子化された入力活性値を \(\tilde{x}\) とすると、線形層の計算は概念的に次の形になる。
\tilde{y}
=
\operatorname{RQ}
\left(
\operatorname{Acc}
\left(
\tilde{W},
\tilde{x}
\right)
\right)
\]
\(\operatorname{Acc}\) は積和と累積、\(\operatorname{RQ}\) は累積結果を次の層の表現形式へ再量子化する処理を表す。重みと入力が低ビットであっても、\(\operatorname{Acc}\) が同じビット数とは限らない。
| 記述項目 | 確認する内容 | 省略した場合の曖昧さ |
|---|---|---|
| 重み形式 | 重みを何ビットで保存し、どの尺度単位で復号するかを示す。 | モデル容量だけが小さいのか、低精度演算へ直接利用できるのかが分からない。 |
| 活性値形式 | 層入力と層出力を何ビットで保持するかを示す。 | 中間メモリと行列積の演算形式を判断できない。 |
| 積の形式 | 低精度入力の積を何ビットで表すかを示す。 | 積の丸めやオーバーフローがどこで生じるか分からない。 |
| 累積形式 | 長い内積の部分和を何ビットで保持するかを示す。 | 加算誤差と数値範囲を評価できない。 |
| 再量子化 | 累積結果を次層の活性値形式へどの尺度で変換するかを示す。 | 層境界で追加される丸め誤差を確認できない。 |
| KV キャッシュ形式 | キーと値を何ビットで保存し、どの単位で尺度を共有するかを示す。 | 長文脈推論のメモリ量と注意計算の誤差を判断できない。 |
重みだけを 4 ビットへ変換する方式は、重み専用量子化(weight-only quantization)と呼ばれる。重みと活性値をともに量子化する方式では、W4A8 や W8A8 のように、それぞれのビット数を分けて表すことがある。しかし、この表記だけでも、累積形式、尺度の粒度、KV キャッシュ、外れ値処理までは確定しない。
15.3 重みは事前に観測できるが、誤差が全入力へ再利用される
学習後の推論では、重み行列は固定されている。量子化前に全要素を調査できるため、最小値、最大値、分位点、チャネルごとの分布、外れ値の位置を使って尺度やコードブックを決められる。
重み行列 \(W\) を量子化し、量子化後の行列を \(\tilde{W}=W+E_W\) とする。入力 \(x\) に対する出力誤差は次の値になる。
\tilde{W}x-Wx
=
E_Wx
\]
重み誤差 \(E_W\) はモデルに固定され、異なる入力が与えられるたびに再利用される。特定の重み方向に生じた誤差は、その方向を利用するすべての入力へ継続的に作用する。
重みの要素平均二乗誤差が小さくても、入力が頻繁に通る方向へ誤差が集中すれば、層出力の誤差は大きくなる。重み量子化では、重み値そのものの分布だけでなく、入力活性値との積によって重要度が決まる。
| 重みの性質 | 量子化上の利点 | 残る問題 |
|---|---|---|
| 推論時に固定 | 量子化処理を推論前に一度だけ実行できる。 | 一度生じた誤差がすべての推論で再利用される。 |
| 全要素を観測可能 | チャネルやグループごとに尺度を最適化できる。 | 観測した重み分布だけでは入力依存の重要度を評価できない。 |
| モデル容量の大部分を占める | 低ビット化によって保存量とメモリ帯域を直接削減できる。 | 復号や特殊な演算カーネルが必要なら、速度改善が容量削減ほど大きくならない。 |
重みだけを低ビット化し、計算時には高精度活性値と組み合わせる構成では、モデルの読み出し量を減らしやすい。一方、量子化コードを演算器が直接処理できず、行列積の前に FP16 などへ展開する場合には、中間的な復号処理と高精度演算が残る。
15.4 活性値は入力依存であり、範囲を事前に固定しにくい
活性値は、入力データ、トークン位置、層、バッチごとに変化する。学習済み重みのように、運用時に現れる全活性値を量子化前に列挙することはできない。
事前に代表的な入力をモデルへ通し、各層の活性値分布を観測する処理をキャリブレーションと呼ぶ。キャリブレーションでは、最小値と最大値、分位点、平均、分散、ヒストグラムなどから量子化範囲を推定する。
キャリブレーションで決めた範囲を \([a,b]\) とし、運用時の活性値 \(x\) がこの範囲を超えると、端へクリップされる。
x>b
\quad\Longrightarrow\quad
Q(x)=Q(b)
\]
キャリブレーション用データに存在しなかった外れ値が運用時に現れると、過負荷誤差が生じる。範囲を広げれば外れ値を収められるが、同じビット数では刻み幅が広がり、通常値の粒状誤差が増える。
| 活性値の特徴 | 量子化上の問題 | 必要な対処 |
|---|---|---|
| 入力依存 | キャリブレーション時と運用時で分布が異なる場合がある。 | 実際の利用条件を代表する入力で範囲を推定する必要がある。 |
| 層ごとに尺度が異なる | 一つの共通尺度では、一部の層が粗くなったり範囲外になったりする。 | 層、チャネル、トークンなどの単位で尺度を分ける必要がある。 |
| 外れ値を含む | 少数の大きな値が表現範囲を広げ、大多数の値の解像度を下げる。 | 分位点による範囲選択、分解、変換、混合精度などを検討する必要がある。 |
| 符号や形が演算ごとに変わる | 0 以上に偏る層と正負対称の層で適切なゼロ点が異なる。 | 対象分布に応じて対称量子化と非対称量子化を選ぶ必要がある。 |
活性値量子化は、重み量子化より実行時の状態へ依存する。入力ごとに尺度を計算する動的量子化を使えば分布変化へ追従しやすいが、最小値や最大値を求める追加処理が必要になる。固定尺度を使えば演算経路は単純になるが、未知の入力分布に対する余裕が必要になる。
15.5 勾配では微小値の消失と不偏性が問題になる
勾配は、学習中に重みを更新する方向と大きさを表す。学習が進むにつれて分布が変化し、正負の値、微小値、まれな大きな値を同時に含む場合がある。
重み更新を次のように書く。
w_{t+1}
=
w_t-\eta_t g_t
\]
\(g_t\) は時刻 \(t\) の勾配、\(\eta_t\) は学習率である。更新量 \(\eta_t g_t\) が重み表現の刻み幅より小さい場合、最近傍丸めによって更新が 0 へ消える可能性がある。
Q(w_t-\eta_t g_t)
=
Q(w_t)
\]
この状態では、数学上は非ゼロの勾配が存在しても、保存された重みは変化しない。小さな勾配が繰り返し同じ方向へ作用しても、各回で独立に消されれば長期的な更新が反映されない。
確率的丸めを使えば、更新量に応じた確率で隣接する表現値へ移し、期待値として更新を保存できる。ただし、更新結果の分散は増える。勾配量子化では、一回の再構成誤差だけでなく、不偏性、分散、時間相関、学習収束への影響を評価する必要がある。
15.6 オプティマイザー状態では誤差が長期間蓄積する
Adam などのオプティマイザーは、現在の勾配だけでなく、過去の勾配から計算した状態を保持する。一次モーメントを \(m_t\)、二次モーメントを \(v_t\) とすると、概念的には次のように更新される。
m_t
=
\beta_1m_{t-1}
+
(1-\beta_1)g_t
\]
v_t
=
\beta_2v_{t-1}
+
(1-\beta_2)g_t^2
\]
これらの状態は、以前の値を次の時刻へ引き継ぐ。量子化誤差が一度生じると、その誤差を含んだ状態が後続更新の基礎になる。
量子化後の一次モーメントを \(\tilde{m}_t=m_t+\varepsilon_t\) とする。誤差は次の更新へ \(\beta_1\varepsilon_t\) の形で伝わる。新しい量子化誤差も加わるため、誤差は反復的な状態方程式として蓄積する。
オプティマイザー状態を低精度化すると、学習時のメモリ量を大きく削減できる。一方、重み量子化のように一回の推論誤差だけを測っても、長期的な学習経路への影響は分からない。
| 対象 | 誤差が残る期間 | 必要な評価 |
|---|---|---|
| 推論時の活性値 | 通常は現在の順伝播またはキャッシュ利用期間に限られる。 | 層出力と最終モデル出力への影響を評価する。 |
| 重み | 再量子化またはモデル更新まで残り続ける。 | 入力分布全体に対する継続的な出力誤差を評価する。 |
| オプティマイザー状態 | 多数の学習ステップにわたって更新へ再利用される。 | 収束速度、最終損失、更新方向の偏りを評価する。 |
15.7 KV キャッシュは長い文脈ほど量子化効果と誤差が大きくなる
自己注意機構では、各トークンからキー \(K\) と値 \(V\) を生成する。自己回帰生成では、過去トークンの \(K\) と \(V\) を保存し、新しいトークンを生成するたびに再利用する。この保存領域が KV キャッシュである。
過去のキーを並べた行列を \(K\)、値を並べた行列を \(V\)、現在のクエリを \(q\) とすると、注意計算は概念的に次の形になる。
\operatorname{Attention}(q,K,V)
=
\operatorname{softmax}
\left(
\frac{qK^\mathsf{T}}{\sqrt{d}}
\right)
V
\]
KV キャッシュを量子化して \(\tilde{K}=K+E_K\)、\(\tilde{V}=V+E_V\) とすると、誤差は二つの経路から出力へ入る。キー誤差 \(E_K\) は softmax へ入る注意スコアを変え、値誤差 \(E_V\) は重み付け後の出力を直接変える。
キー誤差によって注意順位や確率分布が変わると、単純な線形誤差では説明できない。値誤差は、注意確率によって重み付けされるため、強く参照されるトークンの誤差ほど出力へ現れやすい。
| 量子化対象 | 直接変わるもの | 最終出力への経路 |
|---|---|---|
| キー | クエリとの内積による注意スコアが変わる。 | softmax の確率分布が変わり、参照するトークンの配分が変化する。 |
| 値 | 注意確率によって合成されるベクトルが変わる。 | 同じ注意確率でも、取得される内容が変化する。 |
KV キャッシュの容量は、概ねレイヤー数、KV ヘッド数、ヘッド次元、文脈長、1 要素当たりのビット数に比例する。文脈長が増えるほど、重みとは別に KV キャッシュが大きなメモリ領域を占める。
重みを 4 ビット化しても、KV キャッシュを高精度のまま保持すれば、長文脈推論ではキャッシュが主要なメモリ消費になる場合がある。「モデル容量」と「実行中の総メモリ量」は分けて評価しなければならない。
15.8 学習後量子化は完成済みモデルへ後から表現制約を加える
学習後量子化(post-training quantization、PTQ)は、通常の高精度学習を終えたモデルに対して、後から低精度表現を適用する方法である。
PTQ では、重み分布とキャリブレーション用入力から得た活性値分布を調べ、尺度、ゼロ点、クリッピング範囲、コードブックなどを決める。元の学習を最初からやり直さずに導入できることが主要な利点になる。
| 段階 | 処理 | 決定するもの |
|---|---|---|
| モデル解析 | 重みの分布、層構造、演算種別を調べる。 | 量子化対象と尺度の粒度を決める。 |
| キャリブレーション | 代表的な入力を使って活性値分布を観測する。 | 活性値の範囲、外れ値処理、ゼロ点を決める。 |
| 量子化 | 高精度値を低ビットコードへ変換する。 | 実際に使用する重みコードと尺度を作る。 |
| 評価 | 量子化後のモデルを実データで実行する。 | 最終タスク性能、速度、メモリ量を確認する。 |
PTQ は、量子化誤差を受けることを前提にモデルの重みを学習していない。高精度空間で得られた解を、後から有限個の代表値へ写す。ビット数が十分で誤差が小さい場合には性能を保ちやすいが、低ビット化が強い場合や外れ値が支配的な場合には、後処理だけでは性能を維持できないことがある。
15.9 キャリブレーションは活性値範囲を標本から推定する
PTQ におけるキャリブレーションは、単に最大値を記録する処理ではない。どの範囲を量子化対象として残し、どの外れ値をクリップするかを標本から決める過程である。
利用できる整数コード数を \(N\)、選択した活性値範囲を \([a,b]\) とすると、概ね刻み幅は次の値になる。
\Delta
\approx
\frac{b-a}{N-1}
\]
範囲を広げると \(\Delta\) が大きくなり、通常値の丸め誤差が増える。範囲を狭めると \(\Delta\) は小さくなるが、範囲外の入力がクリップされる。
| 範囲選択 | 粒状誤差 | 過負荷誤差 | 失敗しやすい条件 |
|---|---|---|---|
| 観測最大値まで含める | 外れ値によって刻み幅が広がる場合がある。 | キャリブレーション標本内のクリッピングは抑えられる。 | 少数の極端値が大多数の通常値の解像度を低下させる。 |
| 分位点で切る | 通常値へ細かな段階を割り当てやすい。 | 設定した分位点の外側はクリップされる。 | まれな大値がモデル出力に重要な場合に性能を損なう。 |
| 誤差尺度を最小化する | 指定した標本と損失に対する平均誤差を減らせる。 | 評価尺度に現れにくい外れ値を犠牲にする場合がある。 | キャリブレーション標本と運用分布が異なる場合に適合しない。 |
キャリブレーションデータは、量子化後に利用する実際の入力分布を代表する必要がある。標本が狭すぎれば未知の入力でクリッピングが増え、特定の入力に偏れば別の利用条件で尺度が不適切になる。
15.10 量子化対応学習は順伝播へ量子化誤差を組み込む
量子化対応学習(quantization-aware training、QAT)は、学習中から量子化の影響を模擬し、低精度化された状態でも目的関数を小さくする重みを探索する方法である。
学習中は、高精度の重み \(W\) を更新用に保持しながら、順伝播では量子化と逆量子化を模擬した値 \(\tilde{W}\) を使うことが多い。
\tilde{W}
=
D(E(W))
\]
\(E\) は整数コードへの量子化、\(D\) はコードから代表値への復号である。この組合せは偽量子化(fake quantization)と呼ばれる。計算上は浮動小数点値として保持していても、値を量子化格子上の代表値へ制限する。
活性値についても、順伝播中に次の処理を挿入できる。
\tilde{x}
=
D(E(x))
\]
モデルは、量子化された重みと活性値による出力を使って損失を計算する。学習が進むと、重みは量子化誤差が最終損失へ与える影響を補う方向へ調整される。
| 観点 | 学習後量子化 | 量子化対応学習 |
|---|---|---|
| 量子化を導入する時点 | 高精度学習の完了後に導入する。 | 学習または追加学習の順伝播中に導入する。 |
| 重みの調整 | 量子化誤差に合わせた重み更新を原則として行わない。 | 量子化誤差を含む損失に基づいて重みを更新する。 |
| 導入費用 | 大規模な再学習を必要としにくい。 | 学習データ、計算資源、学習手順が必要になる。 |
| 低ビットへの適応 | 強い量子化では性能を保ちにくい場合がある。 | モデル自身が量子化誤差を補償できる可能性がある。 |
QAT は、量子化前のモデルを正確に近似することだけを目的としない。量子化されたパラメーター集合の中で、最終タスク損失が小さい別の解を探索できる。高精度モデルの各重みへ最も近い代表値を選ぶ方式より、重み単体の数値誤差が大きくても、モデル全体の性能が高い配置を得る場合がある。
15.11 丸め関数の導関数は通常の逆伝播に使えない
最近傍丸めを含む量子化器は、セル内部では出力が一定である。入力がセル内で少し変化しても量子化出力は変化しないため、導関数はほとんどの点で 0 になる。
\frac{d}{dx}
\operatorname{round}(x)
=
0
\]
セル境界では出力が不連続に跳ぶため、通常の意味では微分できない。そのまま連鎖律へ入れると、量子化器より前にある重みへ勾配を伝えられない。
順伝播を次のように書く。
\tilde{x}
=
Q(x)
\]
L
=
L(\tilde{x})
\]
正確な導関数を使うと、セル内部では次の勾配が 0 になる。
\frac{\partial L}{\partial x}
=
\frac{\partial L}{\partial\tilde{x}}
\frac{\partial Q(x)}{\partial x}
=
0
\]
このままでは、量子化前の \(x\) を損失に応じて更新できない。
15.12 直通推定量は逆伝播時だけ別の導関数を使う
直通推定量(straight-through estimator、STE)は、順伝播では量子化器 \(Q\) を使用し、逆伝播では量子化器の正確な導関数を使わず、更新可能な近似導関数へ置き換える方法である。
最も単純な近似では、量子化器を逆伝播時だけ恒等写像として扱う。
\frac{\partial Q(x)}{\partial x}
\approx
1
\]
この場合、上流から来た勾配をそのまま量子化前の値へ渡す。
\frac{\partial L}{\partial x}
\approx
\frac{\partial L}{\partial\tilde{x}}
\]
表現範囲外では勾配を止め、範囲内だけ通す近似も使える。
\frac{\partial Q(x)}{\partial x}
\approx
\begin{cases}
1 & a\leq x\leq b\\
0 & x\lt a\ \text{または}\ x>b
\end{cases}
\]
| 経路 | 使用する処理 | 意味 |
|---|---|---|
| 順伝播 | 実際の丸め、クリッピング、代表値への写像を使う。 | 推論時に近い量子化誤差を損失へ反映する。 |
| 逆伝播 | 恒等写像や範囲付き恒等写像の近似導関数を使う。 | 離散的な量子化器を越えて高精度パラメーターへ勾配を伝える。 |
STE は、量子化器の正確な微分を求めたものではない。順伝播で評価した離散モデルと、勾配法による連続最適化を接続するための代理勾配である。
そのため、STE による更新方向が、真の離散最適化問題の最急降下方向である保証はない。近似導関数の選び方、クリッピング範囲、学習率によって、学習の安定性と最終解が変わる。
15.13 アフィン整数量子化では整数積和の後に尺度を戻す
重み \(w\) と活性値 \(x\) を、それぞれ尺度とゼロ点を使って整数コードへ変換する。
q_w
=
\operatorname{round}
\left(
\frac{w}{s_w}
\right)
+
z_w
\]
q_x
=
\operatorname{round}
\left(
\frac{x}{s_x}
\right)
+
z_x
\]
再構成値は次のようになる。
\hat{w}
=
s_w(q_w-z_w)
\]
\hat{x}
=
s_x(q_x-z_x)
\]
積を取ると、二つの尺度の積が現れる。
\hat{w}\hat{x}
=
s_ws_x
(q_w-z_w)
(q_x-z_x)
\]
内積では、整数部分を先に累積できる。
\hat{y}
=
s_ws_x
\sum_i
(q_{w,i}-z_w)
(q_{x,i}-z_x)
\]
整数積和の結果を次層の活性値尺度 \(s_y\) へ移す場合、概念的には次の再量子化を行う。
q_y
=
\operatorname{round}
\left(
\frac{s_ws_x}{s_y}
\sum_i
(q_{w,i}-z_w)
(q_{x,i}-z_x)
\right)
+
z_y
\]
尺度比 \(s_ws_x/s_y\) は、整数累積値を出力コードの尺度へ変換する。実装では、この倍率を整数乗算とビットシフトなどで近似し、浮動小数点演算を避けることがある。
Jacob らは、アフィン量子化、量子化対応学習、整数演算による推論を一つの構成として示した[20]。ここでは、低ビットの保存形式、整数積和、再スケーリング、出力再量子化が別の段階として扱われる。
15.14 低ビット入力でも積と累積には広い形式が必要になる
\(b_w\) ビットの重み整数と \(b_x\) ビットの活性値整数を掛けると、積は入力より広いビット数を必要とする。符号付き整数の詳細を省いた概略では、一つの積に必要な幅は \(b_w+b_x\) ビット程度になる。
b_{\mathrm{product}}
\approx
b_w+b_x
\]
さらに、長さ \(n\) の内積で \(n\) 個の積を加算する場合、最悪値を保持するには概ね \(\log_2 n\) ビット分の余裕が必要になる。
b_{\mathrm{acc}}
\approx
b_w+b_x+\left\lceil\log_2 n\right\rceil
\]
実際に必要な幅は、符号、ゼロ点、値域、飽和規則によって変わるが、入力と同じビット数で安全に累積できるとは限らない。
| 段階 | 低精度化の利点 | 狭すぎる場合の問題 |
|---|---|---|
| 重み保存 | モデル容量とメモリ読み出し量を削減できる。 | 代表値の粗さとクリッピングによる誤差が生じる。 |
| 活性値保存 | 中間メモリと通信量を削減できる。 | 入力依存の外れ値と層境界の再量子化誤差が生じる。 |
| 積 | 低精度乗算器を利用できる。 | 正確な積を保持できず、各項へ追加丸めが入る。 |
| 累積 | 狭い部分和なら演算器とレジスターを小さくできる。 | 長い内積でオーバーフローや小項の消失が生じる。 |
重みと活性値が 4 ビットでも、累積をより広い整数や浮動小数点形式で行う構成は多い。この場合、保存量と入力帯域は低ビット化されるが、計算経路のすべてが 4 ビットになっているわけではない。
15.15 尺度の粒度は付加情報と誤差の交換になる
量子化尺度をどの範囲で共有するかを粒度と呼ぶ。一つのテンソル全体で尺度を共有する方式、出力チャネルごとに尺度を持つ方式、一定数の値からなるグループごとに尺度を持つ方式などがある。
| 粒度 | 尺度の共有範囲 | 利点 | 費用 |
|---|---|---|---|
| テンソル単位 | テンソル全体で一つの尺度を共有する。 | 付加情報と演算処理が少ない。 | 一部の大きな値が全体の刻み幅を広げる場合がある。 |
| チャネル単位 | 出力チャネルなどの単位で尺度を分ける。 | チャネルごとの分布差へ適合できる。 | 尺度の保存量と再スケーリング処理が増える。 |
| グループ単位 | 一定数の連続要素ごとに尺度を持つ。 | テンソル単位より分布へ適合し、要素単位より付加情報を抑えられる。 | グループ境界と実際の分布構造が一致しない場合がある。 |
| 要素単位 | 各値に個別の尺度を持たせる。 | 個々の値へ高い自由度を与えられる。 | 尺度情報が元の値と同程度に大きくなり、量子化の利点を失う。 |
尺度を細かく分けるほど、各範囲の値に適した刻み幅を使える。一方、尺度そのものを保存し、演算時に読み出す費用が増える。量子化コードが 4 ビットでも、短いグループごとに高精度尺度を持てば、実効的な平均ビット数は 4 ビットを超える。
総保存量は、量子化コードと尺度などの付加情報を合わせて評価する必要がある。
S_{\mathrm{total}}
=
S_{\mathrm{codes}}
+
S_{\mathrm{scales}}
+
S_{\mathrm{zero\ points}}
+
S_{\mathrm{metadata}}
\]
15.16 静的量子化と動的量子化では尺度を決める時点が異なる
静的量子化では、キャリブレーションや学習によって尺度を事前に決め、推論中は原則として同じ尺度を使用する。動的量子化では、実行時の入力やブロックから尺度を計算する。
| 方式 | 尺度を決める時点 | 利点 | 制約 |
|---|---|---|---|
| 静的量子化 | 推論前のキャリブレーションまたは学習中に決める。 | 推論時の範囲計算を省き、固定された整数演算経路を作りやすい。 | 運用時の分布変化や未知の外れ値へ適応しにくい。 |
| 動的量子化 | 入力、トークン、ブロックなどを処理するときに決める。 | 現在の値域へ尺度を合わせ、クリッピングと未使用範囲を減らしやすい。 | 最大値の計算、尺度生成、再量子化の実行時費用が加わる。 |
重みは推論前に固定されているため、静的に量子化しやすい。活性値や KV キャッシュは入力依存であるため、動的な尺度が有利になる場合がある。ただし、尺度計算の費用が行列積の削減効果を相殺する場合もある。
15.17 混合精度は対象ごとの感度に応じてビット数を変える
すべての層、チャネル、対象が量子化誤差へ同じ感度を持つとは限らない。量子化によるモデル損失の増加が大きい部分へ高い精度を割り当て、影響の小さい部分を低ビット化する方法を混合精度量子化と呼ぶ。
層 \(\ell\) に割り当てるビット数を \(b_\ell\)、その量子化による損失増加を \(\Delta L_\ell(b_\ell)\)、保存費用を \(S_\ell(b_\ell)\) とする。概念的には、総保存量の制約下で損失増加を最小化する問題になる。
\min_{\{b_\ell\}}
\sum_\ell
\Delta L_\ell(b_\ell)
\]
\text{subject to}
\qquad
\sum_\ell
S_\ell(b_\ell)
\leq
S_{\max}
\]
感度は、重みの数値範囲だけでは決まらない。後続層による増幅、入力活性値の分布、残差接続、正規化、出力判断への距離などが影響する。
| 高精度を残す候補 | 理由 |
|---|---|
| 量子化で損失が急増する層 | 同じビット削減でも最終性能への影響が大きい。 |
| 外れ値が強いチャネル | 共通尺度では通常値の解像度低下または大きなクリッピングが生じる。 |
| 長い累積を持つ演算 | 入力誤差と加算誤差が多数の項にわたって蓄積する。 |
| モデル入出力に近い層 | 誤差を補償する後続層が少ない場合がある。 |
混合精度は、単に精度が必要そうな部分を高ビットへ戻す方法ではない。限られた総ビット数、メモリ帯域、演算器の対応形式の中で、どこへ表現能力を配分するかという最適化問題である。
15.18 モデルサイズの削減と実行速度の向上は同じではない
重みのビット数を減らせば、モデルファイルとメモリ上の重み容量は減る。しかし、実行速度が同じ割合で向上するとは限らない。
速度向上には、量子化形式を直接処理できる演算器とカーネル、効率的なメモリ配置、復号処理の削減が必要になる。低ビットコードを毎回高精度へ展開してから通常の行列積を実行する場合、メモリ帯域は減っても演算量は高精度のまま残る。
| 評価対象 | 主に決める要因 | 低ビット化だけでは確定しない理由 |
|---|---|---|
| モデルファイル容量 | 重みコードと尺度などの付加情報が決める。 | グループ尺度やコードブックの保存量が追加される。 |
| 実行時メモリ | 重み、活性値、KV キャッシュ、作業領域が決める。 | 重み以外が高精度のままなら総量が大きく残る。 |
| メモリ帯域 | 演算中に読み書きする実際の形式が決める。 | 復号後の高精度値を大量に読み書きする場合がある。 |
| 演算速度 | ハードウェア、カーネル、累積形式、並列性が決める。 | 低ビット演算器や最適化された命令経路がなければ高速化しない。 |
| 最終遅延 | 量子化、復号、行列積、メモリ移動、同期を合わせた時間が決める。 | 尺度計算や形式変換が追加の遅延を生む。 |
「4 ビット化によって 8 分の 1 になった」という説明が成立するのは、元の 32 ビット重みと量子化コード本体だけを比較した場合である。尺度、ゼロ点、コードブック、アラインメントを含めれば、実際の削減率は異なる。実行時には活性値と作業領域も含める必要がある。
15.19 量子化評価は数値誤差とタスク性能を分ける
ニューラルネットワークの量子化では、重みや活性値の平均二乗誤差が小さいことと、モデルの最終出力が保たれることは同じではない。
高精度モデルを \(f\)、量子化モデルを \(f_Q\) とすると、入力 \(x\) に対して直接評価すべき差は次の値になる。
f_Q(x)-f(x)
\]
分類では予測ラベルや損失、生成では出力分布や生成品質、回帰では最終数値誤差を確認する必要がある。量子化直後の重み差が小さくても、判断境界付近で出力順位が変われば最終結果は異なる。
| 評価段階 | 測定するもの | 確認できる失敗 |
|---|---|---|
| 値単位 | 重みや活性値の絶対誤差、相対誤差、クリッピング率を測る。 | 表現範囲や刻み幅が不適切な対象を特定できる。 |
| 演算単位 | 層出力、内積、注意スコアの差を測る。 | 誤差が増幅される層と方向を特定できる。 |
| モデル単位 | 最終損失、精度、生成結果などを測る。 | 数値誤差が実際の用途へ与える影響を確認できる。 |
| システム単位 | 容量、実行時メモリ、速度、消費電力を測る。 | 数値的には成功しても実装上の利益がない方式を除外できる。 |
キャリブレーション標本上の平均性能だけでなく、外れ値を含む入力、長文脈、異なるバッチサイズなど、実際の運用条件で評価する必要がある。量子化方式が入力分布へ強く適合しているほど、分布変化に対する性能低下も確認しなければならない。
15.20 ニューラルネットワークの量子化は複数の誤差経路を設計する
ニューラルネットワークで量子化される対象は、モデルの重みだけではない。活性値、勾配、オプティマイザー状態、KV キャッシュ、積、累積値、層出力がそれぞれ異なる誤差経路を持つ。
重みは事前に分布を観測できるが、固定された誤差が全入力へ作用する。活性値は入力ごとに変化し、キャリブレーションで観測しなかった外れ値が現れる。勾配とオプティマイザー状態では、微小な偏りが学習経路へ長期間蓄積する。KV キャッシュでは、過去に量子化した値が後続トークンの注意計算へ繰り返し使われる。
学習後量子化は、完成済みモデルを低精度表現へ写す。量子化対応学習は、順伝播で量子化誤差を模擬し、その誤差を含む状態でも損失を小さくする重みを探索する。直通推定量は、この離散的な順伝播と連続的な勾配最適化を接続する近似である。
整数推論では、低ビットコードだけでなく、尺度、ゼロ点、積の幅、累積精度、再量子化を含む計算経路を設計する必要がある。低ビットで保存した値を高精度で累積する構成もあり、モデル全体を一つのビット数だけで記述することはできない。
ニューラルネットワークの量子化は、単一の実数集合を小さな整数集合へ置き換える処理ではない。性質の異なる複数の数値系列に対して、どの区別を残し、どこで丸め、どの精度で演算し、どの誤差を学習または後続層に補償させるかを決める設計である。
16. LLM では重みの距離よりモデルの関数変化を抑える
16.1 重み誤差は入力を通して出力誤差になる
ニューラルネットワークの重みを量子化すると、量子化前後の重み行列には数値差が生じる。しかし、重み行列は単独で利用されるものではない。実際の影響は、量子化誤差が入力活性値へ作用し、層の出力をどの程度変えるかによって決まる。
重み行列を \(W\)、量子化後の行列を \(\hat{W}\) とし、量子化誤差行列を \(E\) とする。
\hat{W}=W-E
\]
入力ベクトルを \(x\) とすると、量子化前の出力は \(Wx\)、量子化後の出力は \(\hat{W}x\) である。両者の差は次のようになる。
Wx-\hat{W}x
=
Wx-(W-E)x
=
Ex
\]
重み行列の数値誤差が同じでも、入力 \(x\) の方向によって出力誤差 \(Ex\) は変わる。入力が誤差行列によって強く拡大される方向にあれば、出力は大きく変化する。入力が誤差の小さい方向や零空間にあれば、重み差が存在しても出力への影響は小さい。
| 重み誤差の状態 | 入力との関係 | 層出力への影響 |
|---|---|---|
| 数値誤差が小さい | 頻繁に現れる入力方向と強く重なる。 | 小さな重み差でも出力誤差が大きくなる場合がある。 |
| 数値誤差が大きい | 実際の活性値がほとんど通らない方向にある。 | 重み差が大きくても運用時の出力への影響は小さい場合がある。 |
| 誤差が零空間を作る | 入力が \(Ex=0\) を満たす。 | その入力に対して量子化前後の出力は一致する。 |
したがって、重み要素ごとの平均二乗誤差だけでは、LLM の量子化性能を十分に評価できない。必要なのは、実際に現れる活性値を通した層出力の変化と、その変化が後続層でどの程度増幅されるかの評価である。
16.2 複数の入力では活性値分布が重み誤差の重要度を決める
一つの入力ベクトルではなく、キャリブレーション用の複数入力をまとめて考える。各入力を列として並べた活性値行列を \(X\) とすると、量子化前後の層出力差は次のようになる。
WX-\hat{W}X
=
EX
\]
二乗誤差で層出力の変化を評価するなら、目的関数は次の形になる。
D_{\mathrm{layer}}
=
\|EX\|_F^2
\]
\(\|\cdot\|_F\) は、行列の全要素の二乗和を取る Frobenius ノルムである。式を展開すると、入力活性値の相関行列が現れる。
\|EX\|_F^2
=
\operatorname{tr}
\left(
E X X^\mathsf{T} E^\mathsf{T}
\right)
\]
\(XX^\mathsf{T}\) は、キャリブレーション入力が各方向をどの程度使用したかを表す。頻繁に大きな活性値が現れる方向の重み誤差は、目的関数へ強く反映される。ほとんど使われない方向の誤差は、同じ大きさでも影響が小さい。
| 評価尺度 | 数式 | 考慮する情報 | 限界 |
|---|---|---|---|
| 重み距離 | \(\|W-\hat{W}\|_F^2\) | 重み要素の数値差だけを評価する。 | どの入力方向が実際に使われるかを考慮しない。 |
| 層出力距離 | \(\|(W-\hat{W})X\|_F^2\) | キャリブレーション入力を通した出力変化を評価する。 | 観測した入力分布に依存し、未知入力での影響は保証しない。 |
| モデル損失 | \(L(f_{\hat{W}}(X))-L(f_W(X))\) | 後続層を含む最終的なタスク性能を評価する。 | 計算費用が大きく、局所的な量子化設計へ直接使いにくい。 |
LLM の量子化手法では、モデル全体の損失を毎回直接最小化する代わりに、キャリブレーション入力に対する層出力誤差を代理目的として使うことが多い。これは重み距離よりモデルの関数変化に近いが、モデル全体の最終出力を完全に表す尺度ではない。
16.3 局所的な層出力の保存とモデル全体の保存は同じではない
ある層の量子化前後の出力を近づけても、最終的なモデル出力が必ず保たれるとは限らない。層出力の小さな差が後続層によって増幅される場合があり、反対に後続処理によって相殺される場合もある。
量子化対象の層を \(g_W\)、後続のネットワークを \(h\) とすると、モデル全体は次のように書ける。
f_W(x)
=
h(g_W(x))
\]
重み量子化後のモデルは次の値になる。
f_{\hat{W}}(x)
=
h(g_{\hat{W}}(x))
\]
最終的に重要なのは、次の差である。
f_W(x)-f_{\hat{W}}(x)
\]
後続関数 \(h\) が局所的に微分可能なら、層出力の変化 \(\Delta g\) が最終出力へ与える一次近似は次の形になる。
f_{\hat{W}}(x)-f_W(x)
\approx
J_h(g_W(x))\Delta g
\]
\(J_h\) は後続ネットワークのヤコビ行列である。層出力誤差が同じでも、後続ネットワークが強く拡大する方向へ向いていれば、最終出力への影響は大きくなる。
層単位の再構成誤差は、計算可能な代理尺度として有効である。しかし、複数層を量子化したときの誤差相互作用、判断境界付近の変化、生成系列への累積影響は、モデル全体を実行して確認する必要がある。
16.4 外れ値は共通スケールの刻み幅を広げる
一様なアフィン量子化では、指定した範囲を有限個の整数コードへ等間隔に割り当てる。量子化範囲を \([-A,A]\)、利用する代表値数を \(N\) とすると、概略の刻み幅は次の値になる。
\Delta
\approx
\frac{2A}{N-1}
\]
大半の値が -1 から 1 に収まっていても、一部の値が 20 に達する場合、外れ値をクリップせずに表すには \(A\geq20\) とする必要がある。刻み幅は、通常値だけを対象にした場合より大幅に広がる。
符号付き 8 ビットで約 255 段階を使う場合、範囲を \([-1,1]\) とすれば刻み幅は概ね次の値になる。
\Delta_{\mathrm{narrow}}
\approx
\frac{2}{255}
\approx
0.00784
\]
範囲を \([-20,20]\) へ広げると、刻み幅は次の値になる。
\Delta_{\mathrm{wide}}
\approx
\frac{40}{255}
\approx
0.157
\]
この刻み幅では、-0.1 と 0.1 の間に使える段階数が少なくなり、通常値の細かな違いを保持しにくい。
| 範囲設計 | 外れ値 | 通常値 | 主な誤差 |
|---|---|---|---|
| 外れ値まで含める | クリッピングせず表現できる。 | 共通刻み幅が広がり、細かな差を失いやすい。 | 粒状誤差が増える。 |
| 通常値へ範囲を合わせる | 端の代表値へ固定される。 | 細かな刻み幅を利用できる。 | 外れ値の過負荷誤差が増える。 |
| 外れ値を別経路へ分離する | 高精度経路などで処理する。 | 低精度範囲を通常値へ合わせられる。 | 分離判定と複数演算経路の費用が加わる。 |
外れ値の問題は、その値自体の再構成誤差だけにない。一部の大きな値が共通スケールを支配し、同じグループに含まれる大多数の通常値の解像度を低下させることにある。
16.5 外れ値がどの軸に現れるかで対処方法が変わる
外れ値がテンソル内へ無作為に散らばる場合と、特定のチャネルや特徴次元へ集中する場合では、適切な量子化方法が異なる。
特定チャネルだけが大きな値を持つなら、テンソル全体で一つの尺度を共有する代わりに、チャネル単位の尺度を使うことで影響を局所化できる。短いグループごとに尺度を持つ方法でも、外れ値が支配する範囲を狭められる。
| 外れ値の配置 | 共通尺度への影響 | 考えられる対処 |
|---|---|---|
| 特定チャネルへ集中 | 一つのチャネルがテンソル全体の範囲を広げる。 | チャネル単位量子化、スケーリング、外れ値経路の分離を使う。 |
| 少数要素へ散在 | グループ内に一つあるだけでも刻み幅が広がる。 | グループを細かくする、外れ値だけを別形式で保持する。 |
| 入力ごとに位置が変化 | 静的な尺度では未知の外れ値へ対応しにくい。 | 動的尺度、変換、十分なキャリブレーションを検討する。 |
尺度の粒度を細かくすれば分布へ適合しやすいが、尺度の保存量と演算時の再スケーリングが増える。外れ値への対処も、精度、付加情報、実装複雑性の交換になる。
16.6 LLM.int8() は外れ値成分を高精度経路へ分離する
大規模 Transformer の活性値に、通常値から大きく離れた成分が存在する場合、すべてを同じ INT8 量子化器へ通すと、外れ値が尺度を支配する。通常値へ狭い刻み幅を割り当てると、外れ値はクリップされる。
LLM.int8() は、活性値の外れ値に関係する成分を分離し、通常成分を 8 ビット経路で計算しながら、外れ値成分には高精度な演算経路を使用する方法を示した[21]。
入力ベクトルと重み行列を通常部分と外れ値部分へ分けると、行列積は概念的に次の和として表せる。
Wx
=
W_{\mathrm{regular}}x_{\mathrm{regular}}
+
W_{\mathrm{outlier}}x_{\mathrm{outlier}}
\]
通常部分には低精度積和を使い、外れ値部分には高精度演算を使う。両方の結果を加算して元の行列積を近似する。
| 経路 | 対象 | 使用精度 | 目的 |
|---|---|---|---|
| 通常経路 | 大多数の通常範囲の成分 | INT8 などの低精度を使う。 | 主要な演算量を低精度化する。 |
| 外れ値経路 | 共通尺度を支配する大きな成分 | FP16 などの高精度を使う。 | 重要な外れ値をクリッピングせず保持する。 |
この方式では、全要素を同じ形式へ変換するという単純さを捨てる代わりに、大部分の演算を低精度化できる。外れ値成分が少数である限り、高精度経路の費用を限定できる。
重要なのは、外れ値を単に削除することではない。低精度量子化に適した通常成分と、低精度化による損失が大きい成分を異なる経路へ分けることである。
16.7 SmoothQuant は等価変換によって活性値の範囲を重み側へ移す
外れ値へ高精度経路を用意する代わりに、数学的に同じ線形変換を保ちながら、重みと活性値の数値分布を変える方法もある。
複数の入力活性値を行列 \(X\)、重み行列を \(W\) とすると、線形層の出力は次の値になる。
Y=XW
\]
正の対角成分を持つ可逆な対角行列を \(S\) とする。恒等行列 \(S^{-1}S\) を挿入すると、次の等価変形が得られる。
Y
=
XW
=
(XS^{-1})(SW)
\]
活性値側では各チャネルを \(S^{-1}\) で縮小し、重み側では対応するチャネルを \(S\) で拡大する。高精度演算であれば、二つの変換は打ち消し合い、層が表す関数は変わらない。
SmoothQuant は、この等価なチャネルスケーリングを利用し、量子化しにくい活性値の外れ値を重み側へ移す[22]。重みは推論前に固定され、チャネル単位などで量子化しやすいため、活性値より大きな範囲差を受け入れやすい場合がある。
| 対象 | スケーリング前 | スケーリング後 | 量子化上の効果 |
|---|---|---|---|
| 活性値 | 一部チャネルの外れ値が共通尺度を広げる。 | 大きなチャネルを縮小し、範囲差を緩和する。 | 静的 INT8 量子化へ適合しやすくなる。 |
| 重み | 元の重み分布を持つ。 | 活性値から移した尺度差を受け取る。 | 重み側の量子化誤差は増える可能性がある。 |
| 高精度な層出力 | \(XW\) になる。 | \((XS^{-1})(SW)\) になる。 | 丸め前の数学的な関数は変わらない。 |
スケーリングを強くしすぎると、活性値は量子化しやすくなる一方、重み側の範囲が広がり、重み量子化誤差が増える。どの程度の尺度を移すかは、重みと活性値の両方の量子化誤差を考慮して決める必要がある。
16.8 等価変換でも量子化後の関数は同じにならない
SmoothQuant の変換は、高精度演算では元の線形層と等価である。しかし、変換後の重みと活性値を別々に量子化すると、丸め誤差の入り方は変わる。
変換前の量子化を概念的に次のように書く。
Q_X(X)Q_W(W)
\]
変換後は次の形になる。
Q_X(XS^{-1})Q_W(SW)
\]
量子化器 \(Q_X\) と \(Q_W\) は非線形であるため、一般に両者の結果は一致しない。
Q_X(XS^{-1})Q_W(SW)
\neq
Q_X(X)Q_W(W)
\]
等価変換の目的は、量子化前の関数を変えることではなく、量子化誤差が小さくなる座標系へ値を移すことにある。関数を保存するスケーリング自由度を、有限精度表現へ適合させるために利用している。
16.9 GPTQ は層出力誤差の二次近似を使って重みを補正する
単純な重み量子化では、各重みを独立に最も近い代表値へ丸める。しかし、一つの重みを変更した影響は、同じ出力へ寄与する他の重みによって部分的に補償できる。
重み誤差をベクトル化して \(\delta w\) とし、層出力の再構成損失を二次形式で近似すると、概念的には次の形になる。
\Delta L
\approx
\frac{1}{2}
\delta w^\mathsf{T}
H
\delta w
\]
\(H\) は、キャリブレーション入力から得られる二次情報を表す行列である。単純な要素距離では各方向を同じ重みで扱うが、二次形式では入力によって重要な方向の誤差を強く評価する。
GPTQ は、重みを順番に量子化しながら、量子化済み重みで生じた出力変化を、未量子化の重みへ補正として移す方法を用いる[23]。
| 処理 | 単純丸め | GPTQ 型の補正 |
|---|---|---|
| 重みの選択 | 各要素を近い代表値へ独立に丸める。 | 選択した量子化値が層出力へ与える二次的な影響を評価する。 |
| 誤差の扱い | 丸め誤差をその要素だけに残す。 | 未処理の重みを調整し、出力誤差を補償する。 |
| 利用する情報 | 重み値と代表値の距離を使う。 | キャリブレーション活性値から得た方向別の感度を使う。 |
この方法が最小化するのは、通常、キャリブレーション入力に対する層単位の再構成誤差である。モデル全体の最終損失を直接二次近似しているわけではない。キャリブレーション入力が実運用の分布を十分に表していることが前提になる。
16.10 逐次量子化では誤差補償の順序が結果へ影響する
重みを一つずつ、または列やブロックごとに量子化する場合、前に量子化した部分の誤差が、後続部分の補正条件を変える。
最初に量子化した重みで大きな誤差を作ると、残りの重みがその誤差を補償するために大きく変化しなければならない。逆の順序で処理すれば、異なる量子化結果へ到達する可能性がある。
| 要因 | 逐次量子化への影響 |
|---|---|
| 処理順序 | 前段の量子化誤差が後段の補正対象を決める。 |
| ブロックサイズ | 大きなブロックでは広い相関を利用できるが、計算量と作業領域が増える。 |
| 二次情報の近似 | 近似が粗いと、感度の高い方向を正しく評価できない。 |
| 数値安定性 | 二次情報が悪条件の場合、補正計算自体が不安定になる可能性がある。 |
出力誤差を補償する量子化は、各重みを独立な数として扱わない。同じ層の中で、どの重み誤差を別の重み変更で代替できるかを利用する。
16.11 AWQ は活性値から重みの重要度を推定する
重みの絶対値が大きいことと、モデル出力への影響が大きいことは同じではない。小さな重みでも、大きな活性値と頻繁に掛けられるなら、量子化誤差が層出力へ強く現れる。
重み要素 \(w_{ij}\) の誤差を \(e_{ij}\)、対応する入力活性値を \(x_j\) とすると、出力成分への誤差寄与は概ね次の形になる。
\Delta y_i
=
\sum_j
e_{ij}x_j
\]
活性値 \(x_j\) が大きいチャネルでは、同じ重み誤差 \(e_{ij}\) でも出力への寄与が大きくなる。活性値統計は、どの重み方向を量子化から保護すべきかを示す指標になる。
AWQ は、キャリブレーション活性値を観測し、出力への影響が大きい重みを保護する方向でチャネルスケーリングを選ぶ[24]。
入力チャネルごとの正の尺度を対角行列 \(S\) として、線形層を次のように等価変形できる。
XW
=
(XS^{-1})(SW)
\]
重み側の特定チャネルを拡大してから量子化すると、そのチャネルの重み値は量子化格子上で相対的に細かく扱われる。対応する活性値側へ逆尺度を適用すれば、高精度演算での関数は維持される。
AWQ の中心は、すべての重みを同じ数値距離で評価せず、実際の活性値を通した重要度に応じて量子化誤差の配分を変えることにある。
16.12 GPTQ と AWQ は異なる代理尺度で関数変化を抑える
| 方式 | 主に利用する情報 | 量子化誤差への対処 | 直接最適化する対象 |
|---|---|---|---|
| 単純最近傍量子化 | 重み値と代表値の距離 | 各重みを独立に近い値へ丸める。 | 重み要素ごとの数値誤差を小さくする。 |
| GPTQ | キャリブレーション入力から得た二次情報 | 逐次量子化時に未処理重みへ誤差を補償する。 | 層出力の再構成誤差を小さくする。 |
| AWQ | 活性値の大きさやチャネル感度 | 重要な重みチャネルを保護するスケーリングを選ぶ。 | 活性値を通した出力変化を抑える。 |
GPTQ と AWQ は同じアルゴリズムではない。GPTQ は二次的な層再構成誤差と逐次補償を利用し、AWQ は活性値統計に基づく重要度とスケーリングを利用する。
共通するのは、重み行列の全要素を一律に扱わない点である。量子化誤差がモデルの計算へどのように現れるかを代理尺度で推定し、影響の大きい方向へ表現能力を多く配分する。
16.13 4 ビットでは尺度の粒度が重み誤差を大きく左右する
4 ビットコードでは、利用できる状態は最大 16 個しかない。一つの大きな重み行列へ共通尺度を使うと、異なる分布を持つチャネルや局所領域を同じ 16 段階で表さなければならない。
重みを短いグループへ分け、グループごとに尺度を持てば、各局所分布へ量子化範囲を合わせられる。グループを小さくするほど誤差を減らしやすいが、尺度情報の割合が増える。
重み数を \(M\)、グループサイズを \(G\)、重みコードを \(b_w\) ビット、尺度を \(b_s\) ビットで保存するとする。グループ数は概ね \(M/G\) であり、総ビット数は次の形になる。
B_{\mathrm{total}}
=
Mb_w
+
\frac{M}{G}b_s
\]
重み 1 個当たりの実効ビット数は次のようになる。
b_{\mathrm{effective}}
=
b_w
+
\frac{b_s}{G}
\]
| グループサイズ | 量子化誤差 | 尺度の付加情報 | 演算上の性質 |
|---|---|---|---|
| 大きい | 異なる局所分布が共通尺度を使うため増えやすい。 | 重み 1 個当たりの尺度費用は小さい。 | 尺度の読み出しと再スケーリングをまとめやすい。 |
| 小さい | 局所範囲へ尺度を合わせやすく、減少しやすい。 | 尺度が多数必要になり、実効ビット数が増える。 | 尺度切替とデータ配置が複雑になる。 |
「4 ビット重み」という表現は、通常、コード本体のビット数を示す。尺度、ゼロ点、コードブックを含めた実効保存量は、グループサイズと付加情報の形式によって変わる。
16.14 非一様コードブックは重み分布へ代表値を適合させる
重みが 0 の周辺へ集中し、外側ほど出現頻度が低い分布を持つ場合、16 個の代表値を等間隔へ置くと、低確率の外側領域にも同じ密度でコードを割り当てる。
非一様量子化では、頻繁に現れる 0 付近へ代表値を密に配置し、まれな外側領域では間隔を広げる。同じ 16 状態でも、入力分布で重み付けした平均誤差を減らせる。
正規化された重み \(w\) の確率密度を \(f(w)\)、代表値集合を \(C\) とすると、二乗量子化誤差は次の形になる。
D(C)
=
\int
\min_{c\in C}
(w-c)^2
f(w)\,dw
\]
代表値集合 \(C\) は、実数直線上の等間隔配置ではなく、分布 \(f(w)\) に対してこの期待歪みを小さくする位置へ置ける。
| コードブック | 代表値配置 | 適合しやすい分布 | 演算上の性質 |
|---|---|---|---|
| 一様コードブック | 隣接する代表値の間隔を一定にする。 | 使用範囲内で比較的一様な分布に適合しやすい。 | 整数尺度による演算へ写しやすい。 |
| 非一様コードブック | 確率密度や損失に応じて間隔を変える。 | 0 周辺へ集中する分布などに適合しやすい。 | コードから代表値への表参照や復号が必要になる。 |
非一様コードブックが有利になるのは、想定した重み分布と実際の正規化後分布が一致する場合である。チャネルごとの偏りや強い非対称性が残ると、分布へ適合したコードブックでも最適とは限らない。
16.15 QLoRA の NF4 は正規化された重み分布へ適合する
QLoRA は、量子化済みの基盤モデルを保持しながら、高精度な低ランク更新を学習する構成を示した[25]。基盤重みの 4 ビット表現には、正規分布に近い重みへ適合するよう設計された NF4 が用いられる。
概念的には、グループ内の重みを尺度 \(s\) で正規化し、正規化値を 16 個の非一様な代表値から選ぶ。
u
=
\frac{w}{s}
\]
q
=
E_{\mathrm{NF4}}(u)
\]
\hat{w}
=
sD_{\mathrm{NF4}}(q)
\]
\(E_{\mathrm{NF4}}\) は正規化値を 4 ビットコードへ写し、\(D_{\mathrm{NF4}}\) はコードに対応する代表値を返す。尺度 \(s\) を掛けることで、グループごとの元の大きさへ戻す。
この方式では、4 ビットコードだけでは重みを再構成できない。コードブックの定義とグループ尺度が必要になる。
| 構成要素 | 役割 |
|---|---|
| 4 ビットコード | 16 個の非一様な代表値から一つを指定する。 |
| NF4 コードブック | 各コードに対応する正規化代表値を定める。 |
| グループ尺度 | 正規化代表値を重みグループの大きさへ戻す。 |
NF4 の利点は、一般的な重みが正規化後に持つ分布へ、限られた 16 状態を適合させる点にある。すべての LLM 重みが厳密な正規分布に従うことを保証するものではなく、グループ化と正規化によって分布の差を抑えることが前提になる。
16.16 二重量子化は尺度情報も有限コードへ変換する
グループごとに量子化尺度を持つと、尺度自体の保存量が増える。グループサイズを小さくするほど尺度数は増え、4 ビット重みコードに対する付加情報の比率が大きくなる。
QLoRA では、量子化に使う尺度定数自体をさらに量子化する二重量子化が使われる[25]。
元の尺度を \(s_g\)、尺度用の量子化器を \(Q_s\) とすると、保存する尺度は次の値になる。
\hat{s}_g
=
Q_s(s_g)
\]
重み再構成には量子化された尺度 \(\hat{s}_g\) を使う。
\hat{w}
=
\hat{s}_gD_{\mathrm{NF4}}(q)
\]
このとき、重みコードの誤差に加えて、尺度量子化の誤差も重み全体へ作用する。
\hat{s}_g
=
s_g+\varepsilon_{s,g}
\]
\hat{w}
=
(s_g+\varepsilon_{s,g})
D_{\mathrm{NF4}}(q)
\]
| 階層 | 量子化対象 | 削減するもの | 追加される誤差 |
|---|---|---|---|
| 第 1 層 | 基盤モデルの重み | 重み本体の保存量を削減する。 | 重みを 4 ビット代表値へ写す誤差が生じる。 |
| 第 2 層 | 重み量子化に使う尺度 | グループごとの付加情報を削減する。 | 尺度誤差がグループ内の全重みへ共有される。 |
二重量子化は、表現を圧縮するために必要な付加情報も、さらに有限状態へ変換する階層的量子化である。尺度誤差はグループ全体へ共通して作用するため、独立した重み誤差とは異なる相関構造を持つ。
16.17 QLoRA は量子化済み基盤重みと高精度更新を分離する
QLoRA では、基盤モデルの量子化済み重みを通常の全面更新対象とせず、別に低ランクの更新行列を学習する。基盤重みを \(\hat{W}\)、学習する低ランク更新を \(BA\) とすると、実効的な重みは概念的に次の形になる。
W_{\mathrm{effective}}
=
\hat{W}
+
BA
\]
\(\hat{W}\) は量子化済みの基盤重み、\(A\) と \(B\) は比較的小さな高精度の学習パラメーターである。
| 要素 | 保持形式 | 役割 |
|---|---|---|
| 基盤重み | NF4 などの低ビット形式で保持する。 | モデルの大部分を占める固定パラメーターを小さく保存する。 |
| 低ランク更新 | 学習可能な高精度形式で保持する。 | 微調整タスクに必要な関数変化を表現する。 |
| 計算時の値 | 必要に応じて復号または高精度演算へ組み込む。 | 低ビット保存と勾配学習を接続する。 |
量子化済みの基盤重みを直接細かく更新する代わりに、高精度な補助パラメーターへ更新を分離する。これは、保存形式と学習更新形式を異なる数体系へ置く混合表現である。
基盤モデルを低ビットで保存できても、学習中の活性値、勾配、低ランク更新、オプティマイザー状態まで同じ 4 ビットになるわけではない。QLoRA の 4 ビットは、主として基盤モデル重みの保持形式を指す。
16.18 量子化方式ごとに低精度化する対象と目的が異なる
| 方式 | 主な対象 | 中心的な問題 | 主要な対処 |
|---|---|---|---|
| LLM.int8() | 重みと活性値による行列積 | 活性値外れ値が INT8 の共通尺度を支配する。 | 外れ値成分を高精度経路へ分離する。 |
| SmoothQuant | 重みと活性値 | 活性値のチャネル外れ値が静的量子化を難しくする。 | 等価スケーリングによって量子化負担を重み側へ移す。 |
| GPTQ | 学習後の重み | 独立丸めでは入力に対する層出力誤差を抑えにくい。 | 二次情報と逐次補正を使って層出力を保存する。 |
| AWQ | 学習後の重み | すべての重み誤差が出力へ同じ影響を持つわけではない。 | 活性値統計から重要な重み方向を推定して保護する。 |
| QLoRA | 基盤モデル重みと微調整パラメーター | 大規模モデルを低メモリで保持しながら更新したい。 | NF4、二重量子化、高精度な低ランク更新を組み合わせる。 |
これらはすべて同じ意味で「4 ビット化」や「8 ビット化」を行うわけではない。活性値まで低精度演算する方式、重みだけを圧縮する方式、高精度経路を部分的に残す方式、量子化済み重みを固定して別パラメーターを学習する方式がある。
16.19 キャリブレーション分布が変われば感度に基づく量子化も外れる
GPTQ、AWQ、SmoothQuant などは、キャリブレーション入力から得た活性値統計を利用する。観測した入力が運用時の入力を十分に代表しなければ、重要と判断した方向や外れ値の位置が実際とは異なる可能性がある。
キャリブレーション分布を \(P_{\mathrm{cal}}\)、実運用分布を \(P_{\mathrm{run}}\) とすると、量子化器は前者に対する期待誤差を小さくしていても、後者に対する誤差が小さいとは限らない。
\mathbb{E}_{X\sim P_{\mathrm{cal}}}
\left[
\|(W-\hat{W})X\|^2
\right]
\]
と、
\mathbb{E}_{X\sim P_{\mathrm{run}}}
\left[
\|(W-\hat{W})X\|^2
\right]
\]
は、入力分布が異なれば別の値になる。
| 分布変化 | 量子化器への影響 |
|---|---|
| 言語や文体の変化 | 利用される活性値方向と外れ値の頻度が変わる可能性がある。 |
| 文脈長の変化 | 注意機構と KV キャッシュで現れる分布が変化する可能性がある。 |
| タスクの変化 | 特定層やチャネルの重要度がキャリブレーション時と異なる場合がある。 |
| 入力形式の変化 | コード、数式、自然言語などで活性値統計が変わる場合がある。 |
キャリブレーション誤差の小ささだけでなく、複数の入力領域、長さ、タスクに対して量子化後の性能を確認する必要がある。入力感度を利用する方式ほど、その感度を推定した標本の代表性が重要になる。
16.20 関数変化は層出力と最終タスクの両方で評価する
LLM の量子化では、少なくとも三段階の評価を分ける必要がある。
| 評価段階 | 測定対象 | 分かること |
|---|---|---|
| 重み単位 | 重みの平均二乗誤差、最大誤差、クリッピング率を測る。 | コードブックと尺度が重み分布へ適合しているかを確認できる。 |
| 層単位 | キャリブレーション入力に対する層出力差を測る。 | 重み誤差が実際の活性値を通してどの程度現れるかを確認できる。 |
| モデル単位 | 損失、予測、生成品質、長文脈性能などを測る。 | 複数層の誤差伝播を含む最終的な関数変化を確認できる。 |
| システム単位 | モデル容量、実行時メモリ、速度、電力を測る。 | 数値的な精度と実装上の利益が両立しているかを確認できる。 |
層出力誤差が小さくても、生成系列の初期段階でトークン順位が変われば、後続の入力系列自体が変化する。自己回帰生成では、一度の離散的な選択差が、その後のすべての計算へ伝わる場合がある。
反対に、重みや中間活性値の数値差が大きくても、最終的な確率順位や生成結果が維持される場合がある。LLM の量子化評価では、数値距離と関数出力の差を同一視しないことが必要になる。
16.21 LLM 量子化は誤差を重要度の低い場所へ移す設計である
LLM の重み量子化で重要なのは、すべての重みを同じ精度で元の値へ近づけることではない。実際の活性値、後続計算、外れ値、チャネル構造を考慮し、モデル出力へ強く影響する方向の誤差を抑えることである。
LLM.int8() は、外れ値を通常成分から分離し、低精度化による損失が大きい部分へ高精度経路を残す。SmoothQuant は、数学的に等価なスケーリングを使い、活性値と重みの間で量子化しにくさを移動する。GPTQ は、層出力誤差の二次近似を利用し、ある重みの丸め誤差を別の重みで補償する。AWQ は、活性値から重みの重要度を推定し、重要な方向を保護する。
QLoRA は、正規化された重み分布へ適合する非一様な 4 ビットコードブック、尺度情報を圧縮する二重量子化、量子化済み基盤重みと高精度更新を分離する低ランク学習を組み合わせる。
これらの方式に共通するのは、量子化誤差を完全に消すことではない。有限のコード数と付加情報の中で、誤差をモデルの関数へ影響しにくい場所へ移し、影響の大きい値、チャネル、方向、演算だけを相対的に高い精度で保護することである。
したがって、LLM の量子化方式は、重みコードのビット数だけでは記述できない。代表値集合、尺度の粒度、外れ値処理、キャリブレーション分布、誤差補償、高精度経路、計算時の復号形式を含む設計として評価する必要がある。
17. 低ビット化が必ず高速化になるわけではない
17.1 ビット数が直接決めるのは重みコード本体の下限である
モデルのパラメータ数を \(P\)、重み 1 個当たりのコード長を \(b\) ビットとすると、重みコード本体の理論保存量は次の式で求められる。
S_{\mathrm{weights}}
=
\frac{Pb}{8}
\]
70 億個のパラメータを 4 ビットで保存する場合、理論値は次のようになる。
S_{\mathrm{weights}}
=
\frac{
7\times10^9\times4
}{8}
=
3.5\times10^9
\ \mathrm{byte}
\]
10 進表記では約 3.5 GB、2 進表記では約 3.26 GiB になる。これは、すべてのパラメータを隙間なく 4 ビットコードとして並べた場合の重み本体だけの値である。
実際のモデルファイルには、重みコード以外の情報も必要になる。
| 保存対象 | 内容 | 必要になる理由 |
|---|---|---|
| 量子化コード | 各重みに対応する 4 ビットなどの離散コードを保存する。 | 重みの代表値を指定する本体になる。 |
| スケール | グループごとの量子化範囲や復号倍率を保存する。 | 同じ整数コードを元の重み尺度へ戻すために必要になる。 |
| ゼロ点 | 整数コード上で実数の 0 に対応する位置を保存する。 | 非対称なアフィン量子化を復号するために必要になる。 |
| コードブック | 非一様量子化で各コードに対応する代表値を定義する。 | 4 ビットコードを実際の数値として解釈するために必要になる。 |
| テンソル情報 | 形状、データ型、格納位置、量子化方式を記録する。 | 推論エンジンがファイルを正しく読み取るために必要になる。 |
| 非量子化部分 | 埋め込み、出力層、正規化係数などを高精度で残す場合がある。 | 精度低下の大きい部分や未対応演算を保護するために必要になる。 |
| 語彙と設定 | トークナイザー、語彙表、モデル構造などを保存する。 | 入力文字列の変換とモデル実行に必要になる。 |
したがって、パラメータ数へ 4 ビットを掛けた値は、モデルファイル全体の容量ではない。モデルファイルが理論値より大きいことは、直ちに非効率を意味しない。量子化コードを復号し、モデル構造を再現するための情報が追加されている。
17.2 実行時メモリはモデルファイル容量より大きくなる
モデルをストレージへ保存できることと、推論中に必要なメモリへ収まることは別である。推論時には、重み以外にも活性値、作業用バッファー、KV キャッシュ、推論エンジンの管理領域が必要になる。
実行中に必要な総メモリは、概念的に次のように分けられる。
M_{\mathrm{total}}
=
M_{\mathrm{weights}}
+
M_{\mathrm{activations}}
+
M_{\mathrm{KV}}
+
M_{\mathrm{workspace}}
+
M_{\mathrm{runtime}}
+
M_{\mathrm{other}}
\]
| 領域 | 主な内容 | 増加要因 |
|---|---|---|
| 重み | 量子化コード、スケール、非量子化パラメータを保持する。 | パラメータ数、量子化方式、グループサイズによって増える。 |
| 活性値 | 各層の入力、出力、中間計算値を保持する。 | バッチサイズ、モデル幅、実行方式によって増える。 |
| KV キャッシュ | 過去トークンのキーと値を保存する。 | 文脈長、生成長、層数、KV ヘッド数に応じて増える。 |
| 作業領域 | 行列積、並べ替え、復号、注意計算の一時データを保持する。 | 使用する演算カーネルと入力形状によって変わる。 |
| ランタイム | 推論エンジン、モデル管理、演算グラフなどを保持する。 | 実装方式と有効化した機能によって変わる。 |
| 周辺処理 | OS、画面表示、検索処理、別モデル、通常アプリケーションが使用する。 | 推論と同時に動かす処理によって変わる。 |
重み本体がメモリへ収まっても、KV キャッシュや作業領域を確保できなければ、指定した文脈長や実行条件で推論できない。利用可能メモリを重み容量だけで使い切る構成では、モデルの読み込みには成功しても、最初の推論や長文生成でメモリ不足になる場合がある。
17.3 グループを小さくすると量子化誤差は減りやすい
複数の重みで一つのスケールを共有する場合、共有する重み集合をグループと呼ぶ。グループサイズを \(G\) とすると、重みを \(G\) 個ずつ区切り、各グループへ個別のスケールを割り当てる。
一つのグループ内の最大絶対値を \(A_g\)、符号付き量子化コードの最大絶対値を \(q_{\max}\) とすれば、対称量子化の尺度は概ね次の値になる。
s_g
=
\frac{A_g}{q_{\max}}
\]
グループが大きい場合、分布の異なる多数の重みが同じ \(A_g\) と \(s_g\) を共有する。一部の外れ値が尺度を広げると、通常値へ使える刻み幅も粗くなる。
グループを小さくすれば、各局所範囲へ尺度を合わせやすい。外れ値が影響する重み数も限定され、同じ 4 ビットコードでも再構成誤差を減らしやすくなる。
| グループサイズ | 分布への適合 | 量子化誤差 | 尺度数 |
|---|---|---|---|
| モデル全体 | 分布差をほとんど区別できない。 | 外れ値や層差によって大きくなりやすい。 | 最も少なくなる。 |
| テンソル単位 | 層ごとの分布差へ適合できる。 | テンソル内部のチャネル差は残る。 | テンソル数に応じて増える。 |
| 128 個単位 | 局所的な値域へ尺度を合わせやすい。 | 大きなグループより小さくなりやすい。 | 128 重みごとに必要になる。 |
| 64 個単位 | さらに局所的な分布へ適合できる。 | 128 個単位より減る可能性がある。 | 128 個単位の約 2 倍になる。 |
グループサイズを小さくすることは、コード本体の 4 ビットを変更せず、尺度情報を増やして局所的な表現能力を高める操作である。
17.4 小さなグループは実効ビット数を増やす
重み数を \(P\)、各重みの量子化コードを \(b_w\) ビット、グループサイズを \(G\)、各グループのスケールを \(b_s\) ビットで保存するとする。ゼロ点やその他の情報を省けば、総保存量は次のようになる。
B_{\mathrm{total}}
=
Pb_w
+
\frac{P}{G}b_s
\]
重み 1 個当たりへ換算した実効ビット数は、次の値になる。
b_{\mathrm{effective}}
=
b_w
+
\frac{b_s}{G}
\]
4 ビット重みと 16 ビットスケールを使う場合、グループサイズ 128 では次の値になる。
b_{\mathrm{effective}}
=
4
+
\frac{16}{128}
=
4.125
\]
グループサイズ 64 では、次の値になる。
b_{\mathrm{effective}}
=
4
+
\frac{16}{64}
=
4.25
\]
ゼロ点、アラインメント、テンソル情報も含めれば、実効ビット数はさらに増える。
| グループサイズ | 重みコード | 16 ビットスケールの負担 | 尺度だけを含む実効ビット数 |
|---|---|---|---|
| 256 | 4 ビット | 重み 1 個当たり 0.0625 ビットになる。 | 4.0625 ビットになる。 |
| 128 | 4 ビット | 重み 1 個当たり 0.125 ビットになる。 | 4.125 ビットになる。 |
| 64 | 4 ビット | 重み 1 個当たり 0.25 ビットになる。 | 4.25 ビットになる。 |
| 32 | 4 ビット | 重み 1 個当たり 0.5 ビットになる。 | 4.5 ビットになる。 |
小さなグループは量子化誤差を減らす代わりに、尺度の保存量と読み出し回数を増やす。モデル名に同じ 4 ビットと記載されていても、グループサイズが異なれば容量、精度、復号費用は異なる。
17.5 ビットの詰め込み方によって実際の保存量が変わる
4 ビットコードは、理論上は 1 バイトへ 2 個格納できる。しかし、実際のテンソル配置では、行やブロックを演算器が扱いやすい境界へそろえるため、パディングが入る場合がある。
テンソル内の重み数が格納単位の倍数でなければ、末尾に未使用領域が生じる。尺度と量子化コードを別領域へ置く場合には、各領域の境界をそろえるための余白も必要になる。
| 要因 | 理論値との差 | 導入する理由 |
|---|---|---|
| ビットパッキング | 複数の低ビットコードを整数ワードへ詰める。 | メモリと演算器がビット単位ではなくバイトやワード単位で動くためである。 |
| パディング | テンソル末尾や行末に未使用領域が生じる。 | ベクトル命令や行列積カーネルの処理単位へそろえるためである。 |
| アラインメント | 次のデータ領域まで空きが入る。 | 効率的なメモリアクセスや直接読み出しを可能にするためである。 |
| ブロックヘッダー | 各ブロックへ尺度や型情報が追加される。 | ブロックを独立に復号し、演算できるようにするためである。 |
理論ビット数へ近い形式が、必ずしも最も高速とは限らない。数ビットの余白を許してでも、演算器が連続して読み取れる配置へ変えた方が、実行時間を短縮できる場合がある。
17.6 低ビットコードは演算前に展開される場合がある
4 ビット重みをメモリから読み出しても、演算器が 4 ビット値を直接積和へ入力できるとは限らない。その場合、格納ワードから各コードを取り出し、符号を解釈し、尺度を掛け、8 ビットまたは 16 ビットの値へ変換してから演算する。
低ビット重みから演算値を作る処理は、概念的に次の段階を含む。
| 段階 | 処理 | 追加費用 |
|---|---|---|
| 読み出し | 複数の 4 ビットコードを含むバイトやワードをメモリから取得する。 | 低ビット化によって転送量を削減できる。 |
| ビット抽出 | シフトとマスクで各コードを取り出す。 | 整数命令と依存関係が追加される。 |
| 符号変換 | 4 ビットコードを演算器が扱う符号付き整数などへ広げる。 | 展開処理とレジスターを消費する。 |
| 復号 | スケールやコードブックを適用して演算値を作る。 | 乗算、表参照、尺度読み出しが必要になる。 |
| 積和 | 展開済みの重みと活性値を掛けて累積する。 | 演算器が直接対応する精度で実行される。 |
低ビット演算に最適化されたカーネルでは、復号と積和を融合し、重みを完全な高精度配列へ展開せずに処理する。それでも、ビット抽出や尺度適用そのものが消えるわけではない。
復号した重みを別の大きなバッファーへ書き出してから行列積を実行すると、低ビット化で削減したメモリ転送を再び増やす可能性がある。低ビット形式の利点を得るには、読み出したコードをその場で演算へ利用する実装が必要になる。
17.7 低ビット演算器があっても累積は高精度になる
入力と重みが低ビットであっても、内積の部分和は通常、より広い形式で保持する。低ビット値どうしの積を多数加えると、入力形式の範囲を容易に超えるためである。
重みコードを \(q_{w,i}\)、活性値コードを \(q_{x,i}\) とすると、整数内積は次の形になる。
a
=
\sum_{i=1}^{n}
q_{w,i}q_{x,i}
\]
各積が小さくても、項数 \(n\) が増えるほど部分和の最大絶対値は大きくなる。したがって、4 ビットの入力を使っていても、累積値まで 4 ビットにはできない。
| 段階 | 利用し得る精度 | 役割 |
|---|---|---|
| 重み保存 | 4 ビットなどを使用する。 | モデル容量と重み読み出し量を削減する。 |
| 活性値 | 8 ビット、16 ビットなどを使用する。 | 入力ごとの数値範囲と演算精度を保持する。 |
| 乗算 | 入力精度の組合せに対応する形式を使用する。 | 重みと活性値の積を計算する。 |
| 累積 | 32 ビット整数や高精度浮動小数点などを使用する。 | 長い内積で範囲と低位桁を保持する。 |
| 出力 | 次層に合わせて再量子化する。 | 高精度累積値を次の表現形式へ戻す。 |
「4 ビットで計算する」という説明でも、4 ビットなのは重みの保存形式だけであり、乗算入力、累積、出力が異なる精度である場合がある。速度を決めるのは、この計算経路全体をハードウェアがどの程度効率的に処理できるかである。
17.8 メモリ帯域律速なら低ビット化の利益が大きい
処理時間は、必要な演算を実行する時間と、必要なデータをメモリから移動する時間の大きい方に支配される。演算量を \(F\)、転送データ量を \(B\) とすると、演算密度は次の値で表せる。
I
=
\frac{F}{B}
\]
演算密度が低い処理では、少ない演算のために大量のデータを読み出す。この場合、演算器よりメモリ帯域が律速になりやすい。
重みを 16 ビットから 4 ビットへ圧縮すると、重み本体の読み出し量は理論上 4 分の 1 になる。重み読み出しが主要な律速であれば、低ビット化によって実行時間を大きく短縮できる可能性がある。
| 律速要因 | 低ビット化の直接効果 | 期待できる結果 |
|---|---|---|
| 重み読み出し | 同じ帯域で多くの重みを供給できる。 | 復号費用が小さければ速度向上が大きくなりやすい。 |
| 演算器 | 対応する低ビット積和器があれば、演算数当たりの処理量を増やせる。 | ハードウェアとカーネルが対応している場合に限り速度向上が得られる。 |
| 復号処理 | ビット抽出、尺度適用、形式変換が追加される。 | 転送削減より復号費用が大きいと速度が向上しない。 |
| KV キャッシュ | 重みだけの量子化では直接減らない。 | 長文脈では別のメモリ帯域が律速として残る。 |
低ビット重みが特に有利になりやすいのは、同じ重みを一度だけ、または少ない回数だけ使い、メモリからの供給が演算より遅い場合である。
17.9 演算律速では低ビット対応命令が必要になる
処理が演算器の能力に制約されている場合、重みの転送量だけを減らしても実行時間はほとんど変わらない。低ビット化で速度を上げるには、低ビット値を直接入力できる積和命令と、その命令を利用するカーネルが必要になる。
4 ビット重みを FP16 へ展開し、通常の FP16 行列積を実行する場合、行列積部分の演算量は FP16 のままである。低ビット化による利益は、主に重み読み出し量の削減へ限定される。
一方、4 ビット整数と 8 ビット活性値を直接処理する命令があり、十分な並列度で利用できる場合には、演算器側でも利益を得られる。
| 演算経路 | メモリ転送 | 実際の積和 | 速度上の特徴 |
|---|---|---|---|
| 4 ビット保存、FP16 展開 | 重み読み出し量は減る。 | FP16 で実行する。 | メモリ帯域律速では有利だが、演算律速では効果が小さい。 |
| 4 ビットを直接積和 | 重み読み出し量が減る。 | 低ビット命令で実行する。 | 対応ハードウェアでは転送と演算の両方を削減できる。 |
| 4 ビットを事前展開 | 保存時は小さいが、展開後の読み出し量は増える。 | 高精度形式で実行する。 | 展開バッファーが低ビット化の帯域利益を失わせる場合がある。 |
量子化形式の理論上のビット数と、演算装置が実際に実行するデータ型を区別する必要がある。
17.10 バッチサイズによって同じ量子化方式の効果が変わる
自己回帰生成では、一度に少数のトークンを処理する場合、各層の重みを読み出す量に対して演算量が小さくなりやすい。重み読み出しが支配的になり、低ビット化の効果が現れやすい。
バッチサイズを増やすと、読み出した同じ重みを複数入力へ再利用できる。一度の重み転送に対する演算量が増え、演算密度も高くなる。
その結果、処理はメモリ帯域律速から演算律速へ近づく場合がある。
| 実行条件 | 重みの再利用 | 主な律速 | 低ビット重みの効果 |
|---|---|---|---|
| 小さなバッチ | 読み出した重みを少数入力へ使用する。 | 重み転送が支配しやすい。 | メモリ帯域削減の効果が出やすい。 |
| 大きなバッチ | 同じ重みを多数入力へ再利用する。 | 行列積の演算能力が支配しやすい。 | 低ビット積和へ直接対応しなければ効果が小さくなる。 |
一つの量子化モデルについて測定した速度を、異なるバッチサイズや生成条件へそのまま適用することはできない。低ビット化の速度効果は、モデルだけでなく実行形状によって変わる。
17.11 入力処理と逐次生成では処理形態が異なる
LLM 推論は、入力済みの複数トークンをまとめて処理する段階と、新しいトークンを一つずつ生成する段階に分けられる。
入力処理では、複数トークンをまとめた行列演算が多く、重みを一度読み出して多数のトークンへ利用できる。逐次生成では、新しいトークンごとにモデル全体を通過し、重みの再利用度が低くなりやすい。
| 処理段階 | 主な演算形状 | 重み量子化の影響 | 別の律速要因 |
|---|---|---|---|
| 入力処理 | 複数トークンをまとめた比較的大きな行列積になる。 | 重みを複数トークンへ再利用できる。 | 演算器の処理能力が律速になりやすい。 |
| 逐次生成 | 新しいトークンごとに小さな入力を処理する。 | 重み読み出し量の削減が速度へ反映されやすい。 | KV キャッシュ読み出しと小規模カーネルの起動費用が残る。 |
同じモデルでも、入力処理の速度と 1 トークンずつ生成する速度は、量子化によって異なる割合で変化する。評価では両者を分ける必要がある。
17.12 小さな行列では量子化処理の固定費用が支配する
低ビット形式の復号には、尺度読み出し、ビット抽出、形式変換、カーネル起動などの固定費用がある。大きな行列積では、この費用を多数の積和へ分散できる。
小さなテンソルや短い行列積では、実際の積和が少ないため、量子化処理の固定費用が相対的に大きくなる。
| 演算規模 | 復号費用の割合 | 低ビット化の結果 |
|---|---|---|
| 大規模行列積 | 多数の積和へ固定費用を分散できる。 | 転送削減と低ビット演算の利益を得やすい。 |
| 小規模行列積 | ビット抽出と尺度処理の割合が大きくなる。 | 高精度形式より遅くなる場合がある。 |
| 要素演算 | 量子化形式へ対応する専用処理が少ない場合がある。 | 変換を挟むため、低ビット化の利益が限定される。 |
モデル全体のパラメータが多くても、すべての層や演算が低ビット化によって同じ割合で高速になるわけではない。小さな層や特殊演算が推論時間の一定割合を占めると、全体速度の改善率は重み容量の削減率より小さくなる。
17.13 量子化されない演算が全体速度の上限を決める
推論処理の一部だけを低ビット化した場合、残りの処理時間はそのまま残る。全実行時間に占める低ビット化対象の割合を \(p\)、対象部分の高速化倍率を \(s\) とすると、全体の高速化倍率は概念的に次の形で表せる。
S_{\mathrm{total}}
=
\frac{1}{
(1-p)+\dfrac{p}{s}
}
\]
たとえば、実行時間の 80% を占める行列積だけを 2 倍に高速化しても、全体の高速化倍率は次の値になる。
S_{\mathrm{total}}
=
\frac{1}{
0.2+\dfrac{0.8}{2}
}
=
\frac{1}{0.6}
\approx
1.67
\]
行列積が 2 倍になっても、全体は約 1.67 倍にしかならない。正規化、softmax、サンプリング、トークン処理、メモリ管理などの時間が残るためである。
| 低ビット化されにくい処理 | 残る理由 | 全体への影響 |
|---|---|---|
| 正規化 | 平均や分散を扱い、一定の数値精度を必要とする。 | 行列積が速くなるほど相対的な割合が増える。 |
| softmax | 指数関数、最大値、総和などを含む。 | 注意計算の非行列積部分として残る。 |
| トークン選択 | 確率分布の処理と分岐を含む。 | 逐次生成で毎回必要になる。 |
| 形式変換 | 低ビットコードと演算形式の間を接続する。 | 量子化によって新たに追加される場合がある。 |
低ビット化対象の処理が全体時間のどの割合を占めるかを確認しなければ、理論演算性能から推論全体の速度を予測できない。
17.14 KV キャッシュは重みと別のメモリ経路を持つ
自己回帰生成では、過去トークンのキーと値を KV キャッシュへ保存する。キャッシュ容量は文脈長に応じて増えるため、固定された重み容量とは異なる性質を持つ。
1 トークン当たりの KV キャッシュ要素数を、層数 \(L\)、KV ヘッド数 \(H_{\mathrm{KV}}\)、ヘッド次元 \(d_h\) を使って概略的に表すと、キーと値の二つがあるため次の値になる。
N_{\mathrm{KV/token}}
=
2LH_{\mathrm{KV}}d_h
\]
文脈長を \(T\)、1 要素当たりの保存量を \(b_{\mathrm{KV}}\) ビットとすると、キャッシュ本体は概ね次の規模になる。
M_{\mathrm{KV}}
=
\frac{
2TLH_{\mathrm{KV}}d_hb_{\mathrm{KV}}
}{8}
\]
重みを 4 ビットへ圧縮しても、KV キャッシュが FP16 のままなら、長い文脈ではキャッシュが実行時メモリの大きな割合を占める。
| 領域 | 増加の仕方 | 重み量子化による影響 |
|---|---|---|
| 重み | モデル読み込み時にほぼ固定される。 | 重みビット数を下げれば直接減少する。 |
| KV キャッシュ | 入力と生成トークン数に応じて増加する。 | 重みだけの量子化では減少しない。 |
| 活性値 | バッチサイズと演算形状に応じて変化する。 | 重みだけの量子化では高精度のまま残る場合がある。 |
長文脈推論のメモリと速度を評価する場合、重み形式だけでなく、KV キャッシュの形式と読み出し帯域も確認する必要がある。
17.15 ユニファイドメモリでは CPU、GPU、OS が同じ容量を共有する
CPU と GPU が同じ物理メモリを共有する構成では、モデル重みのために確保できる容量が、搭載メモリ全体と等しいわけではない。OS、画面描画、推論エンジン、通常のアプリケーションも同じ領域を使用する。
利用可能な実行余力は、概念的には次のように表せる。
M_{\mathrm{headroom}}
=
M_{\mathrm{physical}}
–
M_{\mathrm{OS}}
–
M_{\mathrm{applications}}
–
M_{\mathrm{model}}
–
M_{\mathrm{runtime}}
\]
この余力が小さい場合、KV キャッシュの増加や一時バッファーの確保によって、メモリ圧縮やストレージへの退避が発生する。モデルを読み込めても、推論速度が安定しない可能性がある。
既稿「MacBook Pro でローカル LLM を実用化する条件」では、4 ビット重みの理論容量だけでなく、量子化情報、作業領域、KV キャッシュ、推論エンジン、macOS、通常の作業アプリケーションが同じユニファイドメモリを使うことを整理した[26]。
| 状態 | モデル読み込み | 推論時の帰結 |
|---|---|---|
| 十分な余力がある | 重みと必要な作業領域を保持できる。 | 文脈長を伸ばしても一定範囲で安定して動作する。 |
| 重みだけが収まる | モデルファイルの読み込みには成功する。 | 推論開始後のバッファーや KV キャッシュで不足する場合がある。 |
| 日常作業との余力がない | 他のアプリケーションを閉じれば読み込める。 | 通常利用との同時実行でメモリ圧迫と速度低下が起こる。 |
モデルを一度読み込めたという事実は、実用的な文脈長、生成速度、他アプリケーションとの共存を保証しない。
17.16 メモリ圧縮やストレージ退避は容量不足を速度低下へ変える
物理メモリが不足すると、OS は使用頻度の低い領域を圧縮したり、ストレージへ退避したりする場合がある。これによって処理を直ちに停止せずに済むが、メモリアクセスの遅延は増える。
LLM 推論では重みと KV キャッシュへ継続的にアクセスするため、必要データが低速な領域へ移ると、トークン生成速度が大きく低下する可能性がある。
低ビット化によってモデルが形式上は動作可能になっても、常時メモリ圧迫が起きる構成では、安定したローカル推論環境とはいえない。容量の限界ではなく、十分な余力を持つ構成を考える必要がある。
17.17 RAG では生成モデル以外の処理も資源を使用する
ローカル RAG では、生成モデルだけでなく、文書の分割、埋め込み生成、ベクトル索引、検索、プロンプト構築を同じ環境で実行する。
既稿「MacBook Pro にローカル RAG を構築する」では、Q4_K_M の生成モデル、埋め込みモデル、ベクトル検索、文書索引を一つの構成で動かしている[27]。
| 構成要素 | 主な資源消費 | 生成モデル量子化との関係 |
|---|---|---|
| 生成モデル | 重み、KV キャッシュ、活性値、作業領域を使用する。 | 重み量子化によってモデル容量と帯域を削減できる。 |
| 埋め込みモデル | 別の重みと活性値を必要とする。 | 生成モデルを量子化しても、このモデルの容量は残る。 |
| ベクトル索引 | 埋め込みベクトルと索引構造を保持する。 | 生成モデルのビット幅とは独立して増加する。 |
| 検索処理 | 距離計算、候補保持、文書読み出しを行う。 | 生成モデル量子化によって検索時間は短縮されない。 |
| 取得文書 | プロンプト長と KV キャッシュを増やす。 | 検索結果が長いほど、量子化済みモデルでも推論資源が増える。 |
生成モデルを低ビット化しても、検索精度、埋め込み品質、索引更新、取得文書の選択は改善されない。取得文書を増やせば情報量は増えるが、入力トークン数と KV キャッシュも増える。
量子化はローカル RAG を成立させる条件の一つであるが、検索処理や文脈設計を代替するものではない。
17.18 小さなモデルが低ビットの大きなモデルより速い場合がある
同じメモリ容量へ収まる構成でも、低ビットの大規模モデルと、高い精度の小規模モデルでは、パラメータ数と演算量が異なる。
行列積の演算量は、重みのビット数だけでなく、モデル幅、層数、処理トークン数によって決まる。4 ビット化してモデル容量を半分以下へ減らしても、パラメータ数自体は減らない。
| 構成 | 重み容量 | 演算数 | 考えられる結果 |
|---|---|---|---|
| 大規模モデルを低ビット化 | 大きく削減できる。 | 元の大規模モデルに近い量が残る。 | 容量には収まるが、生成速度は小規模モデルより遅い場合がある。 |
| 小規模モデルを高精度で使用 | パラメータ数が少ないため抑えられる。 | 層数と行列サイズが小さい。 | 精度が高くても、大規模量子化モデルより高速な場合がある。 |
低ビット化はパラメータ数を減らさない。モデル容量の制約を緩めるが、モデル構造に由来する演算量を自動的には削減しない。
17.19 速度だけでなく初回遅延と継続速度を分ける
ローカル推論の体感速度には、モデル読み込み、入力処理、最初のトークンが出るまでの時間、以後の生成速度が含まれる。
| 指標 | 主に含む処理 | 量子化の影響 |
|---|---|---|
| モデル読み込み時間 | ストレージからの読み出し、メモリ配置、初期化を含む。 | モデルファイルが小さくなれば短縮しやすい。 |
| 入力処理時間 | 既存トークン全体の順伝播と KV キャッシュ構築を含む。 | 大きな行列積では演算対応形式が重要になる。 |
| 最初のトークンまでの時間 | 読み込み、入力処理、最初の出力計算を含む。 | 容量削減だけでなく入力長と初期化費用に左右される。 |
| 継続生成速度 | 1 トークンごとのモデル実行と KV キャッシュ参照を含む。 | 重み帯域削減の効果が現れやすいが、文脈長の影響も受ける。 |
一つのトークン毎秒という値だけでは、入力処理が遅いのか、生成が遅いのかを判断できない。量子化方式を比較する場合は、同じモデル、同じ文脈長、同じバッチ条件で各段階を分けて測る必要がある。
17.20 実装が異なれば同じ量子化形式でも速度が変わる
同じ重みコードとグループサイズを使用しても、推論エンジンや演算カーネルが異なれば速度は変わる。低ビット形式をどの順序で格納し、どの演算単位で読み出し、復号と積和をどの程度融合するかが異なるためである。
| 実装要因 | 速度への影響 |
|---|---|
| データ配置 | 演算器が必要な重みを連続して読み出せるかを決める。 |
| カーネル融合 | 復号結果を中間メモリへ書かず、積和へ直接利用できるかを決める。 |
| ベクトル化 | 一命令で処理できる低ビットコード数を決める。 |
| 並列分割 | 複数の演算器へ負荷を均等に配分できるかを決める。 |
| 形状別最適化 | 入力処理と逐次生成の異なる行列形状へ適合できるかを決める。 |
量子化形式の名称だけから、特定環境での速度を推測することはできない。その形式に対応した実装が利用できるかを確認する必要がある。
17.21 低ビット化では測定対象を分ける必要がある
低ビット化の効果を評価するときは、容量、メモリ、帯域、速度、最終出力を別々に測る必要がある。
| 評価対象 | 測定する量 | 確認できること |
|---|---|---|
| 重み本体 | コードと尺度を含む実効ビット数を測る。 | 量子化形式そのものの保存効率を確認できる。 |
| モデルファイル | 語彙、設定、非量子化部分を含むファイル容量を測る。 | 配布とストレージに必要な実容量を確認できる。 |
| 実行時メモリ | 重み、KV キャッシュ、活性値、作業領域を含む最大使用量を測る。 | 対象環境で安定して実行できるかを確認できる。 |
| メモリ帯域 | 演算中の読み書き量と帯域使用率を測る。 | 処理がデータ転送に制約されているかを確認できる。 |
| 演算時間 | 入力処理時間と継続生成速度を分けて測る。 | 低ビット化が実際の推論速度へ反映されたかを確認できる。 |
| 品質 | 損失、タスク性能、生成結果を測る。 | 容量と速度の利益に対して、どの程度の関数変化が生じたかを確認できる。 |
モデルファイルが小さくなったこと、実行時メモリが減ったこと、推論が速くなったことは、それぞれ別の成果である。一つが成立しても、残りが自動的に成立するわけではない。
17.22 低ビット化はシステム全体の律速を移動させる
重み読み出しが支配的な処理を低ビット化すると、その部分の時間は短縮される。すると、それまで目立たなかった復号、KV キャッシュ、softmax、トークン処理などが新しい律速として現れる。
最適化前の各処理時間を \(T_1,T_2,\ldots,T_n\) とすると、総時間は次の値になる。
T_{\mathrm{total}}
=
\sum_{i=1}^{n}T_i
\]
重み行列積だけを短縮しても、他の項は残る。最初の律速を解消した後には、別の項の割合が相対的に増える。
| 最適化前の律速 | 低ビット化後に現れ得る律速 |
|---|---|
| 重み読み出し | ビット抽出と再スケーリングが支配する場合がある。 |
| 行列積 | softmax や正規化などの非行列積処理が支配する場合がある。 |
| モデル重み容量 | 長文脈の KV キャッシュがメモリを支配する場合がある。 |
| 生成モデル | RAG の検索や埋め込み処理が応答時間を支配する場合がある。 |
低ビット化によって一つの制約を小さくすると、システム全体の制約条件が変わる。次に支配的になる処理を含めて設計しなければ、理論上の削減率を実用性能へ結び付けられない。
17.23 低ビット化の価値は容量、速度、品質の組で決まる
低ビット化の第一の効果は、有限個の重みコードによって保存量を減らすことである。しかし、そのコードを復号して演算する費用、尺度などの付加情報、実行時の活性値と KV キャッシュは別に残る。
グループを小さくすれば重み分布へ適合しやすくなり、量子化誤差は減る。一方、尺度数と実効ビット数が増える。低ビット形式を演算器が直接扱えなければ、ビット抽出、展開、再スケーリングが必要になる。
重み読み出しが律速なら、低ビット化による帯域削減は大きな効果を持つ。演算が律速なら、対応する低ビット積和命令と最適化されたカーネルが必要になる。小さな演算や量子化されない処理が支配する場合には、低ビット形式の管理費用が利益を上回ることもある。
ローカル LLM では、モデル重みだけでなく、KV キャッシュ、推論エンジン、OS、通常のアプリケーションが同じメモリを使用する。ローカル RAG では、埋め込みモデル、検索索引、取得文書も同じ資源と応答時間を消費する。
したがって、「4 ビットだから 4 倍小さく、4 倍速い」とは限らない。4 ビットが直接示すのは、量子化コード本体の幅である。実際の価値は、付加情報を含む保存量、実行時メモリ、ハードウェアの対応、処理の律速、最終的なモデル品質を合わせて評価したときに決まる。
18. なぜ有限精度への丸めを量子化と呼ぶのか
18.1 quantum は量子力学だけに属する語ではない
英語の quantum は、量子力学だけを指すために作られた語ではない。ラテン語で量の大きさを問う語に由来し、英語でも「ある量」「一定量」「ひとかたまりの量」という一般的な意味を持つ。単数形が quantum、複数形が quanta である。辞書上も、物理学における専門的な意味に加え、量や一定部分を表す語義が確認できる[28]。
したがって、工学上の quantization を理解するために、最初から量子力学を持ち出す必要はない。中心にあるのは、連続的または非常に多くの値を取り得る量を、そのまま扱わず、許された一定数の段階へ分けるという意味である。
| 語 | 基本的な意味 | 本稿での位置づけ |
|---|---|---|
| quantity | 対象がどれだけ存在するかという量を表す。 | 量子化前に連続的または高精度に変化する値に対応する。 |
| quantum | 一まとまりとして扱われる一定量を表す。 | 量子化された表現における一段階分の量という意味につながる。 |
| quanta | quantum の複数形である。 | 複数の離散的な量の単位または段階を表す。 |
| quantization | 量を離散的な段階や許された状態へ対応させることを表す。 | 入力集合を有限または離散的な代表値集合へ写す処理に対応する。 |
量子力学で quantum が使われるのも、工学で quantization が使われるのも、「任意に細かな値としてではなく、許された量や状態を単位として扱う」という語の核を共有するためである。ただし、同じ語を使うことは、両者が同じ物理現象や同じ数学的手続きを扱うことを意味しない。
18.2 一様量子化では刻み幅が一段階分の量になる
一様量子化では、表現可能値が一定間隔で並ぶ。刻み幅を \(\Delta\) とすると、0 を基準にした単純な代表値集合は次のように書ける。
C
=
\{
\ldots,
-2\Delta,
-\Delta,
0,
\Delta,
2\Delta,
\ldots
\}
\]
隣接する代表値の差は、どの位置でも \(\Delta\) になる。
c_{i+1}-c_i
=
\Delta
\]
この \(\Delta\) が、一段階進んだときに増減する一定量である。入力値は任意の実数のまま保存されず、\(\Delta\) ごとに並んだ許可済みの値へ対応付けられる。
たとえば、刻み幅が \(\Delta=0.25\) なら、表現可能値には次のような値が含まれる。
\ldots,
0.00,
0.25,
0.50,
0.75,
1.00,
\ldots
\]
入力が 0.61 の場合、最近傍丸めでは 0.50 が選ばれる。
Q(0.61)
=
0.50
\]
入力が 0.64 なら、0.75 が選ばれる。
Q(0.64)
=
0.75
\]
0.61 と 0.64 は異なる実数だが、量子化器が残す区別は 0.25 ごとの段階に限られる。連続的な量を、一定量ずつ離れた代表値で表すことが、quantization という名称へ直接つながる。
18.3 丸めは入力を許された段階へ移す操作である
量子化と丸めは、説明上は別の語として使われることがある。量子化は表現可能な代表値集合とセルを定める操作全体を指し、丸めは具体的な入力に対して、どの代表値を選ぶかを決める操作である。
代表値集合を \(C\) とすると、最近傍丸めは概念的に次のように書ける。
Q(x)
=
\operatorname*{argmin}_{c\in C}
|x-c|
\]
入力 \(x\) が代表値集合に含まれていれば、値は変わらない。
x\in C
\quad\Longrightarrow\quad
Q(x)=x
\]
入力が代表値集合に含まれていなければ、指定された規則によって別の値へ移される。
x\notin C
\quad\Longrightarrow\quad
Q(x)\in C
\]
| 要素 | 決定するもの | 量子化における役割 |
|---|---|---|
| 代表値集合 | どの値を保存可能とするかを決める。 | 量子化後に残される数値上の区別を定める。 |
| セル境界 | どの入力範囲を同じ代表値へ集めるかを決める。 | 異なる入力が同一視される範囲を定める。 |
| 丸め規則 | 境界上や隣接値間の入力をどちらへ送るかを決める。 | 誤差の偏り、分散、再現性を変える。 |
有限精度数への丸めが量子化と呼ばれるのは、単に小数点以下を切り捨てるからではない。実数全体から、数値形式が許した離散的な集合へ入力を写し、同じ代表値へ入った実数どうしの区別を失うからである。
18.4 固定小数点数では quantum を明示しやすい
固定小数点数では、小数部へ割り当てるビット数が決まると、隣接する表現可能値の間隔も決まる。小数部を \(f\) ビットとすると、刻み幅は次の値になる。
\Delta
=
2^{-f}
\]
表現可能値は、整数 \(k\) を使って次のように書ける。
x_k
=
k\Delta
=
k2^{-f}
\]
すべての表現可能値が基本単位 \(\Delta\) の整数倍として並ぶため、\(\Delta\) を一段階分の quantum と考えやすい。
小数部が 8 ビットなら、刻み幅は次の値になる。
\Delta
=
2^{-8}
=
\frac{1}{256}
\]
正確な計算結果がこの格子上に存在しなければ、近い格子点へ丸められる。固定小数点数は、一定の quantum を持つ一様量子化された数体系である。
18.5 浮動小数点数では一段階分の量が場所によって変わる
浮動小数点数も、実数を離散的な表現可能値集合へ丸めるため、広い意味で量子化された数体系である。ただし、固定小数点数のように実数直線全体で同じ刻み幅を使うわけではない。
正規化された二進浮動小数点数では、同じ指数範囲内の隣接値間隔は一定だが、指数が大きくなると間隔も広くなる。有効精度を \(p\)、値の指数を \(e\) とすると、その範囲の間隔は概ね次の形になる。
\Delta_e
=
2^{e-(p-1)}
\]
指数が 1 増えると、刻み幅も 2 倍になる。
\Delta_{e+1}
=
2\Delta_e
\]
したがって、浮動小数点数には形式全体を通じた一つの固定 quantum があるわけではない。値の大きさに応じて、一段階分の絶対量が変化する。
| 数体系 | 一段階分の量 | 表現点の配置 |
|---|---|---|
| 固定小数点 | 形式全体で一定になる。 | 実数直線上へ一定間隔の格子を作る。 |
| 浮動小数点 | 指数領域によって変化する。 | 値が大きくなるほど絶対間隔が広がる。 |
| アフィン整数量子化 | 一つの尺度を共有する範囲では一定になる。 | 対象データへ合わせた有限範囲に等間隔の代表値を置く。 |
| 非一様コードブック | 隣接代表値ごとに異なる。 | 入力分布や損失へ合わせて不規則に配置する。 |
浮動小数点への丸めを量子化と呼べるのは、刻み幅が一定だからではない。許された離散値しか保存できず、複数の実数が同じ表現可能値へ集約されるからである。
18.6 量子化は必ずしも一定間隔への分割を意味しない
quantum という語から、量子化では必ず同じ大きさの単位へ分けると考えやすい。しかし、現代の工学でいう量子化は、一様量子化だけに限られない。
非一様量子化では、隣接する代表値の間隔が場所によって異なる。
c_{i+1}-c_i
\neq
c_i-c_{i-1}
\]
ベクトル量子化では、代表値は実数直線上の段階ではなく、高次元空間内の代表ベクトルになる。量子化セルも一定幅の区間ではなく、ボロノイ領域などの多次元領域になる。
確率的量子化では、同じ入力から複数の代表値が確率的に選ばれる場合もある。それでも、出力が許された離散的な代表値集合に制限される点は共通する。
| 量子化方式 | 許された状態 | 一段階分の量 |
|---|---|---|
| 一様スカラー量子化 | 一定間隔の実数値になる。 | 共通する刻み幅 \(\Delta\) を明確に定義できる。 |
| 非一様スカラー量子化 | 不規則な間隔の実数値になる。 | 場所によって隣接値の差が異なる。 |
| ベクトル量子化 | 有限個の代表ベクトルになる。 | 単一のスカラー刻み幅では表せない。 |
| 確率的量子化 | 有限個の代表値から確率的に選ばれる。 | 代表値集合に加えて選択確率が必要になる。 |
名称の出発点を最も直接に表すのは、一様量子化における一定量ごとの段階である。その後、量子化という概念は、より一般に「入力を許された離散的な状態へ写す操作」へ拡張されている。
18.7 整数化は量子化の本質ではない
量子化は、しばしば「小数を整数へ変換すること」と説明される。しかし、整数は量子化コードとして使いやすいだけであり、量子化の本質ではない。
入力 \(x\) を整数コード \(q\) へ写し、尺度 \(s\) とゼロ点 \(z\) によって再構成するアフィン量子化では、次の処理を行う。
q
=
\operatorname{round}
\left(
\frac{x}{s}
\right)
+
z
\]
\hat{x}
=
s(q-z)
\]
保存されるコード \(q\) は整数だが、量子化後に意味を持つ代表値は \(\hat{x}\) である。コード 7 が数値 7 を意味するとは限らず、尺度とゼロ点によって異なる実数を表す。
非一様コードブックでは、整数コードは代表値表の索引にすぎない。
q
\longmapsto
c_q
\]
代表値 \(c_q\) は等間隔である必要も、整数である必要もない。
量子化と呼ばれる理由は、整数型を使うからではない。入力が取り得た多数の値を、有限個のコードと代表値へまとめるからである。
18.8 工学的量子化では段階を人間が設計する
工学上の量子化では、どの値を表現可能にするかを設計者が決める。ビット数、表現範囲、刻み幅、ゼロ点、コードブック、丸め規則、クリッピング処理は、用途に応じて選択される。
| 設計対象 | 決定する内容 |
|---|---|
| ビット数 | 最大でいくつのコード状態を区別できるかを決める。 |
| 表現範囲 | どの入力までをクリッピングせずに扱うかを決める。 |
| 代表値配置 | 有限個の状態を入力空間のどこへ置くかを決める。 |
| セル境界 | どの入力を同じ代表値として扱うかを決める。 |
| 丸め規則 | 誤差を決定論的な偏り、確率的分散、ディザ付き雑音のどの形で生じさせるかを決める。 |
| 歪み関数 | どの入力差を大きな損失として扱うかを決める。 |
量子化器が作る離散段階は、物理法則によって一意に与えられるものではない。同じ入力でも、目的が音声保存、画像圧縮、数値計算、ニューラルネットワーク推論のどれであるかによって、適切な代表値と誤差尺度は変わる。
18.9 物理学的量子化は数値の丸め規則ではない
物理学における量子化を、連続値を近い離散値へ丸める処理として理解するのは不正確である。量子論では、古典物理学の状態や観測量を、そのまま有限精度数へ変換するのではない。
古典力学では、位置や運動量などを位相空間上の変数として扱う。量子力学では、状態を Hilbert 空間上のベクトルや密度演算子として表し、観測量を演算子として扱う。演算子どうしには、古典変数にはなかった非可換な関係が現れる。
たとえば位置演算子 \(\hat{x}\) と運動量演算子 \(\hat{p}\) は、次の交換関係を持つ。
[\hat{x},\hat{p}]
=
i\hbar
\]
これは、実数値を刻み幅 \(\Delta\) ごとに丸める式ではない。理論が許す状態、観測量、確率予測の構造そのものが、古典理論とは異なることを表している。
| 観点 | 工学的量子化 | 物理学的量子化 |
|---|---|---|
| 出発点 | 信号、数値、ベクトルなどの表現を小さくしたい。 | 古典的な物理理論を量子論の枠組みへ移したい。 |
| 主な操作 | 入力を有限または離散的な代表値集合へ写す。 | 状態と観測量を量子論の数学的対象として構成する。 |
| 段階の決定 | ビット数、分布、損失、実装制約から設計する。 | 物理系の状態空間、演算子、境界条件などから導かれる。 |
| 誤差 | 元の値と代表値との差として量子化誤差が生じる。 | 古典値を近似した丸め誤差として定義されるものではない。 |
| 目的 | 有限の保存量、通信量、演算量で対象を扱う。 | 自然現象を量子論として記述し、観測確率を予測する。 |
物理量の測定結果が離散的な値を持つ例はあるが、すべての量子力学的観測量が有限個または等間隔の値だけを取るわけではない。連続スペクトルを持つ観測量もある。そのため、物理学的量子化を「自然界の値を一定間隔へ丸めること」と説明することはできない。
18.10 共通するのは許された状態を介して量を記述する点である
工学的量子化と物理学的量子化は、具体的な対象も数学的操作も異なる。それでも同じ語が使われる背景には、任意の値を無制限に扱うのではなく、許された量や状態を介して対象を記述するという抽象的な共通点がある。
工学的量子化では、入力値は量子化器が定めた代表値集合に制限される。物理学では、物理系の状態と観測可能な値が量子論の構造によって記述される。
ただし、工学では許された状態が計算資源と設計目的に応じて人為的に定められる。物理学では、理論と対象系が許す状態を記述している。この差は、同じ名称より重要である。
18.11 量子コンピューターを使わなくても量子化は成立する
ニューラルネットワークの量子化、音声の量子化、画像の量子化、浮動小数点への丸めは、通常のデジタル計算機で実行できる。量子ビット、重ね合わせ、量子もつれを必要としない。
量子化されたニューラルネットワークという表現は、ニューラルネットワークが量子力学的な計算を行うことを意味しない。重みや活性値を有限個の低ビット表現へ写したことを意味する。
| 表現 | 意味 | 意味しないこと |
|---|---|---|
| 4 ビット量子化モデル | 重みなどを 4 ビットコードで表している。 | 量子コンピューター上で動作することを意味しない。 |
| 浮動小数点量子化 | 値を浮動小数点形式の表現可能集合へ丸めている。 | 物理量の量子状態を計算していることを意味しない。 |
| 確率的量子化 | 乱数を使って有限個の代表値から出力を選ぶ。 | 量子力学的な確率現象を利用する必要はない。 |
名称に quantum と同じ語根が含まれていても、工学的量子化と量子計算は別の概念である。
18.12 量子化という名称は有限精度表現の構造を正確に示している
有限精度への丸めを量子化と呼ぶのは、実数を単に不正確にするからではない。無数の入力値を、数値形式が許した有限または離散的な代表値へ対応させるからである。
一様量子化では、刻み幅 \(\Delta\) が一段階分の量として明確に現れる。固定小数点数では、すべての値が \(\Delta\) の整数倍として並ぶ。浮動小数点数では、指数領域ごとに一段階分の絶対量が変化する。非一様量子化やベクトル量子化では、単一の刻み幅を定義できなくても、出力が許された代表状態へ制限される構造は残る。
したがって、quantization の中心は整数化でも、量子コンピューターでも、量子力学的な重ね合わせでもない。連続的または非常に多くの候補を、そのまま区別せず、有限個の許された状態を単位として扱うことである。
工学的量子化と物理学的量子化は、「許された状態を介して量を記述する」という語の核を共有する。しかし、工学では表現点と誤差を人間が設計し、物理学では状態空間、演算子、交換関係から理論を構成する。次章では、この名称上の共通性から離れ、物理学における量子化が工学的な丸めとどこで決定的に異なるかを扱う。
19. 量子力学の量子化は数値を粗く丸める操作ではない
19.1 初期量子論では一定のエネルギー要素が導入された
量子という語が物理学で強く結び付いた出発点の一つは、Planck による黒体放射の研究である。Planck は、振動数 \(\nu\) を持つ振動子のエネルギーを統計的に扱う過程で、振動数に比例するエネルギー要素を導入した[29]。
一つのエネルギー要素は、現在の記法では次の形で表される。
\varepsilon
=
h\nu
\]
\(h\) は Planck 定数、\(\nu\) は振動数である。エネルギーをこの要素の整数倍として数えるなら、次のように書ける。
E_n
=
nh\nu
\qquad
(n=0,1,2,\ldots)
\]
この歴史から、量子化を「連続値を飛び飛びの値へ変えること」と説明する場合がある。初期量子論の一部を直観的に表す説明としては理解できるが、完成した量子力学全体を説明するには狭すぎる。
Planck が最初から現在の量子力学と同じ意味で、すべての振動子が離散的なエネルギー準位だけを持つと定式化していたわけでもない。量子概念の物理的解釈は、その後の光量子仮説、原子模型、行列力学、波動力学を通して発展した。
19.2 量子力学ではすべての観測量が離散値になるわけではない
量子力学における観測可能な値は、対応する演算子のスペクトルによって決まる。スペクトルには、離散的な部分、連続的な部分、その両方を含む場合がある。
| 観測量の例 | 典型的なスペクトル | 意味 |
|---|---|---|
| 束縛された系のエネルギー | 離散スペクトルを持つ場合がある。 | 許されるエネルギー固有値が飛び飛びに並ぶ。 |
| 角運動量の成分 | 離散スペクトルを持つ。 | 測定値は量子数によって区別される値になる。 |
| 位置 | 通常は連続スペクトルを持つ。 | 量子力学で扱っても、有限個の格子点だけへ丸められるわけではない。 |
| 自由粒子の運動量 | 通常は連続スペクトルを持つ。 | 任意に設定した有限刻み幅へ制限されるわけではない。 |
| 有限の量子系の観測量 | 有限個の固有値を持つ場合がある。 | 状態空間の次元と演算子の構造によって候補が決まる。 |
したがって、量子力学を「自然界の値を一定間隔の有限段階へ丸める理論」と理解することはできない。離散性は重要な特徴の一つだが、すべての観測量に同じ形で現れるわけではない。
工学的量子化では、設計者がビット数を決めれば表現可能状態数も有限になる。量子力学では、量子論であることから直ちに観測値の候補が有限個になるわけではない。
19.3 古典力学では状態を位相空間上の点として表す
古典力学では、粒子の状態を位置 \(q\) と運動量 \(p\) の組として表す。自由度が一つなら、状態は位相空間上の一点になる。
(q,p)
\]
物理量は、位相空間上の関数として表される。たとえば古典的な Hamiltonian は、位置と運動量の関数になる。
H(q,p)
\]
状態の時間発展は、Hamilton の運動方程式によって記述される。
\frac{dq}{dt}
=
\frac{\partial H}{\partial p}
\]
\frac{dp}{dt}
=
–
\frac{\partial H}{\partial q}
\]
この記述では、位置と運動量は同時に特定された数値として扱われる。観測量どうしの積も、通常の数の積として可換である。
qp=pq
\]
量子化では、これらの数値を単に低精度の格子へ移すのではなく、状態と観測量を表す数学的対象そのものを変更する。
19.4 量子力学では状態を Hilbert 空間のベクトルとして表す
量子力学では、純粋状態を Hilbert 空間のベクトルによって表す。状態ベクトルを、Dirac の記法では次のように書く。
|\psi\rangle
\]
同じ物理状態を表すベクトルは、全体の位相因子を除いて同一視される。そのため、物理状態は厳密には単なるベクトルではなく、同じ方向を持つベクトルの同値類として扱われる。
複数の状態ベクトルを線形結合したものも、適切に正規化すれば量子状態になる。
|\psi\rangle
=
\alpha|a\rangle
+
\beta|b\rangle
\]
\(\alpha\) と \(\beta\) は複素数の振幅である。この線形結合の構造は、古典的な位相空間上の一点を有限精度へ丸める操作からは生じない。
| 理論 | 状態の表現 | 数値の丸めとの違い |
|---|---|---|
| 古典力学 | 位置と運動量などを並べた位相空間上の点として表す。 | 状態変数は通常の実数値として扱われる。 |
| 量子力学 | Hilbert 空間のベクトル、射線、密度演算子として表す。 | 古典変数の桁数を減らしたものではなく、状態表現の構造が異なる。 |
統計的な混合や部分系を扱う場合には、状態を密度演算子 \(\rho\) で表す。
\rho
\geq
0
\]
\operatorname{tr}(\rho)=1
\]
量子状態の記述には、ベクトル空間、複素振幅、内積、演算子という構造が必要になる。有限個の代表値を保存する工学的量子化とは、出発点から異なる。
19.5 観測量は数値関数ではなく演算子として表される
量子力学では、位置、運動量、エネルギーなどの観測量を、Hilbert 空間上の自己共役演算子として表す。位置を \(\hat{q}\)、運動量を \(\hat{p}\)、Hamiltonian を \(\hat{H}\) と書く。
観測によって得られる値は、対応する演算子のスペクトルに属する。離散固有値を持つ場合、状態 \(|a_n\rangle\) は次の固有値方程式を満たす。
\hat{A}|a_n\rangle
=
a_n|a_n\rangle
\]
\(a_n\) が観測され得る値である。これは、任意の実数を最も近い \(a_n\) へ丸めるという規則ではない。
観測前の状態が複数の固有状態を含む場合、各観測値が得られる確率は Born の規則によって決まる。
|\psi\rangle
=
\sum_n
c_n|a_n\rangle
\]
P(A=a_n)
=
|c_n|^2
\]
工学的量子化では、入力値がどのセルに属するかによって代表値を選ぶ。量子測定では、状態ベクトルと観測演算子の関係から結果の確率分布を求める。両者は同じ写像ではない。
19.6 位置と運動量は非可換な演算子になる
古典力学では、位置 \(q\) と運動量 \(p\) は数値であり、その積の順序を入れ替えても結果は変わらない。
qp=pq
\]
量子力学では、位置演算子 \(\hat{q}\) と運動量演算子 \(\hat{p}\) は、一般に可換ではない。標準的な交換関係は次のとおりである。
[\hat{q},\hat{p}]
=
\hat{q}\hat{p}
–
\hat{p}\hat{q}
=
i\hbar\hat{I}
\]
\(\hbar\) は換算 Planck 定数、\(\hat{I}\) は恒等演算子である。右辺を単に \(i\hbar\) と書くことも多いが、演算子の等式としては恒等演算子が省略されている。
この非可換性は、数値の有効桁数を減らした結果ではない。どれほど高精度の数値計算を行っても、演算子の積の順序が持つ違いは消えない。
交換関係から、位置と運動量の不確定性関係が導かれる。
\Delta q
\Delta p
\geq
\frac{\hbar}{2}
\]
この関係も、測定器の刻み幅やデジタル丸め誤差を表しているのではない。量子状態における二つの観測量の分散が同時に任意に小さくならないという構造を表す。
19.7 Heisenberg の行列力学は観測可能な遷移を基礎にした
Heisenberg の行列力学は、古典軌道を直接記述する代わりに、観測可能な周波数や遷移振幅の関係から理論を構成した[30]。
古典物理学では、粒子が時間とともに通る軌道 \(q(t)\) を考える。初期の行列力学では、直接観測できない軌道の代わりに、状態間の遷移に対応する量を配列として扱った。
これらの配列の積は、通常の数の積とは異なり、一般に順序を入れ替えられない。
AB\neq BA
\]
非可換な行列積は、量子力学の交換関係へつながる。ここで導入された変更は、連続的な軌道を有限個の数値へ圧縮することではない。物理的予測に使う基本量と、その間の演算規則を組み替えることである。
19.8 正準量子化は古典変数を演算子へ対応させる
古典力学から量子力学を構成する代表的な手続きの一つに、正準量子化がある。古典的な位置と運動量を、量子論の演算子へ対応させる。
q
\longmapsto
\hat{q}
\]
p
\longmapsto
\hat{p}
\]
古典力学における Poisson 括弧は、二つの関数 \(f(q,p)\) と \(g(q,p)\) に対して次のように定義される。
\{f,g\}_{\mathrm{PB}}
=
\frac{\partial f}{\partial q}
\frac{\partial g}{\partial p}
–
\frac{\partial f}{\partial p}
\frac{\partial g}{\partial q}
\]
位置と運動量については、次の関係が成り立つ。
\{q,p\}_{\mathrm{PB}}
=
1
\]
Dirac は、古典力学の Poisson 括弧と量子力学の交換子の対応を量子化の原理として整理した[31]。概念的な対応は次のように書ける。
\{f,g\}_{\mathrm{PB}}
\quad\longrightarrow\quad
\frac{1}{i\hbar}
[\hat{f},\hat{g}]
\]
位置と運動量へ適用すると、標準交換関係が得られる。
[\hat{q},\hat{p}]
=
i\hbar\hat{I}
\]
この対応で変換されるのは、古典変数の値の細かさではない。古典的な関数と Poisson 括弧から、演算子と交換子を持つ代数的構造へ移っている。
19.9 正準量子化は単純な置換規則だけでは完結しない
古典変数 \(q\) と \(p\) は可換であるため、古典式では積の順序を区別しない。
qp=pq
\]
量子演算子 \(\hat{q}\) と \(\hat{p}\) は可換ではないため、古典式を演算子へ置き換えると順序の曖昧さが生じる。
たとえば古典的な積 \(qp\) からは、次の複数の演算子候補を考えられる。
\hat{q}\hat{p}
\]
\hat{p}\hat{q}
\]
\frac{1}{2}
\left(
\hat{q}\hat{p}
+
\hat{p}\hat{q}
\right)
\]
これらは同じ演算子ではない。交換関係から、最初の二つには次の差がある。
\hat{q}\hat{p}
–
\hat{p}\hat{q}
=
i\hbar\hat{I}
\]
したがって、古典式の各数値を機械的に演算子へ置き換えるだけでは、量子論が一意に決まらない場合がある。
| 問題 | 内容 | 工学的丸めとの違い |
|---|---|---|
| 演算子順序 | 古典的には同じ積が、量子論では異なる演算子になり得る。 | 最も近い代表値を選ぶ問題ではない。 |
| 座標系 | 量子化手続きが座標変換に対して同じ形を保つかが問題になる。 | 刻み幅やコードブックの変更だけでは解決しない。 |
| 制約系 | 古典的制約を量子状態と演算子へどう実装するかが必要になる。 | 入力範囲外をクリップする処理とは異なる。 |
| 量子異常 | 古典理論の対称性が量子化後に維持されない場合がある。 | 有限精度誤差ではなく、理論構造の変化として現れる。 |
物理学における量子化は、単純な数値変換関数ではなく、理論の整合性を確認しながら状態空間と演算子代数を構成する問題である。
19.10 離散的な固有値は丸めによって作られるのではない
束縛された量子系で離散的なエネルギー準位が現れる場合、その値は設計者が設定した刻み幅へ丸めた結果ではない。Hamiltonian の固有値問題と境界条件から導かれる。
定常状態は、時間に依存しない Schrödinger 方程式を満たす。
\hat{H}|\psi_n\rangle
=
E_n|\psi_n\rangle
\]
許されるエネルギー \(E_n\) は、演算子 \(\hat{H}\) と状態に課された条件を同時に満たす固有値として現れる。
無限に深い一次元井戸型ポテンシャルでは、境界条件によって波動関数が許される形が制限され、エネルギー固有値が離散化する。概略的には次の形になる。
E_n
=
\frac{n^2\pi^2\hbar^2}{2mL^2}
\qquad
(n=1,2,\ldots)
\]
隣接する準位の差は一定ではない。
E_{n+1}-E_n
=
\frac{(2n+1)\pi^2\hbar^2}{2mL^2}
\]
これは、一定刻み幅の一様量子化とは異なる。準位間隔は系の Hamiltonian、質量 \(m\)、領域の大きさ \(L\)、量子数 \(n\) によって決まる。
19.11 連続スペクトルは量子論と両立する
量子化された理論であっても、観測量が連続スペクトルを持つ場合がある。位置演算子の形式的な固有値方程式は次のように書ける。
\hat{q}|q\rangle
=
q|q\rangle
\]
固有値 \(q\) は、連続的な実数範囲を動く。自由粒子の運動量も、通常は連続スペクトルを持つ。
連続スペクトルに対応する固有状態は、離散スペクトルの通常の正規化可能な固有ベクトルとは異なり、一般化された固有状態として扱われる。数学的な取扱いには注意が必要だが、ここで重要なのは、量子力学が連続的な観測値を排除していないことである。
「量子」という名称から、空間、時間、位置、運動量のすべてが有限間隔の格子になっていると結論することはできない。
19.12 量子測定はアナログ値をデジタルコードへ変換する処理ではない
実際の量子実験では、検出器から得た電気信号をデジタル化するために、工学的な量子化が使われる場合がある。しかし、この信号処理上の量子化と、量子力学の測定理論は別の段階である。
| 段階 | 行われること | 量子化の意味 |
|---|---|---|
| 量子系の測定 | 量子状態と観測演算子から測定結果の確率を扱う。 | 量子力学の測定理論に属する。 |
| 検出器の応答 | 光、電荷、電流、電圧などの物理信号を生成する。 | 測定装置の物理過程に属する。 |
| アナログデジタル変換 | 連続的な電気信号を有限ビットのコードへ丸める。 | 工学的な数値量子化に属する。 |
量子実験の測定値が計算機へ保存されるときには、装置の有限精度やアナログデジタル変換による誤差が加わる。しかし、それらは量子力学そのものが要求する離散性ではない。
19.13 量子状態の確率性は確率的丸めとも異なる
確率的丸めでは、設計者が定めた確率に従って、隣接する有限精度値の一つを選ぶ。入力 \(x\) を挟む代表値を \(a\) と \(b\) とすれば、期待値を保存するよう選択確率を設計できる。
量子測定における確率は、量子状態と測定演算子から Born の規則によって定まる。離散的な測定結果 \(a_n\) に対応する射影演算子を \(\hat{P}_n\) とすると、確率は次のように書ける。
P(a_n)
=
\langle\psi|
\hat{P}_n
|\psi\rangle
\]
| 確率過程 | 確率を決めるもの | 目的 |
|---|---|---|
| 確率的丸め | 量子化格子、入力値、設計された選択規則が決める。 | 有限精度誤差の偏りを制御する。 |
| 量子測定 | 量子状態と観測演算子が決める。 | 量子系に対する測定結果の統計を予測する。 |
両方に確率が現れるからといって、同じ種類の処理ではない。確率的丸めは、古典計算機上で擬似乱数を使って実装できる工学的規則である。量子測定確率は、量子論の状態記述そのものに含まれる。
19.14 量子場の量子化でも有限精度化が目的ではない
量子化という語は、粒子の量子力学だけでなく、場の量子論でも使われる。古典場を量子化する場合、場とその共役運動量を演算子として扱い、交換関係または反交換関係を導入する。
場を複数の振動モードへ分解すると、各モードを量子調和振動子として扱える場合がある。生成演算子と消滅演算子は、モードに対応する量子の個数を増減させる。
ボース粒子に対応する演算子は、概念的に次の交換関係を持つ。
[\hat{a},\hat{a}^{\dagger}]
=
\hat{I}
\]
粒子数演算子は次のように定義される。
\hat{N}
=
\hat{a}^{\dagger}\hat{a}
\]
粒子数の固有値は非負整数になる。
N=0,1,2,\ldots
\]
ここで現れる離散性も、場の振幅を有限ビットで丸めた結果ではない。量子場の状態空間と演算子代数から生じる。
19.15 物理学的量子化は一般に情報圧縮を目的としない
工学的量子化では、状態数を減らすことが中心になる。32 ビットの値を 4 ビットへ変換すれば、区別できる状態を大幅に減らし、保存量や通信量を削減する。
物理学的量子化では、古典理論より状態数を少なくすることが一般的な目的ではない。量子状態空間は、古典状態空間より単純な有限集合になるとは限らない。
たとえば一つの量子調和振動子でも、エネルギー固有状態は無限個存在する。
|0\rangle,
|1\rangle,
|2\rangle,
\ldots
\]
状態はこれらの重ね合わせにもなり得る。
|\psi\rangle
=
\sum_{n=0}^{\infty}
c_n|n\rangle
\]
量子化によって有限個のコードへ圧縮されたわけではない。むしろ、複素振幅を持つ Hilbert 空間という新しい状態構造が導入されている。
19.16 同じ quantization でも変換する対象が異なる
| 観点 | 工学・機械学習の量子化 | 量子力学における量子化 |
|---|---|---|
| 出発点 | 実数値、信号、重み、活性値などを有限資源で表現する。 | 古典的な物理系から量子論的な記述を構成する。 |
| 状態 | 有限個または離散的なコードと代表値を使う。 | Hilbert 空間上の状態ベクトルや密度演算子を使う。 |
| 観測量 | 量子化前後の数値として扱う。 | 自己共役演算子として扱う。 |
| 演算規則 | 整数演算、復号、丸め、クリッピングなどを設計する。 | 演算子積、交換関係、時間発展、測定規則を使う。 |
| 主な写像 | 多数の入力を有限個の代表値へ対応させる。 | 古典変数や古典的観測量を量子演算子へ対応させる。 |
| 情報損失 | 複数の入力を同じコードへまとめるため、意図的な非可逆性が生じる。 | 粗い数値表現を作る操作ではなく、単純な圧縮写像としては表せない。 |
| 離散性 | ビット数、コードブック、表現範囲によって設計者が導入する。 | 演算子のスペクトルと物理系の条件により、離散または連続になる。 |
| 誤差 | 元の値と再構成値との差を量子化誤差として測る。 | 古典値と丸め後の量子値との差という誤差を一般には定義しない。 |
| 目的 | 記憶、通信、演算の有限資源へ対象を収める。 | 量子現象を記述し、観測結果の確率を予測する。 |
| 量子計算との関係 | 通常の CPU や GPU で実行できる。 | 量子論の数学的構造そのものに属する。 |
19.17 共通するのは語の骨格であり、数学的操作ではない
工学的量子化と物理学的量子化には、連続的に扱われていた量を、そのままの形では扱わず、許された状態や単位を介して記述するという抽象的な共通点がある。この共通点が、同じ quantization という語の使用を支えている。
しかし、工学的量子化では、入力集合 \(X\) から代表値集合 \(C\) への写像を設計する。
Q:X\rightarrow C
\]
複数の入力が同じ代表値へ写されるため、量子化器は一般に非可逆である。
物理学的量子化では、古典変数や古典的観測量から、量子状態と演算子を持つ理論へ移る。
q,p
\quad\longmapsto\quad
\hat{q},\hat{p}
\]
\{q,p\}_{\mathrm{PB}}
=
1
\quad\longmapsto\quad
[\hat{q},\hat{p}]
=
i\hbar\hat{I}
\]
ここで変わるのは数値の分解能ではなく、物理量の数学的な身分、演算の順序、状態の重ね合わせ、測定確率である。
19.18 量子力学の量子化を丸めとして理解してはいけない
初期量子論では、エネルギー要素 \(h\nu\) が重要な役割を持った。束縛系のエネルギーや角運動量では、離散的な固有値が現れる。このため、量子化を飛び飛びの値と結び付ける説明には歴史的な根拠がある。
一方、完成した量子力学は、すべての物理量を有限個の段階へ変換する理論ではない。位置や自由粒子の運動量は連続スペクトルを持ち得る。離散的なエネルギー準位も、任意に設定した刻み幅への丸めではなく、Hamiltonian の固有値問題と境界条件から現れる。
量子力学における量子化では、古典状態を Hilbert 空間上の量子状態へ、古典的観測量を演算子へ、Poisson 括弧を交換関係へ対応させる。非可換性、重ね合わせ、Born の確率規則は、有限精度丸めには存在しない構造である。
工学的量子化は、有限の記憶、通信、計算資源へ値を収めるために、設計者が入力の区別を減らす。物理学的量子化は、自然現象を記述する理論の形式を古典論から量子論へ移す。
両者に共通するのは、量を従来の連続的な扱いのまま残さず、許された状態や単位を介して扱うという語義の骨格である。具体的な目的、数学的対象、演算規則、情報損失の意味は異なる。量子力学の量子化を、実数を粗い数値へ丸める処理として説明することはできない。
20. 量子化の正体は目的に不要な区別を捨てることである
20.1 六つの見方は同じ操作を別方向から捉えている
量子化は、整数への変換、空間の分割、確率分布の離散化、情報量の削減など、文脈によって異なる言葉で説明される。しかし、これらは別々の処理ではない。一つの量子化器が持つ構造を、集合、幾何、確率、情報、数値計算という異なる方向から見ている。
| 見方 | 量子化の記述 | 中心となる対象 |
|---|---|---|
| 写像 | 入力空間から有限または離散的なコード集合への多対一写像として表す。 | 入力、コード、代表値の対応関係を扱う。 |
| 同値関係 | 量子化後に区別しない入力を同じ同値類へまとめる。 | どの入力差を捨てるかを扱う。 |
| 幾何 | 入力空間をセルへ分割し、各セルを一つの代表点で置き換える。 | セル境界、代表点、距離、空間分割を扱う。 |
| 確率 | 入力分布が持つ確率質量を有限個の代表点へ集約する。 | セル確率、量子化後の分布、期待歪みを扱う。 |
| 情報理論 | 許容歪みと引き換えに、再構成へ残す情報量を減らす。 | レート、エントロピー、歪みの交換関係を扱う。 |
| 数値計算 | 実数または高精度値を、有限精度の表現集合と演算規則へ写す。 | 丸め、範囲、演算誤差、誤差伝播を扱う。 |
入力空間を \(X\)、コード集合を \(I\)、代表値集合を \(C\) とする。量子化の符号化器を \(E\)、復号器を \(D\) と書けば、量子化器全体は次の合成写像になる。
E:X\rightarrow I
\]
D:I\rightarrow C
\]
Q
=
D\circ E
\]
一つのコード \(i\in I\) へ対応する入力集合は、次の量子化セルになる。
R_i
=
E^{-1}(\{i\})
=
\{x\in X\mid E(x)=i\}
\]
同じセルに属する入力 \(x\) と \(y\) は、量子化後には同じ代表値へ写される。
x,y\in R_i
\quad\Longrightarrow\quad
Q(x)=Q(y)=D(i)
\]
写像として見れば、多数の入力が一つのコードへ集約されている。同値関係として見れば、同じセルの入力が同じものとして扱われている。幾何として見れば、入力空間がセルへ分割されている。確率として見れば、セル内の確率質量が代表点へ集まっている。情報理論として見れば、セル内部の違いを記録しないことで必要レートを減らしている。
20.2 量子化は入力空間へ同値関係を導入する
二つの入力が量子化後に同じ値へ写されるとき、それらを量子化器に関して同値であると定義できる。
x\sim_Q y
\quad\Longleftrightarrow\quad
Q(x)=Q(y)
\]
この関係によって、入力空間 \(X\) は複数の同値類へ分かれる。同値類の集合は商集合として次のように表せる。
X/{\sim_Q}
\]
量子化器が保持するのは、元の入力 \(x\) そのものではない。\(x\) がどの同値類に属するかという情報である。
たとえば、0.60、0.61、0.62 がすべて代表値 0.625 へ写されるなら、量子化後には三つの値を区別できない。
Q(0.60)
=
Q(0.61)
=
Q(0.62)
=
0.625
\]
失われたのは値全体ではない。三つの入力を互いに区別する能力である。量子化後にも、これらが 0.625 に対応する範囲へ属していたことは残っている。
| 量子化前に分かること | 量子化後に残ること | 量子化後に失われること |
|---|---|---|
| セル内の正確な位置を区別できる。 | どのセルまたは代表値へ属するかが残る。 | 同じセルに属する入力どうしの違いを復元できない。 |
| 任意に細かな差を扱える場合がある。 | 有限個のコードで表された粗い位置が残る。 | コード数を超える細かな区別が失われる。 |
量子化を情報損失として説明する場合、何もかも失う処理と捉えるのは正確ではない。量子化器が指定した同値類の内部だけを区別しなくなる。
20.3 有限ビット数は残せる同値類の個数を制限する
固定長 \(b\) ビットのコードでは、表現できるビット列は最大 \(2^b\) 通りである。したがって、コード集合の大きさには次の制約が付く。
|I|
\leq
2^b
\]
量子化器は、入力空間に存在する多数の違いを、最大 \(2^b\) 個の同値類へまとめなければならない。
| コード長 | 最大状態数 | 入力空間に対して行うこと |
|---|---|---|
| 1 ビット | 2 状態 | 入力を最大二つの同値類へ分ける。 |
| 4 ビット | 16 状態 | 入力を最大 16 個の同値類へ分ける。 |
| 8 ビット | 256 状態 | 入力を最大 256 個の同値類へ分ける。 |
ビット数を減らすということは、保存する数値の桁を短くするだけではない。入力空間に残せる同値類の個数を減らし、より多くの入力を同じものとして扱うことである。
20.4 捨てた区別の重要度を歪み関数が決める
どの入力差を捨ててもよいかは、量子化という操作だけからは決まらない。入力 \(x\) と再構成値 \(\hat{x}\) の違いを評価する歪み関数 \(d(x,\hat{x})\) が必要になる。
量子化器 \(Q\) の平均歪みは、次のように表せる。
D(Q)
=
\mathbb{E}
\left[
d(X,Q(X))
\right]
\]
二乗誤差を使うなら、歪みは次の値になる。
d(x,\hat{x})
=
\|x-\hat{x}\|^2
\]
しかし、量子化の目的が数値の再現ではなく、知覚、分類、制御、生成などにある場合、同じ数値差でも重要度は異なる。
| 対象 | 捨てやすい区別 | 保護すべき区別 |
|---|---|---|
| 音声 | 聴覚上ほとんど識別できない差を優先して捨てる。 | 音声の明瞭さや音色を大きく変える差を保護する。 |
| 画像 | 人間が気付きにくい空間方向や周波数方向の差を捨てる。 | 輪郭、色の境界、知覚上目立つ構造を保護する。 |
| 数値計算 | 後続計算によって減衰または相殺される差を捨てる。 | 条件数やヤコビ行列によって増幅される方向を保護する。 |
| LLM | 実際の活性値を通しても層出力をほとんど変えない重み差を捨てる。 | 頻繁に使われる活性方向や外れ値に関係する差を保護する。 |
同じ量子化コード数でも、歪み関数が変われば最適なセル境界と代表値は変わる。良い量子化器とは、元の値へ一律に近い量子化器ではない。目的にとって重要な差を優先して残す量子化器である。
20.5 量子化設計は有限の表現能力を配分する問題である
量子化器の一般的な設計問題は、利用できるコード集合の制約下で、期待歪みを最小化する形に書ける。
\min_{E,D}
\mathbb{E}
\left[
d
\left(
X,
D(E(X))
\right)
\right]
\]
固定長 \(b\) ビットを使う場合には、コード集合へ次の制約を課す。
|I|
\leq
2^b
\]
この最適化で決めるのは、単に各入力をどの整数へ丸めるかではない。
| 設計対象 | 決定する内容 |
|---|---|
| コード数 | 入力空間をいくつの同値類へ分けられるかを決める。 |
| セル境界 | どの入力どうしを同じものとして扱うかを決める。 |
| 代表値 | 各同値類をどの値またはベクトルで代理するかを決める。 |
| 丸め規則 | 境界付近の入力を決定論的または確率的にどう割り当てるかを決める。 |
| 範囲 | どの入力までを通常セルで扱い、どこからクリップするかを決める。 |
コード数が有限である以上、すべての入力差を保存することはできない。設計の中心は、どの違いをまとめるか、どの違いには別のコードを割り当てるかという配分にある。
20.6 頻出する違いと重要な違いは一致しない場合がある
入力分布へ代表値を適合させると、頻繁に現れる領域へ多くのコードを配置できる。平均二乗誤差を小さくするだけなら、確率質量の大きい領域を細かく分けることが合理的である。
一方、まれな入力でも、最終用途へ重大な影響を与える場合がある。頻度だけを基準にすると、低確率だが高損失な入力を粗く扱う可能性がある。
期待歪みを明示すると、頻度と損失の両方が評価へ入る。
D(Q)
=
\int
d(x,Q(x))
\,d\mu(x)
\]
入力 \(x\) の出現確率が小さくても、歪み \(d(x,Q(x))\) が大きければ、期待歪みへ無視できない寄与を持つ。
| 入力領域 | 出現頻度 | 用途上の損失 | 量子化方針 |
|---|---|---|---|
| 頻出かつ高損失 | 高い。 | 大きい。 | 優先的に細かな表現を割り当てる。 |
| 頻出だが低損失 | 高い。 | 小さい。 | 頻度だけで過剰な精度を割り当てないようにする。 |
| まれだが高損失 | 低い。 | 大きい。 | 外れ値処理や高精度経路によって保護する場合がある。 |
| まれかつ低損失 | 低い。 | 小さい。 | 粗く量子化またはクリップしやすい。 |
良い量子化器は、分布だけにも、数値距離だけにも適合しない。入力が現れる頻度と、その入力差を失った場合の影響を同時に扱う。
20.7 可変長符号を使う場合はコード数より平均レートを制約する
固定長量子化では、利用可能なコード数を先に制限する。可変長符号を利用する場合には、量子化後の状態確率を使い、平均ビット数を制約できる。
状態 \(i\) の出現確率を \(p_i\) とすると、量子化出力のエントロピーは次の値になる。
H(Q(X))
=
-\sum_i
p_i\log_2p_i
\]
エントロピー制約量子化では、歪みとレートを一つの目的関数で扱える。
J(Q)
=
D(Q)
+
\lambda H(Q(X))
\]
\(\lambda\) を大きくすると平均レートを強く抑え、小さくすると歪みの削減を優先する。
この場合、状態数を増やしても、追加状態がほとんど使われなければエントロピーの増加は小さい。反対に、同じ状態数でも均等に使われればエントロピーは大きくなる。
固定長と可変長では制約の置き方が異なるが、中心となる問いは同じである。限られた記録能力を使い、どの入力差を残すかを決める。
20.8 量子化誤差は捨てた区別を数値化したものである
量子化前の入力を \(x\)、量子化後の代表値を \(\hat{x}=Q(x)\) とする。本稿で用いてきた符号規約では、量子化誤差を次のように書く。
e
=
x-\hat{x}
=
x-Q(x)
\]
この誤差は、量子化器が捨てた違いの一つの表現である。しかし、誤差の数値だけでは、失った区別の重要性までは分からない。
同じ絶対誤差を持つ二つの入力でも、後続計算や用途によって影響は異なる。
| 評価対象 | 測定するもの | 分からないこと |
|---|---|---|
| 絶対誤差 | 元の値と代表値の数値差を測る。 | 後続計算による増幅や用途上の重要性は分からない。 |
| 平均二乗誤差 | 大きな数値誤差を強く罰しながら平均する。 | 判断境界、知覚、タスク損失を直接表さない。 |
| 層出力誤差 | 重み誤差を実際の活性値へ作用させた結果を測る。 | 後続層を通した最終モデル出力までは保証しない。 |
| タスク損失 | 量子化が最終用途へ与えた影響を測る。 | どの内部値が原因だったかを直接特定しにくい。 |
量子化誤差を小さくすることは重要だが、それ自体が最終目的とは限らない。用途に不要な差を大きく捨て、必要な差を小さく保つ方が、数値上の一様な誤差削減より適切な場合がある。
20.9 量子化は情報圧縮の一部だが圧縮全体ではない
量子化は、入力の区別を減らすことで情報量を削減する非可逆処理である。その意味で、非可逆圧縮の中心的な構成要素になり得る。
ただし、情報圧縮には量子化以外の操作も含まれる。量子化後のコードへ可変長符号を割り当てる処理は、量子化後の状態を保ったままビット列を短くする可逆符号化である。
| 操作 | 減らすもの | 情報損失 | 量子化との関係 |
|---|---|---|---|
| 量子化 | 区別する数値状態を減らす。 | 同じセルに入った入力差を失う。 | 本稿の中心となる操作である。 |
| エントロピー符号化 | 量子化後の状態を表す平均ビット数を減らす。 | 理想的には量子化後の状態を失わない。 | 量子化後に適用される別の処理である。 |
| 予測符号化 | 値そのものではなく予測残差を記録する。 | 残差を量子化しなければ可逆にもできる。 | 量子化しやすい分布へ入力を変換できる。 |
| 変換符号化 | 情報を圧縮しやすい座標系へ移す。 | 変換自体は可逆にできる。 | 変換後の係数へ量子化を適用する場合がある。 |
量子化だけでファイルや通信形式が完成するわけではない。どの区別を捨てるかを量子化が決め、残った状態をどう効率的に記録するかを符号化が決める。
20.10 蒸留、枝刈り、低ランク化は別の構造を減らす
ニューラルネットワークを小さくする方法には、量子化以外にも蒸留、枝刈り、低ランク化などがある。いずれも計算資源を減らすが、減らしている対象が異なる。
| 方法 | 主に減らすもの | 量子化との違い |
|---|---|---|
| 量子化 | 一つの値に使える表現状態数を減らす。 | 原則としてモデル構造やパラメータ個数を変えず、値の区別を減らす。 |
| 枝刈り | 重み、接続、チャネルなどを削除する。 | 表現精度ではなく、モデル内の要素数や接続数を減らす。 |
| 低ランク化 | 行列を少数の基底成分へ分解する。 | 値の段階数ではなく、線形変換が持つ有効次元を減らす。 |
| 蒸留 | 大きなモデルの関数を小さなモデルへ移す。 | 元モデルの値を直接丸めず、別のモデル構造を学習する。 |
これらを組み合わせることはできる。枝刈りしたモデルを量子化し、その出力コードを符号化することも可能である。しかし、それぞれが捨てる区別や構造は同じではない。
20.11 量子化の成功は捨てた区別が本当に不要だったかで決まる
量子化後のファイルが小さいことや、使用メモリが減ったことだけでは、量子化が成功したとはいえない。削減した資源に対して、用途上必要な機能が保たれている必要がある。
| 評価段階 | 確認すること |
|---|---|
| 表現 | 量子化誤差、クリッピング率、コード利用率が許容範囲にあるかを確認する。 |
| 計算 | 後続演算による誤差増幅、累積、オーバーフローがないかを確認する。 |
| 用途 | 知覚品質、分類精度、生成品質、制御結果などが保たれているかを確認する。 |
| システム | 保存量、実行時メモリ、速度、通信量が実際に改善したかを確認する。 |
数値誤差が小さくても、用途上重要な境界を越えれば失敗になる。数値誤差が大きくても、最終出力が変わらず、必要資源が減っていれば成功する場合がある。
量子化の成否を決めるのは、どれだけ多く捨てたかではない。捨てた違いが本当に目的に不要だったかである。
20.12 量子化には用途外の入力に対する限界がある
量子化器は、想定した入力分布と歪み関数に対して設計される。設計時に重要でないと判断した区別が、別の入力分布や別の用途では重要になる可能性がある。
キャリブレーション分布を \(\mu_{\mathrm{cal}}\)、運用時の分布を \(\mu_{\mathrm{run}}\) とすると、設計時の期待歪みが小さくても、運用時の期待歪みが同じとは限らない。
\mathbb{E}_{X\sim\mu_{\mathrm{cal}}}
\left[
d(X,Q(X))
\right]
\]
と、
\mathbb{E}_{X\sim\mu_{\mathrm{run}}}
\left[
d(X,Q(X))
\right]
\]
は、分布が変われば異なる値になる。
また、音声知覚向けの歪み関数で捨てられる差が、音声解析や法的記録でも不要とは限らない。LLM の一般文章で影響が小さい重み方向が、数式、コード、特定言語では重要になる場合もある。
「不要な区別」という判断は、対象、入力分布、用途、許容損失を固定した範囲でのみ成立する。量子化器の適用範囲を越えて、捨てた差が普遍的に無意味だったと結論することはできない。
20.13 量子化という名前が示す範囲
量子化は、値を整数へ変えることより広く、情報圧縮全体より狭い概念である。
代表値が整数でなくても、浮動小数点数、非一様な実数、ベクトル、行列、確率分布上の代表点であっても、入力の区別を有限または離散的な状態へまとめれば量子化になる。
一方、量子化後のコードを可変長符号で短くする処理は符号化である。モデルのパラメータ数や接続数を減らす枝刈り、別の小さなモデルへ機能を移す蒸留、行列の有効次元を減らす低ランク化も、量子化とは別の操作である。
量子化とは、有限の表現能力に収めるため、元の空間に存在した区別の一部を同じものとして扱う操作である。
この定義で重要なのは、「整数」「丸め」「圧縮」という個別の実装語ではない。「有限の表現能力」と「区別の同一視」である。
20.14 工学的量子化と物理学的量子化は目的が異なる
工学的量子化が量子化と呼ばれるのは、量子コンピューターを利用するからではない。量を一定の単位または許された状態を介して扱うという quantum の語義を共有しているためである。
工学的量子化では、設計者がビット数、代表値、セル境界、歪み関数を定める。有限の記憶、通信、計算資源へ収めるために、入力の区別を意図的に減らす。
量子力学における量子化では、古典的な状態や観測量を、Hilbert 空間、演算子、交換関係、測定確率を持つ量子論の形式へ移す。有限ビットへの丸めや非可逆圧縮が目的ではない。
| 観点 | 工学的量子化 | 物理学的量子化 |
|---|---|---|
| 目的 | 有限の保存量、通信量、演算量で対象を扱う。 | 古典論では記述できない物理現象を量子論として記述する。 |
| 主な操作 | 入力を有限または離散的な代表値へ対応させる。 | 状態、観測量、演算規則を量子論の数学へ移す。 |
| 情報損失 | 同じセル内の入力差を意図的に失う。 | 粗い数値表現を作る単純な圧縮ではない。 |
| 離散性 | コード数やコードブックによって設計者が導入する。 | 観測量の演算子と物理系に応じて離散または連続になる。 |
共通するのは名称の核であり、実際に行っている数学と目的ではない。
20.15 量子化の中心にあるのは何を残すかという判断である
量子化を「小数を整数にする処理」とだけ捉えると、代表値の配置、入力分布、誤差伝播、符号長、タスク感度といった本質的な設計問題が見えなくなる。
量子化器は、入力に存在した違いを二つに分ける。一つは、目的のために残す違いである。もう一つは、同じものとして扱う違いである。
| 残す区別 | 捨てる区別 |
|---|---|
| 最終出力を大きく変える差を残す。 | 最終出力へほとんど伝わらない差を捨てる。 |
| 頻繁に現れ、平均損失へ強く影響する差を残す。 | 低確率かつ低損失な差を粗く扱う。 |
| 判断境界や知覚上重要な差を残す。 | 用途上識別する必要のない差を同一視する。 |
| 誤差が後続計算で増幅される方向を保護する。 | 誤差が相殺または減衰する方向の精度を下げる。 |
有限のコード数では、すべての違いを残せない。量子化の技術的な中心は、丸め式そのものではなく、限られた識別能力をどこへ配分するかにある。
量子化とは、精度を一律に下げることではない。目的に必要な区別と不要な区別を分け、不要と判断した差を同じ状態へまとめることである。その判断が適切なら、記憶量、通信量、演算量を減らしながら必要な機能を保てる。判断を誤れば、数値上は小さな誤差でも、目的に必要な差を失う。
量子化の正体は、値を粗くすることではない。有限の表現能力の中で、何を違うものとして残し、何を同じものとして扱うかを決めることである。
参考文献
- Robert M. Gray and David L. Neuhoff, “Quantization,” IEEE Transactions on Information Theory, Vol. 44, No. 6, 1998. https://pzs.dstu.dp.ua/ComputerGraphics/ic/bibl/Gray_and_Neuhoff__1998.pdf
- W. R. Bennett, “Spectra of Quantized Signals,” Bell System Technical Journal, Vol. 27, 1948. https://onlinelibrary.wiley.com/doi/10.1002/j.1538-7305.1948.tb01340.x
- P. F. Panter and W. Dite, “Quantization Distortion in Pulse-Count Modulation with Nonuniform Spacing of Levels,” Proceedings of the IRE, Vol. 39, 1951. https://ieeexplore.ieee.org/document/1701410/
- Joel Max, “Quantizing for Minimum Distortion,” IRE Transactions on Information Theory, Vol. 6, No. 1, 1960. https://web.stanford.edu/class/ee398a/handouts/papers/Max%20-%20Quantizing%20for%20Min%20Distortion.pdf
- Stuart P. Lloyd, “Least Squares Quantization in PCM,” IEEE Transactions on Information Theory, Vol. 28, No. 2, 1982. https://ieeexplore.ieee.org/document/1056489
- Allen Gersho, “Principles of Quantization,” IEEE Transactions on Circuits and Systems, Vol. 25, No. 7, 1978. https://doi.org/10.1109/TCS.1978.1084519
- L. Schuchman, “Dither Signals and Their Effect on Quantization Noise,” IEEE Transactions on Communication Technology, Vol. 12, No. 4, 1964. https://doi.org/10.1109/TCOM.1964.1088973
- Stanley P. Lipshitz, Robert A. Wannamaker and John Vanderkooy, “Quantization and Dither: A Theoretical Survey,” Journal of the Audio Engineering Society, Vol. 40, 1992. https://secure.aes.org/forum/pubs/journal/?elib=7047
- Yoseph Linde, Andrés Buzo and Robert M. Gray, “An Algorithm for Vector Quantizer Design,” IEEE Transactions on Communications, Vol. 28, No. 1, 1980. https://ieeexplore.ieee.org/document/1094577
- Allen Gersho, “Asymptotically Optimal Block Quantization,” IEEE Transactions on Information Theory, Vol. 25, No. 4, 1979. https://ieeexplore.ieee.org/document/1056067
- Allen Gersho and Robert M. Gray, Vector Quantization and Signal Compression, Kluwer Academic Publishers, 1992. https://link.springer.com/book/10.1007/978-1-4615-3626-0
- Siegfried Graf and Harald Luschgy, Foundations of Quantization for Probability Distributions, Springer, 2000. https://link.springer.com/book/10.1007/BFb0103945
- Claude E. Shannon, “A Mathematical Theory of Communication,” Bell System Technical Journal, Vol. 27, 1948. https://people.math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf
- Herbert Gish and John N. Pierce, “Asymptotically Efficient Quantizing,” IEEE Transactions on Information Theory, Vol. 14, No. 5, 1968. https://doi.org/10.1109/TIT.1968.1054193
- Claude E. Shannon, “Coding Theorems for a Discrete Source with a Fidelity Criterion,” IRE National Convention Record, Vol. 7, 1959. https://gwern.net/doc/cs/algorithm/information/1959-shannon.pdf
- IEEE, IEEE Standard for Floating-Point Arithmetic, IEEE Std 754-2019, 2019. https://standards.ieee.org/ieee/754/6210/
- Nicholas J. Higham, Accuracy and Stability of Numerical Algorithms, 2nd ed., Society for Industrial and Applied Mathematics, 2002. https://doi.org/10.1137/1.9780898718027
- Suyog Gupta, Ankur Agrawal, Kailash Gopalakrishnan and Pritish Narayanan, “Deep Learning with Limited Numerical Precision,” Proceedings of the 32nd International Conference on Machine Learning, 2015. https://proceedings.mlr.press/v37/gupta15.html
- Dan Alistarh, Demjan Grubic, Jerry Li, Ryota Tomioka and Milan Vojnovic, “QSGD: Communication-Efficient SGD via Gradient Quantization and Encoding,” Advances in Neural Information Processing Systems, 2017. https://proceedings.neurips.cc/paper/2017/hash/6c340f25839e6acdc73414517203f5f0-Abstract.html
- Benoit Jacob et al., “Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference,” Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition, 2018. https://openaccess.thecvf.com/content_cvpr_2018/papers/Jacob_Quantization_and_Training_CVPR_2018_paper.pdf
- Tim Dettmers et al., “LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale,” 2022. https://arxiv.org/abs/2208.07339
- Guangxuan Xiao et al., “SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models,” Proceedings of the 40th International Conference on Machine Learning, 2023. https://proceedings.mlr.press/v202/xiao23c.html
- Elias Frantar et al., “GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers,” International Conference on Learning Representations, 2023. https://arxiv.org/abs/2210.17323
- Ji Lin et al., “AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration,” 2023. https://arxiv.org/abs/2306.00978
- Tim Dettmers et al., “QLoRA: Efficient Finetuning of Quantized LLMs,” Advances in Neural Information Processing Systems, 2023. https://proceedings.neurips.cc/paper_files/paper/2023/hash/1feb87871436031bdc0f2beaa62a049b-Abstract-Conference.html
- id774, MacBook Pro でローカル LLM を実用化する条件(2026-07-17)。https://blog.id774.net/entry/2026/07/17/5102/
- id774, MacBook Pro にローカル RAG を構築する(2026-07-18)。https://blog.id774.net/entry/2026/07/18/5104/
- Merriam-Webster, “Quantum.” https://www.merriam-webster.com/dictionary/quantum
- Max Planck, “On the Law of Distribution of Energy in the Normal Spectrum,” 1901. https://strangepaths.com/files/planck1901.pdf
- Werner Heisenberg, “Quantum-Theoretical Re-interpretation of Kinematic and Mechanical Relations,” 1925. https://www.staff.uni-mainz.de/doria/WH.pdf
- P. A. M. Dirac, “The Fundamental Equations of Quantum Mechanics,” Proceedings of the Royal Society A, Vol. 109, 1925. https://royalsocietypublishing.org/doi/10.1098/rspa.1925.0150