発展:モデルを小さく速くする(蒸留・量子化・プルーニング)
モデルの解釈性と圧縮のレッスンの続きとして、大きなモデルを小さく速くする工夫について、蒸留・量子化・プルーニング・宝くじ仮説の機構のレベルまで掘り下げます。なぜ軽くしたいのか、効きの弱い結合を削るプルーニングと宝くじ仮説、数を粗くする量子化、大きなモデルの振る舞いを小さなモデルに写す蒸留、そしてこれらの組み合わせと釣り合いまでを実装のコードは扱わず、なぜ小さくできるのかに絞って説明します。
ねらい
このレッスンは、モデルの解釈性と圧縮のレッスンの続きにあたる発展(はってん)の記事です。対象レッスンで名前の出た蒸留(じょうりゅう)・プルーニング・モデル圧縮をここでは機構のレベルまで掘り下げ、あわせて数を粗くする量子化(りょうしか)という現行の重要な工夫も加えます。大きなモデルは強い一方で、動かすのに大きな計算とメモリが要ります。それを性能をなるべく保ったまま小さく速くするのが、モデル圧縮です。
この記事は、ある程度の知識のある人に向けた深掘りです。ニューラルネットワークが重みのかたまりでできていること、エッジ AI という言葉(対象レッスン)を前提にします。実装のコードは扱いません。なぜ、性能を大きく落とさずにモデルを小さくできるのか、その理由に絞ります。
1. 効きの弱い結合を削る:プルーニングと宝くじ仮説
1つ目は、プルーニング(pruning)です。刈り込み、という意味の言葉です。ネットワークの中で、効きの弱い結合を削って、モデルを小さくします。
ニューラルネットワークには、たくさんの結合、つまり重みがあります。その中には、値がほとんど0に近く、出力にほとんど効いていない結合が、少なからずあります。プルーニングは、こうした効きの弱い結合を見つけて、取り除きます。効いていない結合を削るのですから、うまくやれば、性能をあまり落とさずに、重みの数を減らせます。削ったあとに、残った結合を学習し直して、性能を取り戻すこともします。
ここで、対象レッスンで触れた宝くじ仮説(たからくじかせつ、lottery ticket hypothesis)が関わってきます。宝くじ仮説とは、大きなネットワークの中には、単独で取り出して学習しても、元の大きなネットワークと同じくらいよく学べる、小さな部分ネットワークが潜んでいる、という仮説です。ちょうど、たくさんのくじの中に、当たりくじがまぎれているように、大きなネットワークの中に、それだけで十分に働く「当たり」の小さな部分がある、という見方です。もしこれが正しければ、大きく作ってから、その当たりの部分を残して周りを削る、という進め方に、根拠が与えられます。プルーニングが性能をあまり落とさずにモデルを小さくできるのは、こうした、大きなネットワークに含まれるむだと当たりの部分の存在によって、うまく説明されます。
ポイント
プルーニングは、効きの弱い結合を削ってモデルを小さくします。大きなネットワークには単独でもよく学べる小さな部分が潜む、という宝くじ仮説が、その背景にあります。
理解の確認
プルーニングは、出力にほとんど効いていない弱い結合を削ってモデルを小さくし、必要なら学習し直して性能を取り戻します。宝くじ仮説は、大きなネットワークの中に単独でもよく学べる小さな部分ネットワークが潜む、という仮説で、削っても性能を保てる背景を説明します。
2. 数を粗くする:量子化
2つ目は、量子化(quantization)です。重みや計算に使う数を粗い精度に置きかえて、モデルを軽くします。
ニューラルネットワークの重みは、ふつう、細かい精度の数で表されています。細かい精度の数は、正確なぶん、1つあたりの置き場所を多く使い、計算も重くなります。量子化は、この数をもっと粗い精度、たとえば段階の少ない数へと置きかえます。数を粗くすると、1つあたりの置き場所が小さくなり、モデル全体のメモリが減り、計算も速くなります。効率的なファインチューニングのレッスンで見た QLoRA も、この量子化を土台にしていました。
なぜ、粗くしても大きく壊れないのでしょうか。ニューラルネットワークは、もともと、多少のばらつきに強い性質を持っています。1つひとつの重みが、少しくらい粗くまるめられても、全体としての振る舞いは、大きくは変わりにくいのです。とはいえ、粗くしすぎれば、さすがに性能は落ちます。そこで、どこまで粗くしてよいかを見きわめたり、粗くしたあとに学習し直したりして、性能の落ち込みを抑えます。ここでは、量子化は数を粗くしてメモリと計算を減らす工夫で、ネットワークがばらつきに強いから成り立つ、と押さえてください。
理解の確認
量子化は、重みや計算に使う数を粗い精度に置きかえ、メモリと計算を減らす工夫です。ニューラルネットワークが多少のばらつきに強いため、粗くしても全体の振る舞いは大きく崩れにくいのですが、粗くしすぎると性能は落ちます。どこまで粗くするかを見きわめ、学習し直しで落ち込みを抑えます。
3. 振る舞いを小さなモデルに写す:蒸留
3つ目は、蒸留(distillation)です。正しくは知識の蒸留と呼ばれます。大きなモデルの振る舞いを小さなモデルに写し取って学ばせる工夫です。
やり方の芯は、こうです。まず、すでに高い性能を持つ、大きなモデルを用意します。これを教師(きょうし)と呼びます。次に、小さなモデルを用意し、これを生徒(せいと)と呼びます。生徒は、正解のラベルをまねるだけでなく、教師が出す答えの出し方そのものをまねるように学びます。
ここが蒸留のうまい点です。教師の出す答えには、正解のラベルだけからは分からない、豊かな手がかりが含まれています。たとえば、ある画像を「犬」と答えるとき、教師は「犬らしさが強いが、少し猫にも似ている」といった、確からしさの配り方まで示します。この、教師の答えの配り方を生徒がまねると、生徒は、正解だけを見て学ぶより、うまく学べます。教師が長い経験でつかんだ判断のこつを答えの出し方を通して受け継ぐ、というわけです。こうして、小さな生徒モデルが、大きな教師モデルに近い性能をはるかに軽い体で持てるようになります。ここでは、蒸留は、大きな教師モデルの答えの出し方を小さな生徒モデルにまねさせて、軽いのに賢いモデルを作る工夫だ、と押さえてください。
理解の確認
蒸留は、高性能な大きなモデル(教師)の答えの出し方を小さなモデル(生徒)にまねさせる工夫です。生徒は正解ラベルだけでなく、教師が示す確からしさの配り方までまねるため、正解だけを見て学ぶより、うまく学べます。小さな体で、教師に近い性能を持てるようになります。
4. 組み合わせと、釣り合い
ここまでの3つ、プルーニング・量子化・蒸留は、どれか1つを選ぶものではありません。組み合わせて使えます。
たとえば、大きなモデルから蒸留で小さなモデルを作り、そこからさらにプルーニングで結合を削り、最後に量子化で数を粗くする、というように重ねられます。それぞれが別の角度から軽くするので、重ねることで、より小さく速くできます。
ただし、どこまでも軽くできるわけではありません。ここには釣り合いがあります。小さくするほど、動かしやすくなりますが、あるところを越えると、性能がはっきり落ち始めます。どこまで軽くしてよいかは、使う場面が決めます。少しの性能低下も許されない場面なら、控えめに。多少落ちても、とにかく軽さと速さが要る場面なら、思い切って。目的に合わせて、軽さと性能の釣り合いをとるのが、モデル圧縮の勘どころです。
こうした圧縮の工夫は、エッジ AI を支えるだけでなく、大きなモデルを動かす費用や電力を抑えるうえでも、ますます大切になっています。のちの倫理のレッスンで扱う、学習や推論の電力消費の問題とも、地続きです。小さく速くすることは、動かしやすさと、資源の節約の、両方に効きます。
理解度の確認
説明できる項目にチェックを入れましょう。すべて確認できたら、完了ボタンで記録します。
分からなかった点・気になった点
読み込み中です。