トークナイザのアルゴリズム:BPE・WordPiece・Unigram
語彙の決め方ひとつでトークン数も未知語耐性も変わる。BPE・WordPiece・Unigram の分割原理を比較し、なぜそのサブワードになるかを仕組みで理解できます。
- 1.サブワード分割は語彙を有限に保ちつつ未知語を回避する仕組み。BPE は頻度最大のペアを貪欲にマージ、WordPiece は尤度(相互情報量)が最大のペアをマージ、Unigram は大きな語彙から尤度寄与の小さい部分語を削っていく、と最適化の向きが異なる。
- 2.BPE/WordPiece は学習で固定したマージ規則を順に適用する決定的な分割。Unigram は各部分語に確率を持たせた言語モデルで、Viterbi 探索により全体の尤度が最大となる分割を選ぶ。同じ語彙サイズでも分割境界が変わる。
- 3.バイトレベル BPE は文字でなく256種のバイトを基本単位にすることで、絵文字や未知文字を含むあらゆる入力を未知語ゼロで表現する。語彙サイズは圧縮率と系列長のトレードオフを決める設計パラメータ。
なぜサブワードなのか:語彙爆発と未知語のジレンマ
トークナイザの設計は、二つの極端の間のトレードオフです。単語をそのまま語彙にすると、活用形・複合語・固有名詞で語彙が爆発し、学習時に見なかった語はすべて未知語(UNK)になります。逆に1文字ずつに分割すれば語彙は小さく未知語も消えますが、系列が極端に長くなり、意味のまとまりも失われます。
この中間を取るのがサブワード分割です。頻出語は1トークンのまま、稀な語は意味のある部分語(接頭辞・語幹・接尾辞など)に分解します。語彙サイズを数万程度に固定しつつ、未知語を「既知の部分語の組み合わせ」で必ず表現できる——これがサブワードの狙いです。トークン化の基礎 を前提に、ここでは語彙をどう学習するかのアルゴリズムを比較します。
BPE・WordPiece・Unigram はいずれも、本体モデルの学習とは別に、コーパスから語彙とマージ規則(または部分語確率)を先に決める前処理です。一度決めた語彙はモデルと固定でひも付き、推論時も同じ規則で分割します。語彙が変われば 埋め込み の行列も作り直しになるため、後から差し替えるのは容易ではありません。
BPE:頻度最大のペアを貪欲にマージする
バイトペア符号化(Byte Pair Encoding, BPE) は元はデータ圧縮の手法で、最も頻出する隣接ペアを新しい記号に置き換える操作を繰り返します。トークナイザではこれを文字列に適用します。
学習手順:
1. 全単語を文字列に分解(例 "low" → l o w </w>)
2. コーパス全体で隣接トークンのペア頻度を数える
3. 最頻のペア(例 "e","s")を1トークン "es" にマージし語彙へ追加
4. このマージを規則として記録
5. 目標語彙サイズに達するまで 2〜4 を繰り返す
ポイントは、選択基準が純粋な出現頻度であることです。最も多く隣り合うペアから順に結合していくため、th er ing のような高頻度の連なりが自然に1トークンになります。学習結果は順序付きのマージ規則のリストで、推論時はこの規則を学習時と同じ順序で適用するだけ——完全に決定的で高速です。
頻度ベースゆえの弱点もあります。頻度が高くても言語的にまとまりの薄いペアまで結合しうる点で、これを尤度基準で正そうとするのが次の WordPiece です。
WordPiece:尤度(相互情報量)が最大のペアをマージ
WordPiece は BPE と同じ「ペアをマージしていく」枠組みですが、マージ対象の選び方が違います。頻度そのものではなく、マージによって学習コーパスの尤度がどれだけ上がるかを基準にします。
ペア (a, b) を結合する価値は、おおむね次の比で測られます。
score(a, b) = freq(a, b) / ( freq(a) * freq(b) )
分子はペアの共起頻度、分母は各トークン単体の頻度の積です。これは相互情報量に対応し、「a と b が偶然以上に強く結びついているか」を表します。単に多いだけのペアより、単体ではあまり出ないのに一緒だとよく出るペアが優先されます。たとえば一般的すぎる文字同士は分母が大きくスコアが下がり、特徴的な語幹を作るペアが選ばれやすくなります。
| 観点 | BPE | WordPiece |
|---|---|---|
| マージ基準 | ペアの出現頻度が最大 | 尤度向上(相互情報量)が最大 |
| 選ばれやすいペア | とにかく高頻度の連なり | 単体は稀でも強く共起するペア |
| 学習結果 | 順序付きマージ規則リスト | 語彙(接頭辞 ## 付き) |
| 代表例 | GPT 系、RoBERTa(バイト版) | BERT、DistilBERT |
WordPiece の語彙では、単語の途中に続く部分語に ## などの接頭辞を付けて「語頭か継続か」を区別します(例 play + ##ing)。推論時の分割は最長一致が基本で、語頭から語彙に含まれる最長の部分語を貪欲に切り出していきます。BERT がこの方式を採用したことで広く普及しました。
Unigram:大きな語彙から尤度の低い部分語を削る
Unigram 言語モデル は、マージで語彙を育てるBPE/WordPiece とは逆向きに、大きな候補語彙から削るアプローチを取ります。発想の出発点が言語モデルである点が決定的に異なります。
各部分語 x に確率 p(x) を割り当て、ある分割 (x1, x2, ..., xk) の確率を各部分語確率の積とみなします。
P(分割) = p(x1) * p(x2) * ... * p(xk)
学習はおおむね次の通りです。
1. 文字や高頻度部分文字列から「過剰に大きい」初期語彙を作る
2. EM 法で各部分語の確率 p(x) を推定(現在の語彙で尤度最大化)
3. 各部分語について「それを消すとコーパス尤度がどれだけ下がるか」を計算
4. 尤度への寄与が小さい部分語を一定割合だけ語彙から除去
5. 目標語彙サイズに収束するまで 2〜4 を繰り返す
つまり Unigram は「この部分語が無くてもあまり困らない」ものから捨てていきます。残るのは全体の尤度を支える部分語です。SentencePiece の実装で広く使われ、多言語モデル(mBART、ALBERT、多くの T5 系)で採用されています。
確率的分割と Viterbi:Unigram の真価
Unigram の最大の特徴は、同じ単語に複数の分割があり得て、その中から尤度最大の分割を選べることです。語彙に un able unable able がすべて含まれていれば、unable を1トークンにも un+able にも分けられます。Unigram は各部分語の確率を持つので、
最適分割 = argmax_(分割) Σ log p(xi)
を Viterbi アルゴリズムで効率的に探索します。これは「どの境界で切れば対数確率の和が最大か」を動的計画法で解くもので、BPE/WordPiece の貪欲な最長一致と違い、単語全体を見渡して最適な切り方を決められます。
Unigram は確率を持つため、最尤分割だけでなく確率に応じてわざと別の分割をサンプリングできます。学習時に同じ語をいろいろな切り方で見せる「サブワード正則化」により、トークナイズのゆらぎに対する頑健性が上がります。BPE 側にも同種の効果を狙う BPE-dropout(マージをランダムに抜く)があります。決定的な WordPiece では得にくい性質です。
バイトレベル BPE:未知語を原理的にゼロにする
文字単位の BPE には穴があります。学習コーパスに無かった文字(珍しい絵文字、別言語の記号)は基本単位にすら存在せず、UNK になってしまいます。これを断つのがバイトレベル BPE です。
基本単位を「文字」ではなく UTF-8 のバイト(0〜255 の256種) にします。あらゆるテキストはバイト列で表現できるため、どんな文字・絵文字・制御記号が来ても、最悪でもバイト列に分解でき、未知語が原理的に発生しません。語彙の最小単位256種はすべて既知だからです。マージ規則はバイト列の上で BPE と同様に学習します。GPT-2 以降の GPT 系や RoBERTa が採用し、現在の大規模モデルの事実上の標準になっています。
未知語ゼロは無料ではありません。マルチバイト文字(日本語の1文字は UTF-8 で3バイトが多い)は、語彙にうまく登録されないと1文字が複数バイトトークンに分かれ、系列が長くなります。日本語など非ラテン言語で「文字数の割にトークン数が多い」のは主にこれが原因で、文脈長の消費と推論コストに直結します。多言語を扱う語彙は、対象言語のバイト列が適切にマージされるよう十分なコーパスで学習する必要があります。
語彙サイズという設計レバー
語彙サイズ V はトークナイザ最大の設計パラメータで、二つの量を相反させます。
| 語彙サイズ | 系列長(トークン数) | 副作用 |
|---|---|---|
| 小さい(数千) | 長くなる | 稀語が細かく割れ、文脈長を圧迫。埋め込み行列は小さい |
| 大きい(10万超) | 短くなる | 1語1トークン化が進むが、埋め込み・出力層が肥大し稀トークンの学習が薄い |
語彙を大きくすると平均トークン数が減り、同じ文を短い系列で表せます。これは文脈長の有効活用と推論の高速化につながります(KV キャッシュと推論最適化 で見た通り、系列長はコストに直結します)。一方で、語彙が大きいほど埋め込み行列と出力 softmax の幅が増え、稀にしか出ないトークンは学習データが薄く十分に学べません。近年は数万〜十数万が選ばれ、多言語対応では大きめに振る傾向があります。語彙サイズは スケーリング則 の文脈でも、パラメータ配分の一要素として最適化の対象になります。
まとめ:三手法をどう捉えるか
| 論点 | 実態 | そこから言えること |
|---|---|---|
| 最適化の向き | BPE/WordPiece は育てる、Unigram は削る | 語彙の到達点が異なり分割境界も変わる |
| 選択基準 | 頻度(BPE)/尤度・相互情報量(WordPiece)/全体尤度寄与(Unigram) | 稀でも結びつく部分語を残すかどうかが分かれる |
| 分割の決め方 | 貪欲な最長一致 vs Viterbi の大域最適 | Unigram は確率的分割・正則化が可能 |
| 未知語対策 | バイトレベル化で256種を基本単位に | あらゆる入力を UNK なしで表現できる |
実務では、ベースとなる事前学習モデルが採用したトークナイザをそのまま使うのが基本です。GPT 系ならバイトレベル BPE、BERT 系なら WordPiece、T5・多言語系なら SentencePiece(Unigram)といった具合に、モデルと語彙は不可分にひも付いています。新規にトークナイザを学習する場合は、対象言語の分布・目標語彙サイズ・系列長と推論コストのバランスを見て選びます。三手法の違いは「頻度で結ぶか、尤度で結ぶか、尤度で削るか」に集約され、その違いが最終的な分割の質と未知語耐性を決めます。
AI/機械学習 Article
トークナイザのアルゴリズム:BPE・WordPiece・Unigramを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
トークナイザ
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 6
導入後に効く点
BPE/WordPiece は学習で固定したマージ規則を順に適用する決定的な分割。Unigram は各部分語に確率を持たせた言語モデルで、Viterbi 探索により全体の尤度が最大となる分割を選ぶ。同じ語彙サイズでも分割境界が変わる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 6
判断チェックリスト
- 自社の用途が「トークナイザ / BPE」に近いか確認する。
- 強みである「サブワード分割は語彙を有限に保ちつつ未知語を回避する仕組み。BPE は頻度最大のペアを貪欲にマージ、WordPiece は尤度(相互情報量)が最大のペアをマージ、Unigram は大きな語彙から尤度寄与の小さい部分語を削っていく、と最適化の向きが異なる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。