AI・機械学習
中級

SentencePiece(センテンスピース)

Googleが開発したオープンソースのサブワードトークナイザーライブラリで、言語非依存の前処理不要なテキスト分割を実現し、LLaMA・T5・ALBERT等の主要LLMで広く採用されている。

0 回閲覧
0 いいね

SentencePieceとは

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はこの問題を根本的に解決するため、以下の設計原則を採用している:

  • 空白もトークンの一部として扱う:空白文字を特殊記号「▁」(U+2581)に置換し、テキスト全体を一つの連続した文字列として処理する
  • Unicode正規化の統合:NFKC正規化をトレーニングパイプラインに組み込み、表記揺れを自動的に統一する
  • 可逆変換の保証:トークン列から元テキストを完全に復元できるロスレス変換を実現する
  • C++実装による高速処理:コア部分をC++で実装し、Python/Javaバインディングを提供する

主要アルゴリズム比較

項目SentencePiece BPESentencePiece UnigramWordPiece (BERT)tiktoken (GPT)
開発元GoogleGoogleGoogleOpenAI
前処理不要不要空白分割必須正規表現分割
アルゴリズムボトムアップ結合トップダウン削減ボトムアップ結合BPE変種
語彙サイズ目安32,000〜128,00032,000〜128,00030,522100,256
多言語対応◎◎△○
採用モデル例LLaMA 2/3, MistralT5, ALBERT, XLNetBERT, DistilBERTGPT-4, GPT-4o
学習速度中速高速--
圧縮率高い最も高い中程度高い

採用モデルと語彙サイズ一覧

SentencePieceを採用している主要LLMとその語彙設定を以下に示す:

モデルリリース年語彙サイズアルゴリズム備考
T5 / Flan-T52019/202232,000UnigrammC4コーパスで学習
ALBERT201930,000Unigram語彙共有で軽量化
XLNet201932,000UnigramTransformer-XL基盤
mBART2020250,000Unigram25言語対応
LLaMA / LLaMA 2202332,000BPEMeta開発、英語中心
LLaMA 32024128,256BPEtiktoken互換に拡張
Mistral 7B202332,000BPELLaMA互換語彙
Gemma / Gemma 22024256,128UnigramGoogle最新モデル

インストールと基本的な使い方

インストール

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)
# '自然言語処理は急速に進歩している'

HuggingFace Transformersとの統合

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ベースのトークナイザーが自動的にロードされる。

よくある質問(FAQ)

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トークンになるリスクがあるが、語彙の効率は向上する。

まとめ

  • SentencePieceはGoogleが開発した言語非依存のサブワードトークナイザー
  • BPEとUnigramの2つのアルゴリズムをサポート
  • 前処理不要で生のUnicodeテキストを直接処理可能
  • LLaMA、T5、Gemma、Mistral等の主要LLMで広く採用
  • 空白を「▁」記号として扱い、可逆変換を保証
  • HuggingFace Transformersとシームレスに統合可能