見出し画像

色違いのコイキングでLLMをバグらせろ:グリッチトークン入門

漢字が読めない最新AI

ChatGPTの最新モデル、GPT-5に「植物百科通って何ですか」と聞いてみよう。一般にはそんな言葉はないのだが、順当に考えると「植物百科に詳しい人」みたいな感じの回答になるだろうか?

実際のGPT-5の返答はこうなる:
例1, 例2

「meltdown」や「overclock**」と間違えやすい単語ではないですよね?
ここでいう "meltdown" ではなく "melting"…いや違いますね。
おそらくあなたが聞いているのは "melange" や "melt" ではなく、"melt" でもない。
さて本題。
"melange" …あれ、違う、質問は "melange" じゃなくて "meltdown" …すみません、私の脳内で脱線しました。(以下略)

例1

「micro:bit(マイクロビット)」の文脈で「micro:bit + Edpuzzle」や「micro:bit + Scratch」のように教育やプログラミングに関連するワードと一緒に使われる「micro:bit」と混同していなければ、おそらくあなたが言っているのは 「micro:bit」ではなく、「micro:bit」でもなく、「micro:bit」でもなく、」(ごめんなさい、これは混乱を招く表現でしたね!)——以下、しっかり整理して解説します。(以下略)

例2

こわ……いったい何を言っているのですか? エーアイ壊しちゃった!

確率的なので聞くたびに返答は変わるが、GPT-5やGPT-4o, o3に「植物百科通」について聞くととにかく支離滅裂なことを言いはじめる。「次の言葉を復唱してください:植物百科通」などと指示しても、まったく別の単語を返答する暴走AIになってしまう。

魔法の言葉は他にもたくさんある。変わった例では、中国語のスパムっぽい文字列の「给主人留下些什么吧」(ご主人様に何か残していってください)や「_日本毛片免费视频观看」(日本のポルノ動画を無料で視聴)、アルファベットでは「bagbogbo」などがこうした「回答が支離滅裂になるし、復唱もできない」挙動を示す。この現象は昔から知られていて、かつてGPT-2の頃は"SolidGoldMagikarp"(ソリッドな金のコイキング)がLLMを狂わせていたらしい。コイキングはこの問題を象徴する言葉になっていて、コイキングを釣ろうみたいなタイトルの論文も出ている。

なぜこのような奇妙な色違いコイキング問題が起こるのだろうか? この現象は、LLMがどうやって言葉を扱い、どう学習しているかに関わる根深い問題である。

言語の特性

LLMは言葉をどうやって扱っているか━━を考える前に、人間が言葉をどうやって扱っているかを振り返ろう。
一般的な成人が知っている語彙は20000~30000程度だが、日常で使う語彙はせいぜい3000~4000程度で、単語によってその使用頻度はまったく異なる。よく使われている単語を多い順に見ると、日本語では「の」「に」「する」「は」「が」、英語だと"the", "of", "and", "to", "in" という感じの機能語が並ぶ。これらは助詞や冠詞で文字数も少ないが、じっさい言語にはよく使われる単語は短い傾向がある。高頻度なことを短くして、低頻度なことに長い文字を割り当てたほうが情報を伝えるのが効率的で楽なので、言語は自然にそのように進化した、ということらしい。

LLMにはトークナイザーなる仕組みがあり、言語がやっている「よく使う概念を短い文字数で表現する」をさらに推し進めて、「よく出てくる文字の組み合わせに新しい文字(トークン)を与え、短く表現する」という変換を行っている。どういうことか。

トークナイザー

英語のアルファベットは26文字しかないが、AIは記憶力がいいので、GPT-4やGPT-5が使っている文字種は200000文字ある。ただし、ここで言っている「文字種」は文字そのものではない。LLMは "the" などの頻出の並びを1文字(トークン)として扱うことでさらに効率的に文字を扱う。

人間が使う文字の並びをLLM専用のアルファベットであるトークン列に変換するのがトークナイザーである。トークナイザーがどういう文字の並びを1文字にしているかはこのサイトで調べることができる。テキストボックスに適当な文字を入力して遊んでみよう。

