今天小編分享的科學經驗:Karpathy新視頻又火了:從頭構建GPT Tokenizer,歡迎閱讀。
技術大神卡帕西離職 OpenAI 以後,營業可謂相當積極啊。
這不,前腳新項目剛上線,後腳全新的教學視頻又給大夥整出來了:
這次,是手把手教咱構建一個GPT Tokenizer(分詞器),還是熟悉的時長(足足 2 小時 13 分鍾)。
Ps. 上次講課還是倆月前的大模型科普。
所謂" 卡帕西出手,必屬精品 ",大夥火速碼碼碼:
今晚的約會取消,卡帕西來了我要去上課(狗頭)
再說一遍,付費都買不到的這樣高質量的課程,衝。
具體都有哪些幹貨?
" 太長不看版 "已為大家準備好。
為什麼要關注 Tokenizer
如大神介紹:
Tokenizer 即分詞器是大語言模型 pipeline 中一個完全獨立的階段。
它們有自己的訓練集、算法(比如 BPE,字節對編碼),并在訓練完成後實現兩個功能:
從字元串編碼到 token,以及從 token 解碼回字元串。
為什麼我們需要關注它?
卡帕西指出:
因為 LLM 中的很多奇怪行為和問題都可以追溯到它。
比如:
為什麼大模型不能處理簡單的字元串處理任務,例如反轉?
為什麼大模型在非英語語言任務方面的性能更差?
為什麼大模型不擅長簡單的算術?
為什麼我的模型在看到字元串 "" 後就突然 " 宕機 " 了?|>
為什麼大模型實際上并不是端到端的語言建模?
……
所以為了弄清這些問題,便有了今天的課程——盡管大神本人對這部分内容其實也不太喜歡。
上這門課大家會注意到我的表情全程都很凝重。不過,其中的細節真的太重要了(大家還是忍忍吧)。
以下為視頻主要内容文字版。
從頭構建 OpenAI 大模型中使用的分詞器
視頻的最開始主要是對分詞器的一些介紹。
包括最簡單的字元級分詞操作(即每個字元是一個 token ) 以及更為復雜和常用的 chunk 級操作(即多個字元也會組成一個 token)。
在這之中,業内最常用的算法是 BPE,即 byte pair encoding,字節對編碼,因此我們要想構建自己的分詞器,最重要的是了解這個算法。
卡帕西介紹:
BPE 可以更好地處理非英語語言、對詞匯表大小進行調整,對于模型的性能有顯著影響。
比如 GPT-4 分詞器通過改進 BPE 算法,最終在處理 Python 代碼時更加高效,因為它能夠将多個空格合并為單個标記,從而減少序列長度,使得模型能夠關注更長更多的代碼。
需要注意的是,盡管 BPE 算法可以處理 UTF-8 編碼的字節序列,但直接使用這些序列會導致詞匯表過大、序列過長,從而影響模型的注意力機制和上下文長度,因此需要壓縮處理。
理解 BPE 算法後,如何構建自己的分詞器?
簡單來說,主要包括以下幾個步驟:
1、初始化詞匯表
基于 UTF-8 編碼的字節。
2、合并字節對并不斷迭代,直到詞匯表大小達到預設值
在實際演示中,卡帕西通過 20 次合并,将文本的 token 數量減少了約 27%。
3、處理特殊字元和不同語言的字元
4、整體優化
詞匯表過大可能會導致模型訓練困難,過小則可能無法捕捉到足夠的語言細節。
5、選擇一個包含豐富語言特征的數據集來訓練
在此,卡帕西提到了 SentencePiece 庫,它支持多種分詞算法包括今天提到的 BPE。
我們可以用它進行分詞器的訓練,包括配置選項和如何處理罕見字元。
訓練好的分詞器用于編碼和解碼文本也講了。
6、最後就是評估 + 集成到模型中了。
當然,後續我們還需要根據模型的表現進行持續調整。
具體道每一步,大神都給咱配了詳細的 Python 實現,包括如何找到最頻繁的字節對、如何合并這些對以及如何構建合并字典等等,具體大家就請參閱視頻吧。
在這之中,卡帕西也提醒了 n 個細節,比如:
在解碼過程中,如果遇到無效的 UTF-8 字節序列,可以使用 "errors= ’ replace ’ " 來替換;使用 "end of text" 特殊标記來在訓練數據中分隔文檔等等。
實際遠比此復雜
毫無疑問,卡帕西帶大家實現的是比較基礎的一個分詞器版本,實際模型中遠比這要復雜得多。
比如 OpenAI 官方提供的 BPE 分詞器——tiktoken。
它用了正則表達式來分割文本,以此來保證某些類型的字元也不會被合并。在 GPT-2 中,它就在某些方面表現得不錯了。
到了 GPT-4,官方也對其進行了一些調整。
主要的改變在于:
GPT-4 會将空格合并;
大小寫不敏感;
GPT-4 最多只合并 3 位數字,避免了長數字序列 token。
不過由于官方并沒有公開具體訓練細節,所以我們也無法知道其詳細的實現。
而除了更復雜的算法,分詞器本身在處理長字元串、非英語語言、數字和特殊字元時都可能遇到問題。
因此,講來講去,大神在視頻中還是表達了一個 " 樸素的願望 ":
非常希望有一天能夠不需要分詞,直接将字節流輸入到語言模型中。
不過由于這就需要我們對 Transfomer 架構進行重大修改了,所以現階段,構建和優化分詞器仍然是實現高效大模型的關鍵步驟。
完整視頻見:
https://weibo.com/6105753431/O1BQB96Yg
傳送門:
[ 1 ] https://www.youtube.com/watch?v=zduSFxRajkE
[ 2 ] https://twitter.com/karpathy/status/1759996549109776702/quotes