AI・機械学習
上級

SentencePieceトレーナー(センテンスピーストレーナー)

SentencePieceの語彙学習エンジンで、BPEまたはUnigramアルゴリズムを使用して生テキストコーパスからカスタムトークナイザーモデルを構築する。語彙サイズ・文字カバレッジ・正規化ルール等の詳細なパラメータ制御が可能。

0 回閲覧
0 いいね

SentencePieceトレーナーとは

SentencePieceトレーナーは、SentencePieceライブラリに内蔵された語彙学習エンジンである。生のテキストコーパスを入力として受け取り、BPEまたはUnigramアルゴリズムに基づくサブワード語彙を自動的に構築する。出力は.model(バイナリモデル)と.vocab(テキスト語彙リスト)の2ファイルで、これらをSentencePieceProcessorに読み込ませることでトークン化が実行可能になる。

基本的な使い方

コマンドライン

spm_train \
  --input=corpus.txt \
  --model_prefix=my_sp \
  --vocab_size=32000 \
  --model_type=unigram \
  --character_coverage=0.9995 \
  --num_threads=16 \
  --input_sentence_size=10000000 \
  --shuffle_input_sentence=true

Python API

import sentencepiece as spm

spm.SentencePieceTrainer.train(
    input='corpus.txt',
    model_prefix='my_sp',
    vocab_size=32000,
    model_type='unigram',
    character_coverage=0.9995,
    num_threads=16,
    input_sentence_size=10000000,
    shuffle_input_sentence=True,
    normalization_rule_name='nfkc',
    byte_fallback=True,
    split_digits=True,
    allow_whitespace_only_pieces=True,
    remove_extra_whitespaces=False,
    max_sentencepiece_length=16,
    add_dummy_prefix=True,
    unk_id=0,
    bos_id=1,
    eos_id=2,
    pad_id=-1,
    user_defined_symbols=['<mask>', '<sep>'],
)

主要パラメータ一覧

パラメータデフォルト推奨範囲説明
vocab_size8,00016,000〜256,000目標語彙サイズ
model_typeunigramunigram/bpe/char/wordトークン化アルゴリズム
character_coverage0.99950.995〜1.0文字カバレッジ率
num_threads16CPUコア数並列処理スレッド数
input_sentence_size0 (全件)1M〜50M学習に使う最大文数
max_sentencepiece_length168〜321トークンの最大文字数
byte_fallbackfalsetrue推奨UNK回避のバイトフォールバック
split_digitsfalsetrue推奨数字を1桁ずつ分割
normalization_rule_namenfkcnfkc/nmt_nfkc/identityUnicode正規化ルール
add_dummy_prefixtruetrue文頭に「▁」を追加
treat_whitespace_as_suffixfalsefalse/true空白を接尾辞として扱う
shrinking_factor0.750.5〜0.9Unigram語彙削減率

特殊トークンの制御

SentencePieceトレーナーでは以下の特殊トークンをカスタマイズできる:

トークンデフォルトID用途カスタマイズ例
<unk>0未知語変更不推奨
<s>1文頭(BOS)bos_id=1
</s>2文末(EOS)eos_id=2
<pad>-1 (無効)パディングpad_id=3
ユーザー定義-マスク等user_defined_symbols=['<mask>']

LLaMA系モデルではbos_id=1, eos_id=2, pad_id=-1が標準で、T5系ではeos_id=1, pad_id=0が使われる。

コーパス準備のベストプラクティス

データ形式

入力は1行1文のプレーンテキスト(UTF-8):

自然言語処理の基礎を学ぶ
深層学習モデルのファインチューニング手法
トランスフォーマーアーキテクチャの最新動向

データ量の目安

モデル規模推奨コーパスサイズ学習時間(16スレッド)
小規模(1B以下)100MB〜1GB10分〜1時間
中規模(1B〜10B)1GB〜10GB1〜6時間
大規模(10B以上)10GB〜100GB6〜48時間

多言語コーパスの調整

多言語トークナイザーでは、各言語のサンプリング比率が語彙バランスに直結する。一般的にはtemperature samplingが推奨される:

# 各言語のコーパスサイズに応じたサンプリング
# P(lang) ∝ size(lang)^α  where α = 0.3〜0.7
# α=1.0: サイズ比例, α=0.0: 均等, α=0.3: 低リソース言語を優遇

出力ファイルの構造

.modelファイル

Protocol Buffersでシリアライズされたバイナリファイル。以下の情報を含む:

  • マージルール(BPE)またはUnigramスコア
  • Unicode正規化ルール
  • 特殊トークン定義
  • トレーニングパラメータのメタデータ

.vocabファイル

タブ区切りのテキストファイルで、各行がサブワードとそのログ確率を含む:

▁the	-2.345
▁a	-3.456
▁is	-3.789
▁機械	-8.901
学習	-9.012

よくある質問(FAQ)

Q1: 学習中にメモリ不足になる場合はどうすればよいですか?

A: input_sentence_sizeを1,000,000〜10,000,000に制限し、shuffle_input_sentence=Trueでランダムサンプリングする。またseed_sentencepiece_size(Unigramの場合)を小さくすることでメモリ使用量を削減できる。

Q2: 既存のSentencePieceモデルに語彙を追加できますか?

A: 直接的な語彙追加は不可能である。HuggingFaceのTokenizersライブラリのAddedToken機能を使えば推論時に特殊トークンを追加できるが、サブワード自体の追加には再学習が必要。LLaMA系のファインチューニング時にはuser_defined_symbolsで予約トークンを確保しておくのが一般的。

Q3: model_typeにcharやwordを指定する用途はありますか?

A: charは文字レベルモデルの実験用、wordは空白分割による単語レベルトークン化用である。実用LLMではunigramまたはbpeのみを使用する。wordは語彙爆発するため大規模コーパスには不適切である。

Q4: normalization_rule_nameの選択基準は?

A: nfkcが最も一般的で、全角英数を半角に統一する等の正規化を行う。nmt_nfkcはさらにアクセント記号の除去等を含む。identityは正規化なしで、元テキストを完全保存したい場合に使用する。LLaMAではidentityが使われている。

まとめ

  • SentencePieceトレーナーは生テキストからカスタムトークナイザーを構築するエンジン
  • BPEとUnigramの2アルゴリズムを選択可能
  • 40以上のパラメータで語彙構築を細かく制御できる
  • byte_fallbackとsplit_digitsは現代のLLM用途では必須設定
  • 多言語モデルではtemperature samplingによるコーパスバランス調整が重要
  • 出力は.model(バイナリ)と.vocab(テキスト)の2ファイル