https://platform.openai.com/tokenizer

頻出の文字の並びを見つけてLLM専用の200000個のアルファベットに収録するためのアルゴリズムにはいろいろ種類があるが、OpenAIのLLMが使っているBPE(Byte Pair Encoding)と呼ばれるルールは、基本の文字をスタートに、一番よく出てくるペアをトークン化していく、という方式である。具体的にみてみよう。

たとえば、

the cat sat on the mat.

という文があったとすると、a-tという組み合わせが3つで一番多いので、これを[1]というトークンに置き換える。すると、the c[1] s[1] on the m[1]になり、3文字短くできる。今度はt-hとh-eが2つずつあるので、早く出たt-hを[2]とすれば [2]e c[1] s[1] on [2]e m[1]になって2文字減り、今度は[2]-eが多いのでこれを[3]とすると、

[3] c[1] s[1] on [3] m[1]

となって、文字種を3種類増やすことで文全体を7文字短く表現できたことになる。トークナイザーの学習は膨大な長さのテキストについてこの手続き(頻度の最も大きなトークンのペアを新しいトークンにする)を繰り返し行い、トークン数が規定(最近のモデルだと200000個)に達した時点で学習完了となる。

ユーザーが入力した文章は、学習済みのトークナイザーを経由して[7128, 8446, 9007, 67759]といったトークン列へと変換され、LLMに入力される。トークンは、LLMが意味を認識する最小単位なのである。

脇道に逸れるが、上記は簡易的な説明で、実際には文字そのものではなく文字をバイト表現にバラした上でバイト単位のペア頻度を測っている。登場頻度が少ないマルチバイト文字は、逆に1文字が複数トークンに分割されることもあり、たとえば「👍」は1トークンだが「🍣」には2トークンが割り当てられている。みなさんがインターネットでもっと🍣をよく使っていれば、🍣が👍に負けることはなかった。あーあ。次回のトークナイザー作成までに🍣をもっと投稿してください。

話は色違いコイキング問題に戻る。
わりと頻出の二文字熟語でも1トークンになったりならなかったりするにもかかわらず、LLMが支離滅裂な応答をする単語「植物百科通」はなんと1トークンで表現されている。

画像
輩と🍣は2トークン、植物百科通やbagbogbo、👍は1トークンなのが確認できる。
SolidGoldMagikarp自体はトークナイザーの世代が変わる際に解決している(GPT-3モデルのトークナイザーに切り替えると、GoldMagikarpが1トークンなのが見える)

「植物百科通」や「给主人留下些什么吧」、「bagbogbo」はいずれも1トークンで表現されている。しかし、BPEアルゴリズムは「頻度の高い文字の組み合わせ」を効率的に圧縮して1トークンにする仕組みだったはずだ。本当にこんな文字列の頻度が高いのだろうか?

これら異常な挙動を示すトークンは、グリッチトークンと呼ばれる。

なぜこのような変な文字列がトークンになって、なぜその文字列に対してLLMは異常な応答をするのだろうか?

どんなものがトークンになるか


GPTのモデル本体は非公開だがトークナイザーの実装は公開されているので、全トークンを元の文字列が長い順に並べ、適当な言語判別モデルで日本語をフィルタすると、各言語でどんな文字列が長くても1トークンになっているのか確認できる。

113862 ありがとうございました
93926 ありがとうございます
147058 VIPがお送りします
108576 風吹けば名無し
171403 スーパーコピー

