今週のざっくばらん
Tokenizer
ChatGPTのベースになっているGPTは、LLM(Large Language Model)と呼ばれるニューラル・ネットワークです。LLMは「途中で途切れた文章の次の単語を上手に予測する」ようにニューラル・ネットワークを大量の文章で「教育」することにより作りますが、それが結果として、人類の叡智(えいち)を圧縮した人工知能を作ることに繋がった、と言う話は以前にもこのメルマガに書きました。
こんな説明をする時には分かりやすくするために、「次の単語を予測する」と言ってしまいますが、実際に予測するのは「次の単語」ではなく、「次のトークン」です。
「トークン」とは、LLMにおける「情報の一単位」で、LLMの設計者が、効率良く高性能なLLMを作るために、定めます。
1トークン=1文字、とするのが一番シンプルですが、その設計だと文字に含まれる情報が少なすぎて、高性能なLLMを作るのが難しくなります。
1トークン=1単語、とすると、1つのトークンに含まれる情報が多くなりますが、英語だけでも単語の数は膨大にあり(50万から100万)、他の言語まで含めると数が多すぎて、逆にそこが足を引っ張ることになります。
そこで、頻繁に現れる短い単語には1トークンで表現し、そうでない長い単語は、複数のトークンで表現するのが一般的です。
GPT3.5で採用されているtokenizerが、一つのテキストをどう分割するかを見てみましょう。"The quick brown fox jumps over the lazy dog"のように頻繁に使う単語から構成されるテキストの場合、
The/ quick/ brown/ fox/ jumps/ over/ the/ lazy/ dog/.
と全ての単語が一つのトークンで表現されています。
もう少し稀な単語を含む文章 “Hypothetically speaking, the incomprehensibilities arising from the intricate complexities of internationalization can baffle even the most astute minds.” を与えてみると、
H/yp/oth/etically/ speaking/,/ the/ incom/preh/ens/ibilities/ arising/ from/ the/ intricate/ complexities/ of/ international/ization/ can/ b/affle/ even/ the/ most/ ast/ute/ minds/.
と、一部の単語が複数のトークンに分割されていることが分かります。'incomprehensibilities’のような長い単語が分割されているのは当然としても、baffleやastuteのような短いけれどもあまり使われない単語が分割されている点は興味深いところです。
ちなみに、GPT2で採用されているtokenizerで同じテキストをトークンに分割すると、
Hyp/ot/hetically/ speaking/,/ the/ incomp/rehens/ibilities/ arising/ from/ the/ intricate/ complexities/ of/ international/ization/ can/ baff/le/ even/ the/ most/ ast/ute/ minds/.
と分割されており、分割方法に若干の変化が生じていることが分かります。
興味深いのは日本語の扱いです。いくつかのテキストで試したところ、英語とは逆に、一つの文字が二つのトークンで表現されているケースさえあります。
例えば、「本日は晴天なり」という7文字のテキストは、GPT3.5のtokenizerで分割すると、
本/日/は/晴1/晴2/天/な/り
と8トークンに分割されてしまいます。「晴」の字が1トークンで表現できず、2トークンに分割されてしまっているためです。
全ての漢字は無理としても、せめて当用漢字ぐらいは、全て1トークンで表現して欲しいところですが、他の言語とのバランスを考えた上で、こうなったのだと思います。
ちなみに、「本日は晴天なり」をGPT2で採用されているtokenizerで分割すると、11トークンに分割されてしまうので、若干の改良は施されているように見えます。
この件をTwitterで呟いたところ、「こんにちは」だけは1トークンで表現されることを指摘した人がいたので、試してみると、実際にその通りでした。「今日は」ではダメで(3トークン)、「こんにちは」とひらがなで書いた時だけ、1トークンで表現されます。
その他に、1トークンで表現される日本語はないかと探してみたところ、唯一見つけることが出来たのが「ありがとう」でした。
「こんにちは」「ありがとう」だけが1トークンで表現でき、「こんばんは」「おはよう」「どういたしました」「おめでとう」が出来ないのは、結構「デタラメ」に思えます。良く出てくる単語を1トークン化する必要性は認識しながらも、全ての言語についてそんなことは出来ないので、とりあえずいくつか選んで、実験的に1トークン化してみたように私には見えます。
他の言語でどうなるか試した結果が以下の通りです(韓国語の場合、1文字が3つのトークンに分割されるケースがある点に注目)。
この記事は約
NaN 分で読めます(
NaN 文字 / 画像
NaN
枚)