ChatGPT 的內(nèi)部原理
認(rèn)為必須將其視為一項(xiàng)(可能非常驚人的)科學(xué)發(fā)現(xiàn):在像 ChatGPT這樣的神經(jīng)網(wǎng)絡(luò)中,能以某種方式捕捉到人類大腦在生成語(yǔ)言時(shí)所做事情的本質(zhì)。
作者 | [美] 斯蒂芬·沃爾弗拉姆
來(lái)源 | 《這就是ChatGPT》
從根本上說(shuō),ChatGPT是一個(gè)龐大的神經(jīng)網(wǎng)絡(luò)—GPT-3 擁有1750億個(gè)權(quán)重。它在許多方面非常像我們討論過(guò)的其他神經(jīng)網(wǎng)絡(luò),只不過(guò)是一個(gè)特別為處理語(yǔ)言而設(shè)置的神經(jīng)網(wǎng)絡(luò)。它最顯著的特點(diǎn)是一個(gè)稱為Transformer 的神經(jīng)網(wǎng)絡(luò)架構(gòu)。
在前面討論的神經(jīng)網(wǎng)絡(luò)中,任何給定層的每個(gè)神經(jīng)元基本上都與上一層的每個(gè)神經(jīng)元相連(起碼有一些權(quán)重)。但是,如果處理的數(shù)據(jù)具有特定的已知結(jié)構(gòu),則這種全連接網(wǎng)絡(luò)就(可能)大材小用了。因此,以圖像處理的早期階段為例,通常使用所謂的卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural net 或 convnet),其中的神經(jīng)元被有效地布局在類似于圖像像素的網(wǎng)格上,并且僅與在網(wǎng)格上相鄰的神經(jīng)元相連。
Transformer 的思想是,為組成一段文本的標(biāo)記序列做與此相似的事情。但是,Transformer 不是僅僅定義了序列中可以連接的固定區(qū)域,而是引入了“注意力”的概念—即更多地“關(guān)注”序列的某些部分,而不是其他部分。也許在將來(lái)的某一天,可以啟動(dòng)一個(gè)通用神經(jīng)網(wǎng)絡(luò)并通過(guò)訓(xùn)練來(lái)完成所有的定制工作。但至少目前來(lái)看,在實(shí)踐中將事物“模塊化”似乎是至關(guān)重要的—就像Transformer 所做的那樣,也可能是我們的大腦所做的那樣。
ChatGPT(或者說(shuō)它基于的 GPT-3 網(wǎng)絡(luò))到底是在做什么呢?它的總體目標(biāo)是,根據(jù)所接受的訓(xùn)練(查看來(lái)自互聯(lián)網(wǎng)的數(shù)十億頁(yè)文本,等等),以“合理”的方式續(xù)寫文本。所以在任意給定時(shí)刻,它都有一定量的文本,而目標(biāo)是為要添加的下一個(gè)標(biāo)記做出適當(dāng)?shù)倪x擇。
它的操作分為三個(gè)基本階段。第一階段,它獲取與目前的文本相對(duì)應(yīng)的標(biāo)記序列,并找到表示這些標(biāo)記的一個(gè)嵌入(即由數(shù)組成的數(shù)組)。第二階段,它以“標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò)的方式”對(duì)此嵌入進(jìn)行操作,值“像漣漪一樣依次通過(guò)”網(wǎng)絡(luò)中的各層,從而產(chǎn)生一個(gè)新的嵌入(即一個(gè)新的數(shù)組)。第三階段,它獲取此數(shù)組的最后一部分,并據(jù)此生成包含約 50 000 個(gè)值的數(shù)組,這些值就成了各個(gè)可能的下一個(gè)標(biāo)記的概率。(沒(méi)錯(cuò),使用的標(biāo)記數(shù)量恰好與英語(yǔ)常用詞的數(shù)量相當(dāng),盡管其中只有約 3000 個(gè)標(biāo)記是完整的詞,其余的則是片段。)
關(guān)鍵是,這條流水線的每個(gè)部分都由一個(gè)神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn),其權(quán)重是通過(guò)對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行端到端的訓(xùn)練確定的。換句話說(shuō),除了整體架構(gòu),實(shí)際上沒(méi)有任何細(xì)節(jié)是有“明確設(shè)計(jì)”的,一切都是從訓(xùn)練數(shù)據(jù)中“學(xué)習(xí)”來(lái)的。
然而,架構(gòu)設(shè)置中存在很多細(xì)節(jié),反映了各種經(jīng)驗(yàn)和神經(jīng)網(wǎng)絡(luò)的學(xué)問(wèn)。盡管會(huì)變得很復(fù)雜,但我認(rèn)為談?wù)撘恍┘?xì)節(jié)是有用的,至少有助于了解構(gòu)建 ChatGPT 需要做多少工作。
首先是嵌入模塊。以下是 GPT-2 的 Wolfram 語(yǔ)言示意圖。

