PEFT documentation

MonteCLoRA(Monte Carlo Low-Rank Adaptation)

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

MonteCLoRA(Monte Carlo Low-Rank Adaptation)

これはLoRAのバリアントであり、このページに特に記載がない限り、LoRAで可能なすべてのことがこの方法にも適用されます。

MonteCLoRAは、標準的なLoRAアダプターを小さな変分モジュールでラップし、学習中にLoRAのA行列に対して確率的摂動のモンテカルロサンプルを抽出します。具体的には、変分パラメータ(Wishart分布に基づく共分散、サンプルごとの多変量正規ノイズ項、サンプル間のDirichlet重み付け)を学習し、フォワードパスのたびに得られた平均化された摂動をlora_Aに加算します。これらの変分パラメータを妥当な事前分布に固定するため、訓練損失にはKLダイバージェンスとエントロピーの項が加算されます。推論時にはサンプラーが無効化され、MonteCLoRAは通常のLoRAアダプターと完全に同じ挙動を示すため、追加の推論コストやマージが必要な追加パラメータはありません。手法の詳細については、https://huggingface.co/papers/2411.04358を参照してください。

次のような場合は、MonteCLoRAを検討することをお勧めします。

  • ノイズの多い小規模データセットでファインチューニングを行っており、バニラLoRAよりも強力な正則化を求めている場合です。モンテカルロ平均とKL項が組み合わさることで、ベイズ的な正則化器として機能します。
  • 推論時の追加コストを払わずに、アダプターからより良い不確実性のキャリブレーション/ロバスト性を得たい場合(変分機構はトレーニング時のみ使用されます)。
  • Vanilla LoRAは過学習しており、rを下げたりlora_dropoutを上げたりするだけでは不十分です。

大規模でクリーンなデータセットがあり、バニラLoRAがすでに安定して学習できる場合、MonteCLoRAは必要ない可能性が高いです。そのような状況では、追加の変分パラメータは大きな利点をもたらさず、主に学習のオーバーヘッドを増やすだけです。

MonteCLoRAを有効にするには、MontecloraConfigをLoraConfigに渡します:

from peft import LoraConfig, MontecloraConfig

monteclora_config = MontecloraConfig(
    num_samples=8,         # number of Monte Carlo samples per forward pass
    sample_scaler=1e-4,    # magnitude of the variational perturbation
    kl_loss_weight=1e-5,   # weight of the KL term added to the training loss
)
config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    monteclora_config=monteclora_config,
)

学習中は、タスクの損失にバリアショナル正則化損失を加える必要があります。最もシンプルな方法は、基盤となるLoraModelに対してLoraModel._get_monteclora_loss()を呼び出すことです:

task_loss = ...  # standard loss returned by your model
monteclora_loss = model._get_monteclora_loss()  # 0.0 if MonteCLoRA is not used
total_loss = task_loss + monteclora_loss
total_loss.backward()

HFのTrainerで学習する場合、compute_loss内でこれを行うpeft.helpers.MontecloraTrainerMixinをミックスインするだけで済みます:

from transformers import Trainer
from peft.helpers import MontecloraTrainerMixin


class MontecloraTrainer(MontecloraTrainerMixin, Trainer):
    pass

完全な動作するサンプルは、examples/monteclora_finetuning で利用できます。

API

MonteCloraConfig

クラス peft.MontecloraConfig

< >

( num_samples: int = 8use_entropy: bool = Falsedirichlet_prior: float = 0.1sample_scaler: float = 0.0001kl_loss_weight: float = 1e-05buffer_size: int = 150 )

パラメータ

  • num_samples (int) — 1回のフォワードパスごとにサンプリングするモンテカルロサンプルの数。値を高くすると、通常、トレーニングが滑らかになり、不確実性の推定が向上しますが、計算量とメモリ使用量が増加します。トレーニングが遅すぎる場合やメモリが制約されている場合はこの値を下げ、トレーニングが安定しており、より強力なモンテカルロ平均化を行いたい場合は上げてください。
  • use_entropy (bool) — モンテカルロ重みが単一のサンプルに収束することを防ぐエントロピー正則化項を追加するかどうか。サンプラーが非常に尖った分布になることを観察した場合、またはより強力な正則化を希望する場合はこれを有効にしてください。標準的なLoRAをより忠実に模倣したい場合は無効にしてください。
  • dirichlet_prior (float) — サンプル/エキスパート重みに対するDirichlet事前分布の集中度パラメータです。値を大きくすると、重みがより均一に近づきます(正則化が強化され、スパース性が低下します)。一方、小さい正の値にすると、よりスパースで尖った重みが促されます。サンプラーが過学習している場合は値を大きくし、保守的すぎる場合は値を小さくしてください(ただし 0 より大きく保ってください)。
  • sample_scaler (float) — LoRA 重みに適用されるサンプリングされた摂動の全体スケーリング係数です。この値を大きくすると、Monte Carlo ノイズが強くなります(正則化と探索は増えますが、トレーニングの不安定性も高まります)。小さくすると、動作は標準的な決定論的な LoRA に近づきます。0 に非常に近い値に設定すると、Monteclora の効果がほぼ無効になります。
  • kl_loss_weight (float) — 変分分布とその事前分布間のKLダイバージェンス項の重みです。値を大きくすると事前分布との一致に重点が置かれます(強い正則化となり、アンダーフィッティングの可能性があります)。値を小さするとデータ尤度により強く依存します(弱い正則化となり、オーバーフィッティングの可能性があります)。Montecloraがアダプターを過剰に正則化または正則化不足にしていると感じた場合は、この値を調整してください。
  • buffer_size (int) — Monte Carlo サンプラーが使用する内部バッファのサイズ(例:最近の統計情報の保存)。値を大きくすると、追加のメモリを消費する代わりに、推定された変分パラメータが安定します。メモリが制約されている場合は、この値を小さくしてください。

これは、Monteclora(Monte Carlo Low-Rank Adaptation)の設定を保存するためのサブ設定クラスです。 Monteclora は、アダプター重みにモンテカルロサンプリングを追加することで、LoRA に変分推論を導入します。

実際には、MontecloraはLoRA重みの上に確率的で学習された摂動を加えるものとして捉えることができます。これにより、より適切にキャリブレーションされ、より適切に正則化されたアダプタが得られます。以下の引数により、安定性、正則化の強さ、計算コストのトレードオフを調整できます。

Update on GitHub