Ir para o conteúdo

14. Transfer Learning

Quase ninguém treina mais um modelo do zero. A pergunta interessante deixou de ser como adaptar um modelo pré-treinado e passou a ser se vale adaptá-lo — porque as alternativas ficaram muito boas.

Então este capítulo é organizado em torno de uma decisão, não de uma técnica. Primeiro: você deve mudar os pesos? Normalmente não. Depois, se deve: quais pesos, quantos e com qual objetivo — e as respostas honestas são "os de posto baixo", "cerca de 0,5% deles" e "depende de você ter rótulos, preferências ou um verificador".

Slides

Clique nos slides e use as setas ← → para navegar; F abre em tela cheia e P abre a visão do apresentador, com as notas. Os três simuladores e os quatro diagramas desta página rodam dentro dos slides. Abrir os slides numa aba nova

Antes de fazer fine-tuning: não faça

Fine-tuning é a resposta cara para uma pergunta que quatro coisas mais baratas costumam responder melhor. A ordem abaixo é a que se deve percorrer, de cima para baixo. Parar no meio é o desfecho normal.

Tente isto primeiro Resolve Não resolve
Um prompt melhor, com alguns exemplos Formato, tom, enquadramento da tarefa, a maioria das queixas de "o modelo não segue instruções" Conhecimento ausente; latência; custo por chamada
Busca (RAG): os trechos relevantes vão para o prompt Fatos que o modelo não tem, fatos que mudam, dados por cliente, citações Comportamento e estilo; capacidade de raciocínio
Ferramentas e chamadas de função Aritmética, dados atuais, ações num sistema, qualquer coisa cuja resposta certa um programa calcula Qualquer coisa sem API
Um modelo maior ou mais novo Quase tudo, na hora, a um custo por token mais alto Suas metas de latência e custo unitário
Fine-tuning Formato e comportamento consistentes a baixo custo; um modelo pequeno que iguala um grande na sua tarefa; vocabulário e estilo do domínio Fatos que mudam — esses pertencem à busca

Fine-tuning é a ferramenta errada para ensinar fatos

Este é o erro mais comum e mais caro em trabalho aplicado com LLMs. Um fine-tune espalha fatos novos por bilhões de pesos, de forma não verificável, sem citação e sem jeito de atualizar ou apagar um deles. Um índice de busca faz o mesmo trabalho com um PUT. Faça fine-tune de comportamento; busque conhecimento. Quando alguém propuser fazer fine-tuning na documentação da empresa, esta é a frase para dizer em voz alta.

Há um caso econômico que justifica fine-tuning de forma confiável: você tem um prompt que funciona num modelo de fronteira e precisa que ele rode 100× mais barato. Gere dados com o modelo grande, faça fine-tune de um pequeno e meça a diferença. Isso é destilação e é assim que a maioria dos modelos pequenos em produção é de fato construída hoje.

O quadro clássico e por que ele mudou

A história original de transfer learning1 é sobre camadas: as camadas iniciais de um modelo de visão aprendem bordas e texturas que transferem para qualquer lugar, as finais aprendem as categorias do ImageNet, então você congela a frente e retreina o fundo9. Está correto e para uma tarefa pequena ainda é exatamente o que fazer.

"Congelar" quer dizer requires_grad = False: os pesos continuam calculando, mas não recebem gradiente nem estado de otimizador. Isso dá três regimes clássicos, do barato ao caro, com os preços do modelo do laboratório (DistilBERT, 66,4 M de parâmetros, com uma cabeça 768 → 2 para sentimento):

Regime O que treina Parâmetros treináveis O que ele não consegue
Linear probe (extração de features) só a cabeça nova 1.538 Mudar as features: só traça um hiperplano no espaço que o encoder já construiu
Fine-tuning parcial a cabeça e os últimos blocos ~7,1 M por bloco Consertar o que os blocos iniciais congelados erraram
Fine-tuning completo tudo, com taxa de aprendizado pequena 66,4 M Sair barato: cada peso ganha um gradiente e um estado de otimizador