輸入是一個(gè)包含 n 個(gè)(由整數(shù) 1 到大約 50 000 表示的)標(biāo)記的向量。每個(gè)標(biāo)記都(通過(guò)一個(gè)單層神經(jīng)網(wǎng)絡(luò))被轉(zhuǎn)換為一個(gè)嵌入向量(在 GPT-2 中長(zhǎng)度為 768,在 ChatGPT 的 GPT-3 中長(zhǎng)度為 12 288)。同時(shí),還有一條“二級(jí)路徑”,它接收標(biāo)記的(整數(shù))位置序列,并根據(jù)這些整數(shù)創(chuàng)建另一個(gè)嵌入向量。最后,將標(biāo)記值和標(biāo)記位置的嵌入向量相加,產(chǎn)生嵌入模塊的最終嵌入向量序列。
為什么只是將標(biāo)記值和標(biāo)記位置的嵌入向量相加呢?我不認(rèn)為有什么特別的科學(xué)依據(jù)。只是因?yàn)閲L試了各種不同的方法,而這種方法似乎行得通。此外,神經(jīng)網(wǎng)絡(luò)的學(xué)問(wèn)告訴我們,(在某種意義上)只要我們的設(shè)置“大致正確”,通常就可以通過(guò)足夠的訓(xùn)練來(lái)確定細(xì)節(jié),而不需要真正“在工程層面上理解”神經(jīng)網(wǎng)絡(luò)是如何配置自己的。
嵌入模塊對(duì)字符串“hello hello hello hello hello hello hello hello hello hello bye bye bye bye bye bye bye bye bye bye”所做的操作如下所示。

(在上圖的第一個(gè)數(shù)組中)每個(gè)標(biāo)記的嵌入向量元素都在圖中縱向顯示,而從左往右看,首先是一系列 hello 嵌入,然后是一系列bye 嵌入。上面的第二個(gè)數(shù)組是位置嵌入,它看起來(lái)有些隨機(jī)的結(jié)構(gòu)只是(這里是在 GPT-2 中)“碰巧學(xué)到”的。
在嵌入模塊之后,就是 Transformer 的“主要事件”了:一系列所謂的“注意力塊”(GPT-2 有 12 個(gè),ChatGPT 的 GPT-3 有 96 個(gè))。整個(gè)過(guò)程非常復(fù)雜,讓人想起難以理解的大型工程系統(tǒng)或者生物系統(tǒng)。以下是(GPT-2 中)單個(gè)“注意力塊”的示意圖。

在每個(gè)這樣的注意力塊中,都有一組“注意力頭”(GPT-2 有12個(gè),ChatGPT 的 GPT-3 有 96 個(gè))—每個(gè)都獨(dú)立地在嵌入向量的不同值塊上進(jìn)行操作。(我們不知道為什么最好將嵌入向量分成不同的部分,也不知道不同的部分“意味”著什么。這只是那些“被發(fā)現(xiàn)奏效”的事情之一。)
注意力頭是做什么的呢?它們基本上是一種在標(biāo)記序列(即目前已經(jīng)生成的文本)中進(jìn)行“回顧”的方式,能以一種有用的形式“打包過(guò)去的內(nèi)容”,以便找到下一個(gè)標(biāo)記。在“概率從何而來(lái)”一節(jié)中,我們介紹了使用二元詞的概率來(lái)根據(jù)上一個(gè)詞選擇下一個(gè)詞。Transformer 中的“注意力”機(jī)制所做的是允許“關(guān)注”更早的詞,因此可能捕捉到(例如)動(dòng)詞可以如何被聯(lián)系到出現(xiàn)在句子中很多詞之前的名詞。
更詳細(xì)地說(shuō),注意力頭所做的是,使用一定的權(quán)重重新加權(quán)組合與不同標(biāo)記相關(guān)聯(lián)的嵌入向量中的塊。例如,對(duì)于上面的“hello,bye”字符串,(GPT-2 中)第一個(gè)注意力塊中的 12 個(gè)注意力頭具有以下(“回顧到標(biāo)記序列開(kāi)頭”的)“權(quán)重重組”模式。

