量子化と蒸留:モデルを小さくする
モデルを縮める二つの異なる方法。一方は数値を変え、もう一方は小さな複製を学習させます。それぞれの仕組みと、どちらに手を伸ばすべきかを解説します。
大きなモデルは動かすのに費用がかかります。多くのメモリと多くの計算を必要とし、小さなモデルより遅く応答します。だから実用的なAIの仕事の多くは、目立って劣化させることなくモデルを小さくすることに関わっています。その取り組みを支配する技術が二つあり、まったく異なる原理で働くにもかかわらず、しばしば一緒に語られます。量子化は、モデルの数値をより小さく格納することでモデルを縮めます。蒸留は、大きなモデルを模倣するよう小さなモデルを学習させることでモデルを縮めます。違いを理解することが、どのレバーを引くべきかを知る鍵です。
本稿は、両者を平易な言葉で説明し、それぞれが行うトレードオフをたどり、そもそも小ささが正しい目標になるのはいつかを考える実用的な方法を示します。
なぜサイズは解くに値する問題なのか
モデルは突き詰めれば、パラメータと呼ばれる膨大な数値の集まり、すなわち学習中に学んだ値です。大きなモデルはより多くのパラメータを持ち、より多くのパラメータは、保持するためのより多くのメモリと、動かすためのより多くの算術を意味します。それは直接、コスト、レイテンシ、そしてモデルが物理的にどこに存在できるかに変換されます。スマートフォンや控えめなサーバーで動くほど小さいモデルは、データセンターの巨大なモデルが安価にも素早くも提供できない用途を切り開きます。
だから圧縮の目標は、小ささそのものではありません。能力をできるだけ多く保ちながら、モデルをメモリ、費用、時間のより厳しい予算に収めることです。興味深い問いは常に同じです。あなたのタスクにとって意味のある形で品質が落ちる前に、どこまで縮められるか。
量子化:同じモデルをより小さく格納する
モデルのすべてのパラメータは数値であり、数値は異なる精度の水準で格納できます。高精度の数値は細かな段階を捉えるために多くのビットを確保し、低精度の数値はより少ないビットを使い、値をより粗く捉えます。量子化とは、モデルのパラメータを高精度から低精度へ変換する行為、すなわち各数値をより小さな空間に詰め込むことです。
直感は、写真を低い品質設定で保存するのに似ています。画像はまだ見分けがつき、ファイルははるかに小さく、たいていの目的では違いが分かりません。量子化されたモデルは同じ構造と同じ学習した知識を保ちます。ただ各値をより粗く表現するだけです。数値が占める場所が小さくなるので、モデルはより少ないメモリを使い、しばしばより速く動きます。小さい数値を移動し掛け合わせるほうが安上がりだからです。
落とし穴は、粗い数値が細部を失うことです。精度を十分に低く押し下げると、丸め誤差が積み重なり、ついにはモデルの振る舞いが劣化します。答えの正確さが落ち、特に難しいタスクで顕著になります。スイートスポットがあり、それを見つけることがすべてです。控えめな量子化は品質的にほぼ無償であることが多く、攻めた量子化は痛みを伴い始めます。
蒸留:大きなモデルを模倣する小さなモデルを学習させる
蒸留は別の道を取ります。既存のモデルの数値を圧縮する代わりに、新しく小さなモデルを一から作り、大きなモデルを真似るよう学習させます。大きなモデルが「教師」、小さなモデルが「生徒」で、生徒は教師の出力を見て、それを再現しようとすることで学びます。
これが、小さなモデルを生のデータで単純に学習させるよりうまくいく理由は微妙です。教師モデルが入力に応答するとき、その出力は単なる正誤のラベルより多くの情報を運びます。教師が異なる可能性をどう重み付けるかを反映しており、それは問題の構造について何かを捉えています。生徒はその豊かなシグナルから学びます。結果として、模倣するよう学習させられた種類の入力に対して、教師に驚くほど近い性能を出す、はるかに小さなモデルになりえます。教師の学んだ判断を、一人で再発見するのではなく受け継いだからです。
ここでの落とし穴は量子化のものとは異なります。蒸留されたモデルは真に別の、より小さなモデルなので、その上限はより低くなります。教師が実演した領域ではうまくやる傾向があり、その領域から遠い入力では崩れることがあります。蒸留はまた、前もって実質的な労力を要します。学習プロセスを動かさねばなりません。一方、量子化は完成したモデルに比較的すばやく適用できます。
核心的な違いを、はっきり述べる
量子化は同じモデルを保ち、その数値がどう格納されるかを変えます。蒸留は大きなモデルを捨て、それのように振る舞う新しく小さなモデルを学習させます。一方は表現の変更、もう一方はモデルの変更です。その区別が、両者のあらゆるトレードオフを説明します。量子化は適用が速く、元の完全な構造を保ちますが、品質が落ちる前にどこまで縮められるかに限界があります。一方、蒸留は劇的に小さく速いモデルを生み出せますが、学習の労力を要し、真に上限の低いモデルを生みます。
両者の選択、そして組み合わせ
実用的な問いは、あなたの制約が実際に何かです。気に入ったモデルがあり、ただより少ないメモリに収めるか少し速く動かす必要があるだけなら、量子化が労力の少ない最初の一手です。控えめな水準を適用し、自分のタスクで品質を計測し、劣化する前に止めましょう。量子化単独で届くより、はるかに小さく速いもの、すなわち制約の厳しいデバイスに収まるほど小さいか、非常に高い量で動かせるほど安いものが必要なら、蒸留がそこへ連れて行く重い道具です。
肝心なのは、両者がライバルではないことです。異なる原理で働くので、積み重なります。よくある本番の道筋は、大きなモデルを小さな生徒へ蒸留し、それからその生徒を量子化して、両種類の節約を捉えることです。蒸留による小さなモデルがパラメータ数を減らし、量子化が残る各パラメータの格納コストを減らします。各段階で品質を計測し続ける限り、両者を合わせればどちらか単独よりはるかに圧縮できます。
やり過ぎたかどうかを知る方法
どちらの技術も、それがあなたのアプリケーションを損なったときを教えてはくれません。教えるのはあなた自身の評価だけです。規律はどちらの場合も同じです。実際のタスクを代表する入力を少数集め、良い出力がどう見えるかを明確に定め、まさにその入力で圧縮モデルを元のモデルと比べましょう。特に難しい例とエッジケースに注目しましょう。圧縮は、簡単なものを問題なく見せたまま、難しいタスクをまず劣化させる傾向があるからです。単純な入力はなお難なくこなすのに、難しいものを静かに失敗するモデルは、スイートスポットを越えて縮めた典型的なサインです。
まとめ
量子化と蒸留はどちらもモデルを小さくしますが、同じ一手ではありません。量子化は同じモデルの数値をより小さく格納します。適用が速く、構造が保たれ、どこまで縮むかに限界があります。蒸留は新しく小さなモデルを大きなものを模倣するよう学習させます。より多くの労力、はるかに大きな縮小、より低い上限です。制約で選び、必要なら組み合わせ、自分のタスクから作った評価に、小さいが小さすぎになったときを教えさせましょう。小さいことが良いのは、あなたが実際に必要とすることにおいてなお十分に良いときだけです。
