Byte Pair Encodingに基づくサブワード分割アルゴリズム。頻出する文字ペアを繰り返しマージして語彙を構築し、未知語への対応力と語彙効率を両立するLLMの基盤技術。
BPE(Byte Pair Encoding)トークナイザーは、テキストをサブワード単位に分割するアルゴリズムです。元々はデータ圧縮技術として1994年にPhilip Gageが発案しましたが、2016年にSennrichらが機械翻訳に応用して以降、LLMのトークナイゼーションの事実上の標準となっています。GPT系列、LLaMA、Mistralなど主要なLLMの大半がBPEまたはその派生を採用しています。
初期: ['t', 'h', 'e']
Step 1: 'th' が最頻出 → マージ → ['th', 'e']
Step 2: 'the' が最頻出 → マージ → ['the']
... 語彙サイズ上限まで繰り返し
学習で得たマージルールを優先度順に適用し、入力テキストをトークン列に変換します。マージルール表にない文字列は個別文字(またはバイト)に分解されるため、未知語(OOV: Out-of-Vocabulary)が原理的に発生しません。
| 変種 | 採用モデル | 特徴 |
|---|---|---|
| Byte-level BPE | GPT-2/3/4, LLaMA | バイト単位で開始、Unicode問題を回避 |
| BPE-dropout | 研究用途 | 学習時にランダムにマージをスキップし正則化 |
| SentencePiece BPE | LLaMA, Mistral | 空白も1文字として扱い前処理不要 |
| tiktoken | GPT-3.5/4/4o | OpenAI独自の高速BPE実装 |
GPT-2で導入された方式で、文字ではなくバイト(0-255)を基本単位とします。任意のUnicode文字を256個のバイトトークンの組み合わせで表現できるため、言語に依存しない汎用的なトークナイザーが構築できます。
| モデル | 語彙サイズ | 方式 |
|---|---|---|
| GPT-2 | 50,257 | Byte-level BPE |
| GPT-4 / GPT-4o | 100,277 | cl100k_base (tiktoken) |
| LLaMA 2 | 32,000 | SentencePiece BPE |
| LLaMA 3 | 128,256 | tiktoken BPE |
| Mistral | 32,768 | SentencePiece BPE |
| Gemma 2 | 256,000 | SentencePiece BPE |
語彙サイズが大きいほど1トークンで表現できる文字数が増え(圧縮率が上がり)、入力長を節約できます。一方、Embeddingレイヤーのパラメータ数が増加し、メモリ消費と低頻度トークンの学習不足が問題になります。
日本語はスペースで単語区切りがないため、Byte-level BPEでは漢字1文字が2〜3トークンに分解されがちです。「自作パソコン」が ["自", "作", "パソ", "コン"] のように分割され、英語の同等表現より多くのトークンを消費します。
対策として、LLaMA 3やGemma 2は語彙サイズを12〜25万に拡大し、日本語の頻出サブワードを多数語彙に含めることで圧縮率を改善しています。
形態素解析(MeCab等)は言語学的な知識に基づいて単語を分割しますが、BPEは統計的な頻度のみに基づきます。BPEは言語に依存せず、未知語にも対応できる汎用性が強みですが、言語学的に意味のない分割が生じることもあります。
語彙サイズ増加はEmbeddingパラメータ増大とメモリ消費増を伴います。また低頻度トークンの学習が不十分になり、生成品質が下がるリスクもあります。言語カバレッジとモデル効率のバランスが重要です。
語彙サイズ32,000〜128,000のBPEを適切に学習するには、最低でも数GB〜数十GBのテキストコーパスが推奨されます。学習データが少ないとマージルールが偏り、汎化性能が低下します。