Um encoder congelado tem uma segunda vantagem fácil de perder de vista: as features dele não mudam, então podem ser calculadas uma vez e guardadas; treinar a cabeça leva segundos.

Os mesmos regimes no modelo do laboratório, com o LoRA (assunto das próximas seções) ao lado: escolha um e veja o que treina, até onde a passagem reversa precisa descer e quanto isso custa. A faixa embaixo dos blocos é o quadro clássico: camadas iniciais gerais, camadas finais específicas da tarefa de pré-treino.

O DistilBERT com uma cabeça nova, desenhado como uma fila: as embeddings, seis blocos Transformer, a média sobre os tokens, a cabeça e a perda. Um botão escolhe o regime. Linear probe: só a cabeça treina, a passagem reversa para na cabeça e o encoder roda uma vez por frase. Fine-tuning parcial: o bloco 6 e a cabeça treinam e a passagem reversa para no bloco 6. LoRA: os pesos pré-treinados ficam congelados, os adaptadores ficam dentro dos seis blocos e a passagem reversa atravessa o encoder inteiro para chegar a eles. Fine-tuning completo: tudo treina e a passagem reversa chega às embeddings.

O quadro clássico deixou de bastar por uma razão. Num modelo de linguagem, o comportamento que você quer mudar não está numa última camada que dá para trocar: está espalhado por todos os blocos. "Retreinar o fundo" vira "retreinar tudo" e, para um modelo de 8B de parâmetros, isso significa um estado de otimizador que não cabe.

Troque o método para fine-tuning completo e leia a divisão. O problema não são os pesos. O AdamW mantém uma cópia mestra em fp32 mais duas estimativas de momento — 12 bytes por parâmetro treinável, seis vezes o tamanho dos próprios pesos em bf16. (O bf16 e o fp32 guardam um número em 2 e 4 bytes. Os momentos são médias móveis do gradiente e do seu quadrado; a cópia mestra guarda os pesos em fp32 para que os passos pequenos não se percam no arredondamento do bf16.) Some os gradientes e você precisa de cerca de 16 bytes por parâmetro antes de guardar uma única ativação. Para o modelo de 8B: 16 GB de pesos, 16 de gradientes e 96 de estado do otimizador.

Esse número é toda a motivação do fine-tuning eficiente em parâmetros (PEFT): gradientes e estado do otimizador são dimensionados pelos parâmetros treináveis, não pelo tamanho do modelo. Torne 0,5% dos parâmetros treináveis e a conta do painel para o modelo de 8B cai de 129 GB para 18 GB, quase tudo os próprios pesos congelados.

LoRA: a atualização é de posto baixo

A hipótese do LoRA2 é uma afirmação sobre adaptação, não sobre compressão: a mudança que uma tarefa exige tem posto muito menor do que a matriz de pesos que ela modifica. Congele \(W_0\) e aprenda a atualização como produto de duas matrizes finas:

\[ W = W_0 + \Delta W = W_0 + \frac{\alpha}{r} BA, \qquad B \in \mathbb{R}^{d \times r},\; A \in \mathbb{R}^{r \times k},\; r \ll \min(d,k) \]

\(W_0\) é a matriz pré-treinada \(d \times k\) (\(d\) saídas, \(k\) entradas), \(r\) é o posto da atualização (o número de direções independentes que ela pode ter) e \(\alpha\) é uma escala fixa. \(A\) é inicializada aleatoriamente e \(B\) em zero, de modo que \(\Delta W = 0\) no primeiro passo e o treino começa exatamente do modelo pré-treinado. (As duas em zero, não: o gradiente de \(B\) é proporcional a \(A\) e o de \(A\) a \(B\), então dois fatores nulos nunca sairiam do lugar.) A escala \(\alpha/r\) existe para que mudar \(r\) não obrigue a reajustar a taxa de aprendizado.

A LoRALinear do laboratório, com posto 1 numa matriz 2 × 3, linha a linha: o forward, os dois gradientes (\(\partial L/\partial A\) é exatamente zero no primeiro passo, porque passa por \(B\)), um passo de SGD, um segundo e a fusão. Um passo leva a perda de 0,29 para 0,1856; com \(A\) e \(B\) em zero ela nunca se mexe e com um décimo da taxa de aprendizado quase não se mexe (0,2785).

