四ビットのうち三つを捨てても、ほとんど気づかない。 学習済みモデルとは、長く正確な数値が何十億も並んだものだ。量子化はそのひとつひとつをはるかに粗い値に丸める——十六ビットを四ビットへ——それでも答えはほとんど同じ。盆栽のように:大樹の全体の姿を、ほんの一握りの木で保つ。利点は本物だ。サーバーを埋め尽くしていたモデルが、ほんの一部のハードウェアに収まる。
コストは考えることではない。数を運ぶことだ。 M=P⋅b8 bytesM = \dfrac{P \cdot b}{8}\ \text{bytes} 一語を書くたびに、モデルは何十億もの重みをひとつ残らずメモリから運び出す——次の語でまた同じことを繰り返す。ボトルネックは計算ではなく、運搬だ。家財を階上へ運ぶ引っ越し屋のように:労力は運ぶことそのもの、何度も往復することであって、どこへ置くか決めることではない。請求書は単に数×サイズだ:七十億の重みが十六ビットなら十四ギガバイト、四ビットなら三・五ギガバイト。
手口は、すべての数を最も近い段に丸めること。 q=round (xs),x^=s qq = \mathrm{round}\!\left(\dfrac{x}{s}\right), \qquad \hat{x} = s\,q なめらかな十六ビットの値は捨て、短いはしごの最も近い段だけを、小さな整数として残す。靴のサイズのように:足は紙一重で違うのに、在庫はわずかな決まったサイズしかないから、どの足も一番近いものを取る。平たく言えば、刻み幅で割り、整数に丸める——保存するのはその整数だけ——使うときは掛け戻す。
段はどこに置く? いちばん大きな数で決める。 s=maxi∣xi∣2 b−1−1s = \dfrac{\max_i |x_i|}{2^{\,b-1} - 1} 刻み幅はどれくらいにする? いちばん大きな重みを取り、それを最上段に乗せ、残りをゼロまで均等に並べる。一枚の板を等しい板材に切り分けるように:多く取れば一枚ずつは細かくなり、少なければ一枚ずつ粗くなる。ビットが少ない代償は明白だ。四ビットでは七段がゼロの片側に取れるだけ——十六ビットなら三万を超える。
なぜ持ちこたえるか:数は寄り集まり、どれもほとんど動かない。 ∣x−x^∣≤s2\lvert x - \hat{x}\rvert \le \dfrac{s}{2} うまくいくのは、学習済みの重みが散らばっていないからだ——ほとんどがゼロの近くに寄り集まる。その塊に合わせた短いはしごはほぼすべてを捕らえ、丸めは一つひとつを多くても半段しか動かさない。ベイトボールのように:群れ全体がひとつのきつい球に詰まり、まわりの水は空っぽ——だから魚が本当にいるところに、わずかな目印を置く。何十億にもわたれば、小さな過不足は打ち消し合う。
たったひとつの巨大な外れ値が、全員を台無しにする。 sg=maxi∈g∣xi∣2 b−1−1s_g = \dfrac{\max_{i \in g} |x_i|}{2^{\,b-1} - 1} ところが、ごく一部の重みは桁違いの怪物だ——ほかよりずっと大きい。はしごをその怪物に合わせると、寄り集まった全体がただ一段に崩れ落ち、細部はすべて失われる。直し方は、一本のはしごを共有しないこと——重みを小さな組に分け、それぞれに自前の刻み幅を、その組のいちばん大きな値に合わせて持たせる。若木を見下ろす巨大セコイアのように:すべてをセコイアで測れば、どの若木もゼロと出る——だから小さいものは、それ自身の物差しで測る。
ビットは四分の一。それでもほぼ同じ知性。 M16M4=164=4×\dfrac{M_{16}}{M_{4}} = \dfrac{16}{4} = 4\times すべてを合わせると、十六ビットの巨人が四ビットで動く——メモリは四分の一、答えはほぼ同じ。知識を担っていたのは重みのかたち——どれがどちらへ傾くか、どう関わり合うか——であって、末尾の細かな小数ではない。影絵のように:牡鹿をただの黒い輪郭に平らにし、色も質感もなくしても、それはやはり、まぎれもなく牡鹿だ。
四分の三が捨ててよかったなら、それは何のためにあった? 十六ビットのうち十二を焼き捨てても、モデルは少しも惜しまなかった。では、それははじめから無駄な——死に重りだったのか? それとも、その余白こそ学ぶあいだに必要としたゆとり、建物が立てば外せる足場だったのか? 🌱 どんな知性も、どれだけが荷を支える柱で、どれだけがただ育つための空間なのだろう?