PEFT documentation
PVeRA: 確率的ベクトルベースランダム行列適応
PVeRA: 確率的ベクトルベースランダム行列適応
PVeRAは、LoRAベースのアダプターファミリーに属するVeRAをベースとしたパラメータ効率の良いファインチューニング手法です。VeRAの非常に低いパラメータ予算を維持しつつ、潜在適応の分布を学習することで性能を向上させます。これにより、PVeRAで適応されたモデルは、推論時に学習された分布からサンプリングを行うことで、モンテカルロ信頼区間の推定を生成できるようになります。
アダプタのパラメータを保存する際、PveraConfig で save_projection=False を設定することで、低ランク行列の保存を省略できます。その場合、これらの行列は projection_prng_key 引数の固定された乱数シードに基づいて復元されます。これによりチェックポイントのサイズを削減できますが、すべてのデバイスや PyTorch の将来のすべてのバージョンで再現性を保証することはできません。再現性を確保したい場合は、save_projection=True(デフォルト値)を設定してください。
アダプテッドレイヤーの異なる形状を処理するために、PVeRA は各次元について必要な最大サイズで共有 A 行列と B 行列を初期化します。フォワードパスでは、特定のレイヤー用の部分行列 A と B がこれらの共有行列からスライスされ、論文に記述されているように使用されます。例えば、形状が (100, 20) と (80, 50) の 2 つの線形レイヤーをアダプトする場合、それぞれ形状 (rank, 50) と (100, rank) の A 行列と B 行列が作成されます。その後、形状 (100, 20) のレイヤーをアダプトするには、形状 (rank, 20) と (100, rank) の部分行列 A と B が抽出されます。
PVeRAには現在、以下の制約があります:
- サポートされているのは
nn.Linearレイヤーのみです。 - KL分散を用いた学習のために、潜在表現は容易にアクセスできません。
論文の抄録は以下の通りです:
ここ数年、大規模なファウンデーションモデルが登場し、多様なタスクにおける性能の限界を押し広げています。こうしたモデルの学習やファインチューニングには、膨大なデータセットと計算リソースが必要とされますが、これらはしばしば希少で高価です。アダプテーション手法は、これらのモデルを少量のデータと計算リソースでファインチューニングできるようにすることで、これらの制約に対処するための計算効率の高いソリューションを提供します。これは、学習可能なパラメータのほんの一部のみを持つ新しい学習可能モジュールを、凍結されたバックボーンに追加し、新しいタスクに対してこれらのモジュールのみを適合させることで実現されます。最近、VeRAアダプターは、すべてのレイヤーで共有される凍結されたランダムな低ランク行列のペアを利用することで、パラメータ効率の高いアダプテーションにおいて優れた性能を発揮することが示されました。本論文では、VeRAアダプターの確率的バージョンであるPVeRAを提案します。PVeRAは、VeRAの低ランク行列を確率的な方法で修正します。この修正により、入力に内在する曖昧さの処理が自然に可能になり、学習時とテスト時の異なるサンプリング設定を許可します。VTAB-1kベンチマークと7つのアダプターを用いて包括的な評価が行われ、PVeRAはVeRAおよび他のアダプターを上回る性能を示しました。
ベンチマーク概要
API
PveraConfig
クラス peft.PveraConfig
< 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 = Truepvera_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]] = Nonesample_at_inference: bool = Falsegenerator_seed: Optional[int] = None )
パラメータ
- r (
int、任意、デフォルトは256) — PVeRAのパラメータ次元(“rank”)です。PVeRAはレイヤー間でパラメータを共有するため、LoRAよりもはるかに少ないパラメータ数で済みます。そのため、ここでの値はLoRAのrankよりも高い値を選択してください。 - target_modules (
Union[List[str], str]) — PVeRA を適用するモジュールの名前です。サポートされるのは線形層のみです。文字列を渡す場合、正規表現によるマッチングが行われます。‘all-linear’ と指定すると、すべての線形/Conv1D モジュールが選択されます。指定しない場合、モデルのアーキテクチャに基づいてモジュールが選択されます。アーキテクチャが不明な場合、エラーが発生します。 - projection_prng_key (
int) — PVeRA PRNG の初期化キーです。新しいモデルの初期化、またはこれらの投影が含まれていないチェックポイントを読み込む際に、pvera_A と pvera_B の初期化に使用されます。デフォルト値は0です。 - save_projection (
bool) — state dict に、レイヤーごとの lambda_b / lambda_d 重みとともに pvera_A / pvera_B 射影を保存するかどうかを指定します。これによりチェックポイントのサイズは増加しますが、すべてのシステム構成でチェックポイントを再読み込みできることを保証します。デフォルトはTrueです。 - pvera_dropout (
float) — PVeRA層のドロップアウト確率。 - d_initial (
float、任意、デフォルトは0.1) — PVeRA パラメータの初期化時に使用されるpvera_lambda_dベクトルの初期値です。小さい値 (<=0.1) を推奨します。 - fan_in_fan_out (
bool) — 置き換えるレイヤーが重みを (fan_in, fan_out) の形式で保存している場合は、これを True に設定してください。例えば、gpt-2 は重みを (fan_in, fan_out) の形式で保存するConv1Dを使用しているため、これをTrueに設定する必要があります。 - bias (
str) — PVeRA のバイアス型です。‘none’、‘all’、‘pvera_only’ のいずれかを指定できます。‘all’ または ‘pvera_only’ を指定した場合、対応するバイアスが学習中に更新されます。この設定により、アダプターを無効にしても、適応なしのベースモデルが生成する出力と同一の出力は得られない点にご注意ください。 - modules_to_save (
List[str]) — PVeRA レイヤー以外で、学習可能に設定し、最終的なチェックポイントに保存するモジュールのリスト。 - init_weights (
bool) — PVeRA層の重みをデフォルトの初期化で初期化するかどうか。何をしているか正確に理解している場合を除き、この設定を変更しないでください。 - layers_to_transform (
Union[List[int],int]) — 変換対象のレイヤーのインデックスです。この引数が指定されている場合、このリストに指定されたレイヤーのインデックスに対して PVeRA 変換が適用されます。単一の整数が渡された場合、そのインデックスのレイヤーに対して PVeRA 変換が適用されます。 - layers_pattern (
Optional[Union[List[str], str]]) —layers_to_transformがNoneと異なる場合にのみ使用されるレイヤーパターン名です。これはモデルのnn.ModuleListを対象とすべきで、通常は'layers'または'h'と呼ばれます。 - sample_at_inference (
bool、デフォルトはFalse) — 推論時に学習されたPVeRA分布からサンプリングするかどうか。Falseの場合、学習された平均値が使用されます。 - generator_seed (
int, デフォルトは None) — 学習した分布からサンプリングするために使用されるジェネレーターの乱数シード。
これは、PveraModelの設定を保存するための設定クラスです。
PveraModel
クラス peft.PveraModel
< 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 (PveraConfig) — PVeRAモデルの設定です。
- adapter_name (
str) — アダプターの名前。デフォルトは"default"です。 - low_cpu_mem_usage (
bool、optional、デフォルトはFalse) — メタデバイス上に空のアダプター重みを生成します。読み込みプロセスを高速化するために有用です。
戻り値
torch.nn.Module
PVeRAモデル。
事前学習済みのTransformersモデルから、確率的ベクトルベースのランダム行列適応(PVeRA)モデルを作成します。
例:
>>> from transformers import AutoModel
>>> from peft import PveraConfig, get_peft_model
>>> base_model = AutoModel.from_pretrained("facebook/dinov2-base")
>>> config = PveraConfig(r=128, sample_at_inference=False)
>>> model = get_peft_model(base_model, config)属性:
- model (PreTrainedModel) — 適応させる対象のモデル。
- peft_config (PveraConfig): PVeRAモデルの設定です。