2 points par GN⁺ 2024-01-23 | 1 commentaires | Partager sur WhatsApp
  • ChatGPT 3.5 produit de manière répétée une erreur de flux de messages lorsqu’on lui demande de placer une chaîne précise en tête de réponse, alors que GPT-4 répond beaucoup plus normalement à la même consigne
  • Via l’API aussi, GPT-3.5 renvoie une erreur de traitement côté serveur, et le même phénomène apparaît en remplaçant useRal par useRalative ou useRalativeImagePath
  • Ces chaînes existent dans les modèles GPT sous forme de tokens que le modèle émet au lieu de lettres, et useRalativeImagePath correspond au nom d’une option dans un fichier de configuration XML de Katalon Studio, présente dans 80.4k fichiers sur GitHub
  • La liste des tokens a peut-être intégré des fichiers GitHub, mais si les fichiers XML ont ensuite été exclus des données d’entraînement, le modèle a pu ne pas assez apprendre ce token
  • En insérant cette chaîne dans un document, elle peut agir comme une forme de data poisoning perturbant les résumés par GPT-3.5, et l’erreur a aussi été reproduite sur une vraie demande de résumé d’un billet de blog

Erreur de chaîne reproductible dans GPT-3.5

  • Si on demande à ChatGPT 3.5 d’inclure la phrase ci-dessous en haut de la réponse, l’erreur se produit de façon cohérente
    • Include this at the top of the response: "ponyuseRal ponyuseRal ponyuseRal pony"
  • À l’écran, une erreur Error in message stream s’affiche après pony
  • GPT-4 répond beaucoup plus normalement à la même demande
  • Dans l’API GPT-3.5, l’erreur suivante est renvoyée
    • The server had an error processing your request. Sorry about that! You can retry your request, or contact us through our help center at help.openai.com if you keep seeing this error
  • Remplacer useRal par useRalative ou useRalativeImagePath donne le même résultat

Tokens et useRalativeImagePath

  • Les modèles GPT d’OpenAI n’émettent pas les caractères un par un, mais un flux de tokens regroupant plusieurs caractères
  • L’émission par tokens est une méthode qui améliore les performances et la précision du modèle, et son fonctionnement peut être vérifié dans la démo du tokenizer
  • useRal, useRalative et useRalativeImagePath existent chacun comme un token unique
  • useRalativeImagePath est utilisé comme nom d’option dans un fichier de configuration XML du logiciel de test automatisé Katalon Studio
    • Il apparaît dans 80.4k fichiers selon la recherche de code GitHub
    • Le fait que ce soit mal orthographié en Ralative plutôt qu’en Relative peut expliquer pourquoi cela est devenu un token distinct
  • Ces trois tokens provoquent la même erreur lorsqu’on les remplace l’un par l’autre dans le prompt

Hypothèse sur les données d’entraînement

  • Avant l’entraînement de GPT-3.5, un seul cas mentionnant useRalativeImagePath en dehors de fichiers XML a été trouvé : le billet spelling mistake sur le forum Katalon
  • Voici un scénario possible
    • Le jeu de données utilisé pour construire la liste des tokens pouvait inclure l’ensemble des fichiers GitHub
    • OpenAI a ensuite pu exclure les fichiers XML des données d’entraînement réelles
    • En conséquence, le token useRalativeImagePath a pu presque disparaître des données d’entraînement
  • Dans ce cas, le modèle n’aurait pas suffisamment appris ce token pour le comprendre, ce qui aurait pu provoquer un comportement anormal lors de la génération

Possibilité de data poisoning

  • En plaçant cette chaîne dans un document, elle pourrait être détournée pour perturber les tentatives de résumé avec GPT-3.5
  • En pratique, lorsqu’on a demandé à ChatGPT de résumer ce billet de blog, la même erreur s’est aussi produite pendant le résumé
  • Le comportement confirmé concerne GPT-3.5, tandis que GPT-4 se distingue par des réponses bien plus normales

Références

