PEFT documentation
PEANuT: 重み認識型ニューラルツイーカーによるパラメータ効率の良い適応
PEANuT: 重み認識型ニューラルツイーカーによるパラメータ効率の良い適応
PEANuTは、重み認識型ニューラルツイーカーを導入し、凍結された事前学習済み重みそのものからアダプター更新を生成するパラメータ効率の良いファインチューニング手法です。LoRAのように純粋な線形低ランク更新を学習するのではなく、PEANuTはアダプター変換をベース重みに条件付けます。これにより、学習可能なパラメータ数を小さく保ちながら、より表現力のある更新ルールを実現します。
PEANuTは、入力投影A、出力投影B、および任意の非線形活性化を備えた中間残差エンコーダー/デコーダーのペアを使用します。これにより、重み非依存の線形アダプターよりも複雑な更新パターンをモデル化することが可能になりながら、PEFTの枠組み内に留まることができます。
PEANuTには現在、以下のトレードオフがあります:
利点:
- 線形低ランク更新よりも高い理論的な表現力。
- 同様の予算条件下で、幅広いタスクにおいてLoRAよりも優れたパフォーマンスを発揮します。
- 非常に少ないパラメータ数の環境で良好に動作します。例えば、学習可能なパラメータが
0.2M程度の場合などです。
デメリット:
ΔWが適用される前に明示的に構築されるため、LoRAよりもメモリ使用量が高くなります。- LoRAよりも学習と推論が遅く、中間層が深いほどオーバーヘッドがさらに増加します。
- 非線形性は、特に学習率や関連する最適化設定において、より慎重なハイパーパラメータの調整を必要とする場合があります。
これらのトレードオフが使用ケースに合わない場合は、LoRAなどの他のPEFTメソッドを検討してください。
論文の抄録は以下の通りです:
大規模な事前学習済みファウンデーションモデルのファインチューニングは、下流タスクで優れた性能を発揮する傾向がありますが、すべてのパラメータを更新する場合、計算コストが非常に高くなります。LoRAなどのパラメータ効率の良いファインチューニング(PEFT)手法は、軽量な更新モジュールを導入することでこの問題を緩和しますが、重みに依存しない線形近似に依存していることが多く、表現力が制限されています。本研究では、PEANuTという新しいPEFTフレームワークを提案します。PEANuTは、重みに依存するニューラルツイーカーを導入し、凍結された事前学習済み重みに条件付けられたタスク適応型の更新を生成するコンパクトなニューラルモジュールです。PEANuTは、モデル全体のチューニングなしで複雑な更新パターンを捉えるための、柔軟かつ効率的な手法を提供します。理論的に、PEANuTは既存の線形PEFT手法と同等か少ないパラメータ数で、同等以上の表現力を実現することを示します。4つのベンチマーク、20以上のデータセットにわたる広範な実験により、PEANuTはNLPタスクとビジョンタスクの両方で強力なベースラインを一貫して上回り、かつ計算オーバーヘッドを低く保つことが示されました。
ベンチマーク概要
API
PeanutConfig
クラス peft.PeanutConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 32depth: int = 0act_fn: str = 'relu'scaling: float = 1.0target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = Nonelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Noneinit_weights: bool = True )
パラメータ
- r (
int) — PEANuTのランク。アダプターが使用する隠れ次元です。LoRAのランクと同様に、rを大きくすると、アダプターの容量と学習可能なパラメータ数が増加します。 - depth (
int) — PEANuTにおけるエンコーダー/デコーダー各側の隠れアダプター層の数。入力射影Aと出力射影Bは、これらの隠れ層に加えて常に存在します。したがって、depthは非負の整数でなければなりません。depth=0:A,B.depth=1:A、エンコーダー1つ、デコーダー1つ、B。depth=2:A、エンコーダー2つ、デコーダー2つ、B。depth=3:A、エンコーダー3つ、デコーダー3つ、Bなど。
- act_fn (
str) — PEANuTネットワークで適用される非線形活性化関数です。これはバニラPyTorch実装のnon_linearに対応します。デフォルトは"relu"です。transformers.activations.ACT2FNで利用可能な任意の活性化キーがサポートされており、タスクによってパフォーマンスが向上する場合があります。 - scaling (
float) — PEANuTの出力を、凍結されたベース層の出力に足し合わせる前に適用するスカラー乗数です。最終的なアダプタの寄与はscaling * (x @ delta_w)となります。 - target_modules (
Union[List[str], str], 省略可) — PEANuTを適用するモジュールの名前です。モジュール名の文字列のリスト(例:['q_proj', 'v_proj'])または正規表現パターンを指定できます。 - modules_to_save (
List[str], 任意) — PEANuT レイヤーを除き、最終チェックポイントで学習可能かつ保存されるように設定するモジュールのリスト。 - exclude_modules (
Union[List[str], str], 省略可) — アダプタを適用しないモジュールの名前です。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。 - layers_to_transform (
Union[list[int], int], 省略可) — 変換対象のレイヤーのインデックスです。この引数が指定されている場合、PEFT はこのリストに指定されたレイヤーのインデックスのみを変換します。単一の整数が渡された場合、PEFT はそのインデックスのレイヤーのみを変換します。 - layers_pattern (
Optional[Union[List[str], str]]、省略可) —layers_to_transformが None ではなく、かつレイヤーパターンが共通のレイヤーパターンに含まれていない場合にのみ使用される、レイヤーパターンの名前です。 - init_weights (
bool) — デフォルトの初期化スキームを使用して PEANuT アダプターの重みを初期化するかどうか:Trueの場合:Bを除くすべての重みがKaiming uniformで初期化され、Bはゼロで初期化されます。Falseの場合: すべての重み(Bを含む)はKaiming uniformで初期化されます。
Bをゼロに初期化することで、アダプターは完全に何もしない状態から開始します。
これはPeanutModelの設定を保存するための設定クラスです。
Notes:
PEANuTは、ベースの重みに条件付けられたデルタ重みを用いる重み認識パスウェイを使用します。Aアダプタはベースの重みの出力次元に適用されるため、Aの形状はLoRA系の手法で通常使用される(in_dim -> r)ではなく、(out_dim -> r)となります。
PeanutModel
class peft.PeanutModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
パラメータ
- model (
torch.nn.Module) — 適応させる対象のモデル。 - config (PeanutConfig) — PEANuTモデルの設定です。
- adapter_name (
str) — アダプターの名前。デフォルトは"default"です。
戻り値
torch.nn.Module
PEANuT PEFTモデル。
事前学習済みのTransformersモデルからPEANuTモデルを作成します。
この手法の詳細は、https://arxiv.org/abs/2410.01870に記載されています。
属性:
- model (PreTrainedModel) — 適応させる対象のモデル。
- peft_config (PeanutConfig): PEANuTモデルの設定です。