W₀ (congelada), x e A₀ · k = 3 colunas
y e B₀ · d = 2 linhas

A contagem de parâmetros sai dos formatos. Uma atualização completa de uma matriz \(d \times k\) tem \(dk\) números; o LoRA treina \(r(d+k)\):

Matriz Atualização completa \(dk\) LoRA, \(r = 8\): \(r(d+k)\) Razão
uma projeção de atenção 4096 × 4096 (modelo da classe de 8B) 16.777.216 65.536 256×
q_lin do DistilBERT, 768 × 768 589.824 12.288 48×
lin1 do DistilBERT, 768 → 3072 2.359.296 30.720 77×

Os mesmos formatos, em escala. Escolha uma matriz e um posto; as lascas roxas são tudo o que treina.

r =
Uma camada LoRA em escala: a matriz congelada W0, de d linhas e k colunas, mais alfa sobre r vezes B, uma lasca de d linhas e r colunas, vezes A, uma lasca de r linhas e k colunas. O produto BA tem o formato de W0 e posto no máximo r. Botões escolhem a matriz (a q_lin do DistilBERT, a lin1 dele ou uma projeção 4096 por 4096) e o posto; o texto embaixo conta os números: d vezes k congelados contra r vezes d mais k treináveis.

No DistilBERT, o LoRA nas seis camadas lineares de cada um dos seus seis blocos acrescenta \(6 \times 8 \times (4 \cdot 1536 + 2 \cdot 3840) = 663.552\) parâmetros com \(r = 8\), 1% do modelo. O laboratório confere esse número contra o peft.

Se a hipótese vale depende inteiramente da tarefa e é para isso que serve o painel abaixo.

O terceiro painel — o que o posto escolhido não consegue expressar — é o que se deve observar. Uma mudança de estilo ou formato é genuinamente de posto 2 ou algo assim e o LoRA empata com o fine-tuning completo. Uma mudança de domínio quer de 16 a 32. Ensinar um idioma novo não é de posto baixo e nenhum \(r\) acessível esvazia aquele painel.

Os três espectros do painel são inventados para mostrar o mecanismo. A versão medida é a de Biderman et al.8: no pré-treino continuado para código e matemática (mais treino de próximo token num corpus grande e sem rótulos do domínio novo), a mudança de pesos que o fine-tuning completo aprende tem posto de 10 a 100 vezes maior que as configurações típicas de LoRA. Ali o LoRA fica para trás. Numa tarefa estreita acontece o contrário: no laboratório, a classificação de sentimento fica dentro de uns 2 pontos de \(r = 1\) a \(r = 32\), sem ganho depois de \(r = 4\).

Configurações práticas de LoRA e um conselho ultrapassado para desaprender

O artigo original aplicava LoRA só a \(W_q\) e \(W_v\) e essa recomendação continua sendo repetida em toda parte. Trabalhos posteriores38 concluíram que aplicar a todas as camadas lineares — inclusive o MLP — é o que é preciso para empatar com o fine-tuning completo; o MLP é onde vivem dois terços dos parâmetros de um bloco. Padrões sensatos:

  • \(r = 16\), \(\alpha = 32\) como ponto de partida; aumente \(r\) só se a perda de treino estacionar alta.
  • Mire todas as projeções lineares: q,k,v,o,gate,up,down.
  • Taxa de aprendizado 10× maior que a do fine-tuning completo — perto de 1e-4, não 1e-5.
  • Faça o merge para produção: \(W_0 + \frac{\alpha}{r}BA\) volta a ser uma matriz só, então a inferência não custa nada a mais. Mantenha sem merge quando quiser servir muitos adaptadores sobre uma base compartilhada.

