Ajuste Fino Eficiente em Parâmetros (Parameter-Efficient Fine-Tuning, PEFT)
Visão geral
Ajuste Fino Eficiente em Parâmetros (Parameter-Efficient Fine-Tuning, PEFT) é uma família de técnicas para adaptar um modelo grande pré-treinado (pretrained) (tipicamente uma Arquitetura Transformer (Transformer Architecture)) a uma nova tarefa, domínio ou estilo treinando apenas um pequeno número de parâmetros, mantendo a maior parte (ou a totalidade) dos pesos (weights) originais do modelo “base” congelados (frozen).
Em vez de atualizar bilhões de parâmetros durante o ajuste fino completo (full fine-tuning), o PEFT introduz ou modifica componentes leves — como adaptadores (adapters), adaptação de baixo posto (Low-Rank Adaptation, LoRA), ou prompts/prefixos aprendidos (learned prompts/prefixes) — de modo que os custos de treinamento e armazenamento escalem com a parte ajustável pequena (small tunable part), e não com o modelo inteiro.
O PEFT é amplamente usado para modelos de linguagem grandes (large language models, LLMs) porque permite:
- Treinamento mais barato (menos memória de GPU, estados do otimizador (optimizer states) menores)
- Iteração mais rápida (frequentemente menos parâmetros treináveis e menor custo de comunicação)
- Implantação multi-tarefa (trocar pequenos módulos de tarefa sem duplicar o modelo completo)
- Adaptação mais segura (menor risco de sobrescrever capacidades pré-treinadas)
O PEFT é uma ferramenta-chave sob o guarda-chuva mais amplo de Ajuste Fino (Fine-Tuning) e é comumente usado em ajuste por instruções (instruction tuning), adaptação de domínio (domain adaptation) e personalização (personalization).
Por que PEFT funciona (intuição e fundamentos)
LLMs pré-treinados já contêm representações ricas de propósito geral. Muitas adaptações a jusante (downstream) podem ser obtidas aprendendo mudanças pequenas e estruturadas na forma como o modelo usa essas representações, em vez de reescrever todo o espaço de parâmetros.
Algumas lentes conceituais ajudam a explicar por que o PEFT é eficaz:
- Baixa dimensionalidade intrínseca das adaptações: A mudança necessária para uma nova tarefa pode estar em um subespaço de baixa dimensão do espaço completo de parâmetros. A LoRA usa explicitamente essa ideia ao restringir atualizações a matrizes de baixo posto.
- Reuso de características: O modelo base já computa características úteis; o PEFT aprende principalmente como reponderar, rotear ou condicionar essas características para o novo objetivo.
- Regularização via congelamento: Congelar a maior parte dos pesos reduz os graus de liberdade, o que pode melhorar a estabilidade e reduzir o sobreajuste (overfitting) — especialmente quando os dados rotulados são limitados.
- Modularidade: Ao isolar o comportamento específico da tarefa em módulos pequenos, você pode manter o modelo base como uma “fundação” compartilhada e anexar múltiplas especializações.
Do ponto de vista da otimização, o PEFT reduz memória e computação (compute) principalmente porque os estados do otimizador (por exemplo, o momento/variância do Adam) são armazenados apenas para parâmetros treináveis — frequentemente uma redução de 10×–1000× em comparação com o ajuste fino completo.
Famílias centrais de métodos de PEFT
Métodos de PEFT diferem em onde inserem parâmetros treináveis e como esses parâmetros influenciam a passagem direta (forward pass).
1) Módulos adaptadores (adaptadores de gargalo)
Adaptadores adicionam pequenos módulos neurais dentro de cada camada Transformer (frequentemente após blocos de atenção (attention) e/ou de feed-forward (feed-forward)). Um desenho comum é um MLP de gargalo (bottleneck MLP):
- Projeção para baixo do tamanho oculto (hidden size) (d) → tamanho de gargalo (r)
- Aplicar não linearidade
- Projeção para cima (r) → (d)
- Somar de forma residual à saída da camada
Apenas os parâmetros dos adaptadores são treinados; o modelo base permanece congelado.
Prós
- Forte desempenho em diversas tarefas
- Modular: muitos adaptadores podem ser armazenados e trocados
- Funciona bem para sistemas multi-domínio e multi-tarefa
Contras
- Adiciona latência extra na inferência (inference) (camadas extras)
- Tipicamente não é “mesclável (mergeable)” nos pesos base de forma tão limpa quanto a LoRA (embora algumas variantes possam ser fundidas)
Quando adaptadores se destacam
- Você quer muitas variantes de tarefa e troca rápida
- Você está construindo um “hub” de adaptadores para diferentes clientes/domínios
- Você se importa com comportamento estável e repetível com deriva mínima do modelo base
2) Adaptação de Baixo Posto (Low-Rank Adaptation, LoRA) e variantes
LoRA (coberta em detalhes no artigo relacionado LoRA (Adaptação de Baixo Posto)) congela a matriz de pesos original (W) e aprende uma atualização (\Delta W) restrita a ter baixo posto:
[ W' = W + \Delta W,\quad \Delta W = B A ]
onde (A \in \mathbb{R}^{r \times k}), (B \in \mathbb{R}^{d \times r}), e (r \ll \min(d,k)). Na prática, a LoRA é frequentemente aplicada às matrizes de projeção de atenção (por exemplo, (W_q, W_k, W_v, W_o)) e às vezes às projeções do MLP.
Prós
- Muito eficiente em parâmetros (frequentemente <1% dos parâmetros do modelo)
- Frequentemente mesclável aos pesos base para implantação (compute (W+\Delta W))
- Funciona bem com modelos base quantizados (quantized) (por exemplo, treinamento no estilo QLoRA)
Contras
- Ainda adiciona alguma sobrecarga em tempo de execução se não for mesclada
- A escolha do posto (r), dos módulos-alvo e do escalonamento afeta a qualidade
Variantes comuns (alto nível)
- QLoRA: treinar LoRA em um modelo base quantizado para reduzir ainda mais a memória (frequentemente em conjunto com quantização de 4 bits)
- DoRA e outras melhorias: ajustam como magnitude/direção são atualizadas; os detalhes variam por implementação
- LoRA em camadas selecionadas: às vezes apenas as camadas superiores precisam de adaptação
Quando LoRA se destaca
- Você quer forte qualidade com custo mínimo de treinamento
- Você quer a opção de mesclar e implantar como um único conjunto de pesos
- Você precisa treinar com memória de GPU limitada
3) Ajuste de prefixo e ajuste de prompt (prompts suaves)
Essas abordagens evitam modificar diretamente pesos internos e, em vez disso, aprendem vetores de prompt contínuos que condicionam o modelo.
- Ajuste de prompt (prompt tuning) (prompts suaves (soft prompts)): aprende um pequeno conjunto de vetores de incorporação (embeddings) prefixados às incorporações de entrada.
- Ajuste de prefixo (prefix tuning): aprende vetores que atuam como “tokens virtuais” para a atenção de cada camada (frequentemente como prefixos de chave/valor aprendidos), oferecendo mais controle do que apenas modificar incorporações de entrada.
Prós
- Extremamente eficiente em parâmetros (às vezes dezenas de milhares de parâmetros)
- Mantém o modelo base completamente intocado (útil para governança ou modelos compartilhados)
- Fácil de armazenar e trocar entre tarefas
Contras
- Pode ter desempenho inferior a LoRA/adaptadores para transformações complexas ou grandes mudanças de domínio
- Frequentemente não pode ser mesclado aos pesos base; exige condicionamento em tempo de execução
- Sensível ao comprimento do prompt e à inicialização
Quando prompts suaves se destacam
- Você precisa de condicionamento de tarefa ultraleve
- Você está adaptando um modelo para muitas tarefas pequenas com pouquíssimo armazenamento
- Você quer interferência mínima com o comportamento base
4) Ajuste fino parcial (descongelamento seletivo)
Nem sempre categorizado como “PEFT clássico”, mas comumente usado na prática:
- Descongelar apenas as últimas N camadas
- Descongelar apenas parâmetros de normalização de camada (LayerNorm) (e talvez vieses (biases))
- BitFit: treinar apenas vieses na rede
Prós
- Simples de implementar
- Pode funcionar surpreendentemente bem para algumas tarefas
Contras
- Menos modular do que adaptadores/LoRA
- Ainda pode exigir estados do otimizador consideráveis se muitos parâmetros forem descongelados
- Pode causar mais “deriva” do que módulos estritamente aditivos
5) Outras parametrizações leves (por exemplo, IA³)
Métodos como IA³ introduzem vetores leves de escalonamento que modulam ativações (por exemplo, escalonando chaves/valores ou ativações intermediárias do MLP).
Prós
- Muito eficiente em parâmetros
- Frequentemente competitivo para certas tarefas de PLN
Contras
- Menos padronizado entre toolchains do que LoRA/adaptadores
- Ajustes específicos do método podem ser chatos de calibrar
PEFT vs ajuste fino completo: como escolher
O ajuste fino completo atualiza todos os parâmetros. O PEFT atualiza um pequeno subconjunto. A escolha certa depende dos dados, do comportamento-alvo e das necessidades de implantação.
Use PEFT quando…
- Você tem poucos dados de treinamento e quer reduzir o risco de sobreajuste.
- Você precisa entregar muitas variantes (por cliente, por domínio, por funcionalidade) sem armazenar cópias completas do modelo.
- Você está limitado por memória de GPU (PEFT reduz drasticamente a memória de estados do otimizador).
- Você quer experimentação mais rápida (um conjunto treinável menor frequentemente acelera treinamento e varreduras de hiperparâmetros).
- Você quer preservar capacidades base e reduzir o risco de Esquecimento Catastrófico (Catastrophic Forgetting).
Use ajuste fino completo quando…
- Você tem dados de treinamento grandes e de alta qualidade e quer o máximo desempenho na tarefa.
- Você precisa de mudanças comportamentais profundas em muitas camadas (por exemplo, uma mudança substancial de domínio, novas “habilidades” ou fortes restrições de formato).
- Você controla a implantação e pode armazenar pesos completos separados do modelo por variante.
- Você exige a melhor qualidade possível e pode arcar com a computação (e potencialmente com avaliação adicional e trabalho de segurança).
Em muitos cenários de produto com LLMs, um padrão comum é:
- Começar com PEFT (frequentemente LoRA) por velocidade e custo
- Se a qualidade estabilizar abaixo do necessário, tentar dados melhores ou um modelo base maior
- Só então considerar ajuste fino completo como uma opção mais cara
Trade-offs práticos: memória, computação, qualidade e velocidade
Memória
A memória de treinamento geralmente inclui:
- Pesos do modelo (passagem direta)
- Ativações (passagem inversa (backward))
- Estados do otimizador (frequentemente o maior componente no ajuste fino completo)
O PEFT reduz memória principalmente ao encolher os estados do otimizador:
- O ajuste fino completo com Adam mantém ~2 tensores extras por parâmetro (além dos gradientes), o que é caro para bilhões de pesos.
- Com PEFT, estados do Adam são armazenados apenas para parâmetros de adaptadores/LoRA/prompt.
É por isso que LoRA + quantização (quantization) (frequentemente referido como estilo QLoRA) é popular: você mantém um modelo base congelado quantizado na memória enquanto treina um pequeno conjunto de pesos em ponto flutuante.
Conceitos relacionados: Quantização (Quantization), Treinamento em Precisão Mista (Mixed Precision Training).
Computação e vazão
- Computação de treinamento: o PEFT reduz a computação da passagem inversa porque gradientes são calculados para menos parâmetros, mas você ainda executa a passagem direta completa do modelo base. Os ganhos líquidos de velocidade variam.
- Computação de inferência:
- LoRA pode adicionar pequena sobrecarga a menos que seja mesclada
- Adaptadores adicionam camadas extras (sobrecarga perceptível)
- Ajuste de prompt/prefixo adiciona tokens extras ou condicionamento de atenção (a sobrecarga depende do comprimento do prompt)
Qualidade e generalização
Tendências gerais (não regras absolutas):
- LoRA/adaptadores frequentemente se aproximam muito do ajuste fino completo em muitas tarefas, especialmente ajuste por instruções e adaptação de domínio.
- Métodos de prompt suave podem ser muito fortes para classificação ou geração restrita, mas podem ficar atrás em tarefas que exigem reescritas profundas de comportamento.
- Ajuste fino completo ainda pode vencer quando a tarefa exige reconfiguração interna ampla, ou quando há enormes conjuntos de dados supervisionados disponíveis.
Um ponto prático fundamental: qualidade dos dados e avaliação frequentemente dominam a diferença entre métodos de PEFT. Se seu conjunto de dados é ruidoso, enviesado ou mal especificado, nenhum método de ajuste fino irá salvá-lo.
Padrões de implantação e mesclagem
Considerações de implantação frequentemente determinam qual método de PEFT é o melhor.
Mesclagem (especialmente para LoRA)
Uma grande vantagem da LoRA é que muitas vezes você pode “mesclar” a atualização aprendida nas matrizes de pesos base:
[ W_{\text{merged}} = W + BA ]
Após mesclar, a inferência roda como se fosse um modelo normal (sem módulos LoRA), o que simplifica o serviço e pode melhorar a latência.
Ressalvas
- Você deve mesclar em um checkpoint (checkpoint) base específico (mesma arquitetura e pesos).
- Se você quiser múltiplas tarefas, você:
- mantém checkpoints mesclados separados, ou
- mantém o modelo base + múltiplos módulos LoRA e carrega/troca em tempo de execução
Troca a quente de módulos de tarefa
O PEFT viabiliza padrões de serviço como:
- Um único modelo base na memória da GPU
- Múltiplos pequenos adaptadores/LoRAs em disco
- Carregar o módulo certo por requisição (ou por locatário (tenant))
Isso pode reduzir enormemente o armazenamento: em vez de armazenar 20 modelos completos de 7B, você armazena 1 base + 20 pequenos deltas.
Composição (avançado)
Alguns sistemas tentam compor múltiplos adaptadores/LoRAs (por exemplo, domínio + estilo). Isso pode funcionar, mas não é garantido:
- Atualizações podem interferir
- Ordem/escalonamento importa
- Você precisa de avaliação cuidadosa para regressões
Exemplos práticos (conceituais e código)
Exemplo: adaptação de domínio para um bot de suporte ao cliente
Objetivo: adaptar uma LLM geral à documentação de produto da sua empresa e ao tom de suporte.
- Comece com um modelo base instruído (instruct model) forte.
- Colete pares de perguntas e respostas (Q/A pairs) de alta qualidade a partir de tickets resolvidos e documentos curados.
- Treine LoRA nas projeções de atenção (e, opcionalmente, nas projeções do MLP).
- Avalie em:
- factualidade e conformidade com políticas
- comportamento de recusa
- testes de regressão para utilidade geral
Se os resultados forem bons, você pode mesclar a LoRA para um único “modelo de suporte”, ou mantê-la modular para configurações multi-locatário.
Exemplo de código: ajuste fino com LoRA usando Hugging Face PEFT (ilustrativo)
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
base_model_name = "meta-llama/Llama-2-7b-hf" # example; choose what you have access to
tokenizer = AutoTokenizer.from_pretrained(base_model_name)
model = AutoModelForCausalLM.from_pretrained(
base_model_name,
device_map="auto",
)
lora_cfg = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules=["q_proj", "v_proj"], # common choices; varies by architecture
bias="none",
task_type="CAUSAL_LM",
)
model = get_peft_model(model, lora_cfg)
model.print_trainable_parameters()
# Suppose you already built a tokenized dataset: train_dataset, eval_dataset
args = TrainingArguments(
output_dir="./lora-support-bot",
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
learning_rate=2e-4,
num_train_epochs=1,
fp16=True,
logging_steps=10,
save_steps=200,
)
trainer = Trainer(
model=model,
args=args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
)
trainer.train()
trainer.save_model("./lora-support-bot")
tokenizer.save_pretrained("./lora-support-bot")
Notas:
target_modulesdeve corresponder aos nomes das camadas do seu modelo.- O posto
re quais módulos você escolhe como alvo podem afetar significativamente a qualidade e a contagem de parâmetros. - Para treinamento com restrição de memória, muitos profissionais combinam PEFT com quantização (configurações no estilo QLoRA).
Exemplo de código: mesclando pesos LoRA (passo comum de implantação)
from transformers import AutoModelForCausalLM
from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
lora_model = PeftModel.from_pretrained(base, "./lora-support-bot")
merged = lora_model.merge_and_unload() # merges LoRA into base weights
merged.save_pretrained("./support-bot-merged")
Após mesclar, você pode servir ./support-bot-merged como um checkpoint de modelo normal.
Hiperparâmetros e dicas práticas de ajuste
Para LoRA
Controles comuns:
- Posto (
r): posto mais alto aumenta a capacidade e os parâmetros treináveis. - Módulos-alvo: projeções de atenção são um padrão inicial forte; adicionar projeções do MLP pode ajudar em adaptações mais difíceis.
- Alpha / escalonamento: controla a magnitude efetiva da atualização.
- Dropout (dropout): pode melhorar a generalização quando os dados são pequenos.
Regras de bolso:
- Comece com
r=8our=16, mirandoq_projev_proj. - Se houver subajuste (underfitting): aumente
r, adicione mais módulos-alvo ou treine por mais tempo. - Se houver sobreajuste: aumente dropout, reduza a taxa de aprendizado, melhore a curadoria dos dados.
Para adaptadores
- O tamanho de gargalo (r) é análogo ao posto: adaptadores maiores aprendem mais, mas custam mais.
- A colocação do adaptador importa (após atenção, após MLP, ou ambos).
Para ajuste de prompt/prefixo
- O comprimento do prompt (número de tokens virtuais) pode trocar capacidade vs sobrecarga.
- O ajuste de prefixo frequentemente oferece mais controle do que apenas prefixar incorporações.
Armadilhas comuns
- Checkpoint base incompatível: uma LoRA/adaptador treinado em um conjunto exato de pesos base deve ser usado com esse mesmo base.
- Pontos cegos de avaliação: é fácil melhorar na sua distribuição de treinamento enquanto piora a utilidade geral ou a segurança. Use suítes de regressão e testes adversariais (adversarial tests).
- Otimizar demais posto/tamanho: módulos PEFT maiores podem se aproximar do custo do ajuste fino completo sem garantir melhor qualidade. A qualidade dos dados geralmente importa mais.
- Ignorar restrições de inferência: adaptadores e LoRA não mesclada adicionam sobrecarga. Se a latência é rígida, planeje mesclagem ou menos módulos.
- Esquecer mudanças no comprimento de contexto: métodos de prompt suave interagem com janelas de contexto (tokens virtuais consomem espaço).
Onde o PEFT se encaixa em fluxos de trabalho modernos com LLMs
O PEFT é comumente usado em:
- Ajuste por instruções supervisionado (Ajuste Fino Supervisionado (Supervised Fine-Tuning))
- Especialização por domínio (jurídico, médico, documentos internos)
- Adaptação de estilo e persona
- Implantações corporativas multi-locatário (um base, muitos pequenos deltas)
- Prototipação rápida antes de se comprometer com um treinamento mais caro
Ele também combina bem com outras técnicas de otimização e de sistemas, como Quantização e serviço eficiente.
Resumo
O PEFT adapta modelos grandes pré-treinados ao treinar apenas um pequeno número de parâmetros — por meio de adaptadores, atualizações de baixo posto no estilo LoRA, ou prompts/prefixos aprendidos — mantendo a maior parte dos pesos base congelada. Em comparação com o ajuste fino completo, o PEFT normalmente oferece:
- Memória de treinamento muito menor (especialmente estados do otimizador)
- Iteração mais rápida e experimentação mais barata
- Implantação modular (trocar pequenos deltas de tarefa)
- Qualidade frequentemente comparável para muitas tarefas do mundo real
O melhor método de PEFT depende das suas restrições:
- Escolha LoRA quando quiser forte desempenho, eficiência e mesclagem opcional.
- Escolha adaptadores quando quiser modularidade em muitas tarefas e não se importar com camadas extras em tempo de execução.
- Escolha ajuste de prompt/prefixo quando precisar de condicionamento ultraleve e máxima separação dos pesos base.
Na prática, os maiores ganhos de qualidade geralmente vêm de dados e avaliação melhores, com o PEFT atuando como um mecanismo eficiente e escalável para aplicar esses dados a modelos pré-treinados poderosos.