經(jīng)過(guò)注意力頭的處理,得到的“重新加權(quán)的嵌入向量”(在 GPT-2中長(zhǎng)度為 768,在 ChatGPT 的 GPT-3 中長(zhǎng)度為 12 288)將被傳遞通過(guò)標(biāo)準(zhǔn)的“全連接”神經(jīng)網(wǎng)絡(luò)層。雖然很難掌握這一層的作用,但是可以看看它(這里是在 GPT-2 中)使用的 768×768 權(quán)重矩陣。

(對(duì)上圖進(jìn)行)64×64 的滑動(dòng)平均處理,一些(隨機(jī)游走式的)結(jié)構(gòu)開(kāi)始顯現(xiàn)。

是什么決定了這種結(jié)構(gòu)?說(shuō)到底,可能是對(duì)人類語(yǔ)言特征的一些“神經(jīng)網(wǎng)絡(luò)編碼”。但是到目前為止,這些特征到底是什么仍是未知的。實(shí)際上,我們正在“打開(kāi) ChatGPT(或者至少是 GPT-2)的大腦”,并發(fā)現(xiàn)里面很復(fù)雜、難以理解—盡管它最終產(chǎn)生了可識(shí)別的人類語(yǔ)言。
經(jīng)過(guò)一個(gè)注意力塊后,我們得到了一個(gè)新的嵌入向量,然后讓它依次通過(guò)其他的注意力塊(GPT-2 中共有 12 個(gè),GPT-3 中共有 96個(gè))。每個(gè)注意力塊都有自己特定的“注意力”模式和“全連接”權(quán)重。這里是 GPT-2 對(duì)于“hello, bye”輸入的注意力權(quán)重序列,用于第一個(gè)注意力頭。

全連接層的(移動(dòng)平均)“矩陣”如下所示。

奇怪的是,盡管不同注意力塊中的“權(quán)重矩陣”看起來(lái)非常相似,但權(quán)重大小的分布可能會(huì)有所不同(而且并不總是服從高斯分布)。

