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