PEFTとは
Parameter-Efficient Fine-Tuning / パラメータ効率的ファインチューニング
モデルの大部分を凍結し、少数のパラメータだけを学習してファインチューニングする手法の総称
ひとことで言うと
巨大なAIモデルの全体を作り直すのではなく、ごく一部の部品だけを差し替えて調整する省エネなカスタマイズ方法のまとめ言葉。
概要
PEFT(Parameter-Efficient Fine-Tuning)とは、モデルの大部分の重みを凍結し、少数の追加・選択パラメータだけを学習してファインチューニングする手法の総称を指す。 全パラメータを更新するフルファインチューニングは、大規模モデルでは膨大なGPUメモリを要する。そこで、低ランク行列を挿入するLoRAや小さな中間層を挟むアダプターなど、更新対象を絞る手法が発展した。 少ない計算資源で実用的な適応性能を得られ、タスクごとの差分を小さなファイルとして管理できるため、LLMのファインチューニングの標準的な選択肢になっている。
歴史
アダプターによる手法は2019年のHoulsbyらの研究が知られ、2021年のLoRAの発表以降に広く普及した。Hugging Faceが2023年に公開した同名のライブラリも定着に寄与した。
アーキテクチャ
ベースモデルの大部分の重みを凍結したまま、少数の追加パラメータのみを学習可能にする。LoRAは注意機構等の重み行列に低ランクの差分行列を並列に追加し、その差分行列のみを学習する。アダプター手法は各層に小さなボトルネック型のフィードフォワード層を挿入して学習する。プロンプトチューニングは、入力に連結する少数の学習可能な埋め込み(ソフトプロンプト)のみを学習する。
ワークフロー
事前学習済みモデルの重みを凍結する → LoRAやアダプター等の追加パラメータをモデルへ組み込む → タスク固有のデータで追加パラメータのみを学習する → 推論時はベースモデルと追加パラメータを組み合わせて使用する(LoRAの場合は重みへ統合することも可能)。
コード例
Hugging Face PEFTライブラリでのLoRA設定
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
config = LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, config)
model.print_trainable_parameters()利点
- 学習対象のパラメータ数が少ないため、フルファインチューニングよりGPUメモリと計算コストを節約できる
- タスクごとの差分パラメータを小さなファイルとして保存・切り替えでき、複数タスク向けの成果物を管理しやすい
- ベースモデルの重みを変えないため、複数のタスク向けアダプターを同じベースモデルへ使い回せる
欠点
- フルファインチューニングに比べ、タスクによっては到達できる性能に上限が生じる場合もある
- 手法やハイパーパラメータ(ランク数、挿入位置等)の選択が性能に影響し、チューニングの試行錯誤が必要
- 手法の種類が多く、LoRA・アダプター・プロンプトチューニング等からモデルやタスクの特性に応じて選定する知識が必要になる
比較
- LoRA — LoRAはPEFTの代表的な一手法で、PEFTはLoRAのほかアダプターやプロンプトチューニングなどを含む総称
- ファインチューニング — フルファインチューニングが全パラメータを更新するのに対し、PEFTは少数のパラメータだけを更新して計算資源を節約する
関連用語
よくある質問
PEFTはいつ使うべき?
GPUメモリやデータ量が限られる場合や、複数タスク向けに軽量な差分だけを管理したい場合に適している。潤沢な計算資源があり最大限の性能を追求する場合はフルファインチューニングが選ばれることもある。
参考文献
- GitHubhuggingface/peft