Transformers v5 トークナイゼーション更新
アーキテクチャとパラメータの分離
Transformers v5 では、トークナイザのアーキテクチャ(normalizer、pre‑tokenizer、model type、post‑processor、decoder で構成)と、語彙やマージルールといった学習済みパラメータが明確に分離されています。これはバージョン 4 からの大きな変更で、トークナイザが事前学習済みチェックポイントファイルに密結合していたため、使用されている正規化や前処理の戦略を特定することが困難でした。
このモジュラーなアプローチにより、トークナイザクラスはその構造を明示的に宣言します。例えば、v5 の LlamaTokenizer は Byte Pair Encoding (BPE) を使用し、入力テキストを正規化せず、デコード時にメタスペース文字 ☁ をスペースに置き換えることを明確に定義しています。
統合バックエンドとシンプルな階層構造
Transformers v5 は、従来の二重実装システム(各モデルが「slow」Python トークナイザと「fast」Rust バックエンドのトークナイザの両方を持つ)を廃止しました。
統一されたファイル構造
- Single File per Model: ライブラリは現在、モデルごとに 1 つのファイル(例:
tokenization_llama.py)を使用し、2 つではなくなりました。 - Preferred Backend:
TokenizersBackendによる Rust バックエンドのトークナイゼーションがデフォルトで推奨され、コードの重複が減り、slow と fast のバージョン間の挙動差異がなくなります。
クラス階層
PreTrainedTokenizerBase: すべてのトークナイザに共通のインターフェースを定義する抽象基底クラスで、特殊トークン、エンコード/デコードインターフェース、シリアライズ、チャットテンプレートを扱います。TokenizersBackend: 高性能トークナイゼーションのために Rust ベースのtokenizersライブラリをラップする主要バックエンドです。PythonBackend: カスタムロジックやレガシー互換性のための純粋な Python ミックスインです。SentencePieceBackend: Google の SentencePiece ライブラリを使用するモデルを専用に処理します。
モデル固有トークナイザのスクラッチトレーニング
アーキテクチャとパラメータが分離されたため、ユーザーは「空」のトークナイザアーキテクチャをインスタンス化し、ドメイン固有のコーパスでトレーニングできます。従来は低レベルのプリミティブを用いてパイプラインを手動で再構築する必要がありました。v5 では、開発者はモデル固有のクラス(例: LlamaTokenizer)を初期化し、train_new_from_iterator を呼び出すだけで、カスタム語彙とマージルールで埋めつつ、モデルの元々の空白処理や特殊トークンの規約を保持できます。
トークナイゼーションパイプラインとラッパーレイヤー
Transformers のトークナイゼーションは、5 つの独立した段階で行われます:
- Normalizer: テキストを標準化します(例: 小文字化)。
- Pre-tokenizer: テキストを事前のチャンクに分割します。
- Model: アルゴリズム(BPE、Unigram、WordPiece)を適用します。
- Post-processor: 特殊トークン(BOS、EOS、パディング)を追加します。
- Decoder: トークン ID をテキストに戻します。
tokenizers の Rust ライブラリがこれらのメカニズムを処理する一方で、transformers ラッパーはモデル認識機能を追加します。具体的には apply_chat_template によるチャットテンプレートの適用、特殊トークンの自動挿入、コンテキスト長への切り詰め、パディング付きバッチエンコードなどです。
比較: Transformers v4 と v5
| 項目 | V4 | V5 |
|---|---|---|
| モデルあたりのファイル数 | 2つ(tokenization_X.py、tokenization_X_fast.py) |
1つ(tokenization_X.py) |
| デフォルトバックエンド | Python と Rust に分割 | Rust(TokenizersBackend)が推奨 |
| アーキテクチャの可視性 | シリアライズされたファイル内で非表示 | クラス定義で明示的 |
| スクラッチからのトレーニング | 手動でパイプラインを構築する必要があった | tokenizer.train(files=[...]) |
| コンポーネントの検査 | 困難で、ドキュメントがない | 直接プロパティ(tokenizer.normalizer など) |
| 親クラス | PreTrainedTokenizer, PreTrainedTokenizerFast |
TokenizersBackend, SentencePieceBackend, PythonBackend |