在經(jīng)過(guò)所有這些注意力塊后,Transformer 的實(shí)際效果是什么?本質(zhì)上,它將標(biāo)記序列的原始嵌入集合轉(zhuǎn)換為最終集合。ChatGPT 的特定工作方式是,選擇此集合中的最后一個(gè)嵌入,并對(duì)其進(jìn)行“解碼”,以生成應(yīng)該出現(xiàn)的下一個(gè)標(biāo)記的概率列表。
以上就是對(duì) ChatGPT 內(nèi)部原理的概述。它雖然(由于許多難免有些隨意的“工程選擇”)可能看起來(lái)很復(fù)雜,但實(shí)際上涉及的最終元素非常簡(jiǎn)單。因?yàn)槲覀冏罱K處理的只是由“人工神經(jīng)元”構(gòu)成的神經(jīng)網(wǎng)絡(luò),而每個(gè)神經(jīng)元執(zhí)行的只是將一組數(shù)值輸入與一定的權(quán)重相結(jié)合的簡(jiǎn)單操作。
ChatGPT 的原始輸入是一個(gè)由數(shù)組成的數(shù)組(到目前為止標(biāo)記的嵌入向量)。當(dāng) ChatGPT“運(yùn)行”以產(chǎn)生新標(biāo)記時(shí),這些數(shù)就會(huì)“依次通過(guò)”神經(jīng)網(wǎng)絡(luò)的各層,而每個(gè)神經(jīng)元都會(huì)“做好本職工作”并將結(jié)果傳遞給下一層的神經(jīng)元。沒(méi)有循環(huán)和“回顧”。一切都是在網(wǎng)絡(luò)中“向前饋送”的。
這是與典型的計(jì)算系統(tǒng)(如圖靈機(jī))完全不同的設(shè)置—在這里,結(jié)果不會(huì)被同一個(gè)計(jì)算元素“反復(fù)處理”。至少在生成給定的輸出標(biāo)記時(shí),每個(gè)計(jì)算元素(神經(jīng)元)僅使用了一次。
但是在某種意義上,即使在 ChatGPT 中,仍然存在一個(gè)重復(fù)使用計(jì)算元素的“外部循環(huán)”。因?yàn)楫?dāng) ChatGPT 要生成一個(gè)新的標(biāo)記時(shí),它總是“讀取”(即獲取為輸入)之前的整個(gè)標(biāo)記序列,包括ChatGPT 自己先前“寫入”的標(biāo)記。我們可以認(rèn)為這種設(shè)置意味著ChatGPT 確實(shí),至少在其最外層,包含一個(gè)“反饋循環(huán)”,盡管其中的每次迭代都明確顯示為它所生成文本中的一個(gè)標(biāo)記。
讓我們回到 ChatGPT 的核心:神經(jīng)網(wǎng)絡(luò)被反復(fù)用于生成每個(gè)標(biāo)記。在某種程度上,它非常簡(jiǎn)單:就是完全相同的人工神經(jīng)元的一個(gè)集合。網(wǎng)絡(luò)的某些部分僅由(“全連接”的)神經(jīng)元層組成,其中給定層的每個(gè)神經(jīng)元都與上一層的每個(gè)神經(jīng)元(以某種權(quán)重)相連。但是由于特別的 Transformer 架構(gòu),ChatGPT 的一些部分具有其他的結(jié)構(gòu),其中僅連接不同層的特定神經(jīng)元。(當(dāng)然,仍然可以說(shuō)“所有神經(jīng)元都連接在一起”,但有些連接的權(quán)重為零。)
此外,ChatGPT 中神經(jīng)網(wǎng)絡(luò)的有些方面并不能被順理成章地認(rèn)為只由“同質(zhì)”層組成。例如,(正如本節(jié)中單個(gè)“注意力塊”的示意圖所示)在注意力塊內(nèi)有一些對(duì)傳入的數(shù)據(jù)“制作多個(gè)副本”的地方,每個(gè)副本都會(huì)通過(guò)不同的“處理路徑”,可能涉及不同數(shù)量的層,然后才被重新組合。雖然這可能簡(jiǎn)便地表示了正在發(fā)生的事情,但至少原則上總是可以將事實(shí)考慮為“密集填充”各層,只是有一些權(quán)重為零。
看一下 ChatGPT 最 長(zhǎng) 的 路 徑, 會(huì) 發(fā) 現(xiàn) 大 約 有 400 個(gè)( 核 心 )層—在某種程度上看來(lái)并不是很多。但是它們包括數(shù)百萬(wàn)個(gè)神經(jīng)元,總共有 1750 億個(gè)連接,因此有 1750 億個(gè)權(quán)重。需要認(rèn)識(shí)到的一件事是,ChatGPT 每生成一個(gè)新的標(biāo)記,都必須進(jìn)行一次包括所有這些權(quán)重在內(nèi)的計(jì)算。在實(shí)現(xiàn)上,這些計(jì)算可以“按層”組織成高度并行的數(shù)組操作,方便地在 GPU 上完成。但是對(duì)于每個(gè)產(chǎn)生的標(biāo)記,仍然需要進(jìn)行 1750 億次計(jì)算(并在最后進(jìn)行一些額外的計(jì)算)—因此,不難理解使用 ChatGPT 生成一段長(zhǎng)文本需要一些時(shí)間。
值得注意的是,所有這些操作—盡管各自都很簡(jiǎn)單—可以一起出色地完成生成文本的“類人”工作。必須再次強(qiáng)調(diào),(至少就我們目前所知)沒(méi)有“理論上的終極原因”可以解釋為什么類似于這樣的東西能夠起作用。事實(shí)上,正如我們將討論的那樣,我認(rèn)為必須將其視為一項(xiàng)(可能非常驚人的)科學(xué)發(fā)現(xiàn):在像 ChatGPT這樣的神經(jīng)網(wǎng)絡(luò)中,能以某種方式捕捉到人類大腦在生成語(yǔ)言時(shí)所做事情的本質(zhì)。
推薦閱讀