O QLoRA3 acrescenta a outra metade: encolhe o único item que o LoRA não toca, os pesos congelados. A base é guardada em NF4 de 4 bits (NormalFloat: 16 níveis colocados em quantis de uma distribuição normal, densos perto de zero, onde está a maioria dos pesos), em blocos de 64 pesos que dividem uma escala; cada bloco é desquantizado para bf16 na hora de ser multiplicado e os pesos LoRA ficam em bf16. Como a base está congelada, o erro de quantização é um viés fixo em torno do qual o adaptador simplesmente aprende. É a técnica que colocou fine-tuning de 65B numa única GPU de 48 GB. Um bloco, passo a passo:

O armazenamento do QLoRA, passo a passo, num bloco de 64 pesos congelados: os pesos numa reta numérica; divididos pelo maior valor absoluto do bloco, de modo que ficam entre menos um e um; arredondados para o mais próximo dos 16 níveis do NF4 (densos perto de zero) e guardados como índices de 4 bits; as constantes de escala quantizadas de novo; a passagem direta, que desquantiza para bf16 e soma o caminho LoRA em bf16, com o gradiente chegando a A, a B e à entrada, mas não aos códigos guardados; e a conta de um modelo de 65B: 130 GB em bf16 contra 33,5 GB em NF4.

O DoRA5 decompõe cada peso em magnitude e direção e aplica LoRA só à direção. Nos testes dos autores ele supera o LoRA de forma consistente a um custo de treino praticamente igual e o merge funciona do mesmo jeito, então a inferência não custa nada a mais. É a variante recente de PEFT a tentar primeiro quando o LoRA fica aquém.

O resto do zoológico de PEFT, com honestidade

Técnica Situação em 2026
LoRA O padrão. Todo o resto é medido contra ele.
QLoRA O padrão quando a restrição é memória.
DoRA Vale tentar quando o LoRA não basta e o fine-tuning completo não cabe no orçamento.
Camadas adaptadoras (Houlsby) MLPs pequenos, em gargalo, inseridos entre as camadas. Histórico: acrescentam latência de inferência porque não podem ser fundidas.
Prefix / prompt tuning Alguns vetores aprendidos colocados antes da entrada (prompt tuning) ou antes das chaves e dos valores de cada camada (prefix tuning); o modelo fica congelado. Histórico: difíceis de otimizar, mais fracos e consomem janela de contexto.
BitFit, IA³ Treinam só os vieses (BitFit) ou um vetor de escala por ativação (IA³). Curiosidades: úteis para entender o que basta, não para entregar.

Pós-treino: o que você otimiza, não quais pesos

O PEFT responde "quais pesos se movem". A outra metade da pergunta é em direção a quê e o pipeline moderno tem três estágios que fazem coisas genuinamente diferentes.

Percorra os estágios abaixo. Cada um mostra os dados que consome, o sinal que o treina e o que muda no modelo; um mesmo prompt é acompanhado do modelo base até o modelo em produção.

Nem todo modelo passa por todos os estágios: o estágio 3 precisa de respostas que possam ser checadas e um modelo destilado muitas vezes para no SFT.

1. Fine-tuning supervisionado (SFT). Treine em pares (prompt, boa resposta) — a mesma perda de próximo token, sobre demonstrações curadas. É o que transforma um modelo base em algo que responde em vez de continuar. Aqui a qualidade dos dados domina a quantidade com folga: alguns milhares de exemplos escritos com cuidado rotineiramente batem centenas de milhares raspados.

2. Otimização de preferências. O SFT ensina uma boa resposta; não consegue ensinar que a resposta A é melhor que a B. A solução original, RLHF7 (aprendizado por reforço com feedback humano), treina um modelo de recompensa com comparações humanas e otimiza a política (o modelo em treino) com PPO, um algoritmo de aprendizado por reforço — poderoso e um fardo de engenharia real: quatro modelos na memória (a política, uma referência congelada, o modelo de recompensa e uma rede de valor que prevê a recompensa esperada) e um laço notoriamente instável.

O DPO4 removeu a maior parte disso. A sacada é que o objetivo do RLHF tem uma política ótima em forma fechada, então o modelo de recompensa pode ser substituído algebricamente e as preferências otimizadas diretamente com uma perda de estilo classificação sobre pares:

\[ \mathcal{L}_{\text{DPO}} = -\log \sigma\!\left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) \]

Aqui \(x\) é o prompt, \(y_w\) e \(y_l\) são a resposta preferida e a rejeitada, \(\pi_\theta\) é o modelo em treino, \(\pi_{\text{ref}}\) é o modelo SFT congelado, \(\beta\) diz o quanto \(\pi_\theta\) pode se afastar de \(\pi_{\text{ref}}\) e \(\sigma\) é a sigmoide. Dois modelos em vez de quatro, sem laço de amostragem e treina como aprendizado supervisionado. Para a maioria dos praticantes, substituiu o PPO por completo.

3. Aprendizado por reforço a partir de um verificador (RLVR). Quando a correção pode ser checada — um teste unitário passa, uma prova compila, uma resposta aritmética bate — não é preciso modelo de recompensa aprendido nenhum. Amostre várias tentativas, pontue com o verificador e empurre probabilidade para as que deram certo. O GRPO10 faz exatamente isso e ainda descarta a rede de valor, normalizando as recompensas dentro de cada grupo de amostras:

\[ \hat{A}_i = \frac{r_i - \text{mean}(r_{1..G})}{\text{std}(r_{1..G})} \]

São amostradas \(G\) tentativas para o mesmo prompt, \(r_i\) é a nota do verificador para a tentativa \(i\) e a vantagem \(\hat{A}_i\) é positiva para as tentativas acima da média do grupo (mean é a média, std o desvio padrão). É o sinal de treino por trás dos modelos de raciocínio dos últimos dois anos6 e é tratado apropriadamente no capítulo 15. O ponto a levar daqui: isso é fine-tuning e precisa de um verificador em vez de um rótulo.

Esquecimento catastrófico não é hipotético

Faça fine-tune pesado numa tarefa estreita e o modelo piora em todo o resto — inclusive em seguir instruções e nos comportamentos de segurança para os quais ele foi alinhado. Mitigações, na ordem em que costumam ser a resposta certa: use LoRA (ele muda menos, então esquece menos8), mantenha a taxa de aprendizado baixa, misture ~10% de dados gerais no seu conjunto e avalie em tarefas nas quais você não está treinando antes e depois. Essa última é a única forma de descobrir.

Quando usar o quê

Situação Faça isto
Formato ou tom errados Engenharia de prompt. Não faça fine-tune.
Fatos ausentes ou que mudam RAG. Não faça fine-tune.
Precisa de dados atuais ou de ações Ferramentas / chamadas de função
Qualidade de modelo de fronteira a 1% do custo Destile: gere dados com o grande, faça SFT num pequeno
< 1k exemplos rotulados Prompting few-shot, ou encoder congelado + cabeça linear em visão
1k–100k exemplos, uma GPU LoRA, todas as camadas lineares, \(r=16\)
Idem, mas limitado por memória QLoRA
> 100k exemplos, um cluster de verdade e a tarefa é distante do pré-treino Fine-tuning completo ou pré-treino continuado
Muitos clientes, um modelo base Adaptadores LoRA servidos sem merge sobre uma base compartilhada
"Prefira esta resposta àquela" SFT → DPO
Respostas que um programa consegue checar SFT → GRPO com um verificador
Um corpus inteiro de domínio novo, sem rótulos Pré-treino continuado, depois SFT

Laboratório: fine-tuning, com o preço na etiqueta