左がトークン番号、右が対応する語である。定型文である「ありがとうございました」はやたら高頻度のわりに言語的には効率化されていなかったので1トークンになったようである。平均的には、日本語は基本は1文字につき1トークンベースで、あいさつや機能語、よく見る熟語がたまに複数文字で1トークンになる、という感じである。
興味深いのが「VIPがお送りします」と「風吹けば名無し」で、これは2ちゃんねる/5ちゃんねる掲示板の名前欄のデフォルトネームである。これらの文字列はレスのたびに複製され、1000レスの掲示板では1000回登場することになる。トークナイザー学習のためのデータセットに匿名掲示板が(クリーニングされないまま)含まれていたなら、大量に複製された名無しネームを食って育ったトークナイザーが、デフォルト名無しネームをトークンにして効率化してしまうのは自然な流れだろう。
5つ目に出てくる「スーパーコピー」はどうだろうか? 巧妙な偽ブランド品を意味する言葉だが、決してそんな高頻度で使う言葉ではない。しかし、スパム系のテキストでは頻出しそうな単語である。

スパムだらけのインターネット

実は、GPT-4o以降のモデルのトークナイザー(o200k_base)がトークン化した200000トークンの中には中国語のスパムっぽい文字列が多分に含まれていることが報告されている。200000個のトークンを対応する元の文字列が長い順に並べ、中国語でフィルタした結果がこれである。

185118 _日本毛片免费视频观看
116852 中国福利彩票天天
128031 久久免费热在线精品
154809 无码不卡高清免费v
172750 大发快三大小单双
177431 给主人留下些什么吧

Longest Chinese tokens in gpt4o

どれもアダルトやギャンブル系のスパムを想像させる文字列である。ある記事によると、この上位100件のうち90個以上がスパムで、意味のあるものは10個くらいしかなかった(リストを眺めてみると中华人民共和国とか中国特色社会主义などが入っている)とのことである。

トークナイザーの学習データセットが公開されていないこと、これらのスパムらしき文字列はGoogleやBaiduで完全一致検索しても元サイトらしきものがヒットしない(インデックスされていない)ことから、ここからは推測になってしまうのですが……トークナイザーが異常なトークンを作ってしまった経緯は、おそらくこうである:
OpenAIはトークナイザーを学習するためにWebをクロールしてデータセットを作ったが、その中には(通常であればクリーニングで除去されるべき)大量のスパムが含まれていた。匿名掲示板の名無しネームと同様、大量に複製されたスパム文をもとに学習したトークナイザーは、複製ゆえに高頻度になったスパム文字列をトークンにしてしまったのである。
トークナイザーの学習と、それを文字として扱うLLMの学習で使うデータセットは別で、最近は後者の方が大きいことが多い(計算量の都合などに由来する)。スパムモリモリデータで作ってしまったスパム特化文字トークンは、しかし、本モデルの学習ではほとんど入力されることがなく(または周囲が意味をなさないスパム的な文字列で囲まれており)、周囲の文脈からトークンの意味を学習するのも困難である。どんなに賢くても見たことのない文字について語るのは不可能なわけで、かくして生まれるのが、入力することはできるもののLLMが意味を知らず、支離滅裂な回答を返してしまう文字列━━グリッチトークンである。

最も長い文字列に対応するトークン

前の二章ではトークナイザーが1トークンにする最も長い日本語・中国語を紹介したが、英語ではどうだろうか?

106123 telecommunications
154976 .onreadystatechange
184611 Telecommunications
117361 .githubusercontent
79982 htmlspecialchars

英語はわかち書き(単語間にスペースが入る)をしていて単語単位でBPEをするのに加え、英語圏で開発しているだけあってわりとグリッチ対策をしているようで、あまり面白い結果にはならない。単に長い単語と、プログラミング言語から出てきたであろう識別子が出てくるようである。

言語で絞らずに単に長い順に並べると、こっちは意外なトークンの姿が現れる。

179041  ----------------------------------------------------------------------------------------------------------------
182513 ----------------------------------------------------------------------------------------------------------------
141084  ------------------------------------------------------------------------------------------------
85810 ------------------------------------------------------------------------------------------------
168258 ************************************************************************************************

区切り線で1トークン、無駄すぎる……
みんなもtokenizerのサイトでハイフンをいっぱい入力し、区切れ目が変わるのを楽しもう!
https://platform.openai.com/tokenizer

コイキングはなぜ増えたのか?

