PEFT documentation

Householder反射適応(HRA)による低ランク適応と直交適応のギャップの橋渡し

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

Householder反射適応(HRA)による低ランク適応と直交適応のギャップの橋渡し

Bridging The Gap between Low-rank and Orthogonal Adaptation via Householder Reflection Adaptation

HRAは、Householder reflectionsを活用してパラメータ数と計算コストを削減しつつ、事前学習知識の損失をペナルティとして課すことで、LoRAとOFTを結びつける新たな視点を提供します。これにより、両方の戦略の利点を活用でき、学習可能なパラメータを少なくしながらも一貫して優れたパフォーマンスを発揮します。大規模言語モデル(LLM)や条件付き画像生成モデルを含む、さまざまなモデルにおいて、最先端のアダプタを上回る性能を示しています。

HRA は r 個の学習可能な Householder 反射 (HR) の鎖を構築します。Householder 反射行列は直交行列であり、直交行列の積もまた直交行列であるため、HRA は Orthogonal Finetuning (OFT) の理論的保証を満たします。同時に、HRA は低ランクのファインチューニングアダプターとしても見なすことができます。 r, が大きいほど学習可能なパラメータが増え、モデルの容量が大きくなり、パフォーマンスが向上します。また、鎖構造により、HR 平面の直交性が HRA の容量と規則性に影響を与えます。モデルの容量と規則性のバランスを取るため、損失関数に HR 平面の直交性正則化項を追加します。重みλ\lambda で正則化の強さを制御できます。

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

異なる技術的アプローチを採用しながらも、低ランク適応と直交適応の両方の手法は、学習可能なパラメータのわずかな部分に基づいて、大規模な事前学習モデルを特定のタスクやドメインに効率的に適応させることができます。本研究では、これらの2つの手法の間のギャップを埋め、Householder反射に基づくシンプルかつ効果的な適応手法を提案します。事前学習済みモデルが与えられた場合、本手法は、各凍結された重み行列を、学習可能なHouseholder反射(HR)の連鎖によって構成される直交行列で乗算することにより、その層をファインチューニングします。このHRベースの直交ファインチューニングは、適応型低ランク適応と等価です。さらに、HRに対応する反射面の直交性が、モデルの容量と正則性に影響を与えることを示します。この分析を踏まえ、HRの直交性を正則化することの動機づけとなり、提案するHouseholder反射適応(HRA)手法の異なる実装が導かれます。最先端の手法と比較して、HRAは、大規模言語モデルや条件付き画像生成器に適応させる際に、より少ない学習可能なパラメータで優れたパフォーマンスを実現します。コードはpeftとHRAで利用可能です。

API

HRAConfig

クラス peft.HRAConfig

< >

( 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 = 8apply_GS: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )

パラメータ

  • r (int) — 異なるレイヤーにわたる HRA のランクです。デフォルトの初期化方法が機能しないため、r は偶数に設定するのが最善です。
  • apply_GS (bool) — Gram-Schmidt直交化を適用するかどうか。
  • target_modules (Optional[Union[List[str], str]]) — アダプタを適用するモジュールの名前です。このパラメータが指定されている場合、指定された名前のモジュールのみが置き換えられます。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。このパラメータが ‘all-linear’ として指定されている場合、出力層を除くすべての線形モジュールが選択されます。このパラメータが指定されていない場合、モデルのアーキテクチャに基づいてモジュールが選択されます。アーキテクチャが不明な場合はエラーが発生します。この場合、ターゲットモジュールを手動で指定する必要があります。
  • exclude_modules (Optional[Union[List[str], str]]) — アダプタを適用しないモジュールの名前。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。
  • init_weights (bool) — HRAの重みの初期化を実行するかどうか。
  • layers_to_transform (Union[List[int], int]) — 変換対象のレイヤーのインデックスです。int のリストが渡された場合、このリストに指定されたレイヤーのインデックスにアダプターが適用されます。単一の整数が渡された場合、そのインデックスのレイヤーに変換が適用されます。
  • layers_pattern (Optional[Union[List[str], str]]) — layers_to_transform が None と異なる場合にのみ使用されるレイヤーパターン名です。これはモデルの nn.ModuleList を対象とすべきで、通常は 'layers' または 'h' と呼ばれます。
  • bias (str) — HRA のバイアス型。'none'、'all'、または 'hra_only' を指定できます。
  • modules_to_save (List[str]) — 最終チェックポイントに保存されるよう、学習可能に設定するアダプタ層以外のモジュールのリスト。

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

HRAModel

クラス peft.HRAModel

< >

( 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 (HRAConfig) — HRAモデルの設定。
  • adapter_name (str) — アダプターの名前。デフォルトは"default"です。
  • low_cpu_mem_usage (bool、optional、デフォルトはFalse) — メタデバイス上に空のアダプター重みを生成します。読み込みプロセスを高速化するために有用です。

戻り値

torch.nn.Module

HRAモデル。

事前学習済みモデルからHouseholder反射適応(HRA)モデルを作成します。この手法はhttps://huggingface.co/papers/2405.17484に説明されています。

例:

>>> from diffusers import StableDiffusionPipeline
>>> from peft import HRAModel, HRAConfig

>>> config_te = HRAConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     init_weights=True,
... )
>>> config_unet = HRAConfig(
...     r=8,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = HRAModel(model.text_encoder, config_te, "default")
>>> model.unet = HRAModel(model.unet, config_unet, "default")

属性:

  • model (~torch.nn.Module) — 適応させる対象のモデル。
  • peft_config (HRAConfig): HRAモデルの設定です。
Update on GitHub