PEFT documentation

MonteCLoRA(蒙特卡洛低秩适应)

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(蒙特卡洛低秩适应)

这是 LoRA 的一种变体,因此,除非本页另有说明,LoRA 支持的所有功能在此方法中均适用。

MonteCLoRA 在标准 LoRA 适配器之上包裹了一个小型变分模块,该模块在训练期间对 LoRA 的 A 矩阵进行蒙特卡洛采样,以引入随机扰动。具体而言,它学习一组变分参数(基于 Wishart 分布的协方差、逐样本的多变量正态噪声项,以及跨样本的 Dirichlet 权重),并在每次前向传播时将由此得到的平均扰动添加到 lora_A 中。训练损失中会加入 KL 散度与熵项,以将这些变分参数锚定在合理的先验分布上。在推理阶段,采样器会被禁用,MonteCLoRA 的行为与常规 LoRA 适配器完全一致,因此不会产生额外的推理开销,也没有需要合并的额外参数。有关完整方法,请参阅 https://huggingface.co/papers/2411.04358。

在以下情况下,您可能需要考虑使用 MonteCLoRA:

  • 您正在使用小型或噪声较大的数据集进行微调,并希望获得比标准 LoRA 更强的正则化效果。蒙特卡洛平均与 KL 项共同作用,充当一种贝叶斯风格的正则化器。
  • 你希望在不增加推理时间开销的情况下,从适配器中获得更好的不确定性校准/鲁棒性(变分机制仅在训练时使用)。
  • 普通的 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 进行训练,只需混入 peft.helpers.MontecloraTrainerMixin,它会在 compute_loss 中为您完成此操作:

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) — 每次前向传播中抽取的蒙特卡洛样本数量。较高的值通常能带来更平滑的训练过程和更优的不确定性估计,但会增加计算和内存开销。如果训练速度过慢或内存受限,请降低此值;如果训练稳定且希望获得更强的蒙特卡洛平均效果,请提高此值。
  • use_entropy (bool) — 是否添加熵正则化项,以防止蒙特卡洛权重坍缩到单个样本。如果观察到采样器变得非常尖锐,或者希望获得更强的正则化效果,请开启此选项;若要更贴近标准 LoRA 的行为,请保持关闭。
  • dirichlet_prior (float) — 样本/专家权重上 Dirichlet 先验的浓度参数。较大的值会使权重趋向更均匀(正则化更强,稀疏性更低),而较小的正值则鼓励更稀疏、更尖锐的权重。如果采样器过拟合,请增大该值;如果采样器过于保守,请减小该值(但需保持 > 0)。
  • sample_scaler (float) — 应用于 LoRA 权重的采样扰动的整体缩放因子。增大该值会增强蒙特卡洛噪声(带来更强的正则化和探索能力,但也会导致训练不稳定);减小该值则使行为更接近标准的确定性 LoRA。将其设置为非常接近 0 的值会基本禁用 Monteclora 的效果。
  • kl_loss_weight (float) — 变分分布与其先验之间 KL 散度项的权重。较大的值会更强调匹配先验(正则化更强,可能导致欠拟合);较小的值则更依赖数据似然(正则化更弱,可能导致过拟合)。如果您发现 Monteclora 对适配器进行了过度或不足的正则化,请调整此参数。
  • buffer_size (int) — 蒙特卡洛采样器使用的内部缓冲区大小(例如用于存储近期统计量)。较大的值可以稳定估计的变分参数,但会增加内存开销;如果内存受限,请减小此值。

这是用于存储 Monteclora(Monte Carlo Low-Rank Adaptation,蒙特卡洛低秩适应)配置的子配置类。 Monteclora 通过在适配器权重中引入蒙特卡洛采样,将变分推断引入 LoRA。

在实践中,你可以将 Monteclora 视为在 LoRA 权重之上叠加随机且可学习的扰动,从而获得校准更好、正则化更强的适配器。以下参数允许你在稳定性、正则化强度和计算成本之间进行权衡。

Update on GitHub