Saltar ao contido
11/30Capítulo 11 de 30

Do modelo base ao asistente: SFT, RLHF, DPO e GRPO

Pídelle a un modelo base un haiku e repetirá a mesma frase cinco veces. Logo observa como un modelo de recompensa prefire lonxitude.

Nesta páxina

Pídelle a GPT-2 —un modelo de linguaxe preadestrado competente— que escriba un 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.

Non está confundido, e non fallou no seu traballo. Está facendo exactamente aquilo para o que o adestrou o capítulo 10: dado un texto, producir texto de continuación plausible. Na internet, unha liña como Escribe un haiku sobre o mar. adoita ir seguida de prosa sobre o mar, e unha frase que acaba de aparecer é inusualmente probable que apareza outra vez. O modelo é un predictor de next-token magnífico e un asistente inútil.

Agora a mesma petición a un modelo construído do mesmo xeito —Qwen2.5, medio billón de parámetros, catro veces o tamaño do GPT-2 anterior e aínda minúsculo para calquera estándar de 2026— despois das etapas de adestramento das que trata este capítulo:

TEXT
Whispers of the ocean,
Silent depths where waves meet,
Mysteries in the vast blue.

Ter catro veces máis parámetros non lle ensina a un modelo a calar. A fenda entre esas dúas saídas non é escala, nin arquitectura, nin volume de datos. É post-training: unha segunda fase, ordes de magnitude máis pequena ca o preadestramento, que colle un predictor de texto e o transforma en algo que responde.

Primeira etapa: mostrarlle como é unha resposta

Ligazón á sección: Primeira etapa: mostrarlle como é unha resposta

O primeiro paso é o menos vistoso e fai a maior parte do traballo. Recolle exemplos de instrucións emparelladas con boas respostas e continúa adestrando con eles usando exactamente a loss do capítulo 8 —predicir o seguinte token— pero só na parte da resposta. Isto é supervised fine-tuning, ou SFT.

Non se lle está ensinando nada novo sobre linguaxe. O que se lle ensina é un formato: que a un texto con esta forma lle segue un texto con aquela forma, e logo para. Mira outra vez o fallo do modelo base. Respondeu a pregunta na primeira frase e logo non foi quen de parar, porque nada no seu adestramento marcara nunca o final dunha resposta. Parar é un comportamento aprendido.

Por iso tamén hai que dicirlle ao modelo onde están os límites, que é o que fai unha chat template:

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

Eses marcadores <|im_start|> e <|im_end|> son token reais no vocabulario, engadidos antes do fine-tuning, e o modelo viu millóns deles exactamente nesas posicións. Así sabe de quen é a quenda e onde remata unha quenda.

Salta o template e entrégalle ao modelo unha pregunta espida, e estarás dándolle unha secuencia que non viu no adestramento. Medido, mesmo modelo, mesma pregunta, mesma decodificación greedy:

Sen o template —a cadea en 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]

Co template:

TEXT
The capital of France is Paris.

A resposta é correcta nos dous casos, pero sen os marcadores o modelo deriva a escribir Python para comprobarse a si mesmo, porque o prompt que recibiu non se parece a nada do que viu no fine-tuning. Esta é a causa máis común de «o modelo volveuse máis parvo cando o chamei directamente»: o template non é decoración arredor do modelo, é parte do modelo, e un template incorrecto é unha degradación silenciosa sen erro asociado.

Segunda etapa, e o problema que existe para resolver

Ligazón á sección: Segunda etapa, e o problema que existe para resolver

SFT ten un teito, e o teito son os datos. Para facer fine-tuning cunha demostración precisas que alguén escriba a resposta ideal; e para a maioría das preguntas interesantes, escribir unha boa resposta é difícil, lento, caro, e produce exactamente unha resposta cuxa calidade non podes verificar.

No que a xente é boa é na comparación. Cando se lle mostran dúas respostas, unha persoa anotadora pode dicir con fiabilidade cal é mellor en poucos segundos, sen ser quen de producir ningunha das dúas. Este é o feito sobre o que se constrúe toda a segunda etapa, e é a parte que a maioría das explicacións conta ao revés:

Os humanos non escriben as respostas. Ordenan pares.

Así que os datos son pares: un prompt, dúas respostas e cal gañou. Iso non se pode enchufar nunha loss de next-token, porque non hai unha secuencia obxectivo. Precisa unha máquina distinta.

Recibe novas publicacións na túa caixa de entrada

Novas de IA, guías e actualizacións do produto — un correo breve cando publiquemos algo que pague a pena.

O modelo de recompensa, e que aprende en realidade

Ligazón á sección: O modelo de recompensa, e que aprende en realidade

