

SentencePiece Unigramの語彙サイズ、目安と実例を確認した
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
SentencePieceのUnigramモデルを使うとき、語彙サイズ(--vocab_size)をいくつにすればいいかは毎回悩む。結論から言うと「データセット規模・言語の複雑さ・モデルの目的・計算リソース」で決まるという一般論自体は正しい。ただ数値感がないと使いにくいので、実際の研究事例を並べてみた。
Unigramモデルの仕組み(前提)
BPEと逆方向なのがポイント。BPEは小さい語彙からマージして目標サイズまで増やしていくが、Unigramは大きめのseed vocabularyから始めて、EM(期待値最大化)アルゴリズムで尤度への寄与が低いトークンを間引きながら目標サイズまで減らしていく。
flowchart LR
A[大きめのseed vocabularyを生成] --> B[EMで各トークンの確率を推定]
B --> C[尤度への寄与が低いトークンを削除]
C --> D{目標の語彙サイズに到達?}
D -- No --> B
D -- Yes --> E[学習済みUnigramモデル]
この方式だと、語彙サイズを大きくしたい場合は元のコーパスの語彙多様性がボトルネックになる。コーパスが小さい・単調だと、目標サイズを大きく設定しても実質的に意味のあるサブワードが出てこない。
実際の数値感
- 小規模言語モデル(BabyLM系)のUnigram学習では、40kの語彙サイズがBLiMPでの単体性能が最も良かったという報告がある。
- PEGASUSの実験では、Unigramの語彙サイズを32kから256kまで振って比較していて、データセットごとに最適値が違う。ニュース系だとBPEと大差ないが、WikiHowやReddit TIFUのような非ニュース系だとUnigramの方が良く、最終的にPEGASUS-LARGEでは96kを採用している。
- 1Bパラメータ規模の多言語モデルXmodel-1.5では、65,280トークンの語彙サイズを採用。性能と効率のバランスを取った選択とされている。
- 語彙サイズの効果を直接検証した研究では、英語・日本語それぞれで5k, 10k, 50k, 100k, 500kを比較していて、大きい語彙の方が性能が上がるという結果も出ている(そのままのタイトルの論文もあるくらい)。
まとめると
- 数千〜数万:小規模・特定ドメイン向け
- 数万〜10万前後:中規模〜大規模の単一言語モデル
- 10万〜数十万:大規模多言語モデル
という大枠は妥当。ただし「コーパスの多様性が語彙サイズの上限を決める」という制約は意外と見落としがちなので、目標サイズを決める前にコーパスの実際の語彙量(unique subword候補数)を確認しておいた方がいい。最終的には複数サイズで学習して、下流タスクで評価するのが一番確実。実機での比較は未検証。