Todo número desta página que envolve o DistilBERT é medido num notebook no Colab: o DistilBERT (66 M de parâmetros) adaptado ao SST-2, o sentimento de frases de críticas de cinema, com 2.000 exemplos de treino. Ele precisa de GPU e a T4 gratuita do Colab basta (Ambiente de execução → Alterar o tipo de ambiente de execução → GPU T4); não é preciso instalar nada. São onze seções, cada uma terminando num checkpoint com valor de verificação:

  1. os parâmetros de um encoder Transformer, contados à mão;
  2. um linear probe: features calculadas uma vez, 1.538 números treinados;
  3. o fine-tuning completo, com o estado do otimizador medido em bytes;
  4. o LoRA escrito à mão: a inicialização em zero, qual fator recebe gradiente primeiro, o merge;
  5. o LoRA com peft em todas as camadas lineares, o \(r(d+k)\) conferido contra o print_trainable_parameters e a taxa de aprendizado de que ele precisa;
  6. uma varredura de posto de \(r = 1\) a \(r = 32\);
  7. o modelo com merge, conferido contra o sem merge;
  8. o posto da atualização que o fine-tuning completo encontrou sozinho;
  9. o que cada método esqueceu, medido numa segunda tarefa;
  10. (opcional, só com CUDA) a base em 4 bits do QLoRA;
  11. sua vez: abaixo de quantos exemplos rotulados o probe basta?

Abrir o laboratório no Colab — salve uma cópia no seu Drive (Arquivo → Salvar uma cópia no Drive) para rodar e editar.

Pontos principais

  1. A primeira pergunta é se vale fazer fine-tuning. Prompting, busca, ferramentas e um modelo maior resolvem a maior parte daquilo que as pessoas tentam consertar com fine-tuning.
  2. Fine-tune comportamento, busque conhecimento. Fatos em pesos não podem ser citados, atualizados nem apagados.
  3. O fine-tuning completo é caro por causa do estado do otimizador, não dos pesos: o AdamW custa 12 bytes por parâmetro treinável.
  4. O LoRA funciona quando a atualização necessária é de posto baixo — o que é verdade para estilo e formato, aproximadamente verdade para mudanças de domínio e falso para conhecimento novo.
  5. Aplique LoRA a todas as camadas lineares, use taxa de aprendizado ~10× maior que a do fine-tuning completo e faça merge para produção para que a inferência não custe nada a mais.
  6. O QLoRA quantiza a base congelada; o adaptador aprende em torno do erro de quantização. O DoRA é a variante a tentar quando o LoRA fica aquém.
  7. O pós-treino é SFT → otimização de preferências → RL a partir de um verificador. O DPO substituiu o PPO para a maioria; GRPO com um verificador foi o que produziu os modelos de raciocínio.
  8. Destilação a partir de um modelo mais forte é como a maioria dos modelos pequenos de produção é construída.
  9. Fine-tuning causa esquecimento. Misture dados gerais, prefira LoRA e avalie fora da tarefa.


  1. Pan, S. J., & Yang, Q. (2010). A Survey on Transfer Learning — IEEE TKDE. O enquadramento que antecede o deep learning e ainda organiza a área. ↩

  2. Hu, E. J., et al. (2022). LoRA: Low-Rank Adaptation of Large Language Models — ICLR. ↩

  3. Dettmers, T., Pagnoni, A., Holtzman, A., & Zettlemoyer, L. (2023). QLoRA: Efficient Finetuning of Quantized LLMs — NeurIPS. NF4 de 4 bits, dupla quantização, otimizadores paginados. ↩↩

  4. Rafailov, R., et al. (2023). Direct Preference Optimization: Your Language Model is Secretly a Reward Model — NeurIPS. A dedução que remove o modelo de recompensa. ↩

  5. Liu, S.-Y., et al. (2024). DoRA: Weight-Decomposed Low-Rank Adaptation — ICML. ↩

  6. DeepSeek-AI (2025). DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. GRPO em escala e raciocínio aprendido de um verificador em vez de demonstrações. ↩

  7. Ouyang, L., et al. (2022). Training language models to follow instructions with human feedback — NeurIPS. InstructGPT; o pipeline SFT → modelo de recompensa → PPO por inteiro. ↩

  8. Biderman, D., et al. (2024). LoRA Learns Less and Forgets Less — TMLR. Uma medição cuidadosa das duas metades da troca. ↩↩↩

  9. Yosinski, J., Clune, J., Bengio, Y., & Lipson, H. (2014). How transferable are features in deep neural networks? — NeurIPS. A medição camada a camada: features gerais no começo, específicas da tarefa no fim. ↩

  10. Shao, Z., et al. (2024). DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. Onde o GRPO foi introduzido. ↩