SentencePieceの語彙学習エンジンで、BPEまたはUnigramアルゴリズムを使用して生テキストコーパスからカスタムトークナイザーモデルを構築する。語彙サイズ・文字カバレッジ・正規化ルール等の詳細なパラメータ制御が可能。
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
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_size | 8,000 | 16,000〜256,000 | 目標語彙サイズ |
model_type |
| unigram |
| unigram/bpe/char/word |
| トークン化アルゴリズム |
character_coverage | 0.9995 | 0.995〜1.0 | 文字カバレッジ率 |
num_threads | 16 | CPUコア数 | 並列処理スレッド数 |
input_sentence_size | 0 (全件) | 1M〜50M | 学習に使う最大文数 |
max_sentencepiece_length | 16 | 8〜32 | 1トークンの最大文字数 |
byte_fallback | false | true推奨 | UNK回避のバイトフォールバック |
split_digits | false | true推奨 | 数字を1桁ずつ分割 |
normalization_rule_name | nfkc | nfkc/nmt_nfkc/identity | Unicode正規化ルール |
add_dummy_prefix | true | true | 文頭に「▁」を追加 |
treat_whitespace_as_suffix | false | false/true | 空白を接尾辞として扱う |
shrinking_factor | 0.75 | 0.5〜0.9 | Unigram語彙削減率 |
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〜1GB | 10分〜1時間 |
| 中規模(1B〜10B) | 1GB〜10GB | 1〜6時間 |
| 大規模(10B以上) | 10GB〜100GB | 6〜48時間 |
多言語トークナイザーでは、各言語のサンプリング比率が語彙バランスに直結する。一般的にはtemperature samplingが推奨される:
# 各言語のコーパスサイズに応じたサンプリング
# P(lang) ∝ size(lang)^α where α = 0.3〜0.7
# α=1.0: サイズ比例, α=0.0: 均等, α=0.3: 低リソース言語を優遇
Protocol Buffersでシリアライズされたバイナリファイル。以下の情報を含む:
タブ区切りのテキストファイルで、各行がサブワードとそのログ確率を含む:
▁the -2.345
▁a -3.456
▁is -3.789
▁機械 -8.901
学習 -9.012
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が使われている。