AI・機械学習
中級

SentencePiece(センテンスピース)

Googleが開発したオープンソースの言語非依存トークナイザーライブラリ。事前のトークン化(空白分割等)を必要とせず、生のテキストから直接サブワードモデルを学習できる。BPEとUnigramの両アルゴリズムをサポートし、LLaMA・T5・Mistralなど多数のLLMで採用。

0 回閲覧
0 いいね

SentencePieceとは

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を完全に排除できる。

主要LLMでの採用状況

モデルSPモード語彙サイズbyte_fallback
T5 / mT5Unigram32,000 / 250,000なし
LLaMA 2BPE32,000あり
Mistral 7BBPE32,000あり
Gemma / Gemma 2BPE256,000あり
NLLB-200BPE256,206あり
PaLM / PaLM 2Unigram256,000あり

LLaMA 3以降はSentencePieceからtiktoken互換の独自BPE実装に移行しており、これは推論速度の最適化が主な理由とされている。

SentencePieceの実装アーキテクチャ

SentencePieceは以下のコンポーネントで構成される。

  • Trainer: 生テキストからサブワードモデルを学習し、.modelファイルと.vocabファイルを出力
  • Encoder(SentencePieceProcessor): 学習済みモデルを読み込み、テキストをトークンID列に変換
  • Decoder: トークンID列を元のテキストに可逆的に復元
  • Normalizer: Unicode正規化(NFKC等)を内蔵し、前処理を統合

C++で実装されたコアライブラリに対し、Python/Java/Go等のバインディングが提供されている。

FAQ

Q1: SentencePieceとtiktokenはどちらを使うべきですか?

既存のLLMを利用するだけなら、そのモデルが採用しているライブラリを使います。カスタムモデルを学習する場合、SentencePieceが推奨です。理由は、SentencePieceが語彙の学習機能を備えているのに対し、tiktokenは事前学習済みの語彙でのエンコードのみをサポートするためです。多言語モデルの語彙構築にはSentencePieceのcharacter_coverageパラメーターが特に有用です。

Q2: SentencePieceモデルの学習にはどのくらいの時間がかかりますか?

語彙サイズ32,000、入力1,000万文の場合、標準的なサーバーCPUで1-3時間程度です。語彙サイズを256,000に拡大すると10-20時間かかることがあります。GPUは使用されず、CPU性能とメモリ容量が律速要因です。学習データのサイズは10GB-100GB程度が推奨されます。

Q3: 日本語モデルでSentencePieceを使う際の注意点は?

character_coverageを0.9995程度に設定し、byte_fallbackをtrueにすることで、漢字・ひらがな・カタカナ・絵文字を含む全文字をカバーできます。日本語固有の注意点として、同じ文字の全角/半角バリアント(例: A/A)やUnicode正規化(NFC/NFD)の設定が分割結果に影響するため、学習時と推論時で同一の正規化設定を使うことが重要です。