PEFT documentation
MonteCLoRA (Monte Carlo Low-Rank Adaptation)
MonteCLoRA (Monte Carlo Low-Rank Adaptation)
Esta é uma variante do LoRA e, portanto, tudo o que é possível com o LoRA é válido para este método, exceto quando indicado o contrário nesta página.
MonteCLoRA envolve um adaptador LoRA padrão com um pequeno módulo variacional que extrai amostras de Monte Carlo de perturbações estocásticas sobre a matriz A do LoRA durante o treinamento. Concretamente, ele aprende parâmetros variacionais (uma covariância baseada em Wishart, um termo de ruído multivariado normal por amostra e um peso Dirichlet sobre as amostras) e adiciona a perturbação resultante média a lora_A em cada passagem de frente. Um termo de divergência de KL + entropia é adicionado à perda de treinamento para manter esses parâmetros variacionais ancorados a um prior sensato. No momento da inferência, o amostrador é desativado e o MonteCLoRA se comporta exatamente como um adaptador LoRA regular, portanto não há custo extra de inferência nem parâmetros extras para mesclar. Para o método completo, veja https://huggingface.co/papers/2411.04358.
Você pode considerar o MonteCLoRA quando:
- Você está fazendo fine-tuning em um conjunto de dados pequeno ou ruidoso e deseja uma regularização mais forte do que a do LoRA padrão. A média de Monte Carlo e o termo de KL, juntos, atuam como um regularizador de estilo bayesiano.
- Você deseja uma melhor calibração de incerteza / robustidade do seu adaptador sem pagar um custo extra no tempo de inferência (o mecanismo variacional é usado apenas no treinamento).
- O LoRA vanilla está sofrendo de overfitting e reduzir
rou aumentarlora_dropoutnão é suficiente.
Provavelmente você não precisa do MonteCLoRA quando possui um conjunto de dados grande e limpo e o LoRA padrão já treina de forma estável — nesse regime, os parâmetros variacionais extras adicionam principalmente sobrecarga de treinamento sem muito benefício.
Para habilitar o MonteCLoRA, passe um MontecloraConfig para 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,
)Durante o treinamento, você deve adicionar a perda de regularização variacional à perda da tarefa. A maneira mais simples é chamar LoraModel._get_monteclora_loss() no LoraModel subjacente:
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()Se você treinar com o Trainer do HF, basta misturar o peft.helpers.MontecloraTrainerMixin, que faz isso para você em compute_loss:
from transformers import Trainer
from peft.helpers import MontecloraTrainerMixin
class MontecloraTrainer(MontecloraTrainerMixin, Trainer):
passUm exemplo completo e funcional está disponível em examples/monteclora_finetuning.
API
MonteCloraConfig
classe 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 )
Parâmetros
- num_samples (
int) — Número de amostras de Monte Carlo a serem extraídas por cada passagem de frente. Valores mais altos geralmente resultam em treinamento mais suave e melhores estimativas de incerteza, mas aumentam o uso de computação e memória. Reduza esse valor se o treinamento estiver lento demais ou se houver restrições de memória; aumente-o se o treinamento estiver estável e você desejar uma média de Monte Carlo mais robusta. - use_entropy (
bool) — Se deve adicionar um termo de regularização de entropia que impede que os pesos de Monte Carlo colapsam para uma única amostra. Ative esta opção se observar que o amostrador está se tornando muito pontudo ou se desejar uma regularização mais forte; deixe-a desativada para imitar o LoRA padrão de forma mais próxima. - dirichlet_prior (
float) — Parâmetro de concentração para a priori Dirichlet sobre os pesos de amostra/especialista. Valores maiores empurram os pesos para serem mais uniformes (regularização mais forte, menos esparsidade), enquanto valores positivos menores encorajam pesos mais esparsos e com picos mais acentuados. Aumente se o amostrador sofrer overfitting; diminua (mas mantenha > 0) se ele for muito conservador. - sample_scaler (
float) — Fator de escala geral para as perturbações amostradas aplicadas aos pesos do LoRA. Aumentar esse valor torna o ruído de Monte Carlo mais forte (mais regularização e exploração, mas também mais instabilidade no treinamento); diminuí-lo aproxima o comportamento do LoRA determinístico padrão. Definir um valor muito próximo de 0 desativa em grande parte o efeito do Monteclora. - kl_loss_weight (
float) — Peso do termo de divergência de KL entre a distribuição variacional e sua priori. Valores maiores dão mais ênfase à correspondência com a priori (regularização mais forte, potencialmente subajuste); valores menores confiam mais na verossimilhança dos dados (regularização mais fraca, potencialmente sobreajuste). Ajuste este parâmetro se você notar que a Monteclora está regularizando demais ou de menos o adaptador. - buffer_size (
int) — Tamanho do buffer interno usado pelo amostrador de Monte Carlo (por exemplo, para armazenar estatísticas recentes). Valores maiores podem estabilizar os parâmetros variacionais estimados, ao custo de memória adicional; reduza este valor se estiver limitado em memória.
Esta é a classe de subconfiguração para armazenar a configuração do Monteclora (Monte Carlo Low-Rank Adaptation). O Monteclora introduz inferência variacional no LoRA ao adicionar amostragem de Monte Carlo aos pesos do adaptador.
Na prática, você pode pensar no Monteclora como a adição de perturbações estocásticas e aprendidas sobre os pesos do LoRA para obter um adaptador melhor calibrado e melhor regularizado. Os argumentos abaixo permitem equilibrar estabilidade, força da regularização e custo computacional.