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 é:

  1. Começar com PEFT (frequentemente LoRA) por velocidade e custo
  2. Se a qualidade estabilizar abaixo do necessário, tentar dados melhores ou um modelo base maior
  3. 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_modules deve corresponder aos nomes das camadas do seu modelo.
  • O posto r e 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=8 ou r=16, mirando q_proj e v_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.