PEFT(Parameter-Efficient Fine-Tuning)とは、機械学習(ML)において、大規模で事前に訓練されたモデル(基礎モデルのような)を、モデルの全パラメータを更新することなく、特定の下流タスクに適応させるために使用されるテクニックのコレクションを指す。その代わりに、PEFTの手法は、パラメータの小さなサブセットだけを変更したり、少数の新しいパラメータを追加したりすることに重点を置いている。このアプローチは、大規模な言語モデル(LLM)やコンピュータビジョン(CV)で使用される大規模なビジョンモデルなど、大規模なモデルの微調整に関連する計算コストやストレージコストを大幅に削減し、カスタマイズをより身近で効率的なものにします。
関連性とメリット
数十億ものパラメータを含む、非常に大規模な事前学習済みモデルの台頭により、従来のファインチューニング手法はリソース集約的なものとなっている。このようなモデルを完全に微調整するには、膨大な計算能力(多くの場合、複数のハイエンドGPU)、大容量のメモリ、および適応されたモデルごとにかなりのストレージ容量が必要です。PEFTは、いくつかの重要な利点を提供することで、これらの課題に対処します:
- 計算コストの削減:ごく一部のパラメータのみをトレーニングすることで、高価なハードウェアの必要性を大幅に減らし、トレーニング時間を短縮します。Ultralytics HUB Cloud Trainingのようなプラットフォームは、このプロセスをさらに効率化することができます。
- ストレージ要件の低減:元の大きなモデルは変更されないため、各タスクで保存する必要があるのは、変更または追加されたパラメータの小さなセットだけです。
- 壊滅的な忘却の軽減:事前学習されたモデルの重みの大部分を凍結することで、PEFTは、新しいタスクを学習する際に、モデルが事前学習中に獲得した一般的な知識を失うことを防ぎます。壊滅的忘却の克服についての詳細はこちら。
- 低データ領域での汎化の改善:少ないパラメータを微調整することで、少ないデータセットへのオーバーフィッティングのリスクを減らすことができるため、限られたデータのタスクでより良いパフォーマンスを発揮できることがある。
- より簡単な展開:タスク固有のパラメータセットを小さくすることで、特にエッジAIデバイスのようなリソースに制約のある環境でのモデル展開が簡素化されます。
キーコンセプトとテクニック
PEFTは転移学習の概念に基づいており、ベースモデルの知識を新しいタスクに適用する。標準的な微調整が多くの(あるいはすべての)レイヤーを調整するのに対して、PEFTは特殊な手法を採用する。一般的なPEFTの手法には以下のようなものがある:
- アダプター:事前に訓練されたモデルの既存の層の間に挿入される小さなニューラルネットワークモジュール。これらの新しいアダプター層のパラメータのみがトレーニングされる。詳細はオリジナルのAdapters研究論文を参照。
- LoRA (Low-Rank Adaptation):学習可能な低ランク行列を変換器アーキテクチャの層に注入し、学習可能なパラメータ数を大幅に削減しながら、重みの更新を近似する。
- プリフィックス・チューニング:学習可能な接頭辞ベクトルの小さなセットを変換層の入力に追加し、元の重みを変更することなくモデルの注意メカニズムに影響を与える。プリフィックス・チューニングの論文を読む。
- プロンプトチューニング:入力シーケンスの前に付加されたソフトプロンプト(連続ベクトル埋め込み)を学習し、特定のタスクに対するフローズンモデルの動作を誘導する。
Hugging Face PEFTライブラリのようなライブラリは、様々なPEFTメソッドの実装を提供している。
関連概念との区別
PEFTを他のモデル適応や最適化技術と区別することは重要だ:
- 完全な微調整:事前に訓練されたモデルのパラメータのすべて、または大部分を更新する。計算コストは高いが、十分なデータとリソースがあれば高いパフォーマンスを達成できる。
- モデルの刈り込み:学習済みモデルから冗長または重要でないパラメータ(重みまたは接続)を削除することで、モデルサイズと推論レイテンシを削減することを目的とする。PEFTとは異なり、プルーニングはタスク適応よりも圧縮に重点を置く。
- 知識の蒸留:より大きな「教師」モデルの出力や動作を模倣するために、より小さな「生徒」モデルをトレーニングする。PEFTが大きなモデルそのものを最小限の変更で直接適応させるのに対して、目標は小さなモデルにより良いパフォーマンスをもたらすために知識を伝達することである。
- ハイパーパラメータのチューニング:タスク適応のためにモデルパラメータを直接変更するのではなく、学習プロセスの最適な設定(学習率やバッチサイズなど)を見つけることに重点を置く。