単語を数字に
国境の通訳者
言語モデルはテキストを直接見ません。整数を見ます。トークナイザーは国境の検問所に位置します:人間の単語が入ってきて、整数 ID が出て行きます。生成は流れを逆転させます:整数 ID が戻ってきて、トークナイザーがテキストをレンダリングします。
3つの仕事:
1. 分割。 文字列を断片(トークン)に切り分ける。
2. マッピング。 各断片に固定語彙からの一意の整数IDを割り当てる。
3. 逆変換。 生成時にIDからテキストを再構築する。
なぜ単語全体ではなく断片なのか
単語全体の語彙は爆発的に増える。英語だけでも数十万の形態がある。さらに悪いことに、単語全体で訓練されたモデルは、タイポ、新しい名前、または外国語のフレーズを扱えない:未知の単語はすべて単一の <UNK> スロットにマップされる。
サブワードトークン化がそれを解決します。よく使われる断片の語彙が、トレーニング中に一度も見ていない単語を含むあらゆる単語を構成します。2つの戦略が主流です:BPE(バイトペアエンコーディング)と分布的分断。ANDREAは2番目の戦略を選択します。
なぜサブワードか
単語の境界はどこにあるか
Zellig Harris, 1955
Zellig Harrisという言語学者が、あることに気づきました。単語の中で、与えられた文字列の後に続く異なる文字の数が急激に変動します。un の後には数十の文字が見つかります:a, b, c, d, e ... 一方、unbel の後にはごくわずかなセットしか続きません:i(その後 ievable)。
後続の多様性の急増は、ありそうな形態素境界を示します。un(接頭辞)の後では、多様性が跳ね上がります。なぜなら多くの語根が続くからです。believ のような語根の中では、多様性が低く保たれます。なぜなら文字同士が互いを予測するからです。形態素間の遷移点では、多様性が再び跳ね上がります。
多様性スパイクからセグメントへ
トレーニングコーパス全体にその検出器を実行します。すべての単語が統計的証拠を提供します。トークナイザーは、形態素の境界で繰り返し現れる高頻度セグメントを収集します:un、re、pre、believ、know、ing、able、ly、tion、ed。
ラベルなし。 言語学者が形態素を手動でタグ付けしません。文字の共起統計がその仕事をします。
Harris vs BPE
| 特性 | Harris | BPE |
|---|---|---|
| 境界基準 | 後続品詞の多様性スパイク | ペア頻度 |
| 言語的形状 | 形態素に揃えられた(接頭辞、語根、接尾辞) | 頻出バイトペア |
例: unbelievably | un + believ + abl + y | unb + eli + eva + bly |
| 一般化 | 強い(語根 + 接辞が再結合) | 弱い(ペアは揃う必要なし) |
どちらもサブワードピースを生成します。Harrisのピースは言語学者が形態素と呼ぶもの(最小の意味単位)に揃う傾向があります。BPEピースは圧縮を最適化します:意味に関係なく、最も頻出のバイトペアがマージされます。
単語を分割せよ
3つの語彙スラブ
ANDREA語彙の構造
Harrisトークナイゼーションは、3つのスラブを持つ語彙を生成します:
スラブ 1: 256 基本バイト。 すべての可能な UTF-8 バイト (0x00 から 0xFF) がそれぞれ独自のトークン ID を取得します。セーフティネット: コーパスに含まれるあらゆる文字を、トークナイザーはバイトのシーケンスとして表現できます。<UNK> は決して発火しません。
スラブ 2: N 形態素セグメント。 分布分析によって発見された一般的な断片。ANDREA-12M では訓練 N = 4096; ANDREA-120M では訓練 N = 8192。各セグメントは、繰り返されるマルチバイト文字列を単一のトークンに圧縮します。
スラブ 3: 1 BOS トークン。 すべての訓練シーケンスの開始に配置される特別なマーカー。モデルに「この位置には過去がない」と学習させます。ANDREA-12M & ANDREA-120M の両方で、BOS 用に正確に 1 つの ID を予約しています。
語彙サイズ
| モデル | ベースバイト | 形態素セグメント (N) | BOS | 語彙サイズ |
|---|---|---|---|---|
| ANDREA-12M | 256 | 4096 | 1 | 4353 |
| ANDREA-120M | 256 | 8192 | 1 | 8449 |
256 + N + 1 = 語彙サイズ。シンプル。再現可能。オープン。
バイトスラブが重要な理由
バイトのフォールバックがカバレッジを保証します。モデルが日本語に出会い、トークナイザに日本語の形態素がない場合、個々のUTF-8バイトがシーケンスを運びます。モデルはバイトで訓練されます;希少なスクリプトの品質は容量と露出に依存しますが、入力がトークナイザをクラッシュさせることは決してありません。
ボキャブラリーを計算せよ
シーケンスの開始
シーケンスにマーカーが必要な理由
デコーダーオンリーのトランスフォーマーは、前のコンテキストから次のトークンを予測します。位置0には前のコンテキストがありません。マーカーがないと、位置0は論理的な穴にあります:モデルが注目するものが何もないのです。
BOSは穴を解決します。 単一の特別なトークン(ID = 256 + N)が、トレーニング中のすべてのシーケンスの開始に配置されます。モデルは学習します:
- 'BOSを見たら、自然なテキストの可能性の高い最初のトークンを予測せよ。'
- 'BOSの後に単語が見えたら、その単語はシーケンスの開始で、続きではない。'
1つのトークン、さまざまな用途
BOS は次に現れます:
- 訓練時: モデルに与えるテキストの各チャンクの先頭に付加されます。
- 推論時: プロンプトの先頭に付加され、モデルに馴染みのある「新しい開始」の信号を与えます。
- 境界のマーク: 一部の処理パイプラインでは、連結されたドキュメント間の区切りとして使用されます。
ANDREA は BOS 用に正確に 1 つの ID を予約します。EOS なし、PAD なし、ボキャブラリが必要とするものを超える特別なトークンなし。シンプルさが permacomputer の価値として残ります:すべてのトークンがそのスロットを稼ぎます。
アクティビティ 3 続行
アクティビティ 3 (grow_a_language_model_tokenizer_diet) は、N が大きすぎる場合やトークナイザコーパスがトレーニングコーパスから乖離する場合に何が起こるかを扱います。ANDREA-12M はボキャブラリの 63.6% を無駄にしました;ANDREA-120M がそれを修正しました。読み進めてください。