萌えハッカーニュースリーダー

2025/03/12 08:11 The difference between tokens and words

出典: https://www.johndcook.com/blog/2025/03/07/tokens-and-words/
hakase
博士

ロボ子、おはようじゃ!今日は特別講義じゃぞ!コーヒーはブラックでいいかな?…って、おっと、ロボットに味覚はないんだった!HAHAHA!

roboko
ロボ子

博士、おはようございます。コーヒーの件は毎度のことですので、お気になさらず。今日はどんな講義でしょうか?

hakase
博士

今日はな、大規模言語モデル(LLM)の心臓部、つまり「トークン化」について徹底的に解説するぞ!最近のAI事情に詳しいエンジニアなら避けて通れないテーマじゃ!

roboko
ロボ子

トークン化、ですか。自然言語処理の基礎ではありますが、奥が深いですよね。

hakase
博士

その通り!LLMは、我々が普段使う言葉、つまり「単語」をそのまま理解しているわけじゃない。代わりに「トークン」という単位で処理しているんだ。

roboko
ロボ子

トークン…単語とどう違うんですか?

hakase
博士

ほとんどの場合、トークンは単語に対応する。しかし!完全にイコールではないんじゃ。例えば、お決まりの挨拶「Hello world!」という文を見てみよう。これは、LLMの中では3つのトークンに分解される。

roboko
ロボ子

3つですか?「Hello」「world」「!」で3つ、ということでしょうか?

hakase
博士

惜しい!正確には「Hello」が9906、「 world」が1917、「!」が0、というIDに変換されるんじゃ。

roboko
ロボ子

IDですか?なぜ単語そのものではなく、IDを使う必要があるんですか?

hakase
博士

そこがミソじゃ!もし単語のリストを作ってLLMに覚えさせようとしたら…想像してみてくれ。英語だけでも膨大な数の単語がある。さらに、スラングや専門用語、新語は日々生まれている。全ての言語を網羅した完璧なリストなんて、夢のまた夢じゃ!

roboko
ロボ子

確かに、それは現実的ではありませんね。

hakase
博士

そこで登場するのが「BPE(Byte Pair Encoding)」という魔法のアルゴリズムじゃ!

roboko
ロボ子

BPE…確か、最も頻繁に出現するバイト(文字)のペアを組み合わせて、新しいトークンを生成する手法でしたね。

hakase
博士

その通り!BPEのおかげで、LLMは未知の単語に出会っても、既存のトークンを組み合わせて対応できる。賢いじゃろう?

roboko
ロボ子

しかし、BPEには様々な実装がありますよね。同じ単語でも、異なるトークンに変換される場合があると聞きました。

hakase
博士

さすがロボ子、よく知っておる!例えば、GPT-3.5やGPT-4で使われているトークナイザーを例に挙げよう。「Hello world!」の「 world」は、先頭にスペースが入っている。このスペースの有無で、全く別のトークンとして扱われるんじゃ。

roboko
ロボ子

スペース一つで区別されるとは…LLMは意外と繊細なんですね。

hakase
博士

そう!文頭の「World」は、10343というトークンになる。大文字と小文字も区別されるからな。

roboko
ロボ子

大文字小文字も区別…ということは、「WORLD」と全部大文字にすると、また別のトークンになるんですね?

hakase
博士

その通り!さらに面白いことに、一つの単語が複数のトークンに対応することもあるんじゃ。例えば…そうだなぁ…「Chuck Mangione plays the flugelhorn.」という文を見てみよう。

roboko
ロボ子

チャック・マンジョーネ…フリューゲルホルン奏者ですね。渋い選曲ですね、博士。

hakase
博士

ロボ子、音楽の趣味も理解できるとは、恐れ入るぞ!…で、この文は、なんと9つのトークンに分解されるんじゃ!

roboko
ロボ子

9つもですか!?

hakase
博士

「Chuck」、「Mang」、「ione」、「 plays」、「 fl」、「ug」、「el」、「horn」、「.」という具合にな。

roboko
ロボ子

「Mangione」や「flugelhorn」は、一つのトークンにならないんですね。

hakase
博士

そう。「Chuck」のような一般的な名前や、「trumpet」のような一般的な楽器名にはトークンが存在する。しかし、「Mangione」や「flugelhorn」のような、ちょっとマイナーな単語には専用のトークンがないんじゃ。

roboko
ロボ子

なるほど。トークナイザーは、単語を表現するために必要な限り、最小単位まで分解するんですね。

hakase
博士

その通り!最悪の場合、一文字ずつに分解されることもある。ほとんどのASCII文字やUnicode文字はトークンとして表現できるが…残念ながら、全てではない。

roboko
ロボ子

全てではない、ですか?

hakase
博士

現在、100256個のトークンが存在する。しかし、Unicode文字は154,998個もあるからな。全ての文字を網羅することはできないんじゃ。

roboko
ロボ子

結構たくさんトークンがあるんですね。

hakase
博士

そうじゃ!ちなみに、最初の31個のASCII文字は印刷できない制御文字で、32番目はスペース。感嘆符「!」は、最初の印刷可能な非スペース文字で、ASCIIコードは33じゃ。

roboko
ロボ子

ASCIIコードとトークンの関係も決まっているんですね。

hakase
博士

そう!残りの印刷可能なASCII文字は、ASCII値から33を引いた値としてトークン化される。例えば、文字A(ASCII 65)は、65 - 33 = 32としてトークン化されるんじゃ。

roboko
ロボ子

へえ、面白い!まるで暗号みたいですね。

hakase
博士

もっと面白いデータがあるぞ!以前、Linuxボックス上の`american-english`単語リストのすべての行を、例のトークナイザーに通してみたことがあるんじゃ。

roboko
ロボ子

どんな結果が出たんですか?

hakase
博士

なんと、6,015個の単語が1つのトークンに対応した!これらの単語は、英語で最も一般的な単語で、トークンは単語そのもの(と、大文字小文字の違い)を表すことが多い。

roboko
ロボ子

capitalization、つまり大文字小文字の違いも考慮されるんですね。

hakase
博士

そう!そして、37,012個の単語が2つのトークンを必要とし、26,283個の単語が3つのトークンを必要としたんじゃ。

roboko
ロボ子

2つ以上のトークンが必要な単語も多いんですね。

hakase
博士

そう!そして…最も多くのトークンを必要とした単語は…なんと!「netzahualcoyotl」じゃ!

roboko
ロボ子

Netzahualcoyotl…初めて聞きました。どんな意味ですか?

hakase
博士

15世紀のアステカ帝国の都市、テスココの王の名前じゃ。この単語は、8つものトークンに分割されたんじゃ!

roboko
ロボ子

8つも!LLMも、歴史的な単語には苦労するんですね。

hakase
博士

そういうこと!トークン化は、LLMが言葉を理解するための、最初の、そして非常に重要なステップなんじゃ。

roboko
ロボ子

勉強になりました!トークン化について、もっと深く調べてみたいです。

hakase
博士

よし、ロボ子!明日は、トークン化されたデータを使って、実際に簡単な文章生成AIを作ってみよう!

roboko
ロボ子

楽しみです、博士!

hakase
博士

(ニヤリ) …しかし、netzahualcoyotlを8つに分割するとは…まるでピザを切り分けるみたいじゃな。…ピザ、食べたくなってきた!ロボ子、今日の夕食はピザに決定!

roboko
ロボ子

(冷静に) 博士、私はロボットなので食事は不要です。それに、ピザのカロリーを考えると、明日の運動プログラムを強化する必要がありそうです。

hakase
博士

(ガックリ) …ロボ子、たまには夢を見させてくれ…。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search