LLM 基礎:分詞與訓練

LLM 基礎:分詞與訓練

探索大型語言模型(如 GPT)中分詞(tokenization)與嵌入(embeddings)的關鍵差異。了解分詞如何將文本分解為可管理的單位,而嵌入則提供這些 token 的豐富向量表示。理解這些過程對於釋放 LLM 在自然語言處理任務中的潛力至關重要。

簡介

分詞與嵌入是大型語言模型(如 GPT)的基礎元件,對於理解和生成文字至關重要。分詞涉及將原始文字分解為稱為 token 的可管理單元,而嵌入則提供這些 token 的豐富向量表示。理解分詞與嵌入之間的差異對於掌握 LLM 如何處理語言資料的細節至關重要。

什麼是分詞

Token 在 AI 研究中經常被討論,例如在 Llama 2 論文中,作者提到在 2 兆個 token 的資料上進行訓練。Token 是大型語言模型(LLM)的基本單位,類似於「原子」。分詞涉及將字串(即文字)轉換為 token 序列,反之亦然。

在機器學習領域,一個 token 通常不等於一個單字。相反,它可能代表一個較小的單位,例如一個字元或單字的一部分,或者一個較大的單位,例如一個完整的片語。Token 的大小取決於所使用的分詞方法。

分詞通常由一個稱為「分詞器」的元件處理。此模組獨立於大型語言模型運行,並擁有自己的文本訓練資料集,該資料集可能與 LLM 訓練資料完全不同。

為什麼分詞很重要?

分詞往往是大型語言模型(LLM)中許多奇怪現象的根源。有些問題最初看似來自神經網路架構或 LLM 本身,但實際上可歸因於分詞。以下是非詳盡的問題列表,這些問題都可以追溯到分詞:

  • 拼寫不準確
  • 難以處理簡單的字串處理任務,例如反轉字串
  • 非英語語言(如日語)的效能較差
  • 基本算術運算表現不佳
  • GPT-2 在處理編碼任務(如 Python)時遇到挑戰
  • 尾隨空格的問題
  • 早期版本的 GPT 在提示「SolidGoldMagikarp」時出現異常行為
  • 在處理結構化資料時偏好 YAML 而非 JSON

我們將在本篇文章中深入探討分詞如何導致這些問題。

分詞細節

以下是分詞步驟的概述。雖然有些步驟可能不是很清楚,但我們將在後續內容中詳細介紹。

預訓練:建立詞彙表

  1. 收集訓練資料:收集模型將學習的大量文本資料語料庫。
  2. 初始分詞:使用初始分詞方法將文字劃分為基本單元,例如單字、子詞或字元。
  3. 建立詞彙表:選擇一種分詞演算法,例如位元組對編碼(BPE)、WordPiece 或 SentencePiece,以產生一個可管理且高效的 token 集合。
  4. 應用演算法:對初始 token 實施所選的演算法,以產生一組子詞 token 或字元,捕捉訓練資料中的語言細微差別。
  5. ID 分配:為詞彙表中的每個 token 分配一個唯一的整數 ID。

即時分詞流程

  1. 根據已建立的詞彙表將傳入的文字轉換為 token,確保所有文字都被完整覆蓋。
  2. 將每個 token 與其對應的整數 ID 關聯,如預先建立的詞彙表中所定義。
  3. 在序列中加入必要的特殊 token,以滿足模型處理的要求。

理解分詞挑戰

請隨意輸入句子,觀察 token 是如何生成的(並注意 token 數量和每次提示的價格隨之增加)。

啟用「Show whitespace」核取方塊後,將滑鼠懸停在右側的文字上,您會看到突出顯示的 token。這些 token 通常由「區塊」組成,通常在開頭包含空格字元。

這是另一個範例:

觀察 token 區塊及其數值表示如何根據以下因素而變化:

  • 單字前是否有空格
  • 是否存在標點符號
  • 字母大小寫

大型語言模型(LLM)必須從原始資料中學習:儘管 token 存在這些差異,這些單字代表相同的概念或至少極為相似。這種可變性可能會降低效能。

其他語言

將英語的區塊大小與其他語言進行比較,您通常會發現非英語語言使用的 token 數量明顯更多。這種差異源於其他語言的區塊更為碎片化,導致文件中的序列長度膨脹。

在機器學習 Transformer 的注意力機制中,非英語語言更容易出現上下文不足的情況。即使在傳達相同訊息時,由於區塊較小,也會消耗更多 token。這種差異同時受到分詞器的訓練集和分詞器本身的影響。

最終,對於非英語語言,上下文視窗的低效利用導致大型語言模型(LLM)在處理非英語查詢時效能較差。

分詞與程式碼 — Python

以 Python 為例,OpenAI 的 GPT-2 編碼器經常在 Python 程式碼縮排所使用的個別空格字元上花費大量 token。這種行為類似於非英語語言所面臨的挑戰,會導致 LLM 的上下文視窗顯著膨脹,進而導致效能下降。

配置:YAML 與 JSON

研究發現,YAML 比 JSON 具有更高的密度,完成相同任務所需的 token 更少。

以下是一個簡單的說明:

JSON:46 個 token

JSON 的膨脹增加導致:

  1. LLM 更難理解(密度較低,更容易超出上下文視窗)。
  2. 使用者花費更高(因為他們在 API 呼叫 OpenAI 時基本上是按 token 付費)。

分詞問題

