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 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_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).
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.
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ão1e-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 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:
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:
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:
- os parâmetros de um encoder Transformer, contados à mão;
- um linear probe: features calculadas uma vez, 1.538 números treinados;
- o fine-tuning completo, com o estado do otimizador medido em bytes;
- o LoRA escrito à mão: a inicialização em zero, qual fator recebe gradiente primeiro, o merge;
- o LoRA com
peftem todas as camadas lineares, o \(r(d+k)\) conferido contra oprint_trainable_parameterse a taxa de aprendizado de que ele precisa; - uma varredura de posto de \(r = 1\) a \(r = 32\);
- o modelo com merge, conferido contra o sem merge;
- o posto da atualização que o fine-tuning completo encontrou sozinho;
- o que cada método esqueceu, medido numa segunda tarefa;
- (opcional, só com CUDA) a base em 4 bits do QLoRA;
- 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
- 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.
- Fine-tune comportamento, busque conhecimento. Fatos em pesos não podem ser citados, atualizados nem apagados.
- 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.
- 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.
- 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.
- 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.
- 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.
- Destilação a partir de um modelo mais forte é como a maioria dos modelos pequenos de produção é construída.
- Fine-tuning causa esquecimento. Misture dados gerais, prefira LoRA e avalie fora da tarefa.
-
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. ↩
-
Hu, E. J., et al. (2022). LoRA: Low-Rank Adaptation of Large Language Models — ICLR. ↩
-
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. ↩↩
-
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. ↩
-
Liu, S.-Y., et al. (2024). DoRA: Weight-Decomposed Low-Rank Adaptation — ICML. ↩
-
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. ↩
-
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. ↩
-
Biderman, D., et al. (2024). LoRA Learns Less and Forgets Less — TMLR. Uma medição cuidadosa das duas metades da troca. ↩↩↩
-
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. ↩
-
Shao, Z., et al. (2024). DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. Onde o GRPO foi introduzido. ↩