Non podes pedirlle a un humano que puntúe cada resposta durante o adestramento: iso son millóns de xuízos. Así que adestras un modelo para imitar os humanos: un modelo de recompensa que toma unha resposta e devolve un escalar.

Adestralo a partir de comparacións usa un resultado de 1952. O modelo Bradley–Terry2 di que, se dous elementos teñen forzas latentes, a probabilidade de que un venza o outro é a función loxística da súa diferenza. Dálle a volta e convértese nunha loss: dado que un humano preferiu ywy_w sobre yly_l, maximiza

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

que en código é todo o bucle de adestramento:

reward_model.pyPYTHON
loss = -F.logsigmoid(reward(chosen) - reward(rejected)).mean()   

Fíxate no que o modelo nunca ve: unha puntuación absoluta. Só aprende diferenzas, que é exactamente o que conteñen os datos.

Agora a parte que paga a pena medir. Un modelo de recompensa aprende o que premiaron as persoas anotadoras, e as persoas anotadoras son persoas. Aquí hai unha simulación na que a calidade real dunha resposta depende só de que sexa útil e correcta —a lonxitude non vale nada— pero a persoa anotadora simulada ten unha leve preferencia por respostas máis longas cando todo o demais está preto, que é un nesgo humano ben documentado. Adestra o modelo de recompensa con 2000 comparacións e le os seus pesos:

nesgo de lonxitude da persoa anotadorapeso aprendido en útilen correctoen lonxitude
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 modelo de recompensa funciona perfectamente. Aprendeu con fidelidade as preferencias que lle mostraron, incluída a parte desas preferencias que non ten nada que ver coa calidade. Un modelo de recompensa non é unha medida do bo; é unha medida do que escolleron as persoas anotadoras, e cada nesgo do conxunto de anotación é agora un coeficiente nunha función diferenciable contra a que un modelo moito máis grande está a piques de optimizar.

O que nos leva ao que pasa cando o optimizas. Dálle á política un orzamento fixo de esforzo para repartir entre as propiedades da resposta, cunha asimetría realista: ser útil e ser correcto é caro, e ser máis longo é barato; só tes que seguir escribindo.

Recompensa por unidade de esforzo, para o modelo adestrado arriba: útil 8,26, correcto 8,31, lonxitude 31,70. A lonxitude paga case catro veces mellor ca a corrección, non porque o modelo de recompensa estea roto, senón porque é barata.

Optimiza contra esa recompensa e observa os dous números:

puntuación do modelo de recompensacalidade reallonxitude producida
política inicial12.5880.9743.365
despois da optimización31.6960.00012.497

A recompensa subiu por un factor de 2,5. O que a recompensa debía medir foi a cero. A política descubriu que podía puntuar extraordinariamente ben escribindo moito e non dicindo nada, e ningunha parte do bucle de adestramento tiña xeito de darse conta, porque o modelo de recompensa é a definición de bo dentro do bucle.

Isto é reward hacking, e se algunha vez te preguntaches por que os modelos de chat son tan verbosos, esta táboa é unha gran parte da resposta.

A defensa estándar é penalizar a política por afastarse demasiado de onde empezou, medindo a distancia coa diverxencia 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 referencia πref\pi_{\text{ref}} é o modelo SFT: a política antes da etapa de reforzo. A afirmación é que isto impide que o modelo derive cara a comportamentos dexenerados. Imos ver canto desa afirmación sobrevive á medición. Mesmo escenario, varrendo β\beta:

β\betarecompensacalidade reallonxitudeKL
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
só o modelo de referencia9.1621.7910.6870

Le a última fila fronte ao resto. En β=0\beta = 0 e β=1\beta = 1 a penalización non fai absolutamente nada: a recompensa vale moito máis ca a KL, así que o optimizador paga a multa e hackea igual. Entre 5 e 15 o comportamento vira. E en β=60\beta = 60, a calidade real volveu subir a 1.769, que segue por baixo do 1.791 que tiña o modelo de referencia antes de empezar nada disto.

Unha advertencia antes de citar ese número en ningures: o 1.791 da última fila e o 0.974 que a primeira táboa lle dá á política inicial son dúas medicións distintas do mesmo modelo pre-RL, tomadas polos dous experimentos por separado. Compara filas dentro dunha táboa, nunca entre táboas: a conclusión de cada táboa sostense nas súas propias filas, e ningunha depende da baseline da outra.

Así que o resumo honesto non é «a penalización KL impide o reward hacking». É:

A penalización KL non impide o reward hacking. Limita canto pode afastarse a política da referencia; e como o fallo require moverse, iso axuda. Pero é unha correa, non un correctivo: con β\beta baixo a correa rompe, e con β\beta alto recuperas o modelo de referencia e toda esa etapa cara non comprou nada.

