枝刈りとは
枝刈り(Pruning)は、ニューラルネットワークから重要度の低いパラメータや接続を除去することでモデルを軽量化する技術です。人間の脳の神経回路が発達過程で不要なシナプスを刈り込む仕組みに着想を得ています。モデルのサイズと計算コストを削減しながら、性能をできるだけ維持することを目的としています。
| ひとことで言うと | 重要度の低い接続やパラメータを削って、モデルを軽くする技術。 |
|---|---|
| 何がうれしいか | 多くのモデルは冗長で、半分近く削っても精度がほとんど落ちない。 |
| 注意点 | バラバラに削ると実行速度は上がりにくい。まとまりで削る手法が実用的。 |
枝刈りの種類
非構造的枝刈り(Unstructured Pruning)は、個々の重みを対象にゼロに設定する手法で、高い圧縮率を達成できますが、スパース行列の効率的な演算にはハードウェアサポートが必要です。構造的枝刈り(Structured Pruning)は、フィルタ、チャネル、アテンションヘッドなどの構造単位で除去する手法で、標準的なハードウェアでも高速化が得られます。
1学習済みモデル全接続が生きた状態
▶
2重要度を測る重みの小ささなどで判定
▶
3不要な接続を削除しきい値以下を切る
▶
4再学習で回復落ちた精度を取り戻す
↺ 2〜4を少しずつくり返すと、精度を保ったまま大きく削れる
重要度の評価方法
枝刈りの鍵は、どのパラメータが重要でないかを判断する基準です。重みの絶対値に基づく手法(Magnitude Pruning)が最もシンプルで広く使用されています。その他、勾配情報を利用する手法、テイラー展開に基づく手法、「宝くじ仮説」(Lottery Ticket Hypothesis)に基づいて初期化時点から重要な部分ネットワークを見つける手法など、さまざまなアプローチが研究されています。
枝刈りの実践
実践的には、学習済みモデルを枝刈りした後に再学習(Fine-tuning)するアプローチが一般的です。段階的に枝刈り率を上げていく反復的枝刈りは、一度に大幅に枝刈りするよりも性能の維持に効果的です。近年では、SparseGPTやWandaなど、大規模言語モデルに特化した枝刈り手法も開発されています。