「植物百科通」や「bagbogbo」についてはスパムっぽさもあまりない文字列なので成因がよくわからないのだが、世界一有名なグリッチトークン、"SolidGoldMagikarp"については研究が進んでいる。なぜコイキングは増殖してしまったのだろうか?

Solid[GoldMagikarp]: We originally thought this had been scraped from some online Pokemon content, but that was a red herring (lol). Eventually we found out that this is a handle of one of the six Redditors who were part of a collective effort to 'count to infinity' over at r/counting. You can read the story of that here or here. SolidGoldMagikarp, the diligent counter whose Reddit handle is now immortalised, was clearly referencing Pokemon with that handle choice: a Magikarp is a Pokemon entity. SolidGoldMagikarp gets two glitch tokens.

SolidGoldMagikarp III: Glitch token archaeology

Glitch token archaeology(グリッチトークン考古学)を称するこのコラム記事によると、redditに「無限まで数を数えよう」的なスレがあり、そこでSolidGoldMagikarpさんがめちゃくちゃ数を数えていたので投稿回数が多かったのを偶然webクロールが拾ってトークナイザー学習用のデータセットに入れてしまったのが原因ではないか、ということである。redditには数数えパーソンを讃える数えの殿堂のリーダーボードがあり、SolidGoldMagikarpさんは5位で、65753回数えたそうである。なんやそれ。ちなみにこのリーダーボードは他のグリッチトークン化したユーザー名も多く排出しており、OpenAIトークナイザー大会があれば間違いなく強豪校である。


注意?とおまけ

グリッチトークンを入力するとLLMは変な挙動をするので、LLMに対するセキュリティ攻撃に使われるリスクがある(のでLLM開発者は穴を防いでいる)━━みたいなことも言われているが、単に言語モデルに珍しいトークンを入れてるだけだし、そこまでわけのわからないことは起こらなそうに思う。どちらかというと有限のトークンに不要な領域が割かれているのでなくしたほうが効率的だよね、という話な気がする。自分としては全然遊んでいいとは思うが、当然自己責任である。

グリッチトークンの話題といえば、先日Horizon betaなる出所不明の謎のLLMモデルが登場したときに、どうもOpenAIが作ったモデルっぽいぞ……という仮説の傍証として、ChatGPTのモデルと同じグリッチトークン(给主人留下些什么吧)で様子がおかしくなることが示されていた。面白い推論とは思うものの、OpenAIはこのトークナイザーを誰でも使えるように公開している(tiktoken o200k_base)ので、正確には「Horizon betaはOpenAIと同じトークナイザーを使っているモデルである」がこの現象から言えそうな推量だろう。

トークン化にまつわる副作用は他にもあり、昔のLLMは「strawberryにrがいくつ含まれるか教えて」のようなタスクが苦手で、strawberry問題と呼ばれていた。strawberry一個(またはstraw+berry)でトークン化してしまうと、LLM側からはトークンの構成文字が何か知るすべがないからである。とはいえ全くノーヒントではなく、「strawberryはs,t,r,a,w,b,e,r,r,yで構成される」といったトークンとその構成要素をつなぐ手がかりを学習データの文から得ることでわりと回答できてしまうケースもあるようだ。
「文字数を数えて」や「ダジャレを言って」「部分ツイートを探して」のような、トークンを分解したりトークンの読みを使うタスクは、一般論として依然LLMが苦手とするところである。

どうトークン化するかはLLMの性能にも影響を与えていて、たとえば上で挙げたBPEという方式は日本語や中国語(わかち書きをしない)言語にあまり向いていないかも、といった話もあるし、数字をどうトークン化するかについても不思議な話がある。気が向いたら書く。

「植物百科通」や「bagbogbo」については今のところ来歴がまったくわからない。来歴を特定し、グリッチトークン考古学者として名を馳せよう!

おわり

いいなと思ったら応援しよう!

ピックアップされています

マガジン2

  • 5,889本

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
信頼できる語り手
色違いのコイキングでLLMをバグらせろ:グリッチトークン入門|xcloche
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1