PEFT documentation
RandLora: 大規模モデルのフルランクパラメータ効率ファインチューニング
RandLora: 大規模モデルのフルランクパラメータ効率ファインチューニング
RandLora は、LoRA や VeRA に似ていますが、パフォーマンスを向上させるためにフルランクの更新を行う、パラメータ効率の高いファインチューニング手法です。RandLora は、LoRA のパラメータ効率を維持しながら、複雑な更新を必要とする困難なタスクに大規模モデルを適応させる際に特に有用です。RandLora のフルランク更新は、ランダムベースを線形にスケーリングすることで実現されます。ランダムベースは、それらのランクの合計がパラメータ行列のフルランク以上となるように設計された、複数の低ランク行列の集合です。RandLora の学習可能パラメータは、2 つの対角行列(ベクトル)であり、VeRA の更新と同様の方法で、右側の低ランクランダムベースと掛け合わせられます。メモリ使用量を低く保つため、RandLora は、逆伝播のために不要なベースをメモリに保存することを防ぐカスタム関数を使用しています。
RandLoraには、他のLoRA系のPEFTアルゴリズムとは異なり、RandLoraのランダムベースのランクを上げると学習可能なパラメータの量が増加するという特筆すべき違いがあります。RandLoraではベースの数とベースのランクの積が一定であるため、ランクを下げるとランダムベースの数が増え、結果としてベース固有の学習可能な対角ベースの数が増加します。
RandLoraのランダムベースのランクを下げるとその数が増加するため、通常、4未満の非常に小さなランクでは、学習時間が大幅に増加し、LoRAよりも学習が遅くなる場合があります。ただし、RandLoraアダプターは事前学習済み重み行列にマージできるため、推論には影響しません。
RandLoraは、スパースな3値のランダム基底(-1、0、1のみを含む)を用いたトレーニングもサポートしています。これらの基底はBingham et al.およびPing et al.で説明されているものであり、理論上、行列積の代わりに集約処理を実行して重みの更新を作成することで、計算負荷を削減するために使用できます。ただし、これは現在サポートされていません。計算負荷を削減するわけではありませんが、RandLoraでスパースなランダム基底を使用することで、一部のケースで過学習を軽減できます。スパースな3値基底の使用に関心のあるユーザーには、sparseオプションが推奨されます。very_sparseオプションはパフォーマンスを低下させる可能性があるためです。
VeRAと同様に、RandLoraのパラメータを保存する際、VeraConfigでsave_projection=Falseを設定することで、低ランク行列の保存を省略できます。その場合、これらの行列はprojection_prng_key引数の固定された乱数シードに基づいて復元されます。これによりチェックポイントのサイズを削減できますが、すべてのデバイスやPyTorchの将来のすべてのバージョンで再現性を保証することはできません。再現性を確保したい場合は、save_projection=True(デフォルト値)を設定してください。
Veraと同様に、適応レイヤーの異なる形状を処理するために、RandLoraは各次元について必要な最大サイズで共有A行列とB行列を初期化します。フォワードパスでは、特定のレイヤー用の部分行列AとBがこれらの共有行列からスライスされ、論文に記述されているように使用されます。例えば、形状(100, 20)と(80, 50)の2つの線形レイヤーを適応させる場合、それぞれ形状(rank, 50)と(100, rank)のA行列とB行列が作成されます。その後、形状(100, 20)のレイヤーを適応させるには、形状(rank, 20)と(100, rank)の部分行列AとBが抽出されます。
RandLoraには現在、以下の制約があります:
- サポートされているのは
nn.Linearレイヤーのみです。
論文の抄録は以下の通りです:
Low-Rank Adaptation (LoRA)とそのバリアントは、ファインチューニングの性能を維持しながら、大規模なtransformerネットワークの学習可能パラメータ数とメモリ要件を削減する点で、印象的な結果を示してきました。しかし、重み更新の低ランク特性は、ファインチューニングされたモデルの表現力を本質的に制限するため、複雑なタスクにおける性能を損なう可能性があります。これにより、重要な問題が提起されます。LoRAと標準的なファインチューニングの間に性能差が観察された場合、それは学習可能パラメータ数の減少によるものなのか、それともランクの欠如によるものなのか、ということです。 本論文では、学習可能な低ランクの非学習可能ランダム行列の線形結合を用いてフルランクの更新を実行する、パラメータ効率の高い手法RandLoraを導入することで、この問題に答えることを目指します。当社の手法は、固定されたランダム行列に適用される対角スケーリング行列への最適化を制限することで、学習可能パラメータ数を制限します。これにより、学習中のパラメータ効率とメモリ効率を維持しながら、低ランクの制限を効果的に克服できます。ビジョン、言語、ビジョン言語のベンチマークにわたる広範な実験を通じて、LoRAと既存のランダム基底手法の制限を体系的に評価しました。その結果、フルランクの更新はビジョンタスクと言語タスクのそれぞれで有益であることが明らかになり、特にビジョン言語タスクではさらに有益であることが示されました。ビジョン言語タスクでは、RandLoraは標準的なファインチューニングとLoRAの間の性能差を大幅に縮小し、場合によっては解消し、その有効性を示しています。
ベンチマーク概要
API
RandLoraConfig
クラス peft.RandLoraConfig
< 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 = 32target_modules: list[str] | str | None = Noneprojection_prng_key: int = 0save_projection: bool = Truesparse: bool = Falsevery_sparse: bool = Falserandlora_dropout: float = 0.0fan_in_fan_out: bool = Falserandlora_alpha: int = 640bias: 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、任意、デフォルトは32) — RandLora のランダム基底のランク次元です。Lora とは異なり、このパラメータは学習可能なパラメータの量に反比例しており、値を下げると学習可能なパラメータが増加します。 - target_modules (
Union[list[str], str]) — RandLora を適用するモジュールの名前です。サポートされるのは線形層のみです。 - projection_prng_key (
int) — RandLora PRNGの初期化キーです。新しいモデルの場合、またはこれらのprojectionが含まれていないチェックポイントを読み込む場合に、basis_Aとbasis_Bの初期化に使用されます。デフォルト値は0です。 - save_projection (
bool) — state dict に、レイヤーごとの lambda / gamma 対角行列とともに、グローバルな basis_A / basis_B ランダム基底を保存するかどうか。これによりチェックポイントのサイズは増加しますが、すべてのシステム構成でチェックポイントを再読み込みできることを保証します。デフォルトはTrueです。 - sparse (
bool) — RandLora論文で説明されているスパースなランダムベースを使用するかどうか。ベースは3値スパースベース(-1、0、1のみを含む)であり、-1と1の帰属確率は1/6、0の帰属確率は2/3です。これらのスパース行列は、将来的にmatmulなしの計算に使用されることを目指しており、https://huggingface.co/papers/2406.02528v1を参照してください。現在の実装は概念実証であり、スパース性を活用して速度やメモリ使用量を改善していません。スパース行列の使用は通常、パフォーマンスを低下させず、むしろ過学習を軽減するのに役立つ場合があります。デフォルトはFalseです。 - very_sparse (
bool) — RandLora論文で説明されているように、非常にスパースなランダム基底を使用するかどうか。非常にスパースな基底は、行列の最小次元がdである場合、3値スパース基底(-1、0、1のみを含む)であり、-1および1の帰属確率は1/√D、0の帰属確率は1- 2/√Dです。これらのスパース行列を使用すると、sparseの代替案よりも過学習をさらに軽減できますが、結果としてパフォーマンスが低下する可能性が高いです。慎重に使用してください。デフォルトはFalseです。 - randlora_dropout (
float) — RandLora層のドロップアウト確率です。 - randlora_alpha (
float) — RandLora 層のスケーリング係数です。通常、ランクの 20 倍になります。デフォルトではrandlora_alpha係数が大きいため、特に学習率が大きい場合に数値的不安定性を引き起こす可能性があります。学習が不安定な場合は、学習率またはrandlora_alpha係数を小さくすることを検討してください。 - fan_in_fan_out (
bool) — 置き換えるレイヤーが重みを (fan_in, fan_out) の形式で保存している場合は、これを True に設定してください。例えば、gpt-2 は重みを (fan_in, fan_out) の形式で保存するConv1Dを使用しているため、これをTrueに設定する必要があります。 - bias (
str) — バイアスの種類です。‘none’、‘all’、‘randlora_only’のいずれかを指定できます。‘all’または‘randlora_only’を指定した場合、対応するバイアスが学習中に更新されます。この設定により、アダプターを無効にしても、適応なしのベースモデルが生成する出力と同じ結果は得られない点にご注意ください。 - modules_to_save (
list[str]) — RandLora レイヤーを除き、最終的なチェックポイントで学習可能かつ保存されるように設定するモジュールのリスト。 - init_weights (
bool) — RandLora層の重みをデフォルトの初期化で初期化するかどうか。何をしているか正確に理解している場合を除き、この設定を変更しないでください。 - layers_to_transform (
Union[list[int],int]) — 変換対象のレイヤーのインデックスです。この引数が指定されている場合、このリストに指定されたレイヤーのインデックスに対して RandLora 変換が適用されます。単一の整数が渡された場合、そのインデックスのレイヤーに対して RandLora 変換が適用されます。 - layers_pattern (
str) —layers_to_transformがNoneと異なり、かつレイヤーパターンが共通のレイヤーパターンに含まれない場合にのみ使用される、レイヤーパターンの名前です。
これは、RandLoraModelの設定を保存するための設定クラスです。
RandLoraModel
クラス peft.RandLoraModel
< 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 (RandLoraConfig) — RandLora モデルの設定です。
- adapter_name (
str) — アダプターの名前。デフォルトは"default"です。 - low_cpu_mem_usage (
bool、optional、デフォルトはFalse) — メタデバイス上に空のアダプター重みを生成します。読み込みプロセスを高速化するために有用です。
戻り値
torch.nn.Module
RandLoraモデル。
事前学習済みのTransformersモデルからRandLoRAモデルを作成します。
例:
>>> from transformers import AutoModelForCausalLM
>>> from peft import RandLoraConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = RandLoraConfig(r=32)
>>> model = get_peft_model(base_model, config)属性:
- model (PreTrainedModel) — 適応させる対象のモデル。
- peft_config (RandLoraConfig): RandLoraモデルの設定です。