Byte Pair Encoding(バイトペアエンコーディング)
Byte Pair Encoding(BPE)とは、テキスト中の最も頻出する連続バイト/文字ペアを反復的にマージすることで語彙を構築するサブワード分割アルゴリズムである。GPT系、Llama系、Qwen系など主要LLMの大半で採用されるトークナイザの中核技術。
Byte Pair Encoding(BPE)は1994年にPhilip Gageがデータ圧縮アルゴリズムとして提案し、2016年にSennrichらがNMT(機械翻訳)に適用して以来、NLP・LLMのトークナイザの事実上の標準となった技術である。
概要
BPEの基本原理は極めてシンプルである:
- テキストを最小単位(バイトまたは文字)に分解
- コーパス内で最も頻繁に隣接するペアを特定
- そのペアを1つの新しいトークンとしてマージ
- 手順2-3を語彙サイズが目標に達するまで反復
この反復マージにより、頻出する単語は1トークンに、稀な単語は複数のサブワードに分割される。「the」は1トークン、「anthropomorphize」は「anthrop」+「omorph」+「ize」の3トークンに分割されるイメージである。
BPEの訓練プロセス
具体例として「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」として保存され、推論時のトークン分割に使用される。
バイトレベルBPE vs 文字レベルBPE
| 方式 | 初期語彙 | 未知文字 | 実装例 |
|---|---|---|---|
| 文字レベル | Unicode文字(数千) | UNKトークンに変換 | 旧GPT-2 |
| バイトレベル | 256バイト値 | なし(全バイト表現可能) | GPT-4, Llama 3 |
2026年の主要LLMはほぼ全てバイトレベルBPEを採用している。バイトレベルの最大の利点は「未知文字が存在しない」ことで、あらゆる言語・記号・バイナリデータを表現可能。初期語彙が256と小さいため、語彙構築の効率も高い。
GPT-4 / tiktoken の BPE 実装
OpenAIのtiktokenは、BPEの推論(エンコード)をRustで実装し、Pythonバインディングを提供する高速トークナイザである。
主な最適化:
- 正規表現プレトークン化:
\'(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|...パターンでテキストを事前分割し、BPEの探索空間を縮小 - バイトレベルBPE: UTF-8バイト列に対してBPEを適用
- 特殊トークン処理:
<|im_start|>等のコントロールトークンをBPEの前に検出・分離 - 並列処理: 複数テキストのバッチエンコードをRustスレッドで並列化
tiktokenのエンコード速度はHuggingFace tokenizersの2-5倍、Python実装のsentencepieceの10-50倍と報告されている。
Llama 3 の BPE 語彙設計
Meta Llama 3は前世代の32K語彙から128,256語彙に4倍拡張した。この設計判断の背景:
- 多言語性能: 32K語彙では非英語テキストの圧縮率が低く、日本語で英語の3-5倍のトークン数が必要だった
- コード対応: プログラミング言語のキーワード・構文を専用トークンでカバー
- 効率性: 同じ文章を少ないトークンで表現でき、推論ステップ数が減少
語彙拡張の効果(トークン数比較、同一テキスト):
| 言語 | Llama 2 (32K) | Llama 3 (128K) | 削減率 |
|---|---|---|---|
| 英語 | 100トークン | 85トークン | 15% |
| 日本語 | 100トークン | 55トークン | 45% |
| 中国語 | 100トークン | 50トークン | 50% |
| Python | 100トークン | 78トークン | 22% |
よくある質問(FAQ)
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の最大の利点です。
まとめ
- BPEは頻出ペアの反復マージで語彙を構築するサブワード分割アルゴリズム
- GPT-4、Llama 3、Qwen3など主要LLMの大半で採用
- バイトレベルBPEにより未知文字問題を完全解消
- tiktokenのRust実装で高速エンコードを実現
- 語彙サイズ拡張(32K→128K)で多言語圧縮率が大幅改善