Saltar para o conteúdo
11/30Capítulo 11 de 30

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:

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

TEXT
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.

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

TEXT
<|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|>assistant

Esses 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?:

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

TEXT
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.

SFT 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.

Nã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 ywy_w a yly_l, maximizar

P(ywyl)=σ(r(yw)r(yl))P(y_w \succ y_l) = \sigma\big(r(y_w) - r(y_l)\big)

que em código é o ciclo de treino inteiro:

reward_model.pyPYTHON
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 anotadorpeso aprendido em útilem corretoem 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.

O 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 modelqualidade verdadeiracomprimento produzido
política inicial12,5880,9743,365
após otimização31,6960,00012,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.

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

objective=E[r(y)]βDKL(πθπref)\text{objective} = \mathbb{E}\big[r(y)\big] - \beta \, D_{\mathrm{KL}}\big(\pi_\theta \,\|\, \pi_{\text{ref}}\big)

A referência πref\pi_{\text{ref}} é 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 β\beta:

β\betarecompensaqualidade verdadeiracomprimentoKL
031,6990,00012,4982,994
131,6970,00012,4972,993
528,3180,28510,7002,163
1512,8601,5422,5520,151
3010,4261,7191,3030,025
609,6321,7690,9080,005
apenas o modelo de referência9,1621,7910,6870

Leia a última linha em contraste com as restantes. Em β=0\beta = 0 e β=1\beta = 1 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 β=60\beta = 60, 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 β\beta baixo a trela parte-se, e com β\beta 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.

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

dpo.pyPYTHON
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íticalossmagnitude do gradient
já prefere fortemente o vencedor0,51300,0401
já o prefere, fracamente0,66850,0488
idêntica à referência0,69310,0500
prefere o perdedor0,79810,0550
prefere fortemente o perdedor1,00550,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 ln2\ln 2, que é a âncora para verificar qualquer implementação: uma política idêntica à sua referência não aprendeu nada e deve ficar em ln2\ln 2.)

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 respondeu

Duas 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.

O 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.


As 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.

  1. 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.

  2. 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.

  3. Schulman, J., Wolski, F., Dhariwal, P., Radford, A. e Klimov, O. Proximal Policy Optimization Algorithms. arXiv:1707.06347 (2017).

  4. 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.

  5. 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.

  6. 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.

  7. Bai, Y. et al. Constitutional AI: Harmlessness from AI Feedback. arXiv:2212.08073 (2022).

  8. Zhou, C. et al. LIMA: Less Is More for Alignment. arXiv:2305.11206 (2023).

  9. Hu, E. J. et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685 (2021).

  10. Dettmers, T., Pagnoni, A., Holtzman, A. e Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023).

Pronto para deixar a LIA escolher?

Construa com todos os modelos de IA num só sítio — comece grátis hoje.