トークナイザーと、それが言語にとって重要な理由
言語モデルは単語を見ません。トークンを見ています。テキストがどうトークンに刻まれるかが、言語間のコスト・速度・公平性を静かに決めます。
言語モデルは単語を読まず、文字も読みません。どんなテキストもモデルに届く前に、それをトークンと呼ばれる単位の列へと刻むトークナイザーを通過します——そしてモデルが見るのはそのトークンだけです。このステップははるか上流にあるため見過ごしやすいのですが、下流のほとんどすべてを形作ります。リクエストにいくらかかるか、モデルの記憶が実効的にどれだけ長いか、そして驚くべきことに、モデルがさまざまな人間の言語をどれだけ公平に扱うか。
トークナイザーはモデルの感覚器官です。同じ考えを表すのに、ある言語では別の言語の二倍のコストがかかり得る理由を理解したいなら、ここから始めなければなりません。
トークンとは実際に何か
トークンはテキストの塊で、たいていは単語まるごとではありません。現代のトークナイザーはテキストをサブワードの断片に分ける傾向があります。よくある単語は単一のトークンかもしれませんが、まれな単語はいくつかに分割されます。でっち上げの、あるいは珍しい文字列は、ほぼ一文字ずつに分解されるかもしれません。空白や句読点もトークンであり、大文字小文字が分割の仕方を変えることもあります。
なぜ単語まるごとではなくサブワードなのでしょうか。単語まるごとの語彙は膨大になり、それでもなお新しい単語、名前、誤字をすべて取りこぼすからです。では、なぜ単に一文字ずつ使わないのでしょうか。それは列を極端に長くし、モデルに小さな断片から意味を再構成させてしまうからです。サブワードのトークン化は妥協です。固定で扱いやすい語彙でありながら、断片を組み合わせることでどんな入力も表現できます。よくあるパターンを効率的に捉えつつ、見たことのないものに完全に行き詰まることもありません。
語彙はどう作られるのか
トークナイザーの語彙は手書きではなく——モデルが訓練される前に、大量のテキストコーパスから学習されます。人気のある手法の背後にある一般原則は同じです。小さく始めて、よく一緒に現れるものを併合する。
典型的なアプローチは基本文字から始め、それから最も頻繁な隣接ペアを繰り返し探して新しい単位へ併合し、その単位を語彙に加えます。これを何度も行うと、頻繁な列——よくある接頭辞、接尾辞、絶えず現れる単語まるごと——が単一のトークンになり、まれな列はより小さな部分に分かれたままになります。結果は、訓練テキストの統計に合わせて調整された語彙です。
その最後の一句が、物語全体の核心です。トークナイザーは、それが作られたテキストに合わせて調整される。 そのテキストが豊富に持っていたものは短く効率的なトークンを得ます。乏しかったものは、多くの小さな断片に刻まれます。
なぜこれが言語間で公平でないのか
大きなトークナイザーのほとんどは、ごく一握りの広く書かれた言語に支配されたコーパスで訓練されます。それらの言語——とりわけ英語——は効率的なトークン化を手にします。よくある単語が単一のトークンになり、文が比較的少ないトークンになります。
そのコーパスで過小に表されていた言語は、より分が悪くなります。同じ意味をそうした言語で表すと、目に見えて多くのトークンを要し得ます。トークナイザーがそれにコンパクトな単位を学ばず、単語を多くの小さな断片へ分割することに頼るからです。大きな文字集合を持つ書記体系や、トークナイザーがほとんど見なかった文字体系は、とりわけ強く打撃を受け、ときに一文字あたり一トークンに近づきます。
これは小さな見た目だけの違いではありません。直接的で複利的な帰結を持ちます。
- コスト。 モデルはたいていトークン単位で価格付けされ計量されます。あなたの言語が同じことを言うのに多くのトークンを要するなら、同じ会話が単純により高くつきます。
- 実効的な記憶。 モデルのコンテキストウィンドウはトークンで測られます。一文あたりのトークンが多ければ収まる文は少なくなり、トークン非効率な言語では、モデルが文書を実効的に記憶する量が少なくなります。
- 速度。 読み書きするトークンが多いほどリクエストあたりの計算が増え、応答が遅くなります。
つまり、過小に表された言語の話者は、より多く支払い、より短い実効的記憶を得て、より長く待ち得るのです——同一の内容に対して。不公平はモデルの下、トークナイザーで焼き込まれています。
品質への下流の影響
トークン化は、コストだけでなく能力をも形作り得ます。単語が多くの断片に砕かれると、モデルは意味を再構成するためにより多くの仕事をしなければならず、単語レベルなら明白なパターンが多くのトークンに薄く広がります。テキストの正確な構造に依存するタスク——数える、綴る、文字を操作する、丁寧な算術——は、モデルが人間の見る文字や数字ではなくトークンを見ているがゆえに、意外な形でつまずき得ます。
これは、さもなければ不可解に見える振る舞いの一群を説明します。モデルが単語の文字数を数え間違えるとき、それは愚かなのではありません。そもそも文字をきれいな別々の単位として持っていなかったのです。トークナイザーは塊を渡し、その塊がタスクに必要なディテールを隠したのです。
それに対して何がなされるのか
完璧な修正はありませんが、レバーはあります。トークナイザーの語彙を、よりバランスの取れた多言語コーパスから作ることは、過小に表された言語に効率的なトークンのより公平な取り分を与えます。語彙を大きくすることは、より大きなモデル構成要素という代償と引き換えに、より多くの言語がコンパクトな単位を得る余地を残します。一部のシステムは最初から多言語であるよう設計され、それに応じてトークナイザーの訓練に重みを置きます。
これらのどれもギャップを完全には消しません。いかなる固定語彙も優先順位を反映するからです——すべての文字体系に、最も効率的な符号化を一度に与えることはできません。しかしトークナイザーについて意図的であることは、パイプライン全体で最もレバレッジの高い公平性の判断の一つです。まさにそれが他のすべての上流に座っているからです。
ユーザーとしてどう考えるか
トークナイザーを制御することはめったにありませんが、それについて推論することはできます。非効率にトークン化される言語で作業するなら、より高いトークン数を見込み、予算とコンテキスト制限でそれに備え、文字に非常に敏感なタスクが不安定になり得ることを意識しましょう。二つのモデルのコストを比べるときは、同じテキストのトークン数がモデル間で異なり得ることを忘れないでください。各モデルが独自のトークナイザーを搭載しているからです。「トークンあたりの価格」という見出しは、あなたの実際のテキストが何トークンになるかを知らなければ、ほとんど意味をなしません。
まとめ
トークナイザーは、人間のテキストをモデルが実際に消費する単位へ変える見えない層であり、それが訓練されたコーパスが何であれ、そこから作られます。その一つの事実が外へ波及します。そのコーパスでよく表された言語は、安く、コンパクトで、有能な扱いを得ます。一方、過小に表された言語は、まったく同じ意味に対して、より多く支払い、コンテキストに収まる量が少なく、より遅く走ります。トークン化は飛ばしてよい技術的細部ではありません。モデルのコスト構造の多くと公平性の多くが、モデル自体が何かを考えるはるか前に、静かに決められる場所なのです。
