BPE(バイトペア符号化)(ビーピーイー)
Byte Pair Encoding(BPE)は、テキスト圧縮アルゴリズムを応用したサブワード分割手法で、コーパス中の最頻出バイグラムを反復的にマージして語彙を構築する。GPT-4o・Llama 3・Mistralなど2026年の主要LLMで最も広く採用されているトークナイザーアルゴリズムである。
BPE(バイトペア符号化)とは
BPE(Byte Pair Encoding、バイトペア符号化)は、1994年にPhilip Gageがデータ圧縮アルゴリズムとして提案し、2016年にSennrichらがニューラル機械翻訳のサブワード分割に応用した手法である。GPT-4o(o200k_base、200,019語彙)、Llama 3(128,256語彙)、Mistral Large(32,768語彙)など、2026年現在の主要LLMのトークナイザーとして最も広く採用されている。
概要
BPEは「最も頻出する隣接トークンペアを1つの新トークンにマージする」操作を目標語彙サイズに達するまで反復するアルゴリズムである。初期状態では各文字(またはバイト)が1つのトークンとなり、マージ操作によって徐々に長いサブワード単位が語彙に追加される。
学習の具体例として、「low lower lowest」というコーパスからBPE語彙を構築する場合:
- 初期語彙:
{l, o, w, e, r, s, t, _} - 最頻出ペア
l + o→loを追加(出現3回) - 最頻出ペア
lo + w→lowを追加(出現3回) - 最頻出ペア
e + r→erを追加(出現1回) - 最頻出ペア
e + s→esを追加(出現1回) - 以降、目標語彙サイズまで継続
バイトレベルBPEとCharレベルBPEの違い
| 項目 | CharレベルBPE | バイトレベルBPE |
|---|---|---|
| 初期語彙 | Unicode文字(数万種類) | UTF-8バイト値(256種類) |
| 未知文字 | [UNK] トークンに置換 | バイト分解で必ず表現可能 |
| 代表モデル | 初期BPE研究 | GPT-2以降の全GPT系 |
| 多言語対応 | 語彙に含まれない文字は処理不可 | 任意のUnicode文字を処理可能 |
| 語彙効率 | 高い(文字単位) | やや低い(バイト単位で冗長) |
GPT-2で導入されたバイトレベルBPEは、UTF-8の全256バイト値を初期語彙とすることで、あらゆるUnicode文字列を[UNK]なしで表現可能にした。この設計はGPT-3、GPT-4、GPT-4oに引き継がれ、LLMトークナイザーの事実上の標準となっている。
BPEの学習アルゴリズム
BPEトークナイザーの学習は以下の手順で実行される:
- コーパス準備: 数TB規模のテキストデータを収集(GPT-4oでは推定13兆トークン規模の学習データ)
- 初期語彙構築: UTF-8の256バイト値 + 特殊トークンで初期語彙を構成
- 頻度カウント: コーパス全体で隣接トークンペアの出現頻度を集計
- マージ実行: 最頻出ペアを新トークンとして語彙に追加し、コーパス内の該当箇所を置換
- 反復: 手順3-4を目標語彙サイズ(例:GPT-4oなら200,019回)まで反復
- マージルール保存: 学習されたマージルールを順序付きリストとして保存
学習の計算量はO(N × V)(N=コーパスサイズ、V=目標語彙サイズ)で、GPT-4oクラスの200K語彙を数TBのコーパスから学習するには数百GPU時間を要する。
BPEの推論時トークン分割
学習済みBPEトークナイザーによるトークン分割は以下の手順で実行される:
- プリトークナイズ: 正規表現パターンでテキストを単語・数字・記号チャンクに分割
- 初期分割: 各チャンクをバイト(または文字)単位に分解
- マージルール適用: 学習時に記録されたマージルールを優先度順(学習順)に適用
- トークンID変換: 最終的なサブワード列を語彙テーブルでIDに変換
例として、「tokenization」のBPEトークン分割:
- 初期:
t o k e n i z a t i o n - マージ1:
to k e n i z a t i o n - マージ2:
tok en i z at i on - マージ3:
token iz ation - 最終:
token ization(2トークン)
主要モデルのBPE実装比較
| モデル | 実装 | 語彙サイズ | 正規表現前分割 | バイトフォールバック | 学習コーパス規模 |
|---|---|---|---|---|---|
| GPT-4o | tiktoken (Rust) | 200,019 | あり | あり | 推定13兆トークン |
| Llama 3 | tiktoken互換 | 128,256 | あり | あり | 15兆トークン |
| Mistral Large | SentencePiece BPE | 32,768 | なし(▁方式) | あり | 非公開 |
| Falcon 2 | HuggingFace BPE | 65,024 | あり | あり | 5.5兆トークン |
| Phi-3 | tiktoken | 32,064 | あり | あり | 3.3兆トークン |
よくある質問(FAQ)
Q1: BPEとUnigram LMはどちらが優れていますか? A: 用途によります。BPEは決定的な分割を行い実装が高速なため、GPT-4oやLlama 3など推論速度重視の大規模LLMで主流です。Unigram LMは確率的に複数の分割候補から最尤選択するため多言語性能に優れ、Gemma 2やT5で採用されています。2026年時点ではBPEが市場シェアで圧倒的です。
Q2: BPEの語彙サイズを増やすとモデル性能は上がりますか? A: 一般的にはトークン効率が向上し、同じテキストをより短いシーケンスで表現できるため推論コストが下がります。GPT-4oはcl100k_base(100K語彙)からo200k_base(200K語彙)に拡大し、平均15%のトークン数削減を達成しました。ただし語彙拡大は埋め込み層のパラメータ増加(200K × 隠れ次元)を伴うため、モデルサイズとのバランスが重要です。
Q3: tiktokenとHuggingFaceのBPE実装の違いは何ですか? A: tiktokenはOpenAIがRustで実装した高速BPEライブラリで、正規表現による前分割とバイトレベルBPEを組み合わせています。HuggingFace Tokenizersも同様にRust実装ですが、BPE・WordPiece・Unigram LMなど複数アルゴリズムをサポートする汎用ライブラリです。速度面ではtiktokenがやや高速(約1.5倍)ですが、HuggingFaceの方がカスタマイズ性に優れます。
まとめ
- BPEは最頻出バイグラムを反復マージするサブワード分割手法で、2026年のLLMトークナイザーの事実上の標準
- バイトレベルBPE(GPT-2以降)により任意のUnicode文字を[UNK]なしで処理可能
- GPT-4oのo200k_base(200K語彙)、Llama 3(128K語彙)など大規模語彙化が進行中
- tiktoken(Rust実装)による高速化と正規表現前分割の組み合わせが主流実装パターン
- 語彙サイズの拡大はトークン効率向上と埋め込み層パラメータ増加のトレードオフ