英語は単語のあいだに空白があります。日本語にはありません。ですから日本語を機械に読ませるときは、まず単語に割るのが最初の仕事でした。MeCabやJUMAN、Sudachiといった形態素解析器が担ってきた工程です。
今のLLMは、これをしていません。 しかも調べていくと、英語のほうも似た扱いを受けていることが分かります。
実際に割ってみる
公開されているトークナイザ(GPT-4oのもの)で、日本語を分割した結果です。区切りが実際の単位です。
有名人には詳しく → 有 | 名 | 人 | には | 詳 | しく
有名人のことは詳しく → 有 | 名 | 人 | の | こと | は | 詳 | しく
歴史に詳しい → 歴 | 史 | に | 詳 | しい
形態素解析器なら「有名人 / に / は」と割るところです。ところが実際は、「有名人」が3つにばらけ、逆に「には」が1つの塊になっています。
ここは注目に値します。「には」は「に」と「は」という2つの助詞です。 文法的には別々の部品なのに、融合したまま1つの単位として扱われている。 一方、同じ「は」が「のことは」の中では独立した単位になっています。同じ助詞が、隣に何が来るかで別々に扱われているわけです。
つまり、分割の切れ目は文法の切れ目と一致しません。
英語も、似たようなものだった
では空白のある英語は単語で割られているのか。同じトークナイザで見ると、そうではありません。
tokenization → token | ization
unbelievable → un | bel | ievable
internationalization → international | ization
un | bel | ievable は、意味の切れ目としては壊れています。正しくは un / believ / able のはずです。英語も、文法や語源とは無関係なところで切られている。
「英語は単語が分離しているから有利」という直感は、少なくともこの工程では表れていません。 空白は手がかりの一つに過ぎず、英語も日本語も、同じところまで降ろされてから処理されます。
なぜ、これで動くのか
単位を決めているのは文法ではなく頻度です。大量のテキストを眺めて、よく一緒に登場する並びを1つの単位にまとめる——BPEやUnigramと呼ばれる方式です。「には」がひと塊になったのも、日本語のテキストに「には」という並びが大量に登場するからでしかありません。
この考え方を、空白のない言語まで含めて徹底したのがSentencePiece(2018年)です。空白を特別扱いせず、生のテキストから直接、単位を学ぶ。 日本語や中国語で前処理を不要にすることが、論文に明示された設計目標に含まれています。
形態素解析をやめたのではなく、要らない作り方に変えた、というのが正確なところです。
なお、形態素解析が完全に無意味というわけでもありません。日本語のトークナイザを比べた研究は、形態素解析器を前段に置く構成も検討したうえで、課題ごとに最適な解析器が違う(=万能の1つはない)と報告しています。
副作用:日本語はトークンを食う
割り方が頻度で決まる以上、学習データに多い言語ほど、少ないトークンで済みます。 そして多くのモデルは英語中心のデータで作られています。
同じ内容の日英3組を、先ほどのトークナイザで測った結果です。
| 日本語 | 英語 | 比 | |
|---|---|---|---|
| 3文の合計 | 66トークン | 31トークン | 2.13倍 |
同じことを言うのに、日本語はおよそ2倍のトークンを使います。 これは料金にも、文脈に収まる量にも、そのまま効きます(トークン節約の話)。
数えたいときは
ここまでの測定はすべて公開されているGPT-4oのトークナイザによるもので、Claudeのトークナイザではありません。 Anthropicはトークナイザ本体を公開していないので、Claudeでの正確な数はトークンカウントAPIで数えることになります。傾向は共通ですが、具体的な数字はモデルごとに違います。
まとめ
- LLMは形態素解析をしていない。単語に割る工程そのものを持たない
- 分割は頻度で決まるので、文法の切れ目と一致しない。「には」は助詞2つのまま1つの単位になり、「有名人」は3つにばらける
- 英語も同じ扱いを受けている。
un | bel | ievableのように、意味の切れ目を無視して切られる - 日本語は同じ内容でおよそ2倍のトークンを使う(本記事の実測値、3文の比較)
- Claudeのトークナイザは非公開。正確に数えるなら公式のトークンカウントAPI
では、単語にすら割っていないモデルが、なぜ助詞を間違えないのか。文法はどこにあるのか。 それは次の記事で扱います。