トークナイザーが食べるものが、それが知るものになる
トークナイザーの食事療法:定義
Harris トークナイザーはコーパスのサンプルで訓練されます。そのサンプル全体で分布分析を実行し、最も強く再発する N 個のセグメントを選択し、語彙に書き込みます。訓練後、それらの N 個のセグメントは、言語モデルが訓練、推論、すべての入力、すべての出力に使用する固定されたアルファベットになります。
トークナイザーの食事療法 = トークナイザーが訓練されるテキストのサンプル。
トレーニング食 = 言語モデルが訓練されるコーパス。
2つの食事が異なる場合、トークナイザーはモデルが決して見ないテキストに調整されたセグメントを学習します。埋め込み容量(語彙エントリ1つにつき1スロット)は、訓練中に報酬を得ないセグメントに費やされます。
ANDREA-12Mのミス
ANDREA-12M は、Harris トークナイザーを megachat-v8.txt の生のヘッドで訓練しました。そのヘッドにはコードサンプルとツール呼び出しデータが含まれていました。しかし、訓練カリキュラムではコードとツール呼び出しを除外しました。ANDREA-12M は会話テキストのみを見ました。
結果:トークナイザーは Python キーワード、JSON 括弧、シェルフラグからセグメントを学習しました。モデルは辞書エントリと対話で訓練されました。カリキュラム加重サンプルのうち、わずか 36.4% のセグメントしか重複しませんでした。 残りの 63.6% の語彙スロットは、モデルが訓練時に決して遭遇しないセグメントに割り当てられました。
なぜそれが重要か
各語彙エントリは埋め込みパラメータを消費します:V × d_model 形状の埋め込み行列の1行(アクティビティ4で扱います)。V = 4353、d_model = 384 の場合、各語彙スロットは 384 個の浮動小数点数をコストします。63.6% を無駄にすると、モデルが決して見ないデータに埋め込み行列の 63.6% を無駄に費やします。
Diet ルールを述べよ
Nはいかに大きくすべきか
語彙科学の包括的調査
ANDREA-120Mは語彙科学実験を実施:同じ1.25B文字のfirehoseコーパス上で、異なるN値(要求セグメント数)でHarrisトークナイザを訓練。トークナイザが実際に発見したセグメント数を測定し、結果をプロット。
| 要求された N | 実際に見つかったセグメント数 | 状態 |
|---|---|---|
| 2,048 | 2,048 | 未飽和 (成長の余地あり) |
| 4,096 | 4,096 | 未飽和 |
| 8,192 | 8,192 | 飽和点 |
| 16,384 | 13,106 | コーパス枯渇 |
飽和とは何か
小さな N では、コーパスには十分な繰り返しパターンが存在し、トークナイザーは要求されたすべてのスロットを埋めます。大きな N では、トークナイザーは統計的に意味のある境界を使い果たします。12.5億文字のコーパスには、周波数閾値以上の頻度を持つ約13,106個の異なる形態素形状のセグメントが含まれます。16,384個を要求すると13,106個が得られ、残りの3,278スロットはパディングされたり空のままになります。
飽和点: 要求された N = 発見された N の点。 飽和点を超えると、トークナイザーは品質を希薄化せずに(周波数閾値を下げてノイズを受け入れることなく)これ以上のセグメントを発見できません。
スイートスポット at 8192
ANDREA-120M は N = 8192 を選びました。理由:
- 8192未満(例: 4096)の場合: 語彙が一般的な形態素を十分に捉えきれず、シーケンスがより多くのトークンに断片化し、スループットが低下します。
- 8192 で:すべてのセグメントスロットがコーパス内の実際の、繰り返しパターンにマッピングされます。
- 8192 以上:収束が減少;13,106 < 16,384 とは、スロットが無駄になります。
最終 ANDREA-120M 語彙:256 + 8192 + 1 = 8449 トークン。平均圧縮:トークンあたり 5.91 UTF-8 バイト、つまり各トークンが生テキストの約 5.9 バイトを置き換えます。この比率がモデルの有効なコンテキストを設定します:1024 トークン × 5.91 バイト/トークンで、ANDREA-120M は1回のフォワードパスあたりおよそ 6,050 文字のコンテキストを読み取ります。
飽和点以上または以下
63.6% がどこから来たのか
無駄なスロットの数え方
ANDREA-12Mのトークナイザーは生のmegachat-v8.txtで訓練されました(4096セグメント要求、発見)。チームはカリキュラム加重サブセットをサンプリングしました:バンディットによって各ソースが引き出される頻度で加重されたコーパス。彼らはその加重サンプルでHarris分析を再実行し、次の質問をしました:元の4096セグメントのうち、どれだけがまだ現れるか?
結果:36.4% の重なり。4,096セグメントのうち1,491がカリキュラム加重に一致。残りの2,605セグメントはモデルが除外したソースから来ました。
語彙スロットの63.6%が、モデルが一度も見たことのないバイトに割り当てられた。
埋め込みコスト
各語彙エントリは、形状(V, d_model)の埋め込み行列の1行を占有します。ANDREA-12Mの場合:
- V = 4353 (256 + 4096 + 1)
- d_model = 384
- 埋め込みパラメータ = V × d_model = 4353 × 384 = 1,671,552 parameters
会話トレーニングで未使用だったパラメータの 63.6%。1,063,107 パラメータ割り当て、0 報酬信号。ANDREA-12M は 256 基本バイトが常にどんな文字もカバーするため生き残るが、パラメータあたりの容量が急激に低下した。
ANDREA-120M がこれをどう修正したか
ANDREA-120M のトークナイザーは、完全な firehose(1.25B 文字、21 ソース)で飽和 N = 8192 でトレーニングされた。トレーニングコーパス = 同じ firehose。Diet alignment: 100%。チャット加重サンプルでの結果的重ね合わせ: 36.5%。(注: 36.5% はカバレッジではなく重ね合わせ; チャット単独は full firehose のサブセットなので、この数字は 12M の 36.4% とは異なる振る舞いをする。)
有効圧縮: トークンあたり 5.91 UTF-8 バイト。ANDREA-120M の埋め込み行列: 8449 × 768 = 6,488,832 パラメータ。すべてのパラメータが報酬信号を得るのは、すべてのセグメントがモデルが実際にトレーニングするテキストにマッピングされるからだ。
カバレッジ対重ね合わせ
なぜ5.91 Bytes Per Tokenが重要か
圧縮率
トークンあたりの平均UTF-8バイト数は、各ボキャブラリーエントリがどれだけ生テキストを圧縮するかを測ります。ANDREA-120Mは平均5.91です。短いピース(3バイト/トークン)のモデルはフォワードパスごとに少ないコンテキストを読みます;長いピース(8バイト/トークン)のモデルは多く読みますが訓練が遅くなります(各ピースを十分に学習するには多くのサンプルが必要)。
有効なコンテキスト
| 数量 | 値 |
|---|---|
| トークンコンテキストウィンドウ | 1,024 トークン |
| トークンあたりの平均バイト | 5.91 |
| 有効な文字コンテキスト | 1024 × 5.91 ≈ 6,050 |
およそ6,000のUTF-8文字が1回のANDREA-120Mのフォワードパスに収まります。濃密な英語の散文の1ページは約3,000〜4,000文字です。ANDREAは1パスあたり約1ページ半を読み取ります。
ダイエットが圧縮を強化
よく調整されたトークナイザはより良く圧縮します。トークナイザがトレーニングコーパスで繰り返されるセグメントを学習すると、1トークンあたりのテキスト量が増えます。ANDREA-12Mの調整が不十分なトークナイザはチャットで圧縮が悪く(チャットセグメントが語彙に疎だったためバイトフォールバック断片に多くのバイトを費やしました)、ANDREA-120Mのダイエット調整トークナイザはチャット形状の部分を高速パスに保ち、珍しいスクリプトをバイトフォールバックにします。
アクティビティ4の続き
Activity 4 (grow_a_language_model_embeddings) はその8449の語彙エントリに何が起こるかを扱います:それらはV × d_model形状の埋め込み行列の行になり、最初のトランスフォーマーブロックに流れる前に学習された位置埋め込みを加えます。