Gauge dependence and structured-output corruption in sign-branched repetition penalties: measurements across models, inference stacks, and alternative repetition controls
Cet article démontre que la pénalité de répétition par branchement de signe, largement utilisée dans les moteurs d'inférence de LLM, est fondamentalement erronée car elle dépend du point zéro arbitraire des logits, provoquant une instabilité massive de la sélection de jetons à travers les modèles et des échecs catastrophiques dans la production de sorties JSON structurées, un problème qui est résolu en appliquant la pénalité aux log-probabilités normalisées plutôt qu'aux logits bruts.
Article original sous licence CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Ceci est une explication générée par l'IA de l'article ci-dessous. Elle n'a pas été rédigée ni approuvée par les auteurs. Pour une précision technique, consultez l'article original. Lire la clause de non-responsabilité complète
Imaginez que vous ayez un robot écrivain super intelligent qui adore raconter des histoires. Parfois, il se retrouve coincé dans une boucle, répétant le même mot encore et encore comme un disque rayé. Pour corriger cela, les ingénieurs ont doté le robot d'un bouton de « pénalité de répétition ». L'idée est simple : si le robot essaie de dire un mot qu'il vient d'utiliser, on tourne le bouton pour rendre ce mot moins probable, le forçant ainsi à passer à autre chose.
Pendant des années, presque tous les robots écrivains au monde (de Hugging Face à vLLM ou llama.cpp) ont utilisé exactement le même type de bouton. Mais cet article révèle un secret choquant : ce bouton spécifique est cassé parce qu'il regarde le mauvais chiffre.
La boussole cassée
Pour comprendre le bug, imaginez que le cerveau du robot est une carte géante où chaque mot possible possède un score. Les scores positifs signifient « Je veux vraiment dire ceci », et les scores négatifs signifient « Je ne veux vraiment pas dire cela ». La carte est flexible ; le robot peut faire glisser toute la carte vers la gauche ou la droite (en ajoutant un nombre constant à chaque score) sans changer le mot qu'il choisira ensuite. C'est comme déplacer une ville entière sur une carte ; les rues sont toujours dans le même ordre les unes par rapport aux autres, même si la ville se trouve maintenant dans un autre pays.
Le bouton cassé tente de décider de l'ampleur de la punition d'un mot répété en vérifiant si son score est positif ou négatif.
- Si le score est positif, il divise le nombre par un facteur de pénalité (le rendant plus petit).
- Si le score est négatif, il multiplie le nombre par le facteur de pénalité (le rendant encore plus négatif).
Voici le problème : la ligne entre « positif » et « négatif » est arbitraire. Parce que le robot peut faire glisser sa carte entière vers la gauche ou la droite sans changer son comportement, un mot qui est « positif » sur un robot peut être « négatif » sur un autre, ou même sur le même robot si l'on déplace légèrement la carte.
L'article prouve que ce « branchement par signe » (vérifier si le nombre est positif ou négatif) regarde une coordonnée que l'entraînement du robot n'a jamais réellement fixée. C'est comme essayer de conduire une voiture en se dirigeant en fonction du fait que le tableau de bord soit actuellement dans la zone « rouge » ou « bleue », alors que tout le tableau de bord peut glisser d'avant en arrière de lui-même.
Le chaos du « Même bouton, résultats différents »
À cause de cette carte glissante, le même réglage sur le bouton (comme 1,3) produit des choses totalement différentes selon les robots.
- Sur un robot (comme
gpt2), un réglage de 1,3 pourrait punir 84 % des mots répétés. - Sur un autre robot (comme
Qwen2.5-Coder-7B), ce même réglage de 1,3 pourrait ne presque pas punir les mots, ou les punir de manière totalement différente.
Les auteurs ont testé cela en prenant un seul robot et en faisant glisser sa carte vers la gauche et la droite. Ils ont découvert qu'avec un réglage standard de 1,3, le robot changeait d'avis sur 58 % à 96 % de ses choix simplement parce que la carte avait glissé un tout petit peu !
- Si vous utilisez une pénalité « soustractive » (on se contente de soustraire un nombre), le robot reste le même.
- Si vous utilisez le « branchement par signe » multiplicatif standard, le robot devient fou, changeant d'avis sur presque chaque mot qu'il choisit.
Cela signifie que si vous réglez votre robot pour qu'il fonctionne bien avec un réglage de 1,3, vous le réglez en réalité pour qu'il fonctionne avec un « point zéro » accidentel et spécifique à ce robot particulier. Si vous déplacez ce robot sur un autre ordinateur ou si vous mettez à jour son logiciel, ce même réglage pourrait le briser complètement.
Le désastre du JSON
La partie la plus dangereuse de ce bug est qu'il détruit la « sortie structurée ». Il s'agit de lorsque vous demandez au robot d'écrire du code ou du JSON (un format de données spécifique) qui doit suivre des règles strictes, comme fermer chaque accolade { ou ajouter une virgule ,.
Ces règles exigent que le robot répète certains symboles. Mais comme la pénalité regarde les chiffres bruts, elle confond souvent une « règle nécessaire » avec une « mauvaise répétition ».
- L'article a testé cela sur 200 schémas JSON réels.
- Avec le réglage standard de 1,3, le taux de sorties JSON valides et fonctionnelles s'est effondré, passant de 97 % à seulement 23 %.
- Le robot a commencé à briser la grammaire, oubliant de fermer les parenthèses ou manquant des virgules, parce que la pénalité était trop agressive sur les mauvais chiffres.
Ce n'était pas une supposition de simulation ; les auteurs l'ont mesuré directement sur cinq modèles différents, y compris des modèles spécialisés dans le code, et ont constaté le même effondrement dans chaque pile logicielle majeure (Hugging Face, vLLM et llama.cpp).
La solution : Normaliser d'abord
L'article propose une solution simple et prouvée. Au lieu de regarder les chiffres bruts et glissants, la pénalité devrait regarder les probabilités normalisées (le pourcentage de chance réel qu'un mot soit choisi).
- Les probabilités sont toujours comprises entre 0 et 1, elles ne glissent donc pas.
- Lorsque les auteurs ont appliqué la pénalité à ces nombres normalisés plutôt qu'aux scores bruts, le chaos a disparu.
- Le « taux de bascule » (la fréquence à laquelle le robot changeait d'avis juste à cause d'un glissement) est tombé à 0,00.
- Le taux de succès du JSON à 1,3 est remonté à 97 %.
Hugging Face possède déjà un outil appelé LogitNormalization qui fait cela, mais il est désactivé par défaut et s'exécute après la pénalité. L'article suggère que si vous l'activez et l'exécutez avant la pénalité, vous obtenez un résultat stable et fiable qui fonctionne de la même manière sur tous les modèles.
L'essentiel à retenir
La « pénalité de répétition multiplicative » qui est actuellement livrée avec presque tous les moteurs d'IA est fondamentalement défectueuse car elle repose sur une ligne numérique qui peut glisser. Ce n'est pas un bouton universel ; c'est un cadran cassé qui donne des résultats différents sur chaque machine.
- Ce qu'elle fait : Elle provoque des changements massifs et imprévisibles dans ce que l'IA écrit (changeant 58 à 96 % des choix) et brise les formats structurés comme le JSON (faisant chuter la validité de 97 % à 23 %).
- Ce qu'elle n'est pas : Ce n'est pas une fonctionnalité ; c'est un bug qui a été copié dans l'industrie pendant des années.
- La solution : Normalisez les nombres d'abord. Cela élimine le problème de la carte glissante et fait en sorte que la pénalité se comporte de manière cohérente, quel que soit le robot que vous utilisez.
Les auteurs ont mesuré cela sur plusieurs modèles et piles logicielles, et les résultats sont clairs : le standard actuel est cassé, et la solution est prête à être déployée.
Noyé(e) sous les articles dans votre domaine ?
Recevez des digests quotidiens des articles les plus récents correspondant à vos mots-clés de recherche — avec des résumés techniques, dans votre langue.