Byte Pair Encoding(BPE)とは、テキスト中の最も頻出する連続バイト/文字ペアを反復的にマージすることで語彙を構築するサブワード分割アルゴリズムである。GPT系、Llama系、Qwen系など主要LLMの大半で採用されるトークナイザの中核技術。
Byte Pair Encoding(BPE)は1994年にPhilip Gageがデータ圧縮アルゴリズムとして提案し、2016年にSennrichらがNMT(機械翻訳)に適用して以来、NLP・LLMのトークナイザの事実上の標準となった技術である。
BPEの基本原理は極めてシンプルである:
この反復マージにより、頻出する単語は1トークンに、稀な単語は複数のサブワードに分割される。「the」は1トークン、「anthropomorphize」は「anthrop」+「omorph」+「ize」の3トークンに分割されるイメージである。
具体例として「low lower lowest」からBPE語彙を構築する過程:
初期状態(文字レベル):
l o w _ l o w e r _ l o w e s t
Step 1: 最頻出ペア「l o」をマージ → 「lo」 Step 2: 最頻出ペア「lo w」をマージ → 「low」 Step 3: 最頻出ペア「low e」をマージ → 「lowe」 Step 4: 最頻出ペア「lowe r」をマージ → 「lower」
各ステップのマージルールが「merges file」として保存され、推論時のトークン分割に使用される。
| 方式 | 初期語彙 | 未知文字 | 実装例 |
|---|---|---|---|
| 文字レベル | Unicode文字(数千) | UNKトークンに変換 | 旧GPT-2 |
| バイトレベル | 256バイト値 | なし(全バイト表現可能) | GPT-4, Llama 3 |
2026年の主要LLMはほぼ全てバイトレベルBPEを採用している。バイトレベルの最大の利点は「未知文字が存在しない」ことで、あらゆる言語・記号・バイナリデータを表現可能。初期語彙が256と小さいため、語彙構築の効率も高い。
OpenAIのtiktokenは、BPEの推論(エンコード)をRustで実装し、Pythonバインディングを提供する高速トークナイザである。
主な最適化:
\'(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|... パターンでテキストを事前分割し、BPEの探索空間を縮小<|im_start|> 等のコントロールトークンをBPEの前に検出・分離tiktokenのエンコード速度はHuggingFace tokenizersの2-5倍、Python実装のsentencepieceの10-50倍と報告されている。
Meta Llama 3は前世代の32K語彙から128,256語彙に4倍拡張した。この設計判断の背景:
語彙拡張の効果(トークン数比較、同一テキスト):
| 言語 | Llama 2 (32K) | Llama 3 (128K) | 削減率 |
|---|---|---|---|
| 英語 | 100トークン | 85トークン | 15% |
| 日本語 | 100トークン | 55トークン | 45% |
| 中国語 | 100トークン | 50トークン | 50% |
| Python | 100トークン | 78トークン | 22% |
Q1: BPEの語彙構築にはどの程度のデータが必要ですか? A: 語彙の品質はデータの多様性に大きく依存します。GPT-4のBPE語彙は数兆トークンの多言語コーパスから構築されていると推定されます。実用的には、目標言語をカバーする10-100GBのテキストデータがあれば品質の高い語彙を構築可能です。HuggingFace tokenizersライブラリでは1GB程度のテキストから数分で語彙を構築できます。
Q2: BPEとWordPieceの違いは何ですか? A: 両者ともサブワード分割アルゴリズムですが、マージルールの選択基準が異なります。BPEは「最も頻出するペア」を選択するのに対し、WordPieceは「マージによる尤度の向上が最大のペア」を選択します。実用上の性能差は小さく、BPEの方が実装がシンプルで高速なため、最新のLLMではBPEが主流です。WordPieceはBERT系モデルで使用されています。
Q3: BPEの語彙にない単語はどう処理されますか? A: バイトレベルBPEでは「語彙にない単語」は原理的に存在しません。あらゆるテキストは最終的にバイト(256種類、全て語彙に含まれる)まで分解可能です。稀な単語は多数のサブワードに分割されるためトークン数は増加しますが、UNK(未知語)トークンに置換されることはありません。これがバイトレベルBPEの最大の利点です。