BPE (バイトペアエンコーディング)
テキストを頻出するバイト (文字) の組み合わせに基づいてサブワード単位に分割するアルゴリズム。GPT や BERT などの大規模言語モデルのトークナイザーとして広く採用されている。
BPE (Byte Pair Encoding、バイトペアエンコーディング) は、もともと 1994 年にフィリップ・ゲージがデータ圧縮アルゴリズムとして提案した手法です。2016 年にセネリッヒらが機械翻訳のサブワード分割に応用して以降、自然言語処理の標準的なトークン化手法となりました。GPT シリーズ、BERT、LLaMA など、現在の主要な大規模言語モデルのほとんどが BPE またはその派生手法を採用しています。
BPE の学習アルゴリズムは直感的です。まず、訓練テキストを文字 (またはバイト) 単位に分割します。次に、最も頻繁に隣接するペアを見つけ、そのペアを 1 つの新しいトークンとして統合します。この統合を語彙サイズが目標に達するまで繰り返します。たとえば「low」「lower」「lowest」というテキストから、「l」+「o」→「lo」、「lo」+「w」→「low」のように頻出ペアが順次統合されます。
BPE の強みは、未知語 (out-of-vocabulary) の問題を解決することです。単語単位のトークン化では、訓練データに含まれない単語を処理できません。BPE はどんな単語もサブワードの組み合わせで表現できるため、未知語が発生しません。「unhappiness」は「un」+「happiness」や「un」+「happ」+「iness」のように分割され、各サブワードは語彙に含まれています。
日本語の BPE トークン化には特有の課題があります。日本語はスペースで単語が区切られないため、事前に形態素解析で単語分割してから BPE を適用する方法と、文字レベルから直接 BPE を学習する方法があります。GPT-4 のトークナイザー (cl100k_base) は後者のアプローチで、日本語の漢字 1 文字が 1 トークンになることもあれば、ひらがなの連続が 1 トークンにまとまることもあります。
トークン数と文字数の関係は言語によって大きく異なります。英語では平均 1 トークン ≈ 4 文字ですが、日本語では 1 トークン ≈ 1〜2 文字です。つまり、同じ内容を伝えるテキストでも、日本語は英語の 2〜3 倍のトークンを消費します。GPT-4 の 128,000 トークン制限は、英語なら約 50 万文字ですが、日本語では約 15〜20 万文字に相当します。
文字数カウントの観点では、AI 時代において「文字数」と「トークン数」の両方を意識する必要があります。ChatGPT のプロンプト設計では、文字数よりトークン数が制約になります。同じ意味を少ないトークンで表現するには、冗長な表現を避け、情報密度の高い文章を書くことが重要です。BPE の仕組みを理解すれば、どのような表現がトークン効率が良いかを推測できます。