FLAP(特徴量ベースプルーニング)(ふらっぷ とくちょうりょうべーすぷるーにんぐ)
FLAP(Fluctuation-based Adaptive Structured Pruning)は2024年にAn et al.が発表したLLM向け構造化プルーニング手法。特徴量の変動(fluctuation)を重要度指標とし、Attention headとFFNの中間ニューロンを再学習なしで構造的に削除する。LLaMA-2 7Bで20〜30%削除しながらperplexityの上昇をSparseGPT並みの1〜2ptに抑えられる。
FLAPとは
FLAP(Fluctuation-based Adaptive Structured Pruning)は2024年にAn et al.が発表したLLM向け構造化プルーニング手法です。WandaやSparseGPTの非構造化プルーニングと異なり、Attention頭(head)やFFNの中間ニューロンを丸ごと削除するため、削除後のモデルは標準的な密行列として動作します。再学習は不要で、128サンプルのキャリブデータのみで動作します。
重要度指標:Fluctuation(変動)
FLAPの名前の由来でもある「fluctuation(変動)」は、特徴量の入力分散です。
Fluctuation score(j) = Var(X_j)
考え方: キャリブレーションデータでの活性化がほぼ常に同じ値(分散が低い)のニューロンは、入力に関係なく固定的な出力を返すため情報価値が低く、安全に削除できます。
これはWandaの重み×活性化ノルム方式と異なり、活性化の一貫性に着目する点がユニークです。
アダプティブ構造削除の流れ
1. キャリブレーションデータ128サンプルを各レイヤーに通す
2. 各Attention head / FFNニューロンの活性化変動を計算
3. 変動が低いhead/ニューロンをターゲット削除率まで削除
4. 削除後のバイアス補正(削除したニューロンの平均活性化を残留ニューロンに加算)
5. 新しいアーキテクチャとして保存
ステップ4のバイアス補正がFLAPの精度維持の鍵で、削除したニューロンが持っていた定数的な寄与を残留ニューロンに転嫁します。
主要モデルでの性能比較
| モデル/手法 | 削除率 | Perplexity(WikiText2) | BoolQ | ARC-E | 平均 |
|---|---|---|---|---|---|
| LLaMA-2 7B 元 | 0% | 5.47 | 71.0 | 76.3 | 73.7 |
| FLAP 20% | 20% | 6.34 | 68.2 | 72.1 | 70.2 |
| SliceGPT 20% | 20% | 6.51 | 67.8 | 71.5 | 69.7 |
| LLM-Pruner 20% | 20% | 7.22 | 64.3 | 68.9 | 66.6 |
| SparseGPT 50% | 50% | 6.51 | 68.1 | 73.2 | 70.7 |
| Wanda 50% | 50% | 6.83 | 66.9 | 71.4 | 69.2 |
FLAPの構造化20%削除はWandaの非構造化50%と同程度の性能を維持しながら、モデルが物理的に小さくなる利点があります。
Attention ヘッド削除とFFNニューロン削除の配分
FLAPはAttention headとFFNニューロンを同じ変動スコアで統一的に評価し、削除先を自動的に配分します(adaptive)。例えば20%削除指定時:
LLaMA-2 7B(20%削除時の典型的配分):
- Attention heads: 32heads/層 → 平均25〜26head/層
- FFN中間次元: 11008 → 約8800
- 総パラメータ: 6.74B → 約5.4B(約20%削減)
従来の手法では「headを何%削除、FFNを何%削除」と個別設定が必要でしたが、FLAPは変動スコアの統一指標でワンショット最適化します。
実装とHugging Face対応
公式コード CASIA-IVA-Lab/FLAP(GitHub)。LLaMA-2 7Bを20%削除する場合:
git clone https://github.com/CASIA-IVA-Lab/FLAP && cd FLAP && pip install -r requirements.txt
python flap.py --model meta-llama/Llama-2-7b-hf --pruning_ratio 0.20 --device cuda --eval_device cuda --save_model ./flap_llama2_7b_20/
出力は通常のHugging Faceモデルとして保存され、AutoModelForCausalLM.from_pretrained()でロードできます。
実用選択ガイド
FLAPを選ぶべき場面:
- 20〜25%の構造化削減が必要でdeployが標準環境
- SliceGPTより実装が単純なものが必要
- LLaMA/Mistral系の効率的なエッジ展開
FLAPより他を選ぶ場面:
- 50%以上の大幅削減 → SparseGPTやWanda(非構造化)
- 精度最優先の80%削減 → Sheared LLaMA(ファインチューン必要)
FAQ
Q: FLAPとSliceGPTはどちらが良いですか? A: ベンチマーク上はほぼ同等ですが、FLAPはPCA変換なしで実装がシンプルです。SliceGPTは理論的基盤が厚く、大きいモデル(70B以上)での安定性が研究されています。
Q: 削除率20%と30%で効果はどう変わりますか? A: LLaMA-2 7Bでperplexityは20%で+0.9pt、30%で+2.1ptと急増します。実用上は20〜25%が精度とサイズ削減のバランス点です。
Q: FLAPでLoRAファインチューニングは改善しますか? A: はい。削除後に数百Mトークンのfine-tuningを加えるとperplexityが元の+0.3〜0.5pt程度まで回復するとの報告があります。