sentencepiece について
sentencepieceは、言語ごとの前処理なしで生テキストを扱うトークナイザーです。多言語やCJK言語モデルの開発向けに、BPEとUnigramによる学習、エンコード、デコードを提供します。
主な機能
- 01生のUnicodeテキストを処理
- 02BPE・Unigramモデルの学習
- 03テキストのエンコードとデコード
- 04サブワード正則化サンプリング
- 05PythonとC++に対応
活用シーン
- 01多言語モデル用トークナイザーの学習
- 02CJKテキストのトークン化
- 03入力テキストのエンコードとデコード
- 04異なる分割で学習データを拡張
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill sentencepieceインストール後、Claude Code で/sentencepieceを入力して読み込まれたか確認します。
同梱ファイルreferences/algorithms.mdreferences/training.md
詳細
SentencePiece - 言語非依存のトークン化
言語固有の前処理を行わず、生のテキストを処理する教師なしトークナイザーです。
SentencePiece を使う場面
SentencePiece を使う場合:
- 多言語モデルを構築するとき(言語固有のルールが不要)
- CJK 言語(中国語、日本語、韓国語)を扱うとき
- 再現可能なトークン化が必要なとき(決定論的な語彙)
- 生のテキストで学習したいとき(事前トークン化が不要)
- 軽量なデプロイが必要なとき(メモリ 6MB、毎秒 50,000 文)
パフォーマンス:
- 速度:毎秒 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+
エージェントの運用手順
- 環境を確認します。 GPU の種類、メモリ、ドライバー/CUDA のバージョン(
nvidia-smi)、フレームワークのバージョン、データセットの場所とサイズを確認します。 - 入力を確定します。 データまたはユーザーから、形式、識別子、パラメーターを確認します。結果に影響する値は推測せず、質問してください。
- まず小規模に実行します。 スモークテストとして、小さなモデルまたはサブセットを使って少ないステップ数で実行し、損失が減少することとチェックポイントが保存されることを確認します。
- 上記の手順と参考情報に従って、タスク全体を実行します。
- 結果を検証します。 ホールドアウトデータでメトリクスを追跡し、ベースラインと比較して、シード、設定、ハードウェアを記録します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未確定の事項を記載します。
| 発生した問題 | 対応方法 |
|---|---|
| CUDA のメモリ不足 | バッチサイズを小さくする、勾配累積/チェックポイントまたは混合精度を有効にする、あるいはモデルをシャーディングします。 |
| 損失が NaN になる、または発散する | 学習率を下げ、データに無効な値がないか確認し、勾配クリッピングを有効にします。 |
| これらの手順に記載されている関数、フラグ、エンドポイントがインストール済みバージョンにない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認して適宜対応し、ユーザーに伝えます。API を捏造してはいけません。 |
| 必須の入力、識別子、パラメーターが曖昧 | ユーザーに質問するか、実行前に前提を明示します。 |
インテグリティに関するルール
- 結果、パラメーター、識別子、引用、統計情報を捏造してはいけません。実行または検証できないことは、明確に伝えます。
- ログなしに学習結果を主張してはいけません。大規模なジョブを開始する前に、計算コストを見積もります。
- ここに記載されているバージョン固有の詳細は古くなっている可能性があるため、インストール済みバージョンの公式ドキュメントで確認します。
- 費用が発生する操作、共有 GPU またはクラウドクォータを消費する操作、個人データまたは患者データに触れる操作、取り消せない操作を行う前に、確認を求めます。
関連スキル
huggingface-tokenizers:HuggingFace Tokenizers ライブラリを提供します(Rust コアと Python および Node.js バインディング)。BPE、WordPiece、Unigram のトレーニングと使用に対応しています…
コメント
Markdown 対応