A franxa útil é estreita, a súa localización depende do modelo de recompensa, e non hai xeito de atopala salvo mirando. Por iso o modelo de referencia debe ser bo: a KL é un chan na calidade da referencia, non un teito para o fallo, e iso é unha gran parte de por que esta etapa é difícil na práctica máis ca no principio.

O algoritmo que fixo que isto funcionase a escala é Proximal Policy Optimization.3 Nun parágrafo: estima a vantaxe de cada resposta, actualiza a política para aumentar a probabilidade das respostas por riba da baseline, e recorta o tamaño de calquera actualización individual para que unha estimación grande de vantaxe non destrúa a política nun só paso. Aplicado a modelos de linguaxe4, significa manter catro modelos en xogo á vez: a política, a referencia, o modelo de recompensa e un crítico, coa política xerando mostras novas durante todo o adestramento.

Funciona, produciu InstructGPT e todo o que descende del, e é realmente difícil: catro modelos en memoria, mostraxe no bucle de adestramento e unha reputación de inestabilidade ben merecida. Finxir que se pode implementar nunha entrada de blog sería deshonesto, así que este capítulo non o fai.

O que o substituíu para a maioría dos usos saíu de reparar nunha cousa. O obxectivo regularizado por KL de arriba ten unha política óptima en forma pechada, e esa expresión pódese inverter: a recompensa pódese escribir en termos da política óptima e da referencia. Substituír iso de volta na loss Bradley–Terry fai que o modelo de recompensa desapareza por completo. O que queda é unha loss supervisada sobre pares de preferencia: sen mostraxe, sen crítico, sen modelo de recompensa, dous modelos en memoria en vez de catro.

Iso é Direct Preference Optimization,5 e son dúas liñas:

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)                        

Le o que di. A cantidade que se empurra cara arriba é canto máis prefire a política o gañador ca a referencia, menos canto máis prefire o perdedor. A referencia non é unha penalización aparafusada despois: está dentro da loss, que é por que DPO non precisa un termo KL separado.

A propiedade que máis importa está no gradient. Avalía a loss e o seu gradient no mesmo par en cinco estados distintos da política:

estado da políticalossmagnitude do gradient
xa prefire fortemente o gañador0.51300.0401
xa o prefire, feblemente0.66850.0488
idéntica á referencia0.69310.0500
prefire o perdedor0.79810.0550
prefire fortemente o perdedor1.00550.0634

O gradient medra a medida que a política se equivoca máis. Os pares que o modelo xa manexa non achegan case nada; os pares que ten ao revés dominan a actualización. DPO pondera cada exemplo segundo canto se equivoca actualmente a política, automaticamente, sen planificación; e esa auto-ponderación é o mecanismo que fai o traballo que facían a estimación de vantaxe e o crítico de PPO. (A loss da terceira fila é exactamente ln⁡2\ln 2, que é a áncora para comprobar calquera implementación: unha política idéntica á súa referencia non aprendeu nada e debería estar en ln⁡2\ln 2.)

GRPO6 toma outra ruta para saír do mesmo problema. Mantén o bucle de mostraxe pero elimina o crítico: en vez de adestrar un modelo para predicir a baseline, mostraxa un grupo de respostas ao mesmo prompt e usa directamente a recompensa media do grupo como baseline. A vantaxe dunha resposta é canto mellor foi ca as súas irmás. Isto cambia un modelo enteiro por un batch máis grande, e foi o que fixo práctico o adestramento con recompensas verificables, o tema do capítulo 12.

Mostrar detalles

Tres pezas máis da paisaxe do post-training, brevemente.

RLAIF e Constitutional AI.7 A persoa anotadora non ten por que ser humana. Dálle a un modelo un conxunto escrito de principios e pídelle que critique e revise as súas propias saídas, ou que escolla entre dous candidatos, e terás un conxunto de datos de preferencias producido á velocidade e ao custo dunha máquina. A obxección obvia —o modelo corrixe os seus propios deberes— é real, e a resposta honesta é que funciona mellor do que soa porque xulgar é máis doado ca xerar, que é a mesma asimetría na que se apoia todo o capítulo.

LIMA, e o poucos datos que isto precisa.8 Mil demostracións coidadosamente seleccionadas produciron un asistente competitivo. A explicación proposta é que o preadestramento xa instalou o coñecemento e o formato, e que o post-training só ten que seleccionar cales dos comportamentos existentes do modelo facer emerxer. Se iso é certo, a calidade dos datos de post-training domina a cantidade; e o comportamento do campo desde entón suxire que a xente o cre.

