AI・機械学習
中級

BPEトークナイザー(ビーピーイートークナイザー)

Byte Pair Encoding(BPE)に基づくサブワード分割アルゴリズム。テキストを文字単位から出発し、出現頻度の高い隣接ペアを繰り返しマージして語彙を構築する。GPT系列・LLaMA・Mistralなど主要LLMの標準トークナイザー方式。

0 回閲覧
0 いいね

BPEトークナイザーとは

BPE(Byte Pair Encoding)トークナイザーは、テキストをサブワード単位に分割するためのアルゴリズムで、現代の大規模言語モデル(LLM)において最も広く採用されているトークナイゼーション方式である。元々はデータ圧縮アルゴリズムとして1994年にPhilip Gageが提案し、2016年にSennrichらが機械翻訳のサブワード分割に応用したことで自然言語処理の標準技術となった。

アルゴリズムの動作原理

BPEの語彙構築(学習フェーズ)は以下のステップで進行する。

ステップ処理内容例
1. 初期化テキストを文字(またはバイト)単位に分解"lower" → [l, o, w, e, r]
2. 頻度カウント全隣接ペアの出現頻度を集計(l,o)=5, (o,w)=3, (e,r)=8 ...
3. マージ最頻ペアを1トークンに統合(e,r) → "er"
4. 反復目標語彙サイズに達するまで2-3を繰り返す"er"+"s" → "ers" ...
5. 完了マージルール(merge table)を保存32,000〜128,000トークンが標準

推論時(エンコードフェーズ)は、学習済みのマージルールを優先順位順に適用し、入力テキストをトークン列に変換する。

Byte-level BPE(GPT系の拡張)

GPT-2以降のOpenAIモデルは、文字レベルではなくバイトレベルのBPEを採用している。

  • 従来のBPE: Unicode文字を基本単位とするため、未知文字(絵文字・特殊記号)でOOV(語彙外)が発生する
  • Byte-level BPE: UTF-8バイト(256種類)を基本単位とし、全ての入力を表現可能。OOVが原理的に発生しない
  • 実装: GPT-2/3/4のtiktokenライブラリ、LLaMA/Mistralのsentencepiece BPEモードが代表的

Byte-level BPEの利点は多言語対応の容易さで、日本語・中国語・アラビア語なども追加学習なしで扱える。

主要LLMでのBPE採用状況

モデルトークナイザー語彙サイズ実装ライブラリ
GPT-4 / GPT-4oByte-level BPE約100,000tiktoken (cl100k_base)
GPT-3.5Byte-level BPE約100,000tiktoken (cl100k_base)
LLaMA 2BPE (SentencePiece)32,000sentencepiece
LLaMA 3Byte-level BPE128,256tiktoken互換
Mistral 7BBPE (SentencePiece)32,000sentencepiece
Gemma 2BPE (SentencePiece)256,000sentencepiece
Claude 3/4Byte-level BPE非公開独自実装

語彙サイズのトレンドは拡大傾向にあり、LLaMA 2の32,000からLLaMA 3では128,256、Gemmaでは256,000と大幅に増加している。語彙拡大はトークン効率(同じテキストをより少ないトークンで表現)を向上させるが、embedding層のパラメータ数が増加するトレードオフがある。

BPEの長所と短所

長所

  • 高いカバレッジ: サブワード分割により、未知語をゼロにできる(特にByte-level BPE)
  • 言語非依存: 学習データさえあれば、あらゆる言語・スクリプトに対応
  • 効率的な圧縮: 頻出語は1トークン、稀少語は複数トークンに分割され、情報理論的に効率的
  • 実装の単純さ: マージテーブルのルックアップで高速にエンコード可能

短所

  • 形態素境界との不一致: 言語学的な形態素とBPEのサブワード境界が一致しないことがある(例: "unhappy" → ["un", "hap", "py"] ではなく ["unh", "appy"] になる可能性)
  • 貪欲法の限界: 各マージステップで局所最適を選ぶため、大域的に最適な語彙にならない場合がある
  • 日本語の課題: バイト単位では1文字が3バイトに分割され、トークン効率が英語より低下する

tiktokenとsentencepieceの比較

BPEの2大実装ライブラリの特性を比較する。

項目tiktokensentencepiece
開発元OpenAIGoogle
主な採用モデルGPT系列LLaMA, Mistral, T5
BPEバリアントByte-level BPEBPE / Unigram 選択可
エンコード速度非常に高速(Rust実装)高速(C++実装)
学習機能なし(事前学習済みのみ)あり(カスタム語彙構築可)
ライセンスMITApache 2.0

FAQ

Q1: BPEの語彙サイズはどのように決めるのですか?

語彙サイズはハイパーパラメーターとして事前に設定します。一般的に32,000〜256,000の範囲で、モデルの用途と対象言語に応じて調整します。語彙を大きくするとトークン効率(テキスト圧縮率)が向上しますが、embedding層のメモリ消費が増加します。LLaMA 3が128,256に拡大した主な理由は多言語対応の改善です。

Q2: 日本語テキストのトークン効率はどの程度ですか?

日本語はByte-level BPEで1文字あたり平均1.5-3トークンを消費し、英語の1文字≒0.25トークンと比べて効率が3-6倍低くなります。これは日本語のUTF-8エンコードが1文字3バイトであることに起因します。日本語に最適化されたモデル(例: Rinna、ELYZA)は日本語テキストを多く含む学習データでBPEを訓練し、「東京」「です」などの頻出語を1トークンに圧縮しています。

Q3: BPEとWordPieceの違いは何ですか?

BPEは隣接ペアの出現頻度でマージを決定しますが、WordPiece(BERT採用)は尤度最大化(言語モデルの確率が最も上がるペア)でマージを選択します。実用上の差は小さいですが、WordPieceの方が理論的により最適な分割を見つけやすいとされています。一方でBPEの方が実装が単純で高速なため、GPT系列やLLaMA系列ではBPEが選ばれています。