PEFT documentation
VeRA: ベクトルベースのランダム行列適応
VeRA: ベクトルベースのランダム行列適応
VeRAは、LoRAに似ていますが、同等またはそれ以上の性能を保証しながら、さらに少ない追加パラメータで済むパラメータ効率の良いファインチューニング手法です。そのため、パラメータの予算が非常に限られている場合、例えば非常に大規模なモデルへのスケーリング時に特に有用です。学習可能なパラメータ数の削減は、すべてのレイヤーで同じ低ランク行列を共有し、レイヤーごとに2つの追加ベクトルのみを学習することで実現されます。
VeRAの仕組み
LoRAは、各適応レイヤーに対して2つの小さな低ランク行列を学習させることで、凍結されたベースモデルを更新します。ランクはこれらの行列の内部次元であり、アダプタが持つ容量を制御します。LoRAでは、rを大きくするか、適応するレイヤー数を増やすと、各適応レイヤーが独自の低ランク行列のペアを学習するため、学習可能なパラメータ数が急速に増加します。
VeRAは同じ低ランク適応のアイデアを維持しつつ、学習対象のパラメータを変更します。各層に対して個別の低ランク行列を学習するのではなく、VeRAは層全体で共有される、凍結されたランダム初期化の低ランク行列のペアAとBを使用します。適応される各層は、共有行列をスケーリングして層固有の更新を生成するための2つのスケーリングベクトルvera_lambda_dとvera_lambda_bのみを学習します。vera_lambda_dのサイズがrであるため、VeRAの学習可能パラメータ数は依然としてrと適応される層の数に応じて増加します。ただし、大きなAとB行列が各層で個別に学習されるのではなく、共有され凍結されるため、LoRAよりもはるかにゆっくりと増加します。
これが、VeRAがLoRAよりも少ない学習可能パラメータで済む理由です。論文の簡略化されたパラメータ数では、LoRAは2 * L_tuned * d_model * rに比例します。ここでL_tunedは適応される層の数、d_modelはモデルの次元、rはランクです。VeRAはL_tuned * (d_model + r)に比例します。これは、大きな低ランク行列が共有され凍結される一方、学習されるのは層ごとの小さなベクトルのみだからです。
アダプタのパラメータを保存する際、VeraConfig で save_projection=False を設定することで、低ランク行列の保存を省略できます。その場合、これらの行列は projection_prng_key 引数の固定された乱数シードに基づいて復元されます。これによりチェックポイントのサイズを削減できますが、すべてのデバイスや PyTorch の将来のすべてのバージョンで再現性を保証することはできません。再現性を確保したい場合は、save_projection=True (デフォルト) を設定してください。
アダプテッドレイヤーの異なる形状を処理するために、VeRA は各次元について必要な最大サイズで共有 A 行列と B 行列を初期化します。フォワードパスでは、特定のレイヤー用の部分行列 A と B がこれらの共有行列からスライスされ、論文に記述されているように使用されます。例えば、形状が (100, 20) と (80, 50) の 2 つの線形レイヤーをアダプトする場合、それぞれ形状 (rank, 50) と (100, rank) の A 行列と B 行列が作成されます。その後、形状 (100, 20) のレイヤーをアダプトするには、形状 (rank, 20) と (100, rank) の部分行列 A と B が抽出されます。
VeRAには現在、以下の制約があります:
- サポートされているのは
nn.Linearレイヤーのみです。
論文の抄録は以下の通りです:
低ランク適応(LoRA)は、大規模言語モデルのファインチューニング時に学習可能なパラメータ数を削減する人気のある手法ですが、さらに大規模なモデルへのスケーリング、または多数のユーザー別・タスク別適応モデルのデプロイ時には、依然として深刻なストレージ課題に直面しています。本研究では、LoRAと比較して学習可能なパラメータ数を大幅に削減しながら、同等の性能を維持するVector-based Random Matrix Adaptation(VeRA)を提案します。これは、すべてのレイヤーで共有される単一の低ランク行列ペアを使用し、代わりに小さなスケーリングベクトルを学習することで実現されます。GLUEおよびE2Eベンチマーク、画像分類タスクにおけるその有効性を示し、7Bおよび13Bの言語モデルのインストラクションチューニングへの適用例を提示します。
VeRAを使用するタイミング
VeRAは、次のような場合に優れた選択肢です:
- LoRAと同等の性能を維持しながら、学習可能なパラメータの数を最小限に抑えたい場合
- 多くのタスク固有のアダプタを保存またはデプロイする必要があり、より小さいアダプタのチェックポイントによりストレージ要件を削減できる場合があります。
- メモリやパラメータの予算が厳しく、非常に大規模な言語モデルのファインチューニングを行っています。
VeRAを使用しない場合
VeRAが最適な選択ではない可能性がある場合:
- アダプタ層ごとに独立した低ランク行列を必要とし、学習されるアダプタパラメータにおいてより大きな柔軟性を提供します。
nn.Linear以外のモジュールタイプへの適応が必要ですが、VeRAは現在、線形層のみをサポートしています。- モデルには、入力次元と出力次元が大きく異なる適応済み線形層が含まれています。VeRA はすべての適応済み層で単一の射影行列ペアを共有するため、これらの行列は最大の形状に合わせてサイズを設定する必要があります。したがって、層の形状に大きなばらつきがあるモデル(例えば、transformer のアップ射影層とダウン射影層)では、共有射影行列の過剰なプロビジョニングが必要になり、VeRA のパラメータ効率の利点が一部失われる可能性があります。
ベンチマーク概要
API
VeRAConfig
クラス peft.VeraConfig
< 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 = 256target_modules: Optional[Union[list[str], str]] = Noneprojection_prng_key: int = 0save_projection: bool = Truevera_dropout: float = 0.0d_initial: float = 0.1fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_weights: bool = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )
パラメータ
- r (
int、任意、デフォルトは256) — VeRAのパラメータ次元(“rank”)です。VeRAはLoRAよりもはるかに少ないパラメータを使用するため(表1を参照)、ここではLoRAのrankよりも高い値を選択してください。 - target_modules (
Union[List[str], str]) — Vera を適用するモジュールの名前です。サポートされるのは線形層のみです。 - projection_prng_key (
int) — Vera PRNG の初期化キーです。新しいモデル、またはこれらの投影が含まれていないチェックポイントを読み込む際に、vera_A と vera_B の初期化に使用されます。デフォルト値は0です。 - save_projection (
bool) — state dict に、レイヤーごとの lambda_b / lambda_d 重みとともに vera_A / vera_B 射影を保存するかどうかを指定します。これによりチェックポイントのサイズは増加しますが、すべてのシステム構成でチェックポイントを再読み込みできることを保証します。デフォルトはTrueです。 - vera_dropout (
float) — Vera層のdropout確率。 - d_initial (
float、任意、デフォルトは0.1) — VeRA パラメータの初期化時に使用されるvera_lambda_dベクトルの初期値です。小さい値(<=0.1)が推奨されています(論文の Table 6c を参照)。 - fan_in_fan_out (
bool) — 置き換えるレイヤーが重みを (fan_in, fan_out) の形式で保存している場合は、これを True に設定してください。例えば、gpt-2 は重みを (fan_in, fan_out) の形式で保存するConv1Dを使用しているため、これをTrueに設定する必要があります。 - bias (
str) — Vera のバイアス型です。‘none’、‘all’、‘vera_only’ のいずれかを指定できます。‘all’ または ‘vera_only’ を指定した場合、対応するバイアスが学習中に更新されます。この設定により、アダプターを無効にしても、適応なしのベースモデルが生成する出力と同一の出力は得られない点にご注意ください。 - modules_to_save (
List[str]) — Vera レイヤーを除き、最終チェックポイントで学習可能かつ保存されるように設定するモジュールのリスト。 - init_weights (
bool) — Vera層の重みをデフォルトの初期化で初期化するかどうか。何をしているか正確に理解している場合を除き、この設定を変更しないでください。 - layers_to_transform (
Union[List[int],int]) — 変換対象のレイヤーのインデックスです。この引数が指定されている場合、このリストに指定されたレイヤーのインデックスに対して Vera 変換が適用されます。単一の整数が渡された場合、そのインデックスのレイヤーに対して Vera 変換が適用されます。 - layers_pattern (
Optional[Union[List[str], str]]) —layers_to_transformがNoneと異なる場合にのみ使用されるレイヤーパターン名です。これはモデルのnn.ModuleListを対象とすべきで、通常は'layers'または'h'と呼ばれます。
これはVeraModelの設定を保存するための設定クラスです。
VeRAModel
クラス peft.VeraModel
< 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 (PreTrainedModel) — 適応させる対象のモデル。
- config (VeraConfig) — Veraモデルの設定。
- adapter_name (
str) — アダプターの名前。デフォルトは"default"です。 - low_cpu_mem_usage (
bool、optional、デフォルトはFalse) — メタデバイス上に空のアダプター重みを生成します。読み込みプロセスを高速化するために有用です。
戻り値
torch.nn.Module
Veraモデル。
事前学習済みのTransformersモデルから、ベクトルベースのランダム行列適応(Vera)モデルを作成します。
例:
>>> from transformers import AutoModelForCausalLM
>>> from peft import VeraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VeraConfig(r=128)
>>> model = get_peft_model(base_model, config)属性:
- model (PreTrainedModel) — 適応させる対象のモデル。
- peft_config (VeraConfig): Veraモデルの設定です。