バイトレベルBPEトークナイゼーション(バイトレベルビーピーイートークナイゼーション)
BPEの起点をUnicode文字でなくバイト(0-255)にすることで全Unicode文字をOOVなしに表現するトークン化手法。GPT-2で導入され、GPT-4・Llama-3で標準化。256バイトを基本ボキャブラリーとして全言語・絵文字・バイナリデータを統一的にトークン化できる。
バイトレベルBPEトークナイゼーション
Byte-Level BPE(バイトレベルBPE、略称BBPE)はOpenAIのRadfordらがGPT-2論文(2019年)で提案したBPEの拡張版。通常のBPEがUnicode文字(コードポイント)を最小単位とするのに対し、BBPEは256種類のバイト値(0x00〜0xFF)を最小単位として採用する。これにより全Unicode文字は必ず既存のバイト列として表現でき、語彙外(OOV)問題が原理的に発生しない。
通常BPEとの違い
| 特性 | 通常BPE | Byte-Level BPE |
|---|---|---|
| 最小単位 | Unicode文字(コードポイント) | バイト(0x00〜0xFF) |
| 初期vocab | 文字セット(数百〜数千) | 256バイト値 |
| OOV発生 | あり(未知文字) | なし(全入力をバイト表現可能) |
| 絵文字対応 | 不安定(OOV可能性) | 完全対応 |
| バイナリデータ | 非対応 | 理論上対応 |
GPT-2での導入背景
GPT-2以前のLMは語彙外の文字に対して<unk>トークンを使っていた。これにより稀少言語・絵文字・コード中の特殊文字でトークン化が崩れる問題があった。GPT-2ではこれを解決するためBBPEを採用し、全Unicode文字を正確にトークン化できるように設計した。
バイト値の可読化
0x00〜0xFF の256バイト値を直接使うと多くは非印字可能文字になり可読性が低い。GPT-2/tiktokenでは256バイト値を256個の可読文字(ASCII可印字文字+カスタム文字)にマッピングする変換テーブルを使用する。例えば「こんにちは」(UTF-8: e3 81 93 e3 82 93...)はバイト列に変換後、BPEマージルールで「こ」「ん」「にちは」等のサブワードに結合される。
Llama-3でのBBPE採用
LLaMA-2がSentencePiece BPE(Unicode文字レベル)だったのに対し、LLaMA-3はtiktoken互換のBBPEに切り替えた。語彙サイズも32,000から128,256へ4倍拡大。これによりLLaMA-3は絵文字・CJK文字・コードを前世代より大幅に効率的に表現でき、特に日本語テキストのトークン効率が2〜3倍改善した。
コードLLMでの重要性
コード生成モデルにとってBBPEは特に重要。プログラムコードには通常テキストに現れない文字(\x00パディング、バイナリデータ、非ASCII識別子等)が多く、OOV問題がコード品質に直結する。GitHub Copilot/CodeX等のコードLLMがBBPEを採用しているのはこの理由による。