PEFT documentation
MonteCLoRA(蒙特卡洛低秩适应)
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
< source >( 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 权重之上叠加随机且可学习的扰动,从而获得校准更好、正则化更强的适配器。以下参数允许你在稳定性、正则化强度和计算成本之间进行权衡。