SentencePieceのvocab_sizeエラー、原因は学習データの語彙不足

  • SentencePiece
  • transformers
  • Tokenizer
  • Python

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

数値データでSentencePieceを学習しようとしたらvocab_sizeエラーで落ちた。原因は指定した語彙数が学習データから作れる語彙数を上回っていたこと。

何が起きたか

SentencePieceTrainer.Train('--input=example-data.txt --model_prefix=example-models/example-sentencepiece --character_coverage=0.9995 --vocab_size=32000 --pad_id=3 --add_dummy_prefix=False')

これを実行したら以下のエラー。

RuntimeError: Internal: src/trainer_interface.cc(662) [(trainer_spec_.vocab_size()) == (model_proto->pieces_size())] Vocabulary size too high (32000). Please set it to a value <= 156.

vocab_sizeに32000を指定したけど、学習データから作れる語彙(piece)は156個しかない、というエラー。学習データが数値のみ(0-9とスペースくらい)なので、そもそも語彙のバリエーションが少ない。テキストコーパスを前提にしたvocab_size=32000のような値は数値データには過大だった。


補足として、この一連の作業ではLineByLineTextDatasetも使っていたが、この時点ですでに非推奨だった。transformersのFutureWarningでも、代わりにdatasetsライブラリを使う方法に切り替えるよう案内されている。非推奨化自体はv4.18の時点で入っていたので、2023年12月時点でもすでに1年以上前から非推奨状態だった。