Googleが開発したオープンソースの言語非依存トークナイザーライブラリ。事前のトークン化(空白分割等)を必要とせず、生のテキストから直接サブワードモデルを学習できる。BPEとUnigramの両アルゴリズムをサポートし、LLaMA・T5・Mistralなど多数のLLMで採用。
SentencePiece(センテンスピース)は、2018年にGoogleの工藤拓氏とJohn Richardson氏が開発した、言語に依存しないテキストトークナイザーおよびデトークナイザーのライブラリである。従来のトークナイザーが前処理として空白分割や正規化を必要としたのに対し、SentencePieceは生のUnicodeテキストを直接入力として受け取り、サブワード単位に分割する。
SentencePieceの最も革新的な特徴は「空白を特別扱いしない」設計である。
| 従来アプローチ | SentencePieceアプローチ |
|---|---|
| 空白で単語分割→各単語をサブワード分割 | 空白を含めた全文字をフラットに扱う |
| 英語等の空白区切り言語に最適化 | 日本語・中国語等の非空白区切り言語にも対応 |
| 前処理パイプラインが言語依存 | 前処理が不要(end-to-end) |
| デトークナイズ時に空白復元が曖昧 | 可逆なデトークナイズが可能 |
空白文字はUnicode U+2581(▁、下線付きスペース)に置換され、通常の文字と同等に扱われる。これにより「I am a student」は「▁I▁am▁a▁student」として処理され、デトークナイズ時に元のテキストを完全に復元できる。
SentencePieceは2つのサブワード分割アルゴリズムを実装している。
| アルゴリズム | 動作原理 | 特徴 |
|---|---|---|
| BPE | ボトムアップ。最頻ペアを繰り返しマージ | 決定論的・実装が単純・GPT互換 |
| Unigram | トップダウン。尤度最大化で語彙を削減 | 確率的分割が可能・より柔軟 |
デフォルトはUnigram LMモデルだが、LLaMA系列などGPT互換を意識したモデルはBPEモードを選択している。
SentencePieceモデルの学習は以下のパラメーターで制御する。
| パラメーター | 説明 | 典型値 |
|---|---|---|
| vocab_size | 目標語彙サイズ | 32,000-256,000 |
| model_type | アルゴリズム選択 | bpe / unigram |
| character_coverage | 文字カバレッジ率 | 0.9995(多言語)/ 1.0(英語) |
| input_sentence_size | 学習に使う文数上限 | 1,000,000-10,000,000 |
| max_sentence_length | 最大文長(バイト) | 4,192 |
| byte_fallback | 未知文字のバイト分解 | true(推奨) |
character_coverageは重要なパラメーターで、0.9995に設定すると出現頻度が極めて低い文字(特殊記号・絵文字等)がUNK(未知トークン)に置換される。byte_fallbackを有効にすると、UNKの代わりにUTF-8バイト列に分解するため、OOVを完全に排除できる。
| モデル | SPモード | 語彙サイズ | byte_fallback |
|---|---|---|---|
| T5 / mT5 | Unigram | 32,000 / 250,000 | なし |
| LLaMA 2 | BPE | 32,000 | あり |
| Mistral 7B | BPE | 32,000 | あり |
| Gemma / Gemma 2 | BPE | 256,000 | あり |
| NLLB-200 | BPE | 256,206 | あり |
| PaLM / PaLM 2 | Unigram | 256,000 |
LLaMA 3以降はSentencePieceからtiktoken互換の独自BPE実装に移行しており、これは推論速度の最適化が主な理由とされている。
SentencePieceは以下のコンポーネントで構成される。
C++で実装されたコアライブラリに対し、Python/Java/Go等のバインディングが提供されている。
既存のLLMを利用するだけなら、そのモデルが採用しているライブラリを使います。カスタムモデルを学習する場合、SentencePieceが推奨です。理由は、SentencePieceが語彙の学習機能を備えているのに対し、tiktokenは事前学習済みの語彙でのエンコードのみをサポートするためです。多言語モデルの語彙構築にはSentencePieceのcharacter_coverageパラメーターが特に有用です。
語彙サイズ32,000、入力1,000万文の場合、標準的なサーバーCPUで1-3時間程度です。語彙サイズを256,000に拡大すると10-20時間かかることがあります。GPUは使用されず、CPU性能とメモリ容量が律速要因です。学習データのサイズは10GB-100GB程度が推奨されます。
character_coverageを0.9995程度に設定し、byte_fallbackをtrueにすることで、漢字・ひらがな・カタカナ・絵文字を含む全文字をカバーできます。日本語固有の注意点として、同じ文字の全角/半角バリアント(例: A/A)やUnicode正規化(NFC/NFD)の設定が分割結果に影響するため、学習時と推論時で同一の正規化設定を使うことが重要です。
| あり |