PEFT documentation

GraLoRA

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

GraLoRA

Granular Low-Rank Adaptation (GraLoRA)は、量子化における周知の問題から得られた知見に基づき、低ランク適応の表現力を高めると同時に、外れ値アクティベーションに対する頑健性を向上させることを目的としたPEFT手法です。

GraLoRA Overview

標準的な LoRA が特徴空間全体に単一の低ランクアダプタを適用するのに対し、GraLoRA は構造化かつ細粒度の適応スキームを導入します。適応空間を 𝑘2𝑘^2 個のより小さく独立したアダプタペアのグリッドに分割し、それぞれが入力および出力次元の局所的な部分集合を担当します。その結果、各アダプタは元の LoRA アダプタよりも両次元ともに kk 倍小さい部分空間で動作します。

この細粒度な分解により、空間的に局所化された文脈認識型の更新が可能になり、追加のパラメータや計算コストなしに表現能力を効果的に高めることができます。GraLoRAは、より小さな部分空間内で極端な活性化の影響を分離することで、適応過程における勾配の歪みを軽減し、チャネル間のバランスを維持します。


論文の抄録は以下の通りです:

低ランク適応(LoRA)は、生成モデルのパラメータ効率の良いファインチューニング(PEFT)における人気のある手法であり、そのシンプルさと有効性から高く評価されています。最近の改善にもかかわらず、LoRAには根本的な制約が残っています。それは、ボトルネックを広げた際に過学習が発生することです。LoRAはランク32〜64で最も良い性能を発揮しますが、より高いランクでは精度が頭打ちになるか低下し、フルファインチューニング(FFT)の性能には依然として届きません。その根本原因は、LoRAの構造的ボトルネックであり、これが無関係な入力チャネルへの勾配の絡み合いを引き起こし、勾配伝播を歪めていると特定しました。これを解決するために、重み行列をサブブロックに分割し、それぞれに独自の低ランクアダプタを備えた新しい構造、Granular Low-Rank Adaptation(GraLoRA)を導入します。計算コストやストレージコストの増加はほぼ無視できるレベルでありながら、GraLoRAはLoRAの制約を克服し、表現容量を効果的に増加させ、FFTの挙動により近づきます。コード生成、常識推論、数学的推論、一般的な言語理解、画像生成の各ベンチマークにおける実験により、GraLoRAはLoRAや他のベースラインを一貫して上回り、HumanEval+のPass@1で最大+8.5%の絶対的な向上を達成しました。これらの改善はモデルサイズやランク設定を問わず有効であり、GraLoRAはPEFTのためのスケーラブルかつ堅牢なソリューションとなります。

ベンチマーク概要

API

GraloraConfig

クラス peft.GraloraConfig

< >

( 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 = 32hybrid_r: int = 0target_modules: list[str] | str | None = Nonealpha: int = 64gralora_dropout: float = 0.0gralora_k: int = 2fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: list[str] | None = Noneinit_weights: bool = Truelayers_to_transform: list[int] | int | None = Nonelayers_pattern: str | None = None )