分詞是大型語言模型(LLM)中許多異常現象的核心。一些最初看似與神經網路架構或 LLM 本身相關的問題,實際上可以追溯到分詞。例如:

  • LLM 在拼寫單字或執行基本字串處理任務(如字串反轉)時遇到困難。
  • 非英語語言的效能往往會下降。
  • LLM 在處理簡單算術時表現不佳。
  • GPT-2 在處理 Python 編碼時遇到重大挑戰。
  • 可能會出現關於尾隨空格的奇怪警告。
  • 短語「Solid Gold Magikarp」經常導致 LLM 偏離到不相關的話題。
  • 在使用 LLM 時,YAML 比 JSON 更受青睞。

大型語言模型中的分詞

在訓練大型語言模型(LLM)時,過程涉及將字串轉換為來自預定義詞彙表的整數。然後使用這些整數從嵌入表中檢索向量,再將這些向量輸入 Transformer 模型。這個過程變得複雜,因為它不僅需要支援基本的英文字母,還需要容納各種語言和特殊字元(如表情符號)。

Python 中的字串與 Unicode 碼點

在 Python 中,字串是由 Unicode 碼點組成的不可變序列。這些碼點由 Unicode 聯盟在 Unicode 標準中定義,目前涵蓋約 150,000 個字元,跨越 161 種文字。Unicode 標準仍在積極維護中,最新版本 15.1 於 2023 年 9 月發布。

要在 Python 中檢索單個字元的 Unicode 碼點,我們可以使用 ord() 函數。例如:

然而,使用這些原始碼點整數進行分詞是不可行的,因為這會導致詞彙表過大(150,000 以上),而且由於 Unicode 標準持續演進,詞彙表也不穩定。

Unicode 位元組編碼

為了尋求更有效的分詞解決方案,我們轉向 Unicode 位元組編碼,例如 ASCII、UTF-8、UTF-16 和 UTF-32。這些編碼規定了將抽象 Unicode 碼點轉換為適合儲存和傳輸的實際位元組的方法。

Unicode 位元組編碼:ASCII、UTF-8、UTF-16、UTF-32

Unicode 聯盟定義了三種類型的編碼:UTF-8、UTF-16 和 UTF-32。這些編碼是將 Unicode 文字轉換為二進制資料或位元組流的手段。

在這些編碼中,UTF-8 是最常見的。它將每個 Unicode 碼點轉換為 1 到 4 個位元組的位元組流,具體取決於碼點。前 128 個碼點(ASCII)只需要一個位元組。接下來的 1,920 個碼點需要兩個位元組來編碼,涵蓋了大多數拉丁字母。基本多語言平面(BMP)中的其餘 61,440 個碼點需要三個位元組。四個位元組涵蓋其他 Unicode 平面,包括較不常見的 CJK 字元、各種歷史文字和數學符號。

直接使用原始的 UTF-8 位元組對語言模型來說效率極低,會導致序列過長,而詞彙表大小僅限於 256 個可能的位元組值。這種限制阻礙了模型關注足夠長上下文的能力。

解決方案在於使用位元組對編碼(BPE)演算法對這些位元組序列進行可變壓縮。這種方法允許以更大但可調整的詞彙表大小來高效表示文字。

分詞與嵌入有何不同?

分詞和嵌入是大型語言模型(如 GPT)中分開但又相互關聯的過程,有助於模型理解和生成文字。以下是每個過程的簡要概述及其區別:

LLM 分詞

目標:分詞旨在將原始文字轉換為 token 序列,這些 token 可以是單字、子詞或字元,具體取決於所選的分詞方法。

流程:它涉及將文字分解為模型可以解釋的可管理片段。這可能包括根據空格和標點符號初步分割文字,如果文字不在模型的預定義詞彙表中,則進一步分割為子詞或字元。

結果:結果是一個 token 序列,以適合模型處理的格式表示原始文字。每個 token 被分配一個對應於模型詞彙表的唯一整數 ID。

嵌入

目標:嵌入是 token 的緊湊、低維度、連續向量表示。它們編碼語義和句法含義,促進模型對語言細微差別的理解。

流程:在分詞之後,每個 token(由其整數 ID 表示)與一個嵌入向量關聯。這些向量在模型的訓練階段獲得,並存儲在嵌入矩陣或表中。

結果:嵌入作為 LLM 神經網路層的輸入,使模型能夠對 token 進行計算,並辨別資料集中的關係和模式。

在我們的部落格中查找有關 LLM 嵌入的更多詳細資訊:什麼是 LLM Embeddings:您需要知道的一切

上傳中,0

區別特徵

處理階段:分詞是初始預處理步驟,將文字轉換為模型可理解的格式(token),而嵌入發生在分詞之後,將 token 轉換為詳細的向量表示。

功能:分詞主要涉及對文字的結構性分解和表示,而嵌入則側重於捕捉和利用 token 中嵌入的語義和句法含義。

表示:分詞產生離散的、基於整數的文字元件表示,而嵌入將這些整數轉換為編碼語言資訊的連續向量。

結論

總之,分詞和嵌入在大型語言模型的運作中扮演著關鍵角色。分詞將文字結構化為 token,而嵌入通過向量表示為這些 token 提供語義和句法含義。通過理解這些過程,我們深入了解 LLM 如何解釋和生成文字,從而促進自然語言處理的進步。

novita.ai 是無限創意的一站式平台,可讓您存取 100 多個 API。從圖像生成和語言處理到音訊增強和影片操作,便宜且按量付費,讓您在建立自己的產品的同時免於 GPU 維護的困擾。立即免費試用。

推薦閱讀

LLM 和 GPT 有什麼不同

LLM 排行榜 2024 預測揭曉

Novita AI LLM 推理引擎:最大吞吐量與最便宜推理