Transformers v5 斷詞更新
Transformers v5 斷詞更新
Hugging Face 重新設計了 Transformers v5 的斷詞系統,將斷詞器架構與已訓練的詞彙表分離,使得檢視、客製化以及從頭訓練更加容易。
Transformers v5 斷詞更新
Transformers v5 引入了斷詞系統的重大重新設計,將斷詞器的架構設計與已訓練的詞彙表分離。此變化讓開發者能將斷詞器視為可配置的模板,而非不透明的黑盒,類似於 PyTorch 將神經網路架構與學習到的權重分離的方式。
架構與參數的分離
在 Transformers v5 中,斷詞器的架構——包括正規化器、前斷詞器、模型類型、後處理器與解碼器——現在與已訓練的參數(如詞彙表與合併規則)分離。這與第 4 版不同,當時斷詞器與預訓練檢查點檔案緊密耦合,難以判斷使用的具體正規化或前斷詞策略。
透過這種模組化方法,斷詞器類別現在會明確宣告其結構。例如,v5 中的 LlamaTokenizer 清楚表明它使用 Byte Pair Encoding(BPE),不對輸入文字進行正規化,且在解碼時將 metaspace 字元 ☁ 替換為空格。
後端整合與層級簡化
Transformers v5 移除了先前的雙實作系統,過去每個模型同時擁有「慢速」Python 斷詞器與「快速」Rust 後端斷詞器。
統一檔案結構
- 每個模型單一檔案:函式庫現在對每個模型僅使用一個檔案(例如
tokenization_llama.py),不再是兩個。 - 首選後端:透過
TokenizersBackend的 Rust 後端斷詞現在是預設首選,減少程式碼重複,並消除慢速與快速版本之間的行為差異。
類別層級
PreTrainedTokenizerBase:定義所有斷詞器共通介面的抽象基底類別,處理特殊字元、編碼/解碼介面、序列化與聊天模板。TokenizersBackend:主要的後端,封裝基於 Rust 的tokenizers函式庫,以提供高效能斷詞。PythonBackend:純 Python 的 mixin,用於自訂邏輯或相容舊版。SentencePieceBackend:專門處理使用 Google 的 SentencePiece 函式庫的模型。
從頭訓練特定模型的斷詞器
由於架構與參數已分離,使用者可以實例化一個「空白」的斷詞器架構,並在特定領域的語料庫上進行訓練。過去必須手動使用低階原語重建整個流程。於 v5 中,開發者只需初始化特定模型的類別(如 LlamaTokenizer),然後呼叫 train_new_from_iterator,即可以自訂詞彙表與合併規則填充,同時保留模型原有的空白處理與特殊字元慣例。
斷詞流程與包裝層
斷詞在 Transformers 中分為五個獨立階段:
- Normalizer(正規化器):標準化文字(例如小寫化)。
- Pre-tokenizer(前斷詞器):將文字切分為初步的片段。
- Model(模型):套用演算法(BPE、Unigram 或 WordPiece)。
- Post-processor(後處理器):加入特殊字元(BOS、EOS、填充)。
- Decoder(解碼器):將 token ID 轉回文字。
雖然底層的 tokenizers Rust 函式庫負責這些機制,transformers 包裝層則加入了模型感知的關鍵功能,包括透過 apply_chat_template 套用聊天模板、自動插入特殊字元、截斷至上下文長度,以及批次編碼時的填充。
比較:Transformers v4 與 v5
| 方面 | V4 | V5 |
|---|---|---|
| 每個模型的檔案數 | 兩個 (tokenization_X.py, tokenization_X_fast.py) |
一個 (tokenization_X.py) |
| 預設後端 | 在 Python 與 Rust 之間分割 | Rust (TokenizersBackend) 為首選 |
| 架構可見性 | 隱藏於序列化檔案中 | 在類別定義中明確 |
| 從頭訓練 | 需要手動建構管線 | tokenizer.train(files=[...]) |
| 元件檢查 | 困難且未文件化 | 直接屬性 (tokenizer.normalizer, 等) |
| 父類別 | PreTrainedTokenizer, PreTrainedTokenizerFast |
TokenizersBackend, SentencePieceBackend, PythonBackend |