LoRA e QLoRA.910 Facer fine-tuning de cada peso dun modelo grande require memoria para os pesos, os seus gradient e o estado do optimizador —os dezaseis bytes por parámetro do capítulo 10, sobre as dúas medias que o capítulo 6 construíu á man— a unha escala que precisa un clúster. LoRA conxela os pesos orixinais e adestra unha parella de matrices de baixo rango xunto a eles, reducindo os parámetros adestrables por ordes de magnitude; QLoRA ademais cuantiza a base conxelada a 4 bits. Ambos se cobren aquí como técnica. Se o fine-tuning é ou non o lugar axeitado para gastar diñeiro é outra pregunta, e é a do capítulo 20.

O imposto de alignment, e a pregunta que ninguén respondeu

Ligazón á sección: O imposto de alignment, e a pregunta que ninguén respondeu

Dúas cousas para levar contigo.

A primeira é que esta etapa ten un custo, e aparece como capacidade. Os modelos adoitan empeorar de forma medible nalgunhas tarefas de benchmark despois do adestramento de alignment —o imposto de alignment— porque cambiou o obxectivo: unha resposta segura, matizada e ben formatada non sempre é a resposta que maximiza a precisión. Parte desa fenda xa se reduciu con enxeñaría, e parte dela é un intercambio real máis ca un bug que arranxar.

A segunda é a pregunta que agocha a palabra aligned. Aliñado con quen? A cadea é: unha empresa escribe directrices, contratistas interprétanas, as súas comparacións adestran un modelo de recompensa, o modelo de recompensa moldea unha política, e a política responde unha pregunta de alguén que non viu nada diso. Cada elo é unha elección feita por persoas concretas, e ningún dos algoritmos deste capítulo ten opinión ningunha sobre se esas eleccións son boas.

Isto non é unha floritura retórica. É a razón concreta pola que dous modelos de fronteira rexeitan peticións distintas, pola que o mesmo modelo cambia de opinión entre versións, e pola que «aligned» é unha descrición dun proceso máis ca unha propiedade dun artefacto. As matemáticas deste capítulo están asentadas. Esa parte non.

O post-training ensinoulle ao modelo a responder. Non lle ensinou a pensar antes de responder, e as dúas cousas son distintas dun xeito que resulta ser adestrable.

O capítulo 12 trata do que pasa cando deixas que un modelo gaste máis computación nunha pregunta difícil no momento de responder, no canto de facelo no momento de adestrar: chain of thought, aprendizaxe por reforzo a partir de recompensas verificables, e a razón pola que un modelo que mostra o seu traballo non está só explicándose, senón computando de maneira distinta. Tamén salda a débeda deste capítulo: GRPO existe nel, facendo o traballo que facía o crítico de PPO, con recompensas que non precisan persoa anotadora ningunha porque unha proba ou se verifica ou non.


As xeracións de arriba veñen de gpt2 e Qwen/Qwen2.5-0.5B-Instruct con decodificación greedy, así que se reproducen exactamente. O capítulo 11 do Hugging Face LLM Course percorre SFT e DPO con trl e peft se queres executar o real no canto da simulación; o capítulo 7 de Build a Large Language Model (From Scratch), de Sebastian Raschka, implementa instruction fine-tuning de principio a fin sen biblioteca.

  1. Sutton, R. S. and Barto, A. G. Reinforcement Learning: An Introduction, 2nd edition (MIT Press, 2018). A delegación é deliberada: a caixa de vocabulario de arriba é o subconxunto útil máis pequeno, e o tema real é un libro. ↩

  2. Bradley, R. A. and 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 comparación por pares que hai debaixo de todos os modelos de recompensa en uso hoxe. ↩

  3. Schulman, J., Wolski, F., Dhariwal, P., Radford, A. and 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 fixo estándar a receita en tres etapas. Precedido por Christiano et al. (arXiv:1706.03741), que introduciu a aprendizaxe dun modelo de recompensa a partir de comparacións humanas, e Stiennon et al. (arXiv:2009.01325), que o aplicou á resumición. ↩

  5. Rafailov, R., Sharma, A., Mitchell, E., Ermon, S., Manning, C. D. and Finn, C. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290 (2023). A derivación que elimina o modelo de recompensa está na sección 4 e paga a pena lela completa; é máis curta do que di a súa reputación. ↩

  6. Shao, Z. et al. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models. arXiv:2402.03300 (2024). Introduce GRPO na sección 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. and Zettlemoyer, L. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023). ↩

Este capítulo en vídeo

Vídeos breves que explican ideas deste capítulo con linguaxe clara.

Ver todos os vídeos

Pon a túa IA a traballar hoxe

Todos os modelos e todas as ferramentas nun só lugar. Comeza gratis, sen tarxeta.