Byte-Pair Encoding/zh
| Article | |
|---|---|
| Topic area | Natural Language Processing |
| Prerequisites | Tokenization, Language Model |
概述
字節對編碼(Byte-Pair Encoding, BPE)是一種子詞分詞算法,它通過在訓練語料中反覆合併最頻繁的相鄰符號對來構建詞表。該方法最初由 Philip Gage 於 1994 年作為數據壓縮技術提出,2015 年由 Sennrich、Haddow 和 Birch 改造用於神經機器翻譯,此後成為現代語言模型(包括 GPT 系列、RoBERTa 以及眾多開源大型語言模型)的基礎組件。[1] BPE 在兩種分詞極端之間取得平衡:詞級詞表存在詞表外(OOV)問題且嵌入表過大,而字符級詞表則會產生過長的序列和較弱的歸納偏置。通過學習一個固定規模的子詞單元詞表來覆蓋任意輸入字符串而不產生未知詞元,BPE 實現了跨語言和跨領域的高效開放詞表建模。
背景與動機
早期的神經序列模型依賴於詞級詞表,通常上限為 3 萬至 10 萬個條目。超出該集合的單詞會被替換為 <UNK> 令牌,從而丟失信息。這對形態豐富的語言、技術領域和稀有命名實體尤其有害。字符級模型完全避免了未知令牌的問題,但需要更長的序列,並迫使模型從零開始重新學習高頻詞模式。
子詞分詞提供了一種折中方案。其直覺是:頻繁出現的單詞應保留為完整的令牌,而稀有單詞則被分解為有意義的子詞單元,如詞素或詞幹。例如,"tokenization" 可被切分為 "token" 和 "ization",從而讓模型與 "tokenize" 或 "modernization" 等相關形式共享表示。BPE 提供了一種簡單的、數據驅動的方法,無需語言學監督即可找到這樣的詞表。
算法
BPE 的訓練從一個基礎詞表開始,該詞表包含語料中出現的所有字符(或所有字節)。每個單詞被表示為這些基礎符號的序列,通常帶有詞尾標記(如 </w>)以區分詞內片段和詞末片段。隨後訓練過程反覆執行同一個操作:在整個語料中統計每個相鄰符號對的頻次,找出最頻繁的一對,並將其合併為一個新符號加入詞表。
形式上,記 $ V_0 $ 為初始字符詞表,$ C $ 為預分詞後的單詞的多重集,其中每個單詞表示為一個符號序列。在第 $ t $ 次迭代時,BPE 選擇如下的符號對
$ {\displaystyle (a^{*}, b^{*}) = \arg\max_{(a, b)} \; \mathrm{count}(a, b \mid C, V_{t-1})} $
並構造新的符號 $ ab $。$ C $ 中每一處相鄰對 $ (a, b) $ 的出現都會被替換為 $ ab $,同時該合併規則被追加到一個有序的合併列表中。該過程持續進行,直到詞表達到目標規模,通常介於 8 000 至 100 000 個令牌之間。訓練的輸出包含兩件產物:最終詞表和有序的合併規則列表。
一個簡短的示例可以說明其動態。假設語料中包含單詞 "low"、"lower"、"newest" 和 "widest",其頻次使得在初始化步驟之後 "es" 成為最常見的相鄰對。BPE 首先將 "e" + "s" 合併為 "es",隨後可能將 "es" + "t" 合併為 "est",並繼續進行。經過若干次迭代後,"est"、"er" 等常見後綴以單個令牌的形式出現,而較稀有的形式仍保持分段狀態。
推理時的分詞
訓練完成後,BPE 以確定性方式對新字符串進行分詞。先將字符串切分為基礎符號,然後按學習順序依次應用合併規則。每一步中,算法尋找仍然適用的、已學習索引最小的合併規則,執行該規則,並不斷重複,直到沒有規則適用為止。給定合併列表後,所產生的令牌序列是唯一的。
這種貪心、按優先級排序的應用方式使 BPE 編碼既快速又可復現。實用實現使用以合併秩為鍵的優先隊列,可在輸入長度上達到近似線性的時間複雜度。一個微妙的結果是:除非預分詞器進行規範化,否則 BPE 的分詞對空白字符和大小寫並非不變。包括 GPT-2 及後續模型在內的大多數現代分詞器都保留大小寫,並將前導空格表示為特殊字符(通常為 Ġ),因此 "the" 和 " the" 會被映射到不同的令牌。
字節級 BPE
字符級 BPE 的一個實際問題在於其基礎詞表依賴於訓練語料。新語言或不常見的 Unicode 碼位可能在推理時產生未知字符。隨 GPT-2 引入的字節級 BPE 通過將輸入視為 UTF-8 字節序列而非字符序列來規避這一問題。[2] 其基礎詞表固定為 256 個字節值,從而保證任意輸入字符串均可被表示。字節級 BPE 完全消除了未知令牌,並能統一地處理表情符號、代碼和多語言文本。當代大多數大型語言模型都採用這一變體。
其代價是非拉丁文字在字節層面上的編碼效率較低。單個漢字可能占用三個 UTF-8 字節,並需要多次合併才能整合,從而導致這些語言產生更長的令牌序列和更高的推理成本。當跨語言公平性成為目標時,有時會更傾向於使用 Unigram 模型的 SentencePiece。
與其他子詞方法的比較
WordPiece 用於 BERT,與 BPE 密切相關,但其合併選擇依據似然準則而非純頻次。每一步中,WordPiece 選擇其合併能在一元語言模型假設下最大化訓練語料似然的符號對。在實踐中,WordPiece 與 BPE 產生的詞表相似,二者的取捨通常是工具鏈偏好問題。
用於 SentencePiece 和 T5 系列的一元語言模型分詞器採用不同的方法。它從一個較大的候選詞表開始,逐步剪除令牌以最大化語料似然,從而產生概率性切分,並通過採樣支持子詞正則化。此外,SentencePiece 將空白視作普通字符,允許在沒有語言特定預分詞規則的前提下實現端到端的分詞。
與字符級模型相比,BPE 產生的序列更短,並具有更強的詞級先驗。與詞級模型相比,它消除了未知令牌,並在形態相關的形式之間共享參數。所得詞表在不同領域具有良好的泛化能力,並已被證明是 Transformer 架構占主導地位的穩健選擇。
實現考量
一種樸素的 BPE 實現會在每次合併後重新統計所有符號對的頻次,其複雜度對詞表規模呈平方級。Hugging Face Tokenizers 和 OpenAI tiktoken 等生產實現使用增量數據結構,每次合併後僅更新受影響的對,將訓練時間降至與語料規模近似線性。對於推理,得益於精心實現的 Rust 或 C++ 代碼,現代庫可在每個 CPU 核心上達到每秒數百萬個令牌的吞吐量。
預分詞的選擇十分重要。大多數 BPE 流水線在應用合併之前會按空白字符和標點對文本進行切分,從而防止令牌跨越詞邊界。具體的規則集合(包括如何處理數字、縮寫和標點)在不同模型間各異,且很少有詳細記錄,這使得精確復現一個分詞器並非易事。因此,已發布的模型通常會將合併列表與預分詞器的正則表達式作為凍結產物一併發布。
局限性與權衡
BPE 是一種基於頻次的貪心啟發式方法,沒有顯式的語言學目標。它可能產生反直覺的切分,尤其是在低頻形態變體上,並且對訓練語料的組成較為敏感。在網絡文本上訓練得到的詞表,對醫學或法律文本的切分往往次優,會導致序列變長並降低下游性能,除非進行適配或詞表擴展。
BPE 編碼的確定性也被認為是語言模型中隱性偏置的一個來源。由於數字是按訓練語料中的頻次而非數位位置進行合併的,同一個數字可能在不同上下文中被分詞成不同形式,這會使算術推理變得複雜。近期的模型已開始採用按位的分詞作為部分補救方案。
最後,BPE 對每個字符串只提供一種規範的切分,這限制了模型在訓練過程中接觸到的替代分析。子詞正則化技術,如 BPE dropout,會在訓練時隨機跳過部分合併,使模型見到多種合理切分,從而提升魯棒性。[3]
參考文獻
- ↑ Sennrich, R., Haddow, B., and Birch, A., "Neural Machine Translation of Rare Words with Subword Units," ACL 2016.
- ↑ Radford, A. et al., "Language Models are Unsupervised Multitask Learners," OpenAI 2019.
- ↑ Provilkov, I., Emelianenko, D., and Voita, E., "BPE-Dropout: Simple and Effective Subword Regularization," ACL 2020.