sentencepiece について
SentencePieceは、言語固有の前処理なしで生テキストを扱う教師なしトークナイザーです。多言語やCJKのモデル開発に向き、サブワードモデルの学習やサンプリングにも対応します。
主な機能
- 01生テキストを直接処理
- 02BPEとUnigramに対応
- 03独自語彙の学習
- 04正則化向けトークン化サンプリング
- 05テキストのエンコードとデコード
活用シーン
- 01多言語モデル向けデータのトークン化
- 02中国語・日本語・韓国語の処理
- 03サンプリングによる学習データ拡張
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ orchestra-research/ ai-research-skills --skill sentencepieceインストール後、Claude Code で/sentencepieceを入力して読み込まれたか確認します。
同梱ファイルreferences/algorithms.mdreferences/training.md
詳細
SentencePiece - 言語非依存のトークナイゼーション
言語固有の前処理を必要とせず、生のテキストに対して動作する教師なしトークナイザーです。
SentencePiece を使うタイミング
SentencePiece を使うべき場合:
- 多言語モデルを構築するとき(言語固有のルールが不要)
- CJK 言語(中国語、日本語、韓国語)を扱うとき
- 再現可能なトークナイゼーションが必要なとき(決定的な語彙)
- 生のテキストから学習したいとき(事前トークナイゼーションが不要)
- 軽量なデプロイが必要なとき(メモリ 6MB、50k 文/秒)
パフォーマンス:
- 速度: 50,000 文/秒
- メモリ: 読み込み済みモデルで約 6MB
- 言語: すべて(言語非依存)
代わりに使うべき選択肢:
- HuggingFace Tokenizers: 学習が高速で、より柔軟
- tiktoken: OpenAI モデル(GPT-3.5/4)向け
- BERT WordPiece: 英語中心のタスク向け
クイックスタート
インストール
# Python
pip install sentencepiece
# C++ (requires CMake)
git clone https://github.com/google/sentencepiece.git
cd sentencepiece
mkdir build && cd build
cmake .. && make -j $(nproc)
sudo make install
モデルの学習
# Command-line (BPE with 8000 vocab)
spm_train --input=data.txt --model_prefix=m --vocab_size=8000 --model_type=bpe
# Python API
import sentencepiece as spm
spm.SentencePieceTrainer.train(
input='data.txt',
model_prefix='m',
vocab_size=8000,
model_type='bpe'
)
学習時間: 100MB のコーパスで約 1〜2 分
エンコードとデコード
import sentencepiece as spm
# Load model
sp = spm.SentencePieceProcessor(model_file='m.model')
# Encode to pieces
pieces = sp.encode('This is a test', out_type=str)
print(pieces) # ['▁This', '▁is', '▁a', '▁test']
# Encode to IDs
ids = sp.encode('This is a test', out_type=int)
print(ids) # [284, 47, 11, 1243]
# Decode
text = sp.decode(ids)
print(text) # "This is a test"
言語非依存の設計
空白を記号として扱う(▁)
text = "Hello world"
pieces = sp.encode(text, out_type=str)
print(pieces) # ['▁Hello', '▁world']
# Decode preserves spaces
decoded = sp.decode_pieces(pieces)
print(decoded) # "Hello world"
基本原則: テキストを生の Unicode として扱い、空白は ▁(メタ記号)で表します。
トークナイゼーションのアルゴリズム
BPE(Byte-Pair Encoding)
spm.SentencePieceTrainer.train(
input='data.txt',
model_prefix='bpe_model',
vocab_size=16000,
model_type='bpe'
)
使用モデル: mBART
Unigram(デフォルト)
spm.SentencePieceTrainer.train(
input='data.txt',
model_prefix='unigram_model',
vocab_size=8000,
model_type='unigram'
)
使用モデル: T5、ALBERT、XLNet
学習の設定
主要なパラメータ
spm.SentencePieceTrainer.train(
input='corpus.txt',
model_prefix='m',
vocab_size=32000,
model_type='unigram',
character_coverage=0.9995, # 1.0 for CJK
user_defined_symbols=['[SEP]', '[CLS]'],
unk_piece='<unk>',
num_threads=16
)
文字カバレッジ
| 言語タイプ | カバレッジ | 理由 |
|---|---|---|
| 英語 | 0.9995 | 最も一般的な文字 |
| CJK(中国語) | 1.0 | 必要なすべての文字 |
| 多言語 | 0.9995 | バランス |
エンコードのオプション
サブワード正則化
# Sample different tokenizations
for _ in range(3):
pieces = sp.encode('tokenization', out_type=str, enable_sampling=True, alpha=0.1)
print(pieces)
# Output (different each time):
# ['▁token', 'ization']
# ['▁tok', 'en', 'ization']
ユースケース: 頑健性のためのデータ拡張。
よくあるパターン
T5 形式の学習
spm.SentencePieceTrainer.train(
input='c4_corpus.txt',
model_prefix='t5',
vocab_size=32000,
model_type='unigram',
user_defined_symbols=[f'<extra_id_{i}>' for i in range(100)],
unk_id=2,
eos_id=1,
pad_id=0
)
transformers との統合
from transformers import T5Tokenizer
# T5 uses SentencePiece internally
tokenizer = T5Tokenizer.from_pretrained('t5-base')
inputs = tokenizer('translate English to French: Hello', return_tensors='pt')
パフォーマンスベンチマーク
学習速度
| コーパス | BPE (16k) | Unigram (8k) |
|---|---|---|
| 100 MB | 1〜2 分 | 3〜4 分 |
| 1 GB | 10〜15 分 | 30〜40 分 |
トークナイゼーション速度
- SentencePiece: 50,000 文/秒
- HF Tokenizers: 200,000 文/秒(4 倍高速)
対応モデル
T5 ファミリー: t5-base、t5-large(語彙 32k、Unigram)
ALBERT: albert-base-v2(語彙 30k、Unigram)
XLNet: xlnet-base-cased(語彙 32k、Unigram)
mBART: facebook/mbart-large-50(語彙 250k、BPE)
参考資料
リソース
- GitHub: https://github.com/google/sentencepiece ⭐ 10,000+
- 論文: https://arxiv.org/abs/1808.06226 (EMNLP 2018)
- バージョン: 0.2.0+
コメント
Markdown 対応