SentencePiece Unigramの語彙サイズ、目安と実例を確認した

  • NLP
  • SentencePiece
  • Tokenizer

この記事は、構成と文章の整理に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候補数)を確認しておいた方がいい。最終的には複数サイズで学習して、下流タスクで評価するのが一番確実。実機での比較は未検証。