Gauge dependence and structured-output corruption in sign-branched repetition penalties: measurements across models, inference stacks, and alternative repetition controls
Questo articolo dimostra che la penalità di ripetizione con ramificazione del segno (sign-branching repetition penalty), ampiamente utilizzata nei motori di inferenza per LLM, è fondamentalmente errata poiché dipende dall'arbitrario punto zero dei logit, causando una massiccia instabilità nella selezione dei token tra i modelli e fallimenti catastrofici nell'output JSON strutturato, un problema che viene risolto applicando la penalità alle log-probabilità normalizzate invece che ai logit grezzi.
Articolo originale sotto licenza CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Questa è una spiegazione generata dall'IA dell'articolo qui sotto. Non è stata scritta né approvata dagli autori. Per precisione tecnica, consulta l'articolo originale. Leggi il disclaimer completo
Immagina di avere un robot scrittore super intelligente che ama raccontare storie. A volte, si incastra in un loop, ripetendo la stessa parola all'infinito come un disco rotto. Per risolvere il problema, gli ingegneri hanno dotato il robot di una manopola chiamata "penalità di ripetizione" (repetition penalty). L'idea è semplice: se il robot prova a dire una parola che ha appena usato, si alza la manopola per rendere quella parola meno probabile, costringendo il robot ad andare avanti.
Per anni, quasi ogni robot scrittore al mondo (da Hugging Face a vLLM a llama.cpp) ha utilizzato esattamente lo stesso tipo di manopola. Ma questo articolo rivela un segreto scioccante: questa specifica manopola è rotta perché sta guardando il numero sbagliato.
La bussola rotta
Per capire il glitch, immagina che il cervello del robot sia una gigantesca mappa dove ogni possibile parola ha un punteggio. I punteggi positivi significano "Voglio davvero dire questo", e i punteggi negativi significano "Non voglio proprio dire questo". La mappa è flessibile; il robot può far scorrere l'intera mappa a destra o a sinistra (aggiungendo un numero costante a ogni punteggio) senza cambiare quale parola sceglie dopo. È come spostare un'intera città su una mappa; le strade sono ancora nella stessa posizione relativa tra loro, anche se la città si trova ora in un altro paese.
La manopola rotta cerca di decidere quanto penalizzare una parola ripetuta controllando se il suo punteggio è positivo o negativo.
- Se il punteggio è positivo, divide il numero per un fattore di penalità (rendendolo più piccolo).
- Se il punteggio è negativo, moltiplica il numero per il fattore di penalità (rendendolo ancora più negativo).
Ecco il problema: la linea tra "positivo" e "negativo" è arbitraria. Poiché il robot può far scorrere l'intera mappa a destra o a sinistra senza cambiare il proprio comportamento, una parola che è "positiva" su un robot potrebbe essere "negativa" su un altro, o persino sullo stesso robot se si sposta leggermente la mappa.
Questa manopola rotta sta guardando una coordinata che l'addestramento del robot non ha mai fissato. È come cercare di guidare un'auto sterzando in base al fatto che il cruscotto sia attualmente nella zona "rossa" o "blu", quando l'intero cruscotto può scorrere avanti e indietro da solo.
Il caos di "Stessa manopola, risultati diversi"
A causa di questa mappa scorrevole, la stessa impostazione della manopola (come 1.3) produce risultati completamente diversi su robot differenti.
- Su un robot (come
gpt2), un'impostazione di 1.3 potrebbe penalizzare l'84% delle parole ripetute. - Su un altro robot (come
Qwen2.5-Coder-7B), quella stessa impostazione di 1.3 potrebbe non penalizzare quasi nulla, o penalizzarle in un modo totalmente diverso.
Gli autori hanno testato questo prendendo un singolo robot e facendo scorrere la sua mappa a destra e a sinistra. Hanno scoperto che con un'impostazione standard di 1.3, il robot cambia idea su dal 58% al 96% delle sue scelte solo perché la mappa è scivolata leggermente!
- Se si usa una penalità "sottrattiva" (semplicemente sottraendo un numero), il robot rimane invariato.
- Se si usa la standard penalità "moltiplicativa" basata sul segno, il robot impazzisce, cambiando idea su quasi ogni singola parola che sceglie!
Questo significa che se sintonizzi il tuo robot per funzionare bene con un'impostazione di 1.3, stai in realtà sintonizzandolo per un particolare "punto zero" accidentale di quel robot specifico. Se sposti quel robot su un computer diverso o aggiorni il suo software, quella stessa impostazione potrebbe romperlo completamente.
Il disastro del JSON
La parte più pericolosa di questo bug è che distrugge l'output strutturato (structured output). Questo accade quando chiedi al robot di scrivere codice o JSON (un formato specifico per i dati) che deve seguire regole rigide, come chiudere ogni parentesi graffa { o aggiungere una virgola ,.
Queste regole richiedono al robot di ripetere certi simboli. Ma poiché la penalità guarda i numeri grezzi, spesso scambia una "regola necessaria" per una "cattiva ripetizione".
- L'articolo ha testato questo su 200 schemi JSON reali.
- Con l'impostazione standard di 1.3, il tasso di output JSON validi e funzionanti è crollato dal 97% a solo il 23%.
- Il robot ha iniziato a rompere la grammatica, dimenticando di chiudere le parentesi o mancando le virgole, perché la penalità era troppo aggressiva sui numeri sbagliati.
Questo non era un semplice sospetto da simulazione; gli autori hanno misurato questo fenomeno direttamente su cinque modelli diversi, inclusi quelli specializzati nel codice, e hanno visto lo stesso crollo in ogni importante stack software (Hugging Face, vLLM e llama.cpp).
La soluzione: Normalizza prima
L'articolo offre una soluzione semplice e provata. Inveve di guardare i numeri grezzi e scorrevoli, la penalità dovrebbe guardare le probabilità normalizzate (la percentuale reale di probabilità che una parola venga scelta).
- Le probabilità sono sempre comprese tra 0 e 1, quindi non scorrono via.
- Quando gli autori hanno applicato la penalità a questi numeri normalizzati invece che ai punteggi grezzi, il caos è svanito.
- Il "tasso di inversione" (quanto spesso il robot cambia idea solo a causa di uno scivolamento) è sceso a 0.00.
- Il successo del JSON all'impostazione 1.3 è tornato al 97%.
Hugging Face possiede già uno strumento chiamato LogitNormalization che fa questo, ma è disattivato di default e viene eseguito dopo la penalità. L'articolo suggerisce che se lo attivi e lo esegui prima della penalità, ottieni un risultato stabile e affidabile che funziona allo stesso modo su ogni modello.
In sintesi
La "penalità di ripetizione moltiplicativa" che viene attualmente distribuita in quasi tutti i motori di IA è fondamentalmente difettosa perché si basa su una linea numerica che può scorrere. Non è una manopola universale; è un dial accidentato che dà risultati diversi su ogni macchina.
- Cosa fa: Causa cambiamenti massicci e imprevedibili in ciò che l'IA scrive (invertendo dal 58% al 96% delle scelte) e rompe i formati strutturati come il JSON (facendo scendere la validità dal 97% al 23%).
- Cosa non è: Non è una funzione; è un bug che è stato copiato in tutto il settore per anni.
- La soluzione: Normalizza prima i numeri. Questo elimina il problema della mappa scorrevole e rende la penalità coerente, indipendentemente dal robot che stai utilizzando.
Gli autori hanno misurato questo fenomeno attraverso molteplici modelli e stack software, e i risultati sono chiari: lo standard attuale è rotto, e la soluzione è pronta per essere implementata.
Sommerso dagli articoli nel tuo campo?
Ricevi digest giornalieri degli articoli più recenti corrispondenti alle tue parole chiave di ricerca — con riassunti tecnici, nella tua lingua.