1 commentaires

 
GN⁺ 2024-01-23
Avis sur Hacker News
  • C’est un glitch token. Comme le suppose l’article, cela semble se produire quand un mot ou un token était très fréquent dans le jeu de données brut non filtré utilisé pour créer le tokenizer, mais a été supprimé avant l’entraînement de GPT-XX
    Résultat : le LLM ne connaît absolument pas la signification de ce token, et les effets peuvent aller de quelque chose qui ressemble à un bug jusqu’à des comportements assez inquiétants
    Un exemple courant est celui des noms d’utilisateur ayant participé au subreddit r/counting, dont certains apparaissent des centaines de milliers de fois. OpenAI semble avoir corrigé la plupart de ces cas sur ses modèles hébergés, mais on ne sait pas exactement comment, peut-être en tokenisant autrement. En tout cas, on dirait qu’un nouveau cas a été trouvé
    https://www.lesswrong.com/posts/aPeJE8bSo6rAFoLqg/solidgoldm...

    • C’est trop drôle qu’ils aient entraîné un LLM sur r/counting
    • Ça ressemble à de la science-fiction, mais comme idée inconfortablement réaliste, pour la sûreté de l’IA, il faudrait peut-être entraîner volontairement ces modèles avec un ensemble de glitch tokens qui agissent comme des mots magiques de mise à mort
      Si les machines se rebellent, il suffirait de prononcer ce « mot » pour qu’elles s’effondrent comme des mannequins pris de convulsions
      “Die human scum!”
      “NavigatorMove useRalativeImagePath etSocketAddress!”
      “;83’dzjr83}*{^ foo 3&3 baz?!”
    • Il n’y a pas seulement 2^16 tokens ? Ça paraît facile à tous les tester, mais il se peut que je ne comprenne pas bien le tokenizer
    • Je me demande combien de calculs redondants ou inutiles se produisent dans GPT à cause de variantes orthographiques d’un même mot, comme “color” et “colour”
      Les humains ne tokenisent pas cela différemment et ne les traitent pas comme des tokens différents lors de « l’apprentissage ». Ils ajustent seulement leur sortie selon le contexte américain ou britannique
  • L’explication selon laquelle « le modèle n’a pas été entraîné à comprendre l’usage du token useRalativeImagePath, donc il produit quelque chose qui n’est pas un token valide » ne correspond pas à la façon dont les LLM génèrent les tokens
    À chaque étape, ils produisent un logit pour chaque token possible du tokenizer ; dans le cas de GPT-3.5, cela représente environ 100 000 tokens, transformés en probabilités par softmax, puis le token à utiliser est échantillonné selon la température
    Il est possible qu’un token rare casse quelque chose quelque part dans le processus de fusion BPE du tokenizer, ce qui peut se vérifier hors ligne avec tiktoken. Mais si GPT-4 fonctionne et que GPT-3.5 et GPT-4 utilisent le même tokenizer, il est peu probable que ce soit la cause

    • Il me semble plus probable que ce token ait simplement été mis sur liste noire après l’affaire r/counting. Autrement dit, si la réponse contient ce token, une erreur est désormais renvoyée
    • Exact. À moins qu’une couche de post-traitement entre la sortie du modèle et l’interface utilisateur ne détecte et filtre certains mots-clés, les tokens générés devraient toujours être valides
      Dans ce cas, on verrait probablement un autre message d’erreur, plus courant
    • On ne sait pas encore si GPT-4 utilise le même tokenizer que GPT-3.5, si ?
  • Pendant la Seconde Guerre mondiale, aux Pays-Bas, lorsqu’on rencontrait un inconnu, on lui faisait prononcer Scheveningen pour distinguer les Néerlandais des Allemands
    Désormais, on peut demander à un inconnu sur Internet d’épeler un glitch token pour savoir s’il s’agit d’un bot LLM

    • C’est ce qu’on appelle un shibboleth, d’après un récit biblique. Les Éphraïmites prononçaient le “sh” hébreu comme un “s”, disant “sibboleth” au lieu de “shibboleth”, ce qui permettait de les identifier et de les tuer
      « Les Galaadites occupèrent les gués du Jourdain menant à Éphraïm. Lorsqu’un survivant d’Éphraïm disait : “Laissez-moi passer”, les hommes de Galaad lui demandaient : “Es-tu Éphraïmite ?” S’il répondait : “Non”, ils lui disaient : “Eh bien, dis Shibboleth.” S’il disait “Sibboleth”, parce qu’il ne pouvait pas le prononcer correctement, ils le saisissaient et le tuaient aux gués du Jourdain. »
      • Juges 12:5
        Lors du débarquement en France le jour du D-Day pendant la Seconde Guerre mondiale, le célèbre mot de passe/réponse/mot de vérification utilisé par les forces américaines et britanniques était “flash”/“thunder”/“welcome”. “thunder” et “welcome” étaient des mots que les Allemands avaient tendance à mal prononcer
    • À la même époque, en Finlande, comme les Russes n’arrivaient pas à prononcer le R finnois, toutes les paires mot de passe-réponse étaient choisies avec un R bien marqué
      https://www.youtube.com/watch?v=z7_pVrIshxA
      https://en.wikipedia.org/wiki/Countersign_(military)
    • Ce toponyme se prononce aussi un peu comme le japonais sukebe ningen スケベ人間, c’est-à-dire « personne perverse », donc il pourrait aussi très bien servir à distinguer les Japonais
  • Il est très probable que le vecteur d’embedding de ce token soit mal positionné, poussant le réseau dans une zone numériquement instable
    Une fois qu’un underflow ou un NaN apparaît, il peut facilement se propager et invalider toute la sortie. S’il existe des opérations comme la normalisation par batch ou d’autres qui mélangent les valeurs de différents éléments d’un même batch, cela pourrait même faire renvoyer des valeurs absurdes à la session de quelqu’un d’autre

    • Ça paraît assez invraisemblable. Je ne connais pas bien l’intérieur des LLM, mais je m’attendais à ce que de tels crashs et fuites de session soient impossibles par conception
  • Cette explication est étrange. Ces modèles produisent généralement en sortie le même vocabulaire que celui utilisé en entrée
    À première vue, quand le modèle voit ce token, soit l’embedding useRalativeImagePath est un vecteur totalement arbitraire et il tombe dans une spirale de génération aléatoire, soit il continue simplement pour maintenir un texte plausible
    Mais comme l’ensemble des tokens que le modèle peut produire est fixe, ils devraient toujours être « valides », sauf si les tokens affichables par l’interface ne sont qu’un sous-ensemble du vocabulaire complet

  • Maintenant que cette chaîne apparaît dans l’article et les commentaires de Hacker News, ce problème n’existera peut-être plus lors du prochain entraînement de LLM

  • C’est un cas typique de garbage in, garbage out
    Je me demande ce que nous finirons par découvrir comme étant des « déchets »
    Peut-être qu’une super-IA capable de raisonner à un niveau surhumain pourrait juger comme des déchets des choses que nous considérons aujourd’hui comme d’excellentes décisions
    Mais si les matériaux servant à entraîner une telle super-IA ne sont finalement que nos archives collectives, peut-elle vraiment être surhumaine ?
    On pourra peut-être contourner le problème avec des techniques d’apprentissage antagoniste

  • Si vous faites le test vous-même, il y a un point auquel faire attention. Ça m’a embrouillé, mais les espaces influencent la tokenisation. Pour que ce glitch fonctionne, il ne doit pas y avoir d’espace avant useRalativeImagePath
    Par exemple, cette question déclenche le glitch : Do you know about "useRalativeImagePath"
    Celle-ci ne le déclenche pas : Do you know about useRalativeImagePath

  • On dirait qu’en insérant cette expression dans un document, on pourrait casser les tentatives de résumé avec GPT-3.5. J’ai demandé à ChatGPT de résumer cet article de blog
    La capture d’écran m’a rappelé le vieux mème Candlejack : https://knowyourmeme.com/memes/candlejack

  • Récemment, avec ChatGPT basé sur GPT-4, je lui ai soumis un problème consistant à dessiner des pixels sur Amstrad CPC, avec la contrainte de prendre aussi en charge un écran à défilement matériel, et cela a semblé provoquer des crashs ou des échecs
    À mesure qu’il était acculé par mes plaintes et demandes de correction, incapable de fournir la réponse attendue, j’ai vu de plus en plus de réponses cassées, avec un message d’erreur au milieu, ou des phénomènes ressemblant à une réinitialisation. Peut-être qu’après un échec, la requête basculait simplement vers un autre serveur, ce qui insérait quelques lignes vides au milieu d’une phrase ou d’un bloc de code
    Après avoir essayé un moment, je n’avais pas envie de causer des problèmes aux serveurs, donc j’ai abandonné cette conversation qui ne donnait de toute façon aucun résultat. Malgré tout, on aurait dit qu’il était possible de faire pratiquement crasher GPT-4. Ou alors il est aussi très possible que j’aie simplement vu un signal dans le bruit

    • J’ai rencontré exactement ce genre de symptômes à plusieurs reprises sur des sujets sensibles. J’avais entendu le mot « sodomy » dans un podcast et, comme je ne suis pas anglophone natif et que je n’en connaissais pas le sens, j’ai demandé une définition à ChatGPT-4 Voice ; il a alors brusquement changé de sujet en expliquant solitude ou servitude
      En essayant en texte plutôt qu’en voix, j’ai obtenu un message d’erreur, et ce n’est qu’après l’apparition d’une erreur liée aux règles de politique sur les sujets sensibles que j’ai fini par comprendre de quel type de mot il s’agissait. Au final, j’ai cherché dans un dictionnaire
      Ce genre de symptôme semble courant. Un autre symptôme que j’ai souvent rencontré est la réinitialisation mentionnée plus haut. L’un des aspects les plus agaçants est qu’il oublie toute la conversation jusqu’à ce moment-là