Googleが開発したオープンソースのサブワードトークナイザーライブラリで、言語非依存の前処理不要なテキスト分割を実現し、LLaMA・T5・ALBERT等の主要LLMで広く採用されている。
SentencePieceは、Googleが2018年にオープンソースとして公開したサブワードトークナイザーライブラリである。最大の特徴は**言語非依存(Language-independent)かつ前処理不要(Pre-tokenization free)**の設計で、生のUnicodeテキストを直接入力としてサブワード分割を学習・適用できる。BPE(Byte Pair Encoding)とUnigramの2つのアルゴリズムをサポートし、LLaMA、T5、ALBERT、XLNet、mBART、Mistral等の主要な大規模言語モデルで標準的に採用されている。
従来のトークナイザー(WordPiece等)は英語を前提とした空白分割(Pre-tokenization)を必要としていた。しかし日本語・中国語・タイ語のように単語間に空白を置かない言語では、形態素解析器(MeCab等)による前処理が必須となり、言語ごとに異なるパイプラインを構築する必要があった。
SentencePieceはこの問題を根本的に解決するため、以下の設計原則を採用している:
| 項目 | SentencePiece BPE | SentencePiece Unigram | WordPiece (BERT) | tiktoken (GPT) |
|---|---|---|---|---|
| 開発元 | OpenAI | |||
| 前処理 | 不要 | 不要 | 空白分割必須 | 正規表現分割 |
| アルゴリズム | ボトムアップ結合 | トップダウン削減 | ボトムアップ結合 | BPE変種 |
| 語彙サイズ目安 | 32,000〜128,000 | 32,000〜128,000 | 30,522 | 100,256 |
| 多言語対応 | ◎ | ◎ | △ | ○ |
| 採用モデル例 | LLaMA 2/3, Mistral | T5, ALBERT, XLNet | BERT, DistilBERT | GPT-4, GPT-4o |
| 学習速度 | 中速 | 高速 | - | - |
| 圧縮率 | 高い | 最も高い | 中程度 | 高い |
SentencePieceを採用している主要LLMとその語彙設定を以下に示す:
| モデル | リリース年 | 語彙サイズ | アルゴリズム | 備考 |
|---|---|---|---|---|
| T5 / Flan-T5 | 2019/2022 | 32,000 | Unigram | mC4コーパスで学習 |
| ALBERT | 2019 | 30,000 | Unigram | 語彙共有で軽量化 |
| XLNet | 2019 | 32,000 | Unigram | Transformer-XL基盤 |
| mBART | 2020 | 250,000 | Unigram | 25言語対応 |
| LLaMA / LLaMA 2 | 2023 | 32,000 | BPE | Meta開発、英語中心 |
| LLaMA 3 | 2024 | 128,256 | BPE | tiktoken互換に拡張 |
| Mistral 7B | 2023 | 32,000 | BPE | LLaMA互換語彙 |
| Gemma / Gemma 2 | 2024 | 256,128 | Unigram | Google最新モデル |
pip install sentencepiece
import sentencepiece as spm
spm.SentencePieceTrainer.train(
input='corpus.txt',
model_prefix='my_tokenizer',
vocab_size=32000,
model_type='unigram', # または 'bpe'
character_coverage=0.9995,
num_threads=16
)
sp = spm.SentencePieceProcessor()
sp.load('my_tokenizer.model')
text = '自然言語処理は急速に進歩している'
tokens = sp.encode(text, out_type=str)
# ['▁', '自然', '言語', '処理', 'は', '急速', 'に', '進歩', 'している']
ids = sp.encode(text, out_type=int)
# [1, 4523, 8901, 3456, 12, 7890, 45, 6789, 2345]
decoded = sp.decode(ids)
# '自然言語処理は急速に進歩している'
2026年現在、HuggingFace TransformersライブラリではSentencePieceProcessorをラップした以下のクラスが提供されている:
T5Tokenizer:T5 / Flan-T5用のUnigram SentencePieceトークナイザーLlamaTokenizer:LLaMA / Mistral用のBPE SentencePieceトークナイザーAlbertTokenizer:ALBERT用のUnigram SentencePieceトークナイザーXLNetTokenizer:XLNet用のUnigram SentencePieceトークナイザーAutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")のように呼び出すと、モデルに対応するSentencePieceベースのトークナイザーが自動的にロードされる。
Q1: SentencePieceとWordPieceの最大の違いは何ですか?
A: 最大の違いは前処理の要否である。WordPieceは入力テキストを事前に空白で分割する必要があるが、SentencePieceは生のUnicodeテキストをそのまま処理できる。これにより日本語・中国語・タイ語など空白を使わない言語でも統一的に処理可能となる。
Q2: BPEモードとUnigramモードはどちらを選ぶべきですか?
A: 一般的に、LLaMA系のデコーダーモデルにはBPE、T5系のエンコーダー・デコーダーモデルにはUnigramが使われる傾向がある。Unigramは確率的に最適な分割を選択するため圧縮率が高く、BPEは決定論的で再現性が高い。用途に応じて選択するのが推奨される。
Q3: SentencePieceの語彙サイズはどのように決めるべきですか?
A: 一般的な指針として、単一言語モデルでは32,000〜64,000、多言語モデルでは128,000〜256,000が推奨される。語彙サイズを増やすと1トークンあたりの情報量が増えて推論効率が向上するが、埋め込み層のパラメータ数も増加するためモデルサイズとのトレードオフとなる。LLaMA 3が128,256に拡張した例のように、2024年以降は大きめの語彙が主流になりつつある。
Q4: character_coverageパラメータの適切な値は?
A: 日本語・中国語などUnicode文字種が多い言語では0.9995、英語やヨーロッパ言語では1.0が推奨される。この値を下げると稀な文字がUNKトークンになるリスクがあるが、語彙の効率は向上する。