コンテンツにスキップ

1. トークン化

ニューラルネットワーク数値を受け取り、掛け算・足し算と簡単な関数を何段も重ねて、別の数値を出す計算のしくみ。掛ける数(重み)を学習で調整して、目的の出力に近づける。用語集でくわしく →が扱えるのは数値だけです。そこで LLM は、まず文章を トークン という単位に区切り、それぞれに番号(トークン ID語彙の中の各トークンに振られた番号。LLM に実際に入力されるのは、この整数の並び。用語集でくわしく →)を振ります。この区切って番号を振る道具を トークナイザ と呼びます。

この回の入力と出力
  • 入力: 文章(文字列)。例:「猫が魚を食べた。それは新鮮だった」
  • 出力: トークン ID の列(整数の並び)。例:「猫 / が / 魚 / を / 食べた / 。 / それ / は / 新鮮 / だった」の 10 トークンに区切って [3412, 12, 2901, 18, 15873, 6, 911, 14, 20417, 7088](区切り方も番号も説明用の仮定。実際のトークナイザは、もっと細かく区切ることが多い)
  • 使うもの: トークナイザが持つ語彙(ボキャブラリ)トークナイザが知っているトークンの一覧。LLM は、この一覧のどれか 1 つを次のトークンとして選ぶ。語彙の数を語彙サイズという。用語集でくわしく →(どの文字の並びを 1 トークンにするかと、その番号の一覧)。語彙は、LLM 本体の学習の前に作っておく

区切り方には、大きく 3 つの考え方があります。

単位長所短所
1 文字ずつ語彙が比較的小さい(ただし、語彙に入れていない文字は表せない)系列順番に並んだデータの列。ここでは、文章を区切ってできたトークンの並びのこと。並びの個数を系列の長さという。用語集でくわしく →(トークンの並び)がとても長くなり、計算量が増える
単語ごと系列が短い語彙が膨大になり、辞書にない語(未知語)を扱えない
サブワード(文字と単語の中間)よく出る並びは 1 トークン、まれな語は細かく分けて表せる区切り方を学習で決める必要がある

現在の LLM はほぼすべてサブワードを使っています。その代表的な作り方が BPE(Byte Pair Encoding) です。

BPE は、大量の文章(コーパス学習などに使うために集めた、大量の文章のこと。トークナイザやモデルは、コーパスの中の文章から規則や傾向を学ぶ。用語集でくわしく →)を見て、「よく隣り合う 2 つをくっつける」ことを繰り返して語彙を作ります。

  1. すべての文章を 1 文字(GPT-2 などの「バイトレベル BPE」では 1 バイトコンピュータがデータを扱う単位で、0〜255 の整数 1 つ分。文字は UTF-8 などの規則でバイトの並びに直して保存される。用語集でくわしく →)ずつのトークンに分ける
  2. 隣り合うトークンのペアのうち、コーパス全体で 一番多く出てくるペア を探す
  3. そのペアをくっつけて新しいトークンとし、語彙に加える(この操作を マージ と呼ぶ)
  4. 決めた語彙数に達するまで 2〜3 を繰り返す

このページのデモでは、先に空白や改行で文章を区切り、その区切りをまたぐペアはくっつけません。また、2 回以上出てくるペアだけをくっつけ、そうしたペアがなくなったら止まります。

できあがったトークナイザで新しい文章を区切るときは、1 文字ずつ(バイトレベル BPE では 1 バイトずつ)に分けたうえで、学習で覚えたマージを 覚えた順番どおりに 適用します。後のマージは、前のマージで作ったトークンを材料にしているからです。たとえば「の」と「天気」をくっつけるマージは、先に「天」と「気」から「天気」を作っておかないと使えません。

BPE トークナイザを自分で学習させる
32文字32トークン44語彙サイズ
東0京1の3天4気5は6晴7れ8で9す10。11t30h31e32␣空白w33e32a34t30h31e32r35␣空白i36s41␣空白r35a34i36n37y40.43
#くっつけたペア新しいトークン出現回数
まだマージしていません。今は 1 文字 = 1 トークンです。

コーパスの中で一番よく隣り合うペアを 1 つの新しいトークンにする、を繰り返します。「?」付きの番号は学習テキストに出てこなかった文字です(GPT-2 などのバイトレベル BPE や、バイトフォールバックを使うトークナイザでは、未知の文字は生じません)。

  • マージ回数を少しずつ増やす: 「です。」「の天気」「の天気は」のような、何度も出てくる並びから先にまとまっていくのが分かります。
  • トークン化する文に、コーパスにない言葉を入れる: その言葉の中で、コーパスによく出た並び(「の天気」など)だけがまとまり、残りは 1 文字ずつに分かれます。学習データに多い言語ほど、少ないトークンで表せるのはこのためです。
  • コーパスを書き換える: 同じ専門用語が何度も出てくる文章を貼ります。マージ回数は 0 に戻るので、もう一度少しずつ増やすと、その語の並びがまとまっていきます(2 回以上出てくるペアしかまとめないので、必ず 1 語が 1 トークンになるわけではありません)。
  • GPT-2 の語彙は 50,257 トークンでした(Radford ら、2019 年)。最近のモデルはもっと大きな語彙を持つものが多く、たとえば Llama 3 は約 128,000(128K)トークンです。
  • GPT-2 などは、1 文字ではなく 1 バイト から始めます(バイトレベル BPE)。バイトは 256 種類しかないので、絵文字でも未知の文字でも必ず表せます(「?」になる文字がありません)。その代わり、UTF-8 では日本語の文字の多くが 3 バイトなので、まれな漢字は 1 文字が複数のトークンに分かれることがあります。
  • 文字単位で BPE を学習し、語彙にない文字だけをバイトに分解する方式(バイトフォールバック)を使うモデルもあります。バイトレベル BPE もバイトフォールバックも、「どんな文字でも表せる」ための工夫です。
  • 多くのトークナイザは、BPE の前に、空白や記号などで文章を大まかに区切ります(プレトークナイズ)。マージは、その区切りの中でだけ行います(SentencePiece のように、空白も文字の 1 つとして扱う方式もあります)。
  • API の料金やコンテキスト長LLM が一度に読み込めるトークン数の上限。入力(指示や会話の履歴)と、生成した出力の合計で数える。用語集でくわしく →は、文字数ではなく トークン数 で数えます。同じ内容でも、言語やトークナイザによってトークン数は変わります。