パラメータ

  • r (int) — GraLoRA attention dimensionは、GraLoRAアダプタのランクを決定します。GraLoRAアダプタの総パラメータ数は、同じランクrのLoRAと同じですが、表現力はgralora_k倍になります。
  • hybrid_r (int) — Hybrid GraLoRA のランク。Hybrid GraLoRA メソッドを使用する場合、vanilla LoRA メソッドに割り当てられるランクを決定します。 GraLoRA と vanilla LoRA の組み合わせである Hybrid GraLoRA は、hybrid_r > 0 の場合に利用可能になります。GraLoRA アダプターのパラメータ数は r + hybrid_r です。
  • target_modules (Union[List[str], str]) — GraLoRA に置き換えるモジュール名のリスト、またはモジュール名の正規表現です。例えば、[‘q’, ‘v’] や ‘.decoder.(SelfAttention|EncDecAttention).*(q|v)$‘ などです。また、すべての linear/Conv1D にマッチするワイルドカード ‘all-linear’ も指定できます(モデルが PreTrainedModel の場合、出力層は除外されます)。指定しない場合、モデルのアーキテクチャに基づいてモジュールが選択されます。アーキテクチャが不明な場合はエラーが発生します。この場合、ターゲットモジュールを手動で指定する必要があります。
  • alpha (int) — GraLoRA alpha。 GraLoRA alpha は、GraLoRA アダプターのスケーリング係数です。スケールは alpha / (r + hybrid_r) になります。
  • gralora_dropout (float) — GraLoRA dropout は、GraLoRA アダプターにおける dropout の確率です。GraLoRA アダプターの過学習を防ぎ、汎化性能を向上させるために使用されます。
  • gralora_k (int) — GraLoRA k は、GraLoRA アダプター内のサブブロック数を決定します。GraLoRA アダプターが有効であるためには、ランク r が gralora_k で割り切れる必要があります。パラメータの総数は、gralora_k の値に関わらず維持されます。GraLoRA アダプターの全体のランクは gralora_k 倍に増加し、各サブブロックのランクは gralora_k 分の 1 に減少します。ランク 32 以下では gralora_k=2、ランク 64 以上では gralora_k=4 を推奨します。
  • fan_in_fan_out (bool) — 置き換えるレイヤーが重みを (fan_in, fan_out) の形式で保存している場合は、これを True に設定してください。例えば、gpt-2 は重みを (fan_in, fan_out) の形式で保存する Conv1D を使用しているため、これを True に設定する必要があります。
  • bias (str) — gralora のバイアス型です。‘none’、‘all’、‘gralora_only’ のいずれかを指定できます。‘all’ または ‘gralora_only’ を指定した場合、対応するバイアスが学習中に更新されます。この設定により、アダプターを無効にしても、モデルの出力は適応なしのベースモデルの出力と同一にはなりません。
  • modules_to_save (Optional[list[str]]) — gralora レイヤーを除き、最終チェックポイントで学習可能かつ保存されるように設定するモジュールのリストです。例えば、シーケンス分類やトークン分類タスクでは、最終層の classifier/score がランダムに初期化されるため、学習可能かつ保存される必要があります。
  • init_weights (bool) — GraLoRA層の重みをデフォルトの初期化で初期化するかどうか。何をしているか正確に理解している場合を除き、この設定を変更しないでください。
  • layers_to_transform (Union[List[int], int]) — 変換対象のレイヤーのインデックスです。この引数が指定されている場合、PEFT はこのリスト内で指定されたレイヤーのインデックスのみを変換します。単一の整数が渡された場合、PEFT はそのインデックスのレイヤーのみを変換します。これは、target_modules が str のリストである場合にのみ機能します。
  • layers_pattern (Optional[Union[List[str], str]]) — layers_to_transform が None 以外であり、かつレイヤーパターンが共通のレイヤーパターンに含まれない場合にのみ使用されるレイヤーパターンの名前です。これは target_modules が str のリストである場合にのみ機能します。モデルの nn.ModuleList を対象とすべきで、通常は 'layers' または 'h' と呼ばれます。

これはGraloraModelの設定を保存するための設定クラスです。

GraloraModel

クラス peft.GraloraModel

< >

( 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 (PreTrainedModel) — 適応させる対象のモデル。
  • config (GraloraConfig) — Graloraモデルの設定です。
  • adapter_name (str) — アダプターの名前。デフォルトは"default"です。

戻り値

torch.nn.Module

Graloraモデル。

事前学習済みのTransformersモデルから、ベクトルベースのRandom Matrix Adaptation(Gralora)モデルを作成します。

例:

>>> from transformers import AutoModelForCausalLM
>>> from peft import GraloraConfig, get_peft_model

>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = GraloraConfig(r=128)
>>> model = get_peft_model(base_model, config)

属性:

Update on GitHub