解讀AI大模型,從了解token開始 精華
上次??《科普神文,一次性講透AI大模型的核心概念》??一文中,我基于結(jié)合大量示例及可視化的圖形手段給大家科普了AI大模型的相關(guān)算法和核心概念。
但是收到不少非技術(shù)背景的小伙伴反饋,相關(guān)的算法內(nèi)容的解釋技術(shù)性還是太強(qiáng),很難完全理解。所以這次,題主從最基礎(chǔ)的概念“token”著手,跳過了復(fù)雜的算法邏輯,這次一定讓你建立起對AI大模型工作原理的清晰認(rèn)知。
什么是token?最小的語義單元
你可能會好奇,大規(guī)模語言模型是如何工作的呢?它們是如何從數(shù)據(jù)中學(xué)習(xí)到語言的呢?它們是如何根據(jù)輸入來生成合理的文本延續(xù)的呢?為了回答這些問題,我們需要從最基礎(chǔ)的概念開始講起:token。
在自然語言處理(NLP)中,token是指文本中最小的語義單元。比如,一個句子可以被分割成若干個單詞,每個單詞就是一個token。例如,“I love you”這個句子可以被分割成三個token:“I”,“l(fā)ove”和“you”。token可以幫助我們把文本分解成更容易處理和分析的部分。
但是,并不是所有的語言都可以用空格來劃分單詞。有些語言,比如中文、日語等,沒有明顯的單詞邊界。在這種情況下,我們需要用一些更復(fù)雜的方法來進(jìn)行tokenization(分詞)。比如,我們可以用一些規(guī)則或者統(tǒng)計模型來判斷哪些字或者字組合構(gòu)成了一個有意義的token。例如,“我愛你”這個句子可以被分割成兩個token:“我”和“愛你”。當(dāng)然,這種方法并不完美,有時候會出現(xiàn)錯誤或者歧義。
除了單詞之外,還有一些其他的符號也可以被視為token。比如,標(biāo)點(diǎn)符號、數(shù)字、表情符號等等。這些符號也可以傳達(dá)一些信息或者情感。例如,“I love you!”和“I love you?”就不同于“I love you”,因?yàn)楦袊@號和問號表達(dá)了不同的語氣和態(tài)度。
總之,token就是文本中的最小有意義的單位,它們可以幫助我們把文本分解成更容易處理和分析的部分。不同的語言和場景可能需要不同的tokenization方法。接下來,我們要看看GPT系列采用了什么樣的token類型?
GPT系列采用了什么樣的token類型?
GPT系列是一系列基于Transformer的生成式預(yù)訓(xùn)練模型,它們可以用來生成各種類型的文本。目前,已經(jīng)有了GPT-2、GPT-3和GPT-4等不同版本的模型,它們的區(qū)別主要在于模型的大小、訓(xùn)練數(shù)據(jù)的規(guī)模和質(zhì)量、以及生成能力的強(qiáng)度。
GPT系列的模型都是基于子詞(subword)來進(jìn)行tokenization的。子詞是指比單詞更小的語言單位,它們可以根據(jù)語料庫中的詞頻和共現(xiàn)頻率來自動劃分。比如,一個單詞“transformer”可以被劃分成兩個子詞“trans”和“former”,或者三個子詞“t”,“rans”和“former”,或者四個子詞“t”,“r”,“ans”和“former”,等等。不同的劃分方法會產(chǎn)生不同數(shù)量和長度的子詞。一般來說,子詞越多越短,就越能覆蓋更多的語言現(xiàn)象,但也會增加模型的計算復(fù)雜度;子詞越少越長,就越能減少模型的計算復(fù)雜度,但也會損失一些語言信息。
GPT系列采用了一種叫做Byte Pair Encoding(BPE)的子詞劃分方法。BPE是一種基于數(shù)據(jù)壓縮原理的算法,它可以根據(jù)語料庫中出現(xiàn)頻率最高的字節(jié)對(byte pair)來合并字節(jié),從而生成新的字節(jié)。比如,如果語料庫中出現(xiàn)頻率最高的字節(jié)對是“ns”,那么BPE就會把所有的“ns”替換成一個新的字節(jié)“Z”,從而減少字節(jié)總數(shù)。這個過程可以重復(fù)進(jìn)行,直到達(dá)到預(yù)設(shè)的字節(jié)總數(shù)或者沒有更多的字節(jié)對可以合并為止。這樣,BPE就可以把原始的字節(jié)序列轉(zhuǎn)換成一個由新字節(jié)組成的子詞序列。
例如,“obsessiveness”這個單詞可以被BPE轉(zhuǎn)換成以下子詞序列:
- 原始字節(jié)序列:o b s e s s i v e n e s s
- 第一次合并:o b s e Z i v e n e Z (假設(shè)Z代表ss)
- 第二次合并:o b s E i v e n E (假設(shè)E代表e Z)
- 最終子詞序列:o b s E i v e n E(如果沒達(dá)到預(yù)設(shè)的字節(jié)要求,可合并只出現(xiàn)一次的子詞)
當(dāng)然,這只是一個簡單的例子,實(shí)際上BPE會根據(jù)大規(guī)模的語料庫來生成更多更復(fù)雜的子詞。GPT系列使用了不同大小的BPE詞典來存儲所有可能出現(xiàn)的子詞。比如,GPT-3使用了50,257個子詞。
總之,GPT系列采用了基于BPE算法的子詞作為token類型,主要目的是以無損的方式壓縮文本的內(nèi)容,從而以保證語言覆蓋度和計算效率之間達(dá)到一個平衡。接下來,我們要看看如何用子詞來表示和生成文本?
如何用子詞來表示和生成文本?
我們已經(jīng)知道了GPT系列使用了子詞作為token類型,并且通過上文講述的BPE或其他相關(guān)算法我們可以將文本內(nèi)容轉(zhuǎn)換為由子詞組合而成的序列,也就是術(shù)語中分詞過程。
有了子詞序列之后,我們就可以用子詞來表示和生成文本了嗎?答案是否定的。因?yàn)檎Z言模型是基于神經(jīng)網(wǎng)絡(luò)的,而神經(jīng)網(wǎng)絡(luò)只能處理數(shù)值數(shù)據(jù),而不能處理文本數(shù)據(jù)。因此,我們還需要做第二件事情:將子詞序列轉(zhuǎn)換為數(shù)值向量。
這里,我們需要介紹兩個重要的概念:編碼(encoding)和解碼(decoding)。
編碼和解碼
將子詞序列轉(zhuǎn)換為數(shù)值向量的過程叫做編碼(Encoding),它是語言模型的第二步。編碼的目的是將一個個離散且無序的token映射到一個個連續(xù)且有序的向量空間中,從而方便語言模型進(jìn)行計算和學(xué)習(xí)。比如,我們可以用以下的BPE詞典來表示上面的例子:
子詞 | 數(shù)值編碼 | 子詞 | 數(shù)值編碼 |
o | 1 | i | 5 |
b | 2 | v | 6 |
s | 3 | e | 7 |
E | 4 | n | 8 |
那么,編碼和解碼就可以按照以下的規(guī)則進(jìn)行:
- 編碼:根據(jù)BPE算法,將文本分割成最長的匹配子詞,然后根據(jù)BPE詞典,將每個子詞替換成其對應(yīng)的數(shù)值編碼,從而得到一個數(shù)值向量。比如,“obsessiveness”這個單詞可以被編碼為[1, 2, 3, 4, 5,6,7,8,4]這個數(shù)值向量。
- 解碼:根據(jù)BPE詞典,將每個數(shù)值編碼替換成其對應(yīng)的子詞,然后根據(jù)BPE算法,將相鄰的子詞合并成最長的匹配單詞,從而得到一個文本。比如,[1, 2, 3, 4, 5,6,7,8,4]這個數(shù)值向量可以被解碼為“obsessiveness”這個單詞。
通過編碼和解碼,我們就可以實(shí)現(xiàn)文本和子詞序列向量之間的互相轉(zhuǎn)換。但是,這還不夠。我們還需要讓GPT系列能夠理解和生成這些子詞序列。為了做到這一點(diǎn),我們還需要進(jìn)行另外兩個步驟:嵌入(embedding)和預(yù)測(prediction)。
嵌入和預(yù)測
我們已經(jīng)知道,子詞分詞和編解碼,可以把文本轉(zhuǎn)換成數(shù)字,就像我們用數(shù)字來表示電話號碼一樣。但是,這樣的數(shù)字只是一種編碼方式,它們并不能告訴我們子詞之間有什么關(guān)系。比如,我們怎么知道“貓”和“狗”是兩種動物,而“貓”和“桌子”是不同的東西呢?
為了讓GPT系列能夠理解子詞之間的關(guān)系,我們需要進(jìn)行嵌入(embedding)。嵌入就是把每個子詞用一個特征向量來表示,這個特征向量可以反映出子詞的含義、用法、情感等方面的信息。
特征向量的計算算法比較復(fù)雜,但計算原理比較容易理解,GPT只需要基于互聯(lián)網(wǎng)上大量的文本資料,統(tǒng)計出兩個詞語在相鄰/句子/文章中共同出現(xiàn)的概率并通過權(quán)重來匯總計算,就能分析出某個詞語與另外一個詞語的親密度的數(shù)值,并將這個數(shù)值作為特征向量來描述這個詞語。比如,“貓”在互聯(lián)網(wǎng)的資料中與“動物”等詞語一同出現(xiàn)的次數(shù)多,所以“貓”的特征向量可能包含了它是一種動物、有毛發(fā)、喜歡吃魚、會發(fā)出喵喵聲等信息。
通過嵌入,我們就可以把每個子詞看作是高維空間中的一個點(diǎn),而這些點(diǎn)之間的距離和方向,就可以表示出子詞之間的相似度和差異度。比如,“貓”和“狗”的點(diǎn)因?yàn)橥瑸閷櫸铮赡軙容^接近,相對“狗”而言,“貓”和“?!钡狞c(diǎn)可能會比較遠(yuǎn)離。
在完成嵌入后,我們就可以進(jìn)行預(yù)測(prediction)。預(yù)測就是根據(jù)給定的文本,計算出下一個子詞出現(xiàn)的概率。比如,如果給定的文本是“我家有一只”,那么下一個子詞可能是“貓”或者“狗”,而不太可能是“桌子”或者“電視”。這個概率的計算,就是基于特征向量表進(jìn)行的。
通過嵌入和預(yù)測,我們就可以實(shí)現(xiàn)從數(shù)字到文本,或者從文本到數(shù)字的轉(zhuǎn)換。但是,這還不夠。我們還需要讓GPT系列能夠根據(jù)給定的文本來生成新的文本。為了做到這一點(diǎn),我們還需要進(jìn)行最后一個步驟:生成(generation)。
生成與自回歸
生成是指根據(jù)給定的文本來生成新的文本的過程。生成可以分為兩種模式:自回歸(autoregressive)和自編碼(autoencoding),GPT系列主要采用了自回歸模式。
那么什么是自回歸?簡單理解就是想象這么一副畫面:
一個人在拍連環(huán)畫,每一頁連環(huán)畫都是前一張連環(huán)畫的延續(xù)。也就是說,人需要看前一張畫乃至前多張畫才能知道該畫什么內(nèi)容。類似地,自回歸模型中的每個時間點(diǎn)都需要前一個時間點(diǎn)的信息才能計算出當(dāng)前時間點(diǎn)的輸出值。就像拍連環(huán)畫一樣,自回歸模型中各個時間點(diǎn)之間存在著緊密的聯(lián)系和依賴關(guān)系,這種聯(lián)系在預(yù)測時間序列數(shù)據(jù)時非常有用。
例如,“I love you”這個句子可以被GPT系列生成為以下的文本:
- I love you more than anything in the world.
- I love you and I miss you so much.
- I love you, but I can't be with you.
總之,GPT系列使用了子詞、數(shù)值向量、實(shí)數(shù)向量和Transformer模型來表示和生成文本。通過編碼、解碼、嵌入、預(yù)測和生成等步驟,它可以實(shí)現(xiàn)從文本到文本的轉(zhuǎn)換。
整體過程可以參考GPT官方的示意圖,如下:
總結(jié)
今天,我們學(xué)習(xí)了GPT系列是如何用子詞來表示和生成文本的。我們了解了token相關(guān)的概念和文本生成的步驟,通過這些概念和步驟,我們可以理解GPT系列是如何從文本到文本的轉(zhuǎn)換。
本文轉(zhuǎn)載自 ??AI小智??,作者: AI小智
