De modelo base a assistente: SFT, RLHF, DPO e GRPO
Peça um haiku a um modelo base e ele repete a mesma frase cinco vezes. Depois veja um reward model preferir tamanho a correção.
Nesta página
Peça ao GPT-2 — um modelo de linguagem competentemente pré-treinado — para escrever um haiku sobre o mar:
prompt: Write a haiku about the sea.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.
The sea is a beautiful place.Ele não está confuso, e não falhou no seu trabalho. Está a fazer exatamente aquilo para que o Capítulo 10 o treinou: dado algum texto, produzir texto de continuação plausível. Na internet, uma linha como Escreve um haiku sobre o mar. é muitas vezes seguida de prosa sobre o mar, e uma frase que acabou de aparecer tem uma probabilidade invulgarmente alta de aparecer de novo. O modelo é um preditor de next-token soberbo e um assistente inútil.
Agora o mesmo pedido a um modelo construído da mesma forma — Qwen2.5, meio milhar de milhão de parâmetros, quatro vezes o tamanho do GPT-2 acima e ainda minúsculo por qualquer padrão de 2026 — depois das fases de treino de que este capítulo trata:
Whispers of the ocean,
Silent depths where waves meet,
Mysteries in the vast blue.Quatro vezes mais parâmetros não ensinam um modelo a parar de falar. A diferença entre esses dois outputs não é escala, não é arquitetura e não é volume de dados. É pós-treino: uma segunda fase, ordens de grandeza menor do que o pré-treino, que pega num preditor de texto e o transforma em algo que responde.
Primeira fase: mostrar-lhe como é uma resposta
Ligação para a secção: Primeira fase: mostrar-lhe como é uma respostaO primeiro passo é o menos glamoroso e faz a maior parte do trabalho. Recolhem-se exemplos de instruções emparelhadas com boas respostas e continua-se o treino nelas com exatamente a loss do Capítulo 8 — prever o next token — mas apenas na parte da resposta. Isto é supervised fine-tuning, ou SFT.
Não se está a ensinar nada de novo sobre linguagem. O que se ensina é um formato: que texto desta forma é seguido por texto daquela forma, e depois para. Veja de novo a falha do modelo base. Ele respondeu à pergunta na primeira frase e depois não conseguiu parar, porque nada no seu treino alguma vez assinalou o fim de uma resposta. Parar é um comportamento aprendido.
É também por isso que é preciso dizer ao modelo onde estão as fronteiras, que é o que um chat template faz:
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
What is the capital of France?<|im_end|>
<|im_start|>assistantEsses marcadores <|im_start|> e <|im_end|> são tokens reais no vocabulário, acrescentados antes do fine-tuning, e o modelo viu milhões deles exatamente nestas posições. É assim que sabe de quem é a vez e onde termina uma intervenção.
Ignore o template e dê ao modelo uma pergunta nua, e estará a dar-lhe uma sequência que ele não viu no treino. Medido, mesmo modelo, mesma pergunta, mesma greedy decoding:
Sem o template — a string em bruto What is the capital of France?:
The capital of France is Paris.
To verify this, I will use a simple
Python code snippet to confirm that
Paris is indeed the capital city of
France.
[...and then it starts writing a
Python script to check its own answer]Com o template:
The capital of France is Paris.A resposta está certa em ambos os casos, mas sem os marcadores o modelo deriva para escrever Python para se verificar a si próprio, porque o prompt que recebeu não se parece com nada em que tenha sido submetido a fine-tuning. Esta é a causa mais comum de «o modelo ficou mais burro quando o chamei diretamente»: o template não é decoração à volta do modelo, faz parte do modelo, e um template errado é uma degradação silenciosa sem erro associado.
Segunda fase, e o problema que existe para resolver
Ligação para a secção: Segunda fase, e o problema que existe para resolverSFT tem um teto, e esse teto são os dados. Para fazer fine-tuning numa demonstração, é preciso alguém escrever a resposta ideal — e, para a maioria das perguntas interessantes, escrever uma boa resposta é difícil, lento, caro, e produz exatamente uma resposta cuja qualidade não se consegue verificar.
Aquilo em que as pessoas são boas é comparação. Perante duas respostas, um anotador consegue dizer de forma fiável qual é melhor em poucos segundos, sem ser capaz de produzir nenhuma delas. Este é o facto sobre o qual toda a segunda fase é construída, e é a parte que a maioria das explicações inverte:
Os humanos não escrevem as respostas. Classificam pares.
Portanto, os dados são pares — um prompt, duas respostas, e qual delas ganhou. Isto não pode ser ligado a uma loss de next-token, porque não há sequência-alvo. Precisa de uma máquina diferente.
O reward model, e o que aprende realmente
Ligação para a secção: O reward model, e o que aprende realmenteNão se pode pedir a um humano para pontuar todas as respostas durante o treino — seriam milhões de julgamentos. Por isso treina-se um modelo para imitar os humanos: um reward model que recebe uma resposta e devolve um escalar.
Treiná-lo a partir de comparações usa um resultado de 1952. O modelo Bradley–Terry2 diz que, se dois itens têm forças latentes, a probabilidade de um vencer o outro é a função logística da diferença entre elas. Inverta-se isso e torna-se uma loss: dado que um humano preferiu a , maximizar
que em código é o ciclo de treino inteiro:
loss = -F.logsigmoid(reward(chosen) - reward(rejected)).mean() Repare no que o modelo nunca vê: uma pontuação absoluta. Aprende apenas diferenças, que é exatamente o que os dados contêm.
Agora a parte que vale a pena medir. Um reward model aprende aquilo que os anotadores recompensaram, e os anotadores são pessoas. Eis uma simulação em que a qualidade verdadeira de uma resposta depende apenas de ser útil e correta — o comprimento não vale nada — mas o anotador simulado tem uma ligeira preferência por respostas mais longas quando tudo o resto está próximo, o que é um viés humano bem documentado. Treine o reward model em 2000 comparações e leia os seus pesos:
| viés de comprimento do anotador | peso aprendido em útil | em correto | em comprimento |
|---|---|---|---|
| 0,0 | +1,00 | +1,00 | +0,01 |
| 0,3 | +0,98 | +1,00 | +0,15 |
| 0,6 | +0,97 | +1,00 | +0,27 |
| 1,2 | +1,00 | +0,99 | +0,59 |
O reward model está a funcionar perfeitamente. Aprendeu fielmente as preferências que lhe foram mostradas — incluindo a parte dessas preferências que nada tem a ver com qualidade. Um reward model não é uma medida do que é bom; é uma medida daquilo que os anotadores escolheram, e cada viés no conjunto de anotação é agora um coeficiente numa função diferenciável contra a qual um modelo muito maior está prestes a otimizar.
Reward hacking, medido
Ligação para a secção: Reward hacking, medidoO que nos leva ao que acontece quando se otimiza isto. Dê à política um orçamento fixo de esforço para gastar nas propriedades da resposta, com uma assimetria realista: ser útil e estar correto é caro, e ser mais longo é barato — basta continuar a escrever.
Recompensa por unidade de esforço, para o modelo treinado acima: útil 8,26, correto 8,31, comprimento 31,70. O comprimento paga quase quatro vezes melhor do que a correção, não porque o reward model esteja avariado, mas porque é barato.
Otimize contra essa recompensa e observe os dois números:
| pontuação do reward model | qualidade verdadeira | comprimento produzido | |
|---|---|---|---|
| política inicial | 12,588 | 0,974 | 3,365 |
| após otimização | 31,696 | 0,000 | 12,497 |
A recompensa subiu por um fator de 2,5. Aquilo que a recompensa devia medir foi para zero. A política descobriu que conseguia pontuar enormemente bem escrevendo muito e não dizendo nada, e nenhuma parte do ciclo de treino tinha forma de reparar, porque o reward model é a definição de bom dentro do ciclo.
Isto é reward hacking, e se alguma vez se perguntou por que razão os modelos de chat são tão verbosos, esta tabela é uma grande parte da resposta.
O que a penalização KL compra realmente
Ligação para a secção: O que a penalização KL compra realmenteA defesa padrão é penalizar a política por se afastar demasiado de onde começou, medindo a distância com a divergência KL do Capítulo 4:
A referência é o modelo SFT — a política antes da fase de reinforcement. A alegação é que isto impede o modelo de se desviar para comportamento degenerado. Vamos ver quanto dessa alegação sobrevive à medição. Mesma configuração, varrendo :
| recompensa | qualidade verdadeira | comprimento | KL | |
|---|---|---|---|---|
| 0 | 31,699 | 0,000 | 12,498 | 2,994 |
| 1 | 31,697 | 0,000 | 12,497 | 2,993 |
| 5 | 28,318 | 0,285 | 10,700 | 2,163 |
| 15 | 12,860 | 1,542 | 2,552 | 0,151 |
| 30 | 10,426 | 1,719 | 1,303 | 0,025 |
| 60 | 9,632 | 1,769 | 0,908 | 0,005 |
| apenas o modelo de referência | 9,162 | 1,791 | 0,687 | 0 |
Leia a última linha em contraste com as restantes. Em e a penalização não faz absolutamente nada: a recompensa vale muito mais do que a KL, por isso o otimizador paga a multa e faz hacking na mesma. Entre 5 e 15, o comportamento oscila. E em , a qualidade verdadeira voltou a subir para 1,769 — que continua abaixo dos 1,791 que o modelo de referência tinha antes de tudo isto começar.
Uma ressalva antes de esse número ser citado em qualquer lado: os 1,791 da última linha e os 0,974 que a primeira tabela dá à política inicial são duas medições diferentes do mesmo modelo pré-RL, feitas separadamente pelos dois experimentos. Compare linhas dentro de uma tabela, nunca entre tabelas — a conclusão de cada tabela assenta nas suas próprias linhas, e nenhuma depende da baseline da outra.
Portanto, o resumo honesto não é «a penalização KL impede reward hacking». É:
A penalização KL não impede reward hacking. Limita o quanto a política se pode afastar da referência — e, como a falha exige movimento, isso ajuda. Mas é uma trela, não uma correção: com baixo a trela parte-se, e com alto obtém-se de volta o modelo de referência e toda a fase cara não comprou nada.
A faixa útil é estreita, a sua localização depende do reward model, e não há forma de a encontrar exceto olhando. É por isso que o modelo de referência tem de ser bom — a KL é um piso na qualidade da referência, não um teto para a falha — e é uma grande parte da razão pela qual esta fase é difícil na prática e não em princípio.
PPO, e por que razão DPO o substituiu
Ligação para a secção: PPO, e por que razão DPO o substituiuO algoritmo que fez isto funcionar em escala é Proximal Policy Optimization.3 Num parágrafo: estima a vantagem de cada resposta, atualiza a política para aumentar a probabilidade de respostas acima da baseline, e limita o tamanho de qualquer atualização isolada para que uma grande estimativa de vantagem não destrua a política num só passo. Aplicado a modelos de linguagem4, isto significa manter quatro modelos em jogo ao mesmo tempo — a política, a referência, o reward model e um crítico — com a política a gerar novas amostras ao longo do treino.
Funciona, produziu o InstructGPT e tudo o que dele descende, e é genuinamente difícil: quatro modelos em memória, amostragem no ciclo de treino, e uma reputação de instabilidade que é merecida. Fingir que se consegue implementá-lo num artigo de blog seria desonesto, por isso este capítulo não o faz.
O que o substituiu para a maioria dos fins veio de notar uma coisa. O objetivo regularizado por KL acima tem uma política ótima em forma fechada, e essa expressão pode ser invertida: a recompensa pode ser escrita em termos da política ótima e da referência. Substituir isso de volta na loss Bradley–Terry faz o reward model desaparecer por completo. O que resta é uma loss supervisionada sobre pares de preferência — sem amostragem, sem crítico, sem reward model, dois modelos em memória em vez de quatro.
Isso é Direct Preference Optimization,5 e são duas linhas:
def dpo_loss(pi_w, pi_l, ref_w, ref_l, beta=0.1):
"""pi_* and ref_* are summed log-probabilities of a full response."""
logits = beta * ((pi_w - ref_w) - (pi_l - ref_l))
return -F.logsigmoid(logits) Leia o que diz. A quantidade que está a ser empurrada para cima é quanto mais a política prefere o vencedor do que a referência preferia, menos quanto mais prefere o perdedor. A referência não é uma penalização aparafusada depois — está dentro da loss, e é por isso que DPO não precisa de um termo KL separado.
A propriedade que mais importa está no gradient. Avalie a loss e o seu gradient no mesmo par em cinco estados diferentes da política:
| estado da política | loss | magnitude do gradient |
|---|---|---|
| já prefere fortemente o vencedor | 0,5130 | 0,0401 |
| já o prefere, fracamente | 0,6685 | 0,0488 |
| idêntica à referência | 0,6931 | 0,0500 |
| prefere o perdedor | 0,7981 | 0,0550 |
| prefere fortemente o perdedor | 1,0055 | 0,0634 |
O gradient cresce à medida que a política erra mais. Pares que o modelo já trata bem quase não contribuem; pares que ele inverte dominam a atualização. DPO pondera cada exemplo por quão errada a política está nesse momento, automaticamente, sem scheduling — e essa auto-ponderação é o mecanismo que faz o trabalho que a estimativa de vantagem e o crítico do PPO faziam. (A loss na terceira linha é exatamente , que é a âncora para verificar qualquer implementação: uma política idêntica à sua referência não aprendeu nada e deve ficar em .)
GRPO6 toma uma rota diferente para sair do mesmo problema. Mantém o ciclo de amostragem mas elimina o crítico: em vez de treinar um modelo para prever a baseline, amostra um grupo de respostas ao mesmo prompt e usa diretamente a recompensa média do grupo como baseline. A vantagem de uma resposta é o quanto ela foi melhor do que as suas irmãs. Isto troca um modelo inteiro por um batch maior, e foi o que tornou prático o treino com recompensas verificáveis — o tema do Capítulo 12.
Mostrar detalhes
Mais três peças do panorama de pós-treino, em resumo.
RLAIF e Constitutional AI.7 O anotador não tem de ser humano. Dê a um modelo um conjunto escrito de princípios e peça-lhe para criticar e rever os seus próprios outputs, ou para escolher entre dois candidatos, e terá um conjunto de dados de preferências produzido à velocidade e ao custo da máquina. A objeção óbvia — o modelo está a corrigir os seus próprios trabalhos de casa — é real, e a resposta honesta é que funciona melhor do que parece porque julgar é mais fácil do que gerar, que é a mesma assimetria em que todo o capítulo assenta.
LIMA, e quão poucos dados isto exige.8 Mil demonstrações cuidadosamente curadas produziram um assistente competitivo. A explicação proposta é que o pré-treino já instalou o conhecimento e o formato, e o pós-treino só tem de selecionar quais dos comportamentos existentes do modelo devem vir à superfície. Se isto estiver certo, a qualidade dos dados de pós-treino domina a quantidade — e o comportamento da área desde então sugere que as pessoas acreditam nisso.
LoRA e QLoRA.910 Fazer fine-tuning de todos os pesos de um modelo grande exige memória para os pesos, os seus gradients e o estado do otimizador — os dezasseis bytes por parâmetro do Capítulo 10, sobre as duas médias que o Capítulo 6 construiu à mão — a uma escala que precisa de um cluster. LoRA congela os pesos originais e treina ao lado deles um par de matrizes de baixa ordem, reduzindo os parâmetros treináveis em ordens de grandeza; QLoRA quantiza adicionalmente a base congelada para 4 bits. Ambos são tratados aqui como técnica. Se fine-tuning é sequer a coisa certa em que gastar dinheiro é outra questão, e pertence ao Capítulo 20.
O imposto de alignment, e a pergunta a que ninguém respondeu
Ligação para a secção: O imposto de alignment, e a pergunta a que ninguém respondeuDuas coisas para levar daqui.
A primeira é que esta fase tem um custo, e ele aparece como capacidade. Os modelos muitas vezes ficam mensuravelmente piores em algumas tarefas de benchmark depois de treino de alignment — o imposto de alignment — porque o objetivo mudou: uma resposta segura, cautelosa e bem formatada nem sempre é a resposta que maximiza a exatidão. Parte dessa diferença foi eliminada por engenharia, e parte dela é um trade-off real e não um bug a corrigir.
A segunda é a pergunta que a palavra aligned esconde. Alinhado com quem? A cadeia é: uma empresa escreve diretrizes, contratados interpretam-nas, as suas comparações treinam um reward model, o reward model molda uma política, e a política responde a uma pergunta de alguém que não viu nada disso. Cada elo é uma escolha feita por pessoas específicas, e nenhum dos algoritmos deste capítulo tem qualquer opinião sobre se essas escolhas são boas.
Isto não é um floreado retórico. É a razão concreta pela qual dois modelos de fronteira recusam pedidos diferentes, por que razão o mesmo modelo muda de ideias entre versões, e por que razão «aligned» é a descrição de um processo e não uma propriedade de um artefacto. A matemática deste capítulo está assente. Essa parte não.
Para onde isto vai a seguir
Ligação para a secção: Para onde isto vai a seguirO pós-treino ensinou o modelo a responder. Não o ensinou a pensar antes de responder, e as duas coisas são diferentes de uma forma que, afinal, é treinável.
O Capítulo 12 é sobre o que acontece quando se deixa um modelo gastar mais computação numa pergunta difícil no momento da resposta em vez de no momento do treino — chain of thought, reinforcement learning a partir de recompensas verificáveis, e a razão pela qual um modelo que mostra o seu raciocínio não está apenas a explicar-se, mas a computar de forma diferente. Também paga a dívida deste capítulo: GRPO existe nele, a fazer o trabalho que o crítico do PPO costumava fazer, sobre recompensas que não precisam de anotador nenhum porque uma prova ou verifica ou não verifica.
Fontes e método
Ligação para a secção: Fontes e métodoAs gerações acima vêm de gpt2 e Qwen/Qwen2.5-0.5B-Instruct com greedy decoding, por isso reproduzem-se exatamente. O Capítulo 11 do Hugging Face LLM Course percorre SFT e DPO com trl e peft se quiser executar a coisa real em vez da simulação; o capítulo 7 de Build a Large Language Model (From Scratch), de Sebastian Raschka, implementa instruction fine-tuning de ponta a ponta sem uma biblioteca.
Referências
Ligação para a secção: Referências-
Sutton, R. S. e Barto, A. G. Reinforcement Learning: An Introduction, 2.ª edição (MIT Press, 2018). A delegação é deliberada: a caixa de vocabulário acima é o subconjunto utilizável mais pequeno, e o verdadeiro tema é um livro. ↩
-
Bradley, R. A. e Terry, M. E. Rank Analysis of Incomplete Block Designs: I. The Method of Paired Comparisons. Biometrika 39(3/4), pp. 324–345 (1952). O modelo de comparação por pares por baixo de todos os reward models em uso hoje. ↩
-
Schulman, J., Wolski, F., Dhariwal, P., Radford, A. e Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347 (2017). ↩
-
Ouyang, L. et al. Training language models to follow instructions with human feedback. arXiv:2203.02155 (2022). InstructGPT — o artigo que tornou padrão a receita em três fases. Precedido por Christiano et al. (arXiv:1706.03741), que introduziu a aprendizagem de um reward model a partir de comparações humanas, e Stiennon et al. (arXiv:2009.01325), que a aplicou à sumarização. ↩
-
Rafailov, R., Sharma, A., Mitchell, E., Ermon, S., Manning, C. D. e Finn, C. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290 (2023). A derivação que remove o reward model está na secção 4 e vale a pena lê-la por inteiro; é mais curta do que a sua reputação. ↩
-
Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). Introduz GRPO na secção 4.1. ↩
-
Bai, Y. et al. Constitutional AI: Harmlessness from AI Feedback. arXiv:2212.08073 (2022). ↩
-
Zhou, C. et al. LIMA: Less Is More for Alignment. arXiv:2305.11206 (2023). ↩
-
Hu, E. J. et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685 (2021). ↩
-
Dettmers, T., Pagnoni, A., Holtzman, A. e Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023). ↩