斯蒂芬·沃爾夫勒姆(Stephen Wolfram)是一位著名的科學(xué)家、企業(yè)家和作家,被譽為計算機科學(xué)、物理學(xué)和數(shù)學(xué)等領(lǐng)域的重要人物之一。他是著名的計算機程序“Mathematica”和“Wolfram Alpha”的創(chuàng)始人,這些程序在科學(xué)計算和知識處理方面廣受歡迎。他還是“新科學(xué)”(New Kind of Science)一書的作者,這本書重新定義了許多科學(xué)領(lǐng)域的傳統(tǒng)概念,是一本極具影響力的著作。沃爾夫勒姆在科學(xué)、技術(shù)和商業(yè)方面的杰出貢獻(xiàn)使他成為了當(dāng)今世界最具影響力的思想領(lǐng)袖之一。
ChatGPT 能夠自動生成類似人類寫作的文本,這是非常驚人和出乎意料的。但它是如何做到的?為什么它能夠如此成功地生成我們認(rèn)為有意義的文本?在這里,我的目的是概述 ChatGPT 內(nèi)部正在發(fā)生的事情,然后探討為什么它能夠如此出色地產(chǎn)生有意義的文本。首先,我要解釋的是,ChatGPT 始終基本上是在嘗試產(chǎn)生“合理的延續(xù)”任何文本,其中“合理”的意思是“在人們看到了億萬個網(wǎng)頁等內(nèi)容后,可能會寫出的東西”。
所以假設(shè)我們有文本“AI 最好的一點在于它的能力是”。想象一下掃描億萬頁人類寫作的文本(比如在網(wǎng)頁和數(shù)字化圖書中),找到所有這個文本的實例,然后看下一個單詞出現(xiàn)的頻率是多少。ChatGPT 實際上做的事情有些類似,只不過它不是看字面上的文本,而是在某種意義上尋找“意義匹配”的內(nèi)容。但最終的結(jié)果是它會生成一個排序過的單詞列表,這些單詞可能是接下來的單詞,以及與之對應(yīng)的“概率”:
ChatGPT 可以自動生成看起來像人類寫作的文本是非常了不起且出乎意料的。但它是如何做到的呢?為什么它能夠如此成功地產(chǎn)生我們可能認(rèn)為是有意義的文本?我的目的是大致概述 ChatGPT 內(nèi)部的運作方式,然后探討為什么它能夠如此出色地產(chǎn)生文本。我應(yīng)該首先說明,我將聚焦于 ChatGPT 內(nèi)部的總體情況,雖然我將提到一些工程細(xì)節(jié),但我不會深入探討它們。 (而我所說的要點同樣適用于其他當(dāng)前的“大型語言模型” [LLM],并不僅限于 ChatGPT。)
首先要解釋的是,ChatGPT 始終在基本上試圖生成一個“合理的延續(xù)”,這個“合理的延續(xù)”是指“在看到數(shù)十億個網(wǎng)頁等上的人類編寫的文本后,人們可能會寫什么”。
所以假設(shè)我們有文本“AI 最好的事情是它的能力”,想象一下掃描數(shù)十億個人類編寫的文本(例如網(wǎng)絡(luò)和數(shù)字化圖書)并找到所有這些文本的實例,然后看看接下來出現(xiàn)的詞是什么,出現(xiàn)的比例是多少。ChatGPT 實際上做了類似的事情,但是(正如我將解釋的那樣),它并沒有查看文字,而是查找在某種意義上“匹配的意思”的東西。但最終的結(jié)果是它會產(chǎn)生一個單詞可能的排名列表,以及相應(yīng)的“概率”:
而令人驚訝的是,當(dāng) ChatGPT 像寫一篇論文這樣的事情時,它實際上就是在反復(fù)地問“在現(xiàn)有的文本的基礎(chǔ)上,下一個詞應(yīng)該是什么?”-每次都添加一個詞(更精確地說,我將解釋,它添加的是一個“標(biāo)記”,可能只是一個詞的一部分,這就是為什么它有時可以“編造新單詞”的原因)。
當(dāng)ChatGPT像寫文章這樣做事情時,它實際上只是一遍又一遍地問“在給定當(dāng)前文本的情況下,下一個詞應(yīng)該是什么?”——并且每次都添加一個單詞。更準(zhǔn)確地說,它添加一個“標(biāo)記”,這可能只是一個單詞的一部分,這就是為什么它有時可以“編造新單詞”的原因。
但是,在每一步中,它都會獲得一組具有概率的單詞列表。但是它應(yīng)該選擇哪一個單詞實際上添加到它正在寫的文章(或任何其他東西)中呢?你可能會認(rèn)為應(yīng)該選擇“最高排名”的單詞(即分配給最高“概率”的單詞)。但這就是一點點巫術(shù)開始潛入的地方。因為由于某種原因——也許有一天我們會有科學(xué)風(fēng)格的理解——如果我們總是選擇最高排名的單詞,我們通常會得到一個非?!捌降钡奈恼拢雌饋韽奈础罢宫F(xiàn)任何創(chuàng)造力”(甚至有時會重復(fù)一字不差)。但是,如果我們有時(隨機)選擇較低排名的單詞,我們就會得到一個“更有趣”的文章。
這里的隨機性意味著,如果我們多次使用相同的提示,每次得到的文章可能都不同。與巫術(shù)的概念保持一致,有一個特定的所謂“溫度”參數(shù),它確定使用低排名詞語的頻率,對于文章生成而言,溫度為0.8似乎最好。(值得強調(diào)的是,這里并沒有使用任何“理論”;這只是實踐中發(fā)現(xiàn)的可行方法。例如,“溫度”的概念之所以存在是因為使用了統(tǒng)計物理中熟悉的指數(shù)分布,但至少就我們所知,它沒有“物理”聯(lián)系。)
在繼續(xù)之前,我應(yīng)該解釋一下,為了闡述,我大多數(shù)情況下不會使用ChatGPT中的完整系統(tǒng);相反,我通常會使用一個更簡單的GPT-2系統(tǒng),它有一個很好的特點,就是它足夠小,可以在標(biāo)準(zhǔn)臺式計算機上運行。因此,對于我展示的幾乎所有內(nèi)容,我都能夠包含明確的Wolfram語言代碼,您可以立即在計算機上運行它。(單擊此處的任何圖片以復(fù)制其后面的代碼。)
例如,下面是如何獲得上面概率表格的代碼。首先,我們必須檢索底層的“語言模型”神經(jīng)網(wǎng)絡(luò):
稍后,我們將會深入研究這個神經(jīng)網(wǎng)絡(luò),并討論它的工作原理。但是現(xiàn)在,我們可以將這個“網(wǎng)絡(luò)模型”視為一個黑盒子,將其應(yīng)用于我們迄今為止的文本,并詢問該模型所說的應(yīng)該跟隨的前五個概率最高的單詞是什么:
這將結(jié)果轉(zhuǎn)換為一個格式化的“數(shù)據(jù)集”:
這里展示了重復(fù)“應(yīng)用模型”的結(jié)果——在每一步中添加具有最高概率的單詞(在這段代碼中指定為模型的“決策”):
如果繼續(xù)進行下去會發(fā)生什么呢?在這種“零溫度”的情況下,輸出很快就變得混亂和重復(fù):
但如果不總是選擇“最高排名”的單詞,而是有時隨機選擇“非最高排名”的單詞(其“隨機性”對應(yīng)于“溫度”0.8),會發(fā)生什么呢?同樣,可以構(gòu)建文本:
每次這樣做時,都會做出不同的隨機選擇,文本也會不同,就像這些5個例子一樣:
值得指出的是,即使在第一步,也有很多可能的“下一個詞”可以選擇(在溫度0.8下),盡管它們的概率很快下降(是的,這個對數(shù)-對數(shù)圖上的直線對應(yīng)于n-1“冪律”衰減,這是語言的一般統(tǒng)計特征):
那么如果繼續(xù)生成更多文本會發(fā)生什么呢?這里展示了一個隨機的例子。雖然比純粹選取概率最高的詞(零溫度)要好,但結(jié)果仍然有點奇怪:
這是用最簡單的 GPT-2 模型(來自 2019 年)完成的。使用更新和更大的 GPT-3 模型,結(jié)果更好。下面是使用相同“提示”生成的單詞(零溫度)文本,但使用最大的 GPT-3 模型:
以下是“溫度0.8”的一個隨機示例:
好的,ChatGPT總是基于概率選擇下一個單詞。但是這些概率從哪里來呢?讓我們從一個簡單的問題開始。讓我們考慮一次生成一個英文字母(而不是單詞)的英文文本。我們?nèi)绾斡嬎忝總€字母的概率?
我們可以做的非常簡單的事情是只是取一個英文文本樣本,然后計算不同字母在其中出現(xiàn)的頻率。因此,例如,下面計算的是“cats”維基百科文章中的字母:
以下是“dogs”的統(tǒng)計結(jié)果:
結(jié)果相似,但并不完全相同(“o”在“dogs”文章中可能更常見,因為畢竟它出現(xiàn)在“dog”這個單詞中)。然而,如果我們采樣足夠大量的英文文本,我們可以期望最終得到至少相當(dāng)一致的結(jié)果:
以下是我們使用這些概率生成一系列字母時的示例:
我們可以通過加入空格作為帶有一定概率的字母來將其分解為“單詞”:
我們可以通過讓“單詞長度”的分布與英語中的分布相一致,來更好地劃分“單詞”:
我們在這里沒有得到任何“實際單詞”,但結(jié)果看起來略微好一些。為了更進一步,我們需要做的不僅僅是隨機挑選每個字母。例如,我們知道如果有一個“q”,下一個字母基本上必須是“u”。
這是字母本身的概率的繪圖:
以下是一張圖,它展示了在典型的英文文本中,兩個字母(“2元組”)的概率。頁面上顯示可能的第一個字母,頁面下面顯示第二個字母:
現(xiàn)在我們可以每次生成兩個字母,并使用這些“2元組”的概率來生成單詞。以下是結(jié)果的一個示例,其中包含一些“實際單詞”:
如果有足夠多的英文文本,我們不僅可以獲得單個字母或字母對(2-gram)的概率的相當(dāng)好的估計,而且還可以獲得更長字母運行的概率。如果我們使用越來越長的n-gram概率生成“隨機單詞”,我們會發(fā)現(xiàn)它們變得越來越“真實”:
但是現(xiàn)在假設(shè)——更或多或少像ChatGPT那樣——我們處理的是整個單詞,而不是字母。英語中大約有40,000個常用單詞。通過查看大量的英文文本(例如幾百億個單詞的幾百萬本書),我們可以估算出每個單詞的出現(xiàn)頻率。利用這個,我們可以開始生成“句子”,其中每個單詞都是獨立地隨機選擇的,其出現(xiàn)概率與在語料庫中出現(xiàn)的概率相同。下面是我們得到的樣本:
不出意外的是,這些句子沒有意義。那么我們該如何做得更好呢?就像處理字母時一樣,我們可以開始考慮不僅單個詞的概率,還要考慮詞對或更長的n-gram詞組的概率。對于詞對,以下是5個例子,所有情況都是從單詞“cat”開始:
這看起來變得稍微“更合理了”。我們可以想象,如果我們能夠使用足夠長的 n-gram,我們基本上會“得到一個 ChatGPT”,也就是說,我們將獲得一個能夠生成帶有“正確的整體文章概率”的長度為一篇論文的單詞序列。但是問題在于:迄今為止,從寫過的英文文本中甚至無法接近地獲得這些概率。
在網(wǎng)絡(luò)爬行中可能有幾百億個單詞;在數(shù)字化的書籍中可能還有另外一百億個單詞。但是,對于 40,000 個常見單詞,即使是可能的 2-gram 數(shù)量已經(jīng)達(dá)到 16 億,而可能的 3-gram 數(shù)量是 60 兆。因此,我們無法從文本中估計所有這些可能性的概率。而當(dāng)我們到達(dá) 20 個單詞的“文章片段”時,可能性的數(shù)量已經(jīng)超過了宇宙中的粒子數(shù)量,因此從某種意義上說,它們永遠(yuǎn)不可能全部被寫下。
那我們該怎么辦呢?大的思路是建立一個模型,讓我們能夠估計序列出現(xiàn)的概率——即使我們從未在我們查看的文本語料庫中顯式地看到這些序列。而 ChatGPT 的核心正是一個被稱為“大型語言模型”(LLM)的模型,它被構(gòu)建成能夠很好地估計這些概率。
假設(shè)你想知道(就像加利略在16世紀(jì)晚期那樣)從比薩斜塔的每層樓上掉下來的炮彈需要多長時間才能觸地。好吧,你可以在每種情況下測量它并制作一個結(jié)果表。或者你可以做理論科學(xué)的本質(zhì):建立一個模型,提供一種計算答案的方法,而不僅僅是測量和記住每個情況。
讓我們假設(shè)我們有(有些理想化的)數(shù)據(jù),用于記錄炮彈從各個樓層掉落所需的時間:
假設(shè)我們想知道從我們沒有實際數(shù)據(jù)的樓層落下的炮彈需要多長時間才能落地。在這種情況下,我們可以使用已知的物理定律來計算。但是,假設(shè)我們只有數(shù)據(jù),而不知道什么樣的基本定律支配著它。那么我們可能會做出一個數(shù)學(xué)猜測,比如也許我們應(yīng)該使用一條直線作為模型:
我們可以選擇不同的直線,但這是平均最接近我們所給數(shù)據(jù)的直線。從這條直線我們可以估算任何一層落地所需的時間。
我們怎么知道在這里嘗試使用一條直線呢?在某種程度上我們不知道。這只是一種數(shù)學(xué)上的簡單假設(shè),我們習(xí)慣于許多我們所測量的數(shù)據(jù)都可以用數(shù)學(xué)上的簡單方法來擬合。我們可以嘗試更復(fù)雜的數(shù)學(xué)方法,比如 a+bx+cx2,然后在這種情況下,我們可以得到更好的結(jié)果:
事情有時會變得相當(dāng)糟糕。比如,這里是用 a + b/x + c sin(x) 能得到的最佳結(jié)果:
值得理解的是,沒有所謂“無模型的模型”。你使用的任何模型都有某種特定的基礎(chǔ)結(jié)構(gòu),然后有一定的“旋鈕可以轉(zhuǎn)動”(即您可以設(shè)置的參數(shù))以適應(yīng)您的數(shù)據(jù)。在ChatGPT的情況下,使用了許多這樣的“旋鈕” - 實際上有1750億個。
但是令人驚奇的是,ChatGPT的基本結(jié)構(gòu) - “僅”使用這么多的參數(shù) - 足以制作出一個計算下一個單詞概率“足夠好”的模型,從而為我們提供了合理長度的文章。
上面的例子涉及到為來自簡單物理學(xué)的數(shù)值數(shù)據(jù)制定模型,幾個世紀(jì)以來我們已經(jīng)知道“簡單的數(shù)學(xué)適用”。但是對于ChatGPT,我們必須制定一個模型,該模型可計算人類大腦產(chǎn)生的人類語言文本的下一個單詞的概率。對于這樣的任務(wù),我們(至少目前)沒有類似于“簡單數(shù)學(xué)”的東西。那么,這種模型可能是什么樣子呢?
在談?wù)撜Z言之前,讓我們談?wù)劻硪粋€像人一樣的任務(wù):識別圖像。作為一個簡單的例子,讓我們考慮數(shù)字的圖像(是的,這是一個經(jīng)典的機器學(xué)習(xí)示例):
我們可以做的一件事是獲取每個數(shù)字的一堆示例圖像:
我們可以通過與我們擁有的樣本進行像素對像素的比較來確定我們所輸入的圖像是否對應(yīng)于特定的數(shù)字。但是,作為人類,我們似乎做得更好——因為我們可以識別數(shù)字,即使它們是手寫的,并且有各種修改和扭曲。
當(dāng)我們?yōu)樯厦娴臄?shù)值數(shù)據(jù)建立模型時,我們能夠?qū)⑽覀儷@得的數(shù)值 x 視為變量,并為特定的 a 和 b 計算 a + b x。那么,如果我們將每個像素的灰度值視為某個變量 xi,是否存在一個關(guān)于所有這些變量的函數(shù),當(dāng)求值時告訴我們圖像是哪個數(shù)字?事實證明,可以構(gòu)建這樣一個函數(shù)。不出所料,它并不特別簡單。一個典型的例子可能涉及大約五十萬個數(shù)學(xué)運算。
但最終的結(jié)果是,如果我們將圖像的像素值集合饋入該函數(shù),那么我們將得到指定圖像數(shù)字的數(shù)字。稍后,我們將討論如何構(gòu)建這樣的函數(shù)和神經(jīng)網(wǎng)絡(luò)的概念。但現(xiàn)在讓我們將該函數(shù)視為黑盒子,我們將手寫數(shù)字的圖像(作為像素值的數(shù)組)輸入該函數(shù),然后得到它們所對應(yīng)的數(shù)字。
但是這里真正發(fā)生了什么?假設(shè)我們逐漸模糊一個數(shù)字。在短時間內(nèi),我們的函數(shù)仍然“識別”它,這里是一個“2”。但很快它“迷失了”,開始給出“錯誤”的結(jié)果:
但我們?yōu)槭裁磿f這是“錯誤”的結(jié)果呢?在這種情況下,我們知道通過模糊一張“2”得到了所有的圖像。但如果我們的目標(biāo)是創(chuàng)建一個能夠模擬人類在識別圖像方面的模型,那么真正需要問的問題是,如果一個人看到了這些模糊的圖像,并不知道它來自哪里,他會怎么做。
如果我們的函數(shù)的結(jié)果通常與人類的判斷相一致,那么我們就有了一個“好模型”。對于這樣一個圖像識別任務(wù),我們現(xiàn)在基本上知道如何構(gòu)建這樣的函數(shù),這是一個非常不平凡的科學(xué)事實。
我們能“數(shù)學(xué)證明”它們工作嗎?很遺憾,不能。因為為了做到這一點,我們必須有一個關(guān)于人類是如何工作的數(shù)學(xué)理論。拿這個“2”的圖像,改變一些像素。我們可以想象,只要有幾個像素“不在原位”,我們?nèi)詰?yīng)該將圖像視為“2”。但是這個界限應(yīng)該在哪里?這是一個人類視覺感知的問題。是的,答案對于蜜蜂或章魚可能會有所不同,而對于假設(shè)的外星人來說則可能完全不同。
好的,那么我們用于圖像識別等任務(wù)的典型模型實際上是如何工作的呢?目前最受歡迎和成功的方法使用神經(jīng)網(wǎng)絡(luò)。神經(jīng)網(wǎng)絡(luò)的發(fā)明可以追溯到1940年代,其形式與現(xiàn)在的使用方式非常接近,可以看作是關(guān)于大腦如何工作的簡單理想化。
人類大腦中有約1000億個神經(jīng)元(神經(jīng)細(xì)胞),每個神經(jīng)元每秒鐘可以產(chǎn)生最多1000次的電脈沖。神經(jīng)元通過一種復(fù)雜的網(wǎng)絡(luò)連接在一起,每個神經(jīng)元都有樹枝狀的分支,使其能夠?qū)㈦娦盘杺鬟f到可能有數(shù)千個神經(jīng)元的其他神經(jīng)元。在一個粗略的近似中,任何給定神經(jīng)元在給定時刻是否產(chǎn)生電脈沖取決于它從其他神經(jīng)元接收到的脈沖,不同的連接具有不同的“權(quán)重”。
當(dāng)我們“看到一張圖片”時,發(fā)生的事情是當(dāng)來自圖像的光子落在我們眼睛后面的“光感受器”細(xì)胞上時,它們會在神經(jīng)元中產(chǎn)生電信號。這些神經(jīng)元與其他神經(jīng)元相連,最終信號通過一整個神經(jīng)元層序列。在這個過程中,我們“識別”了圖像,最終“形成了”我們“看到一個2”的想法(也許最終做出像“念出'兩’這個詞”這樣的動作)。
上一節(jié)中的“黑匣子”函數(shù)是這樣一個神經(jīng)網(wǎng)絡(luò)的“數(shù)學(xué)化”版本。它恰好有11層(盡管只有4個“核心層”):
這種神經(jīng)網(wǎng)絡(luò)并沒有什么特別“理論推導(dǎo)”的內(nèi)容;它只是一個工程上的構(gòu)造,并在1998年被發(fā)現(xiàn)可以工作。(當(dāng)然,這與我們可能會描述我們的大腦是如何通過生物進化過程產(chǎn)生的并沒有太大區(qū)別。)
好的,那么像這樣的神經(jīng)網(wǎng)絡(luò)如何“識別事物”呢?關(guān)鍵在于吸引子的概念。想象一下我們有手寫的數(shù)字1和2:
我們希望所有的“1”“被吸引到一個地方”,所有的“2”“被吸引到另一個地方”?;蛘邠Q句話說,如果一幅圖像“更接近于1”,而不是2,我們希望它最終進入“1的位置”,反之亦然。
作為一個簡單的比喻,假設(shè)我們有平面上的某些位置,用點表示(在現(xiàn)實生活中它們可能是咖啡店的位置)。那么我們可以想象,從平面上的任何一點開始,我們總是希望最終到達(dá)最近的點(即我們總是去最近的咖啡店)。我們可以通過將平面分成由理想化的“分水嶺”分隔的區(qū)域(“吸引子盆地”)來表示這一點:
我們可以將其視為實現(xiàn)了一種“識別任務(wù)”,其中我們并不是在識別一個給定圖像“看起來最像”的數(shù)字,而是直接看一個給定點最靠近哪個點。 (我們在這里展示的“ Voronoi 圖”設(shè)置將 2D 歐幾里得空間中的點分離開來;可以將數(shù)字識別任務(wù)視為在由每個圖像中所有像素的灰度級組成的 784 維空間中執(zhí)行非常相似的操作。)
那么我們?nèi)绾问股窠?jīng)網(wǎng)絡(luò)“執(zhí)行識別任務(wù)”呢?讓我們考慮這個非常簡單的情況:
我們的目標(biāo)是將與位置 {x,y} 對應(yīng)的“輸入”識別為最接近它的三個點之一。換句話說,我們希望神經(jīng)網(wǎng)絡(luò)計算 {x,y} 的函數(shù),如下所示:
所以我們?nèi)绾斡蒙窠?jīng)網(wǎng)絡(luò)做到這一點呢?最終,神經(jīng)網(wǎng)絡(luò)是一組理想化的“神經(jīng)元”連接在一起的集合,通常排列成層次結(jié)構(gòu),一個簡單的例子是:
每個“神經(jīng)元”實際上都被設(shè)置為評估一個簡單的數(shù)值函數(shù)。為了“使用”網(wǎng)絡(luò),我們只需在頂部輸入數(shù)字(如我們的坐標(biāo)x和y),然后讓每層神經(jīng)元“評估其函數(shù)”并將結(jié)果向前饋送到網(wǎng)絡(luò)——最終在底部產(chǎn)生最終結(jié)果:
在傳統(tǒng)(受生物啟發(fā)的)設(shè)置中,每個神經(jīng)元實際上都有來自前一層神經(jīng)元的一定數(shù)量的“輸入連接”,每個連接被賦予一定的“權(quán)重”(可以是正數(shù)或負(fù)數(shù))。給定神經(jīng)元的值是通過將“前一神經(jīng)元”的值乘以它們相應(yīng)的權(quán)重,然后加上一個常數(shù)來確定的,最后應(yīng)用“閾值”(或“激活”)函數(shù)。在數(shù)學(xué)術(shù)語中,如果一個神經(jīng)元有輸入x = {x1,x2 …},那么我們計算f[w . x + b],其中權(quán)重w和常數(shù)b通常對于網(wǎng)絡(luò)中的每個神經(jīng)元都會不同選擇;函數(shù)f通常是相同的。
計算w . x + b只是矩陣乘法和加法的問題。 “激活函數(shù)”f引入了非線性(最終是導(dǎo)致非線性行為的原因)。常用各種激活函數(shù);在這里,我們將使用Ramp(或ReLU)
對于我們希望神經(jīng)網(wǎng)絡(luò)執(zhí)行的每個任務(wù)(或等價地,對于我們希望其評估的每個總體函數(shù)),我們將有不同的權(quán)重選擇。(正如我們稍后將討論的那樣,這些權(quán)重通常是通過使用機器學(xué)習(xí)從我們想要的輸出示例來“訓(xùn)練”神經(jīng)網(wǎng)絡(luò)確定的。)
最終,每個神經(jīng)網(wǎng)絡(luò)只對應(yīng)于某些總體數(shù)學(xué)函數(shù),盡管它可能很難寫出。對于上面的示例,它將是:
ChatGPT 的神經(jīng)網(wǎng)絡(luò)也只是對應(yīng)一個像這樣的數(shù)學(xué)函數(shù)—不過實際上有數(shù)十億個連接。
但讓我們回到單個神經(jīng)元。以下是具有兩個輸入(表示坐標(biāo) x 和 y)的神經(jīng)元在各種權(quán)重和常數(shù)選擇下(并使用 Ramp 作為激活函數(shù))可以計算的函數(shù)示例:
但是那個上面的大型神經(jīng)網(wǎng)絡(luò)呢?好吧,它計算的內(nèi)容是
這個并不完全“正確”,但它接近于我們上面展示的“最近點”函數(shù)。
我們來看看其他神經(jīng)網(wǎng)絡(luò)會發(fā)生什么。在每種情況下,我們將在稍后解釋中使用機器學(xué)習(xí)來找到最佳的權(quán)重選擇。然后我們展示使用這些權(quán)重的神經(jīng)網(wǎng)絡(luò)所計算的內(nèi)容:
更大的神經(jīng)網(wǎng)絡(luò)通常更能夠逼近我們所追求的函數(shù)。并且在每個吸引子盆地的“中心”,我們通常會得到我們想要的答案。但在邊界處——神經(jīng)網(wǎng)絡(luò)“很難下決心”的地方——事情可能會變得更混亂。
對于這種簡單的數(shù)學(xué)風(fēng)格的“識別任務(wù)”,“正確答案”很清楚。但在識別手寫數(shù)字的問題中,情況就不是那么清楚了。如果有人寫的“2”看起來像“7”等等,怎么辦?盡管如此,我們可以詢問神經(jīng)網(wǎng)絡(luò)如何區(qū)分?jǐn)?shù)字——這會給出一個指示:
我們能否“數(shù)學(xué)地”說明網(wǎng)絡(luò)如何進行區(qū)分?實際上不行。它只是在“執(zhí)行神經(jīng)網(wǎng)絡(luò)所做的操作”。但事實證明,這通常與我們?nèi)祟愃龅膮^(qū)分相當(dāng)吻合。
讓我們來看一個更為詳細(xì)的例子。假設(shè)我們有貓和狗的圖像。我們有一個經(jīng)過訓(xùn)練以區(qū)分它們的神經(jīng)網(wǎng)絡(luò)。以下是它在一些示例上的表現(xiàn):
現(xiàn)在更不清楚“正確答案”是什么了。那么狗穿著貓裝怎么辦?等等。無論輸入什么,神經(jīng)網(wǎng)絡(luò)都會生成一個答案。而且,事實證明,它以一種與人類可能做出的方式相當(dāng)一致的方式進行。就像我之前說的那樣,這不是我們可以“從第一原理”中“推導(dǎo)出來”的事實。在某些領(lǐng)域,它只是被證明是真實的。但這是神經(jīng)網(wǎng)絡(luò)有用的一個關(guān)鍵原因:它們以某種方式捕捉到了一種“類似于人類”的做事方式。
向自己展示一張貓的圖片,并問:“那是只貓嗎?”也許你會開始說:“嗯,我看到了它尖耳朵等等。”但很難解釋你是如何識別這張圖像的。這是因為你的大腦某種方式計算出了這一點。但對于大腦來說,沒有辦法(至少目前還沒有)“進入內(nèi)部”并看看它是如何計算出來的。對于(人造)神經(jīng)網(wǎng)絡(luò)呢?當(dāng)你展示一張貓的圖片時,看到每個“神經(jīng)元”在做什么是很簡單的。但即使要得到一個基本的可視化通常也非常困難。
在我們用于上面的“最近點”問題的最終網(wǎng)絡(luò)中,有17個神經(jīng)元。在用于識別手寫數(shù)字的網(wǎng)絡(luò)中有2190個神經(jīng)元。在用于識別貓和狗的網(wǎng)絡(luò)中有60,650個神經(jīng)元。通常很難將60,650維空間可視化。但因為這是一個用于處理圖像的網(wǎng)絡(luò),其許多神經(jīng)元層都組織成數(shù)組,就像它查看的像素數(shù)組一樣。
如果我們拿一個典型的貓的圖像作為例子:
然后我們可以將第一層神經(jīng)元的狀態(tài)表示為一組衍生圖像,其中許多圖像我們可以輕松解釋為“沒有背景的貓”,或者“貓的輪廓”:
對于第10層,很難解釋正在發(fā)生什么:
但通常我們可以說神經(jīng)網(wǎng)絡(luò)正在“挑選某些特征”,(也許尖耳朵是其中之一),并使用它們來確定圖像的內(nèi)容。但這些特征是否是我們熟知的名稱(如“尖耳朵”)呢?大多數(shù)情況下不是。
我們的大腦是否使用類似的特征?我們大多數(shù)人并不知道。但值得注意的是,像我們在這里展示的這樣一個神經(jīng)網(wǎng)絡(luò)的前幾層似乎會挑選出圖像的某些方面(如物體的邊緣),這些方面似乎類似于我們知道的大腦視覺處理的第一層所挑選出的特征。
假設(shè)我們想要在神經(jīng)網(wǎng)絡(luò)中建立一種“貓識別理論”。我們可以說:“看,這個特定的網(wǎng)絡(luò)可以做到這一點”,這立即給我們一些關(guān)于“問題難度”的感覺(例如需要多少神經(jīng)元或?qū)蛹墸?。但至少目前為止,我們沒有一種“講故事描述”的方式來說明網(wǎng)絡(luò)正在做什么。也許這是因為它確實是計算上不可化簡的,除了明確跟蹤每一步之外,沒有一般方法可以找到它正在做什么?;蛘咭苍S是因為我們還沒有“找到科學(xué)”,還沒有確定允許我們總結(jié)正在發(fā)生的事情的“自然法則”。
當(dāng)我們談?wù)撌褂肅hatGPT生成語言時,我們會遇到同樣的問題。同樣,現(xiàn)在還不清楚是否有辦法“概括它正在做什么”。但語言的豐富性和細(xì)節(jié)(以及我們對它的經(jīng)驗)可能會使我們比圖像更進一步。
我們到目前為止一直在談?wù)撃切耙呀?jīng)知道”如何完成特定任務(wù)的神經(jīng)網(wǎng)絡(luò)。但神經(jīng)網(wǎng)絡(luò)之所以如此有用(很可能在大腦中也是如此),是因為它們可以被逐步“從示例中訓(xùn)練”來完成這些任務(wù)。
當(dāng)我們制作一個神經(jīng)網(wǎng)絡(luò)來區(qū)分貓和狗時,我們不需要有效地編寫一個程序來(例如)顯式地找到胡須;相反,我們只需展示很多關(guān)于貓和狗的示例,然后讓網(wǎng)絡(luò)從這些示例中“機器學(xué)習(xí)”如何區(qū)分它們。
重點在于訓(xùn)練過的神經(jīng)網(wǎng)絡(luò)會從它所展示的特定示例中“概括”出來。正如我們上面所看到的,神經(jīng)網(wǎng)絡(luò)不僅僅是識別所展示的示例貓圖像的特定像素模式;而是它以某種“一般貓”的特征區(qū)分圖像。
那么神經(jīng)網(wǎng)絡(luò)訓(xùn)練實際上是如何工作的呢?本質(zhì)上,我們總是試圖找到使神經(jīng)網(wǎng)絡(luò)成功復(fù)制我們所給示例的權(quán)重。然后,我們依靠神經(jīng)網(wǎng)絡(luò)以“合理”的方式在這些示例之間“插值”(或“概括”)。
讓我們看一個比上面的最近點問題更簡單的問題。讓我們只是嘗試讓神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)函數(shù)
對于這個任務(wù),我們需要一個只有一個輸入和一個輸出的神經(jīng)網(wǎng)絡(luò),例如:
但是我們應(yīng)該使用哪些權(quán)重等呢?對于每個可能的權(quán)重集合,神經(jīng)網(wǎng)絡(luò)都會計算出某個函數(shù)。例如,這里是幾組隨機選擇的權(quán)重集合所計算出的函數(shù):
但是,我們可以清楚地看到,在這些情況下,它甚至沒有接近復(fù)制我們想要的功能。那么我們?nèi)绾握业侥軌驈?fù)制該函數(shù)的權(quán)重呢?
基本思想是提供大量的“輸入→輸出”示例來“學(xué)習(xí)”——然后嘗試找到能夠復(fù)制這些示例的權(quán)重。以下是使用逐漸增加的示例進行此操作的結(jié)果:
在每個階段,“訓(xùn)練”過程中,神經(jīng)網(wǎng)絡(luò)中的權(quán)重會逐步調(diào)整——我們看到最終獲得了一個成功復(fù)制所需函數(shù)的網(wǎng)絡(luò)。那么如何調(diào)整權(quán)重呢?基本思路是在每個階段看看“我們距離所需函數(shù)有多遠(yuǎn)”,然后更新權(quán)重以更接近所需函數(shù)。
要找出“我們距離所需函數(shù)有多遠(yuǎn)”,我們計算通常稱為“損失函數(shù)”(有時稱為“成本函數(shù)”)的函數(shù)。在這里,我們使用一個簡單的(L2)損失函數(shù),它只是所得值與真實值之間差的平方和。我們看到隨著訓(xùn)練過程的進行,損失函數(shù)逐步減?。ㄗ裱煌蝿?wù)的不同“學(xué)習(xí)曲線”)——直到達(dá)到一個點,網(wǎng)絡(luò)(至少可以近似地)成功地復(fù)制了我們想要的函數(shù):
好的,最后一個需要解釋的基本部分是如何調(diào)整權(quán)重以減少損失函數(shù)。正如我們所說,損失函數(shù)給出了我們得到的值和真實值之間的“距離”。但“我們得到的值”是由當(dāng)前版本的神經(jīng)網(wǎng)絡(luò)和其中的權(quán)重決定的。但現(xiàn)在想象一下,權(quán)重是變量,比如w1。我們想找出如何調(diào)整這些變量的值來最小化依賴于它們的損失。
例如,假設(shè)(非常簡化了實際使用的典型神經(jīng)網(wǎng)絡(luò))我們只有兩個權(quán)重w1和w2。那么我們可能會有一個關(guān)于w1和w2的損失函數(shù)看起來像這樣:
這種情況下,數(shù)值分析提供了多種技術(shù)來找到最小值。但是典型的方法就是從先前的 w1、w2 開始逐步沿最陡下降的路徑前進:
就像水流下山一樣,這個過程只能保證最終會到達(dá)曲面的某個局部最小值(“山湖”),但它可能無法到達(dá)最終的全局最小值。
找到“重量曲面”上最陡峭的下降路徑可能并不容易。但微積分拯救了我們。正如我們之前提到的,可以將神經(jīng)網(wǎng)絡(luò)視為計算數(shù)學(xué)函數(shù),該函數(shù)取決于其輸入和權(quán)重。但現(xiàn)在考慮針對這些權(quán)重進行微分。結(jié)果表明,微積分的鏈?zhǔn)椒▌t實際上讓我們“展開”了神經(jīng)網(wǎng)絡(luò)中連續(xù)層所執(zhí)行的操作。結(jié)果是我們可以——至少在某種局部逼近的情況下——“反轉(zhuǎn)”神經(jīng)網(wǎng)絡(luò)的操作,并逐步找到最小化輸出相關(guān)損失的權(quán)重。
上面的圖片展示了我們在只有兩個權(quán)重的情況下需要進行的最小化過程。但是事實證明,即使有更多的權(quán)重(ChatGPT使用了1750億個權(quán)重),也仍然可能進行最小化,至少可以近似地進行最小化。實際上,圍繞2011年發(fā)生的“深度學(xué)習(xí)”重大突破與發(fā)現(xiàn)有關(guān),即某種意義上,當(dāng)涉及到許多權(quán)重時,進行(至少近似地)最小化可能比涉及相當(dāng)少的權(quán)重更容易。
換句話說,有時候用神經(jīng)網(wǎng)絡(luò)解決更復(fù)雜的問題比解決更簡單的問題更容易,這似乎有點違反直覺。大致原因似乎是,當(dāng)有許多“權(quán)重變量”時,我們擁有一個具有“許多不同方向”的高維空間,可以引導(dǎo)我們到達(dá)最小值,而當(dāng)變量較少時,很容易陷入局部最小值(“山湖”)而沒有“方向可走”。
值得指出的是,在典型情況下,有許多不同的權(quán)重集合都可以給出具有幾乎相同性能的神經(jīng)網(wǎng)絡(luò)。通常,在實際的神經(jīng)網(wǎng)絡(luò)訓(xùn)練中會進行許多隨機選擇,這些選擇會導(dǎo)致“不同但等效的解決方案”,如下所示:
上述的“不同解決方案”每個都會有略微不同的行為。如果我們要求在我們給出訓(xùn)練示例的區(qū)域之外進行“外推”,我們可能會得到截然不同的結(jié)果:
但是哪一個是“正確”的呢?實際上沒有辦法說。它們都“與觀測數(shù)據(jù)一致”。但它們都對應(yīng)著不同的“內(nèi)在”思考方式,以“超出框框”的方式去思考應(yīng)該做什么。其中一些對我們?nèi)祟悂碚f可能比其他的更“合理”。
特別是在過去的十年中,神經(jīng)網(wǎng)絡(luò)訓(xùn)練的技術(shù)已經(jīng)有了很多進展。而且,是基本上是一門藝術(shù)。有時候——尤其是事后回顧——我們可以看到一些“科學(xué)解釋”來解釋正在進行的事情。但大多數(shù)情況下,通過試錯發(fā)現(xiàn)了一些思路和技巧,這些思路和技巧逐步積累,構(gòu)成了一個有關(guān)如何使用神經(jīng)網(wǎng)絡(luò)的顯著技術(shù)和經(jīng)驗積累。
有幾個關(guān)鍵部分。首先是對于特定任務(wù)應(yīng)該使用什么神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu)的問題。然后是關(guān)鍵問題,即如何獲取用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)。而且越來越多的情況是,我們不是從頭開始訓(xùn)練一個新的神經(jīng)網(wǎng)絡(luò):相反,一個新的神經(jīng)網(wǎng)絡(luò)可以直接合并另一個已經(jīng)訓(xùn)練好的網(wǎng)絡(luò),或者至少可以使用該網(wǎng)絡(luò)生成更多的訓(xùn)練樣例。
人們可能認(rèn)為,對于每種特定的任務(wù),都需要不同的神經(jīng)網(wǎng)絡(luò)架構(gòu)。但是發(fā)現(xiàn),即使是表面上非常不同的任務(wù),同樣的架構(gòu)似乎也能夠工作。在某種程度上,這讓人想起通用計算的概念(和我提出的計算等價性原則),但是,正如我稍后將討論的那樣,我認(rèn)為這更反映了我們通常試圖讓神經(jīng)網(wǎng)絡(luò)執(zhí)行的任務(wù)是“類人類”的任務(wù),而神經(jīng)網(wǎng)絡(luò)可以捕捉相當(dāng)通用的“類人類過程”。
在早期神經(jīng)網(wǎng)絡(luò)的發(fā)展中,人們通常認(rèn)為應(yīng)該讓神經(jīng)網(wǎng)絡(luò)“盡可能少地做事情”。例如,在將語音轉(zhuǎn)換為文本時,人們認(rèn)為應(yīng)該先對語音進行分析,將其分解為音素等。但是研究發(fā)現(xiàn),至少對于“類似于人類的任務(wù)”,通常最好嘗試訓(xùn)練神經(jīng)網(wǎng)絡(luò)進行“端到端的問題”,讓它自己“發(fā)現(xiàn)”所需的中間特征、編碼等。
還有一種想法是,應(yīng)該向神經(jīng)網(wǎng)絡(luò)中引入復(fù)雜的單個組件,以讓它實際上“顯式實現(xiàn)特定的算法思想”。但同樣地,這在大多數(shù)情況下被證明是不值得的;相反,最好處理非常簡單的組件,并讓它們“自行組織”(雖然通常是以我們無法理解的方式)來實現(xiàn)(可能是)相當(dāng)于那些算法思想的東西。
這并不是說對于神經(jīng)網(wǎng)絡(luò)沒有相關(guān)的“結(jié)構(gòu)化思想”是有幫助的。例如,在處理圖像的早期階段,使用帶有局部連接的二維神經(jīng)元陣列似乎至少非常有用。而專注于“向后查看序列”的連接模式似乎很有用——正如我們稍后將在ChatGPT中看到的那樣——處理類似人類語言的事物。
但是,神經(jīng)網(wǎng)絡(luò)的一個重要特點就像計算機一樣,最終只是處理數(shù)據(jù)。目前的神經(jīng)網(wǎng)絡(luò)——通過當(dāng)前的神經(jīng)網(wǎng)絡(luò)訓(xùn)練方法——專門處理數(shù)字?jǐn)?shù)組。但在處理過程中,這些數(shù)組可以完全重新排列和重新塑造。例如,我們用于識別上面的數(shù)字的網(wǎng)絡(luò)以類似圖像的二維數(shù)組開始,快速“加厚”到許多通道,但然后“集中下降”到最終將包含表示不同可能的輸出數(shù)字的元素的一維數(shù)組中:
但是,好的,如何確定特定任務(wù)需要多大的神經(jīng)網(wǎng)絡(luò)?這在某種程度上是一種藝術(shù)。在某種程度上,關(guān)鍵是要知道“任務(wù)有多難”。但是對于類似于人類的任務(wù),通常很難估計。是的,可能有一種系統(tǒng)化的方法可以通過計算機“機械地”完成任務(wù)。但很難知道是否有可以輕松實現(xiàn)“類似于人類水平”的“技巧”或“快捷方式”來完成任務(wù)。
對于某些小的神經(jīng)網(wǎng)絡(luò)和簡單的任務(wù),有時可以明確地看到“從這里無法到達(dá)那里”。例如,下面是使用幾個小型神經(jīng)網(wǎng)絡(luò)能夠完成的上一節(jié)任務(wù)的最佳成果:
我們可以看到,如果神經(jīng)網(wǎng)絡(luò)太小,它就無法復(fù)制我們想要的功能。但是在某個大小以上,它就沒有問題——至少如果訓(xùn)練足夠長時間,并有足夠的樣本。順便說一句,這些圖片說明了神經(jīng)網(wǎng)絡(luò)學(xué)的一個規(guī)律:如果網(wǎng)絡(luò)中間“擠壓”,強制所有信息通過較小的中間神經(jīng)元,通??梢杂酶〉木W(wǎng)絡(luò)解決問題。(值得一提的是,“無中間層”或所謂的“感知器”網(wǎng)絡(luò)只能學(xué)習(xí)基本線性函數(shù)——但只要有一個中間層,原則上就可以以任意高的精度逼近任何函數(shù),至少如果有足夠的神經(jīng)元,雖然為了使其可行地訓(xùn)練,通常需要一些正則化或標(biāo)準(zhǔn)化。)
好的,現(xiàn)在假設(shè)我們已經(jīng)確定了某個神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)?,F(xiàn)在的問題是如何獲取用于訓(xùn)練網(wǎng)絡(luò)的數(shù)據(jù)。許多與神經(jīng)網(wǎng)絡(luò)和機器學(xué)習(xí)相關(guān)的實際挑戰(zhàn)都集中在獲取或準(zhǔn)備必要的訓(xùn)練數(shù)據(jù)上。在許多情況下(“監(jiān)督學(xué)習(xí)”),我們希望獲取輸入和期望輸出的顯式示例。例如,我們可能希望標(biāo)記圖像中包含的內(nèi)容或其他屬性。也許我們將不得不明確地進行標(biāo)記——通常需要很大的努力。但往往有可能在已有的基礎(chǔ)上利用它或?qū)⑵溆米髂撤N代理。例如,我們可能會使用Web上提供的alt標(biāo)簽。或者,在不同的領(lǐng)域中,我們可能會使用為視頻創(chuàng)建的閉幕字幕?;蛘邔τ谡Z言翻譯訓(xùn)練,我們可能會使用存在于不同語言的Web頁面或其他文檔的平行版本。
神經(jīng)網(wǎng)絡(luò)需要多少數(shù)據(jù)才能訓(xùn)練出特定任務(wù)的能力?從第一原理出發(fā)很難估算。當(dāng)然,使用“遷移學(xué)習(xí)”將已經(jīng)在另一個網(wǎng)絡(luò)中學(xué)習(xí)到的重要特征列表“轉(zhuǎn)移”可以顯著減少要求。但通常情況下,神經(jīng)網(wǎng)絡(luò)需要“看到很多例子”才能良好地訓(xùn)練。對于一些任務(wù)而言,重復(fù)的例子非常重要,而且在每一輪“訓(xùn)練回合”(或“時代”)中,神經(jīng)網(wǎng)絡(luò)的狀態(tài)至少會略微不同,通過“提醒它”某個特定的例子有助于讓它“記住那個例子”。(是的,這也許類似于人類記憶中重復(fù)的有用性。)
但僅僅重復(fù)相同的例子并不足夠。還需要向神經(jīng)網(wǎng)絡(luò)展示例子的變化。而神經(jīng)網(wǎng)絡(luò)的傳說特點是,這些“數(shù)據(jù)增強”變化并不需要復(fù)雜就可以很有用。只需使用基本的圖像處理輕微修改圖像即可使其對于神經(jīng)網(wǎng)絡(luò)訓(xùn)練來說“嶄新如初”。同樣,當(dāng)用于訓(xùn)練自動駕駛汽車的實際視頻等數(shù)據(jù)用盡時,可以繼續(xù)在模擬類似于電子游戲的環(huán)境中運行模擬來獲取數(shù)據(jù),而不需要所有實際現(xiàn)實場景的細(xì)節(jié)。
ChatGPT是怎樣的呢?它有一個很好的特點,可以進行“無監(jiān)督學(xué)習(xí)”,這使得它更容易從中獲得訓(xùn)練樣例。記得ChatGPT的基本任務(wù)是找出如何繼續(xù)給定的一段文本。因此,只需要獲取一段文本,將其結(jié)尾部分掩蓋,并將其作為“輸入來訓(xùn)練”,“輸出”是完整的、未被掩蓋的文本。我們稍后將討論更多,但主要的觀點是,與學(xué)習(xí)圖像內(nèi)容不同,不需要“顯式標(biāo)記”;ChatGPT實際上可以直接從任何文本樣例中學(xué)習(xí)。
好了,那么神經(jīng)網(wǎng)絡(luò)中的實際學(xué)習(xí)過程如何呢?最終的目標(biāo)是確定哪些權(quán)重可以最好地捕捉到已經(jīng)給出的訓(xùn)練樣例??梢允褂酶鞣N詳細(xì)的選擇和“超參數(shù)設(shè)置”(之所以稱之為超參數(shù)是因為權(quán)重可以被視為“參數(shù)”)來調(diào)整如何實現(xiàn)這一點。有不同的損失函數(shù)(平方和、絕對值之和等)。有不同的損失最小化方式(每步在權(quán)重空間移動多遠(yuǎn)等)。然后還有問題,比如顯示多大的“批量”示例以獲得每個連續(xù)估計的損失。是的,可以應(yīng)用機器學(xué)習(xí)(例如我們在Wolfram語言中所做的)來自動化機器學(xué)習(xí),以及自動設(shè)置超參數(shù)等。
但最終整個訓(xùn)練過程可以通過觀察損失如何逐漸減小來進行描述(例如在這個小型訓(xùn)練的Wolfram語言進度監(jiān)視器中)。
通常情況下,人們會看到損失函數(shù)在一段時間內(nèi)下降,但最終會穩(wěn)定在某個常數(shù)值。如果該值足夠小,則可以認(rèn)為訓(xùn)練成功;否則可能需要嘗試更改網(wǎng)絡(luò)結(jié)構(gòu)。
人們可以確定“學(xué)習(xí)曲線”需要多長時間才能趨于平穩(wěn)嗎?就像許多其他事情一樣,這似乎有近似的冪律縮放關(guān)系,這取決于使用的神經(jīng)網(wǎng)絡(luò)的規(guī)模和數(shù)據(jù)量。但是,總的結(jié)論是,訓(xùn)練神經(jīng)網(wǎng)絡(luò)很難,并且需要大量的計算工作量。實際上,絕大部分工作量都花費在對數(shù)字?jǐn)?shù)組進行操作上,這正是GPU擅長的——這就是為什么神經(jīng)網(wǎng)絡(luò)訓(xùn)練通常受到GPU可用性的限制。
在未來,會有根本上更好的方法來訓(xùn)練神經(jīng)網(wǎng)絡(luò),或者通常執(zhí)行神經(jīng)網(wǎng)絡(luò)的任務(wù)嗎?我認(rèn)為幾乎肯定會有。神經(jīng)網(wǎng)絡(luò)的基本思想是利用大量簡單的(本質(zhì)上是相同的)組件創(chuàng)建一個靈活的“計算布料”,并且使這個“布料”能夠逐步修改以從示例中學(xué)習(xí)。在當(dāng)前的神經(jīng)網(wǎng)絡(luò)中,人們基本上使用微積分的思想——應(yīng)用于實數(shù)——來進行這種逐步修改。但越來越清楚的是,具有高精度數(shù)字并不重要;即使使用當(dāng)前的方法,8位或更少的數(shù)字可能已經(jīng)足夠了。
使用類似元胞自動機這樣基本上在許多個單獨位上并行操作的計算系統(tǒng),如何進行這種漸進式修改從未明確過,但沒有理由認(rèn)為它是不可能的。實際上,就像“2012年的深度學(xué)習(xí)突破”一樣,這種漸進式修改在更復(fù)雜的情況下可能比簡單情況更容易實現(xiàn)。
神經(jīng)網(wǎng)絡(luò)——也許有點像大腦——被設(shè)置為具有基本固定的神經(jīng)元網(wǎng)絡(luò),修改的是它們之間連接的強度(“權(quán)重”)。 (也許在至少年輕的大腦中,可以增長相當(dāng)數(shù)量的全新連接。)但是,盡管這可能是生物學(xué)上的一種方便設(shè)置,但它顯然不接近實現(xiàn)我們所需的功能的最佳方式。而且,涉及到漸進式網(wǎng)絡(luò)重寫的事情(也許讓人想起我們的物理項目)可能最終會更好。
但即使在現(xiàn)有神經(jīng)網(wǎng)絡(luò)的框架內(nèi),目前存在一個關(guān)鍵限制:目前的神經(jīng)網(wǎng)絡(luò)訓(xùn)練基本上是順序的,每個示例批次的效果都被傳播回來更新權(quán)重。事實上,即使考慮到GPU,當(dāng)前計算機硬件的大部分神經(jīng)網(wǎng)絡(luò)在訓(xùn)練期間大部分時間處于“空閑”狀態(tài),只有一部分被更新。從某種意義上講,這是因為我們當(dāng)前的計算機傾向于具有與它們的CPU(或GPU)分離的內(nèi)存。但在大腦中,這可能是不同的——每個“內(nèi)存元素”(即神經(jīng)元)也是一個潛在的活動計算元素。如果我們能以這種方式設(shè)置未來的計算機硬件,可能可以更有效地進行訓(xùn)練。
像ChatGPT這樣的東西的能力似乎非常令人印象深刻,人們可能想象,如果可以不斷“擴大規(guī)?!辈⒂?xùn)練越來越大的神經(jīng)網(wǎng)絡(luò),那么它們最終將能夠“做任何事情”。如果關(guān)注那些立即可用于人類思維的事物,這很可能是正確的。但是過去幾百年科學(xué)的教訓(xùn)是,有些事情可以通過形式過程來解決,但不易于立即人類思考。
非平凡的數(shù)學(xué)是一個很好的例子。但是一般情況下是計算。最終問題是計算不可約性的現(xiàn)象。有些計算可能需要很多步驟,但實際上可以“簡化”為某些非常直接的東西。但計算不可約性的發(fā)現(xiàn)意味著這并不總是奏效。而且,可能像下面這個過程一樣,必須實質(zhì)上跟蹤每個計算步驟才能弄清發(fā)生了什么:
我們通常用大腦做的事情可能是有選擇地避免計算不可約性。在大腦中進行數(shù)學(xué)運算需要特殊的努力,而在頭腦中思考任何非平凡程序的操作步驟在實踐中是基本不可能的。
但是我們有計算機來處理這個問題。通過計算機,我們可以輕松地完成長時間的、計算不可約的事情。關(guān)鍵是,在這方面通常沒有捷徑。
是的,我們可以記憶許多特定計算系統(tǒng)中發(fā)生的事情的具體例子。也許我們甚至可以看到一些(“計算可約”)的模式,可以讓我們做一些概括。但是,計算不可約性的要點在于,我們永遠(yuǎn)無法保證不會發(fā)生意外情況,而只有通過顯式地進行計算,才能知道任何特定情況下實際發(fā)生的情況。
最后,學(xué)習(xí)性和計算不可約之間存在根本的張力。學(xué)習(xí)實際上涉及通過利用規(guī)律來壓縮數(shù)據(jù)。但是計算不可約意味著最終存在規(guī)律的限制。
作為一個實際問題,人們可以想象在可訓(xùn)練的系統(tǒng)(如神經(jīng)網(wǎng)絡(luò))中構(gòu)建小的計算設(shè)備,如細(xì)胞自動機或圖靈機。實際上,這些設(shè)備可以作為神經(jīng)網(wǎng)絡(luò)的好“工具”,就像 Wolfram | Alpha 對 ChatGPT 一樣。但是,計算不可約意味著人們不能指望“進入”這些設(shè)備并讓它們學(xué)習(xí)。
或者換句話說,能力和可訓(xùn)練性之間存在根本的權(quán)衡:你想讓系統(tǒng)真正使用其計算能力,它就會顯示出計算不可約性,并且它將越來越難以訓(xùn)練。而它越基本可訓(xùn)練,它就越難進行復(fù)雜的計算。
在目前的 ChatGPT 中,實際上情況更為極端,因為用于生成每個輸出標(biāo)記的神經(jīng)網(wǎng)絡(luò)是純“前饋”網(wǎng)絡(luò),沒有循環(huán),因此沒有能力進行任何具有非平凡“控制流”的計算。
當(dāng)然,人們可能會想知道是否實際上有能力進行不可約計算。事實上,很長一段時間內(nèi)這并不重要。但我們現(xiàn)代技術(shù)世界建立在利用至少數(shù)學(xué)計算的工程學(xué)基礎(chǔ)之上——越來越多地使用更一般的計算。如果我們看看自然界,它充滿了不可約計算,我們正在逐漸了解如何模擬和利用它們的技術(shù)目的。
是的,神經(jīng)網(wǎng)絡(luò)當(dāng)然可以注意到自然界中我們可能也可以輕易注意到的那些規(guī)律。但是,如果我們想解決數(shù)學(xué)或計算科學(xué)范疇內(nèi)的問題,神經(jīng)網(wǎng)絡(luò)將無法完成,除非它有效地“使用作為工具”一個“普通”的計算系統(tǒng)。
但是所有這些都存在一些可能會讓人感到困惑的地方。過去,我們認(rèn)為計算機無法完成的任務(wù)包括寫作文等等,我們假設(shè)這些任務(wù)“本質(zhì)上太難了”。現(xiàn)在我們看到 ChatGPT 等模型完成這些任務(wù)后,我們往往會突然認(rèn)為計算機必須變得非常強大——特別是超越了它們已經(jīng)基本能夠完成的任務(wù)(比如逐步計算像細(xì)胞自動機這樣的計算系統(tǒng)的行為)。
但這不是正確的結(jié)論。計算不可約過程仍然是計算不可約的,對于計算機來說仍然是基本困難的,即使計算機可以輕松地計算它們的每一步。我們應(yīng)該得出的結(jié)論是,我們過去認(rèn)為計算機無法完成的任務(wù)(比如寫作文)實際上在某種意義上比我們想象的更容易。
換句話說,神經(jīng)網(wǎng)絡(luò)能夠成功地寫一篇文章的原因是寫作一篇文章的問題實際上比我們想象的“計算上更淺”。在某種意義上,這使我們更接近于“擁有一個理論”,即我們?nèi)祟惾绾翁幚碚Z言,比如寫作文。
如果你有足夠大的神經(jīng)網(wǎng)絡(luò),那么你可能能夠做到人類可以輕松完成的任何任務(wù)。但你不會捕捉到自然界普遍可以做到的事情,也不會捕捉到我們從自然界中制造的工具可以做到的事情。正是使用這些工具——無論是實用的還是概念性的——在最近幾個世紀(jì)允許我們超越了“純粹未經(jīng)人類思考的”可觸及邊界,并為人類目的捕捉了更多的物理和計算宇宙中的事物。
神經(jīng)網(wǎng)絡(luò)——至少目前的設(shè)置——是基于數(shù)字的。因此,如果我們要使用它們處理文本之類的東西,我們需要一種用數(shù)字表示文本的方法。當(dāng)然,我們可以從字典中開始(基本上像ChatGPT一樣)只是為每個單詞分配一個數(shù)字。但有一個重要的想法——例如ChatGPT的中心——超越了這一點。這就是“嵌入”的概念??梢詫⑶度胍暈橐环N嘗試通過數(shù)字?jǐn)?shù)組來表示某物“本質(zhì)”的方式——具有“附近的東西”由附近的數(shù)字表示的屬性。
因此,例如,我們可以將單詞嵌入視為試圖在一種“意義空間”中擺放單詞,在這個空間中,“意義相近的單詞”會出現(xiàn)在嵌入中附近。實際使用的嵌入,比如在ChatGPT中,往往涉及大量的數(shù)字列表。但如果我們將其投影到二維平面上,就可以展示單詞嵌入是如何布局的:
因此,例如,我們可以將單詞嵌入視為在某種“意義空間”中試圖布置單詞,其中某些“在意義上相鄰”的單詞在嵌入中靠近。實際使用的嵌入,比如在ChatGPT中,往往涉及大量數(shù)字的列表。但是,如果我們將其投影到2D,我們可以展示單詞是如何被嵌入布局的:
是的,我們看到的確能很好地捕捉到典型的日常印象。但是我們?nèi)绾螛?gòu)建這樣的嵌入呢?大致上,我們的想法是查看大量文本(例如來自Web的50億個單詞),然后看不同單詞出現(xiàn)在其中的“環(huán)境”有多相似。例如,“鱷魚”和“鱷魚”幾乎可以在其他類似的句子中交替出現(xiàn),這意味著它們會在嵌入中相鄰。但是,“蘿卜”和“鷹”不會出現(xiàn)在其他相似的句子中,因此它們將在嵌入中被遠(yuǎn)遠(yuǎn)分開。
但是,如何使用神經(jīng)網(wǎng)絡(luò)實際實現(xiàn)這樣的嵌入呢?讓我們首先討論不是單詞,而是圖像的嵌入。我們希望以某種方式用數(shù)字列表來描述圖像,以使“我們認(rèn)為相似的圖像”被分配相似的數(shù)字列表。
我們?nèi)绾未_定是否“認(rèn)為圖像相似”?好吧,如果我們的圖像是手寫數(shù)字的圖像,如果它們是相同的數(shù)字,則“我們認(rèn)為兩個圖像相似”。早些時候我們討論過一個訓(xùn)練用于識別手寫數(shù)字的神經(jīng)網(wǎng)絡(luò)。我們可以認(rèn)為這個神經(jīng)網(wǎng)絡(luò)被設(shè)置為,在其最終輸出中,將圖像放入10個不同的箱中,每個數(shù)字一個框。
但是,如果我們在做出“這是一個'4’”決定之前“截獲”了神經(jīng)網(wǎng)絡(luò)內(nèi)部正在發(fā)生的事情呢?我們可以期望在神經(jīng)網(wǎng)絡(luò)內(nèi)部有一些數(shù)字,它們表征圖像“大部分類似于'4’,但有點類似于'2’”之類的內(nèi)容。這個想法是選取這些數(shù)字作為嵌入中的元素。
因此,這里有一個概念。我們不是直接嘗試表征“哪個圖像與另一個圖像相似”,而是考慮一個定義良好的任務(wù)(在這種情況下是數(shù)字識別),我們可以獲得明確的訓(xùn)練數(shù)據(jù)-然后利用這個事實,在完成這個任務(wù)時,神經(jīng)網(wǎng)絡(luò)隱含地必須做出“接近決策”。因此,我們從來沒有必要明確地談?wù)摗皥D像的相似性”,而只是談?wù)搱D像代表的具體數(shù)字,并且我們“把這個問題留給神經(jīng)網(wǎng)絡(luò)”來隱含地確定這意味著什么樣的“圖像相似性”。
那么,對于數(shù)字識別網(wǎng)絡(luò),更詳細(xì)地說,它是如何工作的呢?我們可以將網(wǎng)絡(luò)視為由11個連續(xù)層組成,我們可以像這樣簡潔地總結(jié)它們(激活函數(shù)顯示為單獨的層):
一開始我們將實際的圖像輸入到第一層,由像素值的2D數(shù)組表示。在最后——從最后一層——我們得到一個由10個值組成的數(shù)組,我們可以認(rèn)為這些值表示網(wǎng)絡(luò)對圖像對應(yīng)于數(shù)字0到9的確定程度。
輸入圖像,最后一層神經(jīng)元的值為:
換句話說,到這個時候,神經(jīng)網(wǎng)絡(luò)已經(jīng)“非常確定”這張圖片是數(shù)字4了——為了得到“4”這個輸出結(jié)果,我們只需要找到具有最大值的神經(jīng)元位置即可。
但如果我們再往前看一步呢?網(wǎng)絡(luò)中最后一步操作是softmax,它試圖“強制確定”。但在這之前,神經(jīng)元的值為:
換句話說,神經(jīng)網(wǎng)絡(luò)現(xiàn)在已經(jīng)“非常確定”這個圖像是數(shù)字4,為了獲得輸出“4”,我們只需要選擇值最大的神經(jīng)元的位置。
但是如果我們再往前看一步呢?網(wǎng)絡(luò)中最后一個操作是softmax,試圖“強制確信”。但在應(yīng)用這個操作之前,神經(jīng)元的值為:
表示“4”的神經(jīng)元仍然具有最高的數(shù)值。但其他神經(jīng)元的值也包含了信息。我們可以期望這個數(shù)字列表在某種意義上可以用來表征圖像的“本質(zhì)”,從而提供可以用作嵌入的東西。例如,這里的每個“4”都有略微不同的“簽名”(或“特征嵌入”),與“8”完全不同:
換句話說,我們基本上使用10個數(shù)字來描述我們的圖像。但是通常最好使用更多的數(shù)字。例如,在我們的數(shù)字識別網(wǎng)絡(luò)中,通過接入前面的一層,我們可以獲得一個包含500個數(shù)字的數(shù)組。這可能是一個合理的“圖像嵌入”數(shù)組。
如果我們想要顯式地可視化手寫數(shù)字的“圖像空間”,我們需要“降維”,通過將我們獲得的500維向量投影到三維空間中,例如:
我們剛剛討論了如何創(chuàng)建圖像的表征(從而獲得嵌入),方法是基本上通過確定圖像是否與相同的手寫數(shù)字對應(yīng)(根據(jù)我們的訓(xùn)練集),來識別相似的圖像。如果我們有一個訓(xùn)練集,其中標(biāo)識了每個圖像屬于5000種常見類型的物體(貓,狗,椅子等),我們也可以以更一般的方式做同樣的事情。通過神經(jīng)網(wǎng)絡(luò)的行為,“錨定”我們對常見對象的識別,然后根據(jù)神經(jīng)網(wǎng)絡(luò)的行為“在其周圍進行概括”。關(guān)鍵是,只要這種行為與我們?nèi)祟惛兄徒忉寛D像的方式相一致,這將最終成為一個“對我們來說正確的”嵌入,并且在實踐中用于執(zhí)行“類似于人類判斷”的任務(wù)。
那么我們?nèi)绾巫裱瑯拥姆椒▉碚业絾卧~的嵌入?關(guān)鍵是從一個與單詞相關(guān)的任務(wù)開始,我們可以很容易地進行訓(xùn)練。標(biāo)準(zhǔn)的任務(wù)是“單詞預(yù)測”。想象一下,我們得到了“the ___ cat”。根據(jù)大量的文本語料庫(比如網(wǎng)絡(luò)的文本內(nèi)容),填入空格的不同單詞有什么概率?或者,另一種方法是,給出“___ black ___”,不同“旁邊的單詞”有什么概率?
如何為神經(jīng)網(wǎng)絡(luò)設(shè)置這個問題?最終,我們必須用數(shù)字來表示所有內(nèi)容。一種方法就是為英語中的大約50,000個常見單詞分配一個唯一的數(shù)字。例如,“the”可能是914,“cat”(前面帶有一個空格)可能是3542。(這些數(shù)字是GPT-2使用的實際數(shù)字。)因此,對于“the ___ cat”問題,我們的輸入可能是{914,3542}。輸出應(yīng)該是一個大約包含50,000個數(shù)字的列表,有效地給出每個可能的“填充”單詞的概率。再一次,為了找到嵌入,我們要攔截神經(jīng)網(wǎng)絡(luò)“達(dá)到結(jié)論之前”的“內(nèi)部”,然后獲取在那里發(fā)生的數(shù)字列表,我們可以將其視為“表征每個單詞”。
那么,這些表征是什么樣子的?在過去的10年中,已經(jīng)開發(fā)了一系列不同的系統(tǒng)(例如word2vec,GloVe,BERT,GPT等),每個系統(tǒng)基于不同的神經(jīng)網(wǎng)絡(luò)方法。但最終,它們都使用數(shù)百到數(shù)千個數(shù)字的列表來表征單詞。
在其原始形式下,這些“嵌入向量”相當(dāng)無信息。例如,這里是GPT-2為三個特定單詞生成的原始嵌入向量:
如果我們像測量這些向量之間的距離一樣做事情,那么我們可以找到諸如單詞“近”的東西。稍后我們將更詳細(xì)地討論我們可能認(rèn)為這些嵌入的“認(rèn)知”意義。但就目前而言,主要的觀點是,我們有一種有用的方法來將單詞轉(zhuǎn)換為“神經(jīng)網(wǎng)絡(luò)友好”的數(shù)字集合。
但實際上,我們可以更進一步,不僅可以將單詞序列化為數(shù)字集合,還可以將整個文本塊化為數(shù)字集合。 ChatGPT 就是這樣處理事情的。它使用生成嵌入向量來代表已有的文本。然后它的目標(biāo)是找到可能出現(xiàn)的不同單詞的概率。它以一系列數(shù)字的形式表示其答案,這些數(shù)字本質(zhì)上給出了每個可能單詞的概率。
(嚴(yán)格來說,ChatGPT 不處理單詞,而是處理“令牌”——方便的語言單位,可能是完整的單詞,也可能只是像“pre”、“ing”或“ized”這樣的部分。使用令牌使 ChatGPT 更容易處理罕見的、復(fù)合的和非英語單詞,并且有時可以發(fā)明新單詞。)
好的,我們終于可以討論一下 ChatGPT 內(nèi)部結(jié)構(gòu)了。沒錯,最終,它是一個龐大的神經(jīng)網(wǎng)絡(luò)——目前是一個擁有 1750 億個權(quán)重的 GPT-3 網(wǎng)絡(luò)版本。在許多方面,這是一個與我們之前討論的其他神經(jīng)網(wǎng)絡(luò)非常相似的神經(jīng)網(wǎng)絡(luò)。但是,它是一個專門用于處理語言的神經(jīng)網(wǎng)絡(luò)。其最顯著的特點是一種神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu),稱為“Transformer”。
在我們上面討論的第一個神經(jīng)網(wǎng)絡(luò)中,任何給定層的每個神經(jīng)元基本上都與之前一層的每個神經(jīng)元連接(至少有一些權(quán)重)。但是,如果正在處理具有特定已知結(jié)構(gòu)的數(shù)據(jù),這種完全連接的網(wǎng)絡(luò)就會是過度的(可能)。因此,例如,在處理圖像的早期階段,通常會使用所謂的卷積神經(jīng)網(wǎng)絡(luò)(“convnets”),其中神經(jīng)元實際上是放置在類似于圖像中的像素的網(wǎng)格上,并且僅與網(wǎng)格上附近的神經(jīng)元相連接。
transformer的想法是對于構(gòu)成文本的token序列進行類似于圖像卷積神經(jīng)網(wǎng)絡(luò)的處理。但是,transformers引入了“attention”這一概念——即“更多地關(guān)注”序列的某些部分而不是其他部分的想法。也許有一天直接開始一個通用的神經(jīng)網(wǎng)絡(luò)并通過訓(xùn)練進行所有的自定義將是有意義的。但至少目前在實踐中,“模塊化”似乎至關(guān)重要——就像transformers那樣,可能也像我們的大腦那樣。
好的,那么ChatGPT(或者更確切地說是它基于的GPT-3網(wǎng)絡(luò))究竟做了什么呢?請記住,它的總體目標(biāo)是基于它所看到的訓(xùn)練數(shù)據(jù)(包括來自Web等數(shù)十億個網(wǎng)頁的文本),以“合理”的方式繼續(xù)文本。因此,在任何給定的點上,它都有一定數(shù)量的文本,其目標(biāo)是想出一個適當(dāng)?shù)倪x擇,以添加下一個token。
它的操作可以分為三個基本階段。首先,它獲取到迄今為止對應(yīng)于文本的令牌序列,并找到表示這些令牌的嵌入(即一組數(shù)字)。然后它以“標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)方式”處理這個嵌入,通過網(wǎng)絡(luò)中連續(xù)的層“傳遞值”來生成一個新的嵌入(即一個新的數(shù)字?jǐn)?shù)組)。接下來,它從這個數(shù)組的最后一部分生成一個包含約50000個值的數(shù)組,這些值會轉(zhuǎn)換成不同可能的下一個令牌的概率。(是的,它恰好有大約與英語常用詞相同數(shù)量的令牌,盡管僅有約3000個令牌是整個單詞,其余的是碎片。)
關(guān)鍵是,此流程的每個部分都由神經(jīng)網(wǎng)絡(luò)實現(xiàn),其權(quán)重是通過端到端的網(wǎng)絡(luò)訓(xùn)練確定的。換句話說,除了整體架構(gòu)以外,實際上沒有什么是“顯式地設(shè)計”的;所有東西都只是從訓(xùn)練數(shù)據(jù)中“學(xué)習(xí)”的。
然而,建立架構(gòu)的方式有很多細(xì)節(jié),反映了各種經(jīng)驗和神經(jīng)網(wǎng)絡(luò)技術(shù)。而且,盡管這絕對是深入探討,但我認(rèn)為談?wù)撘恍┻@些細(xì)節(jié)是有用的,至少可以讓人們了解構(gòu)建ChatGPT這樣的東西需要付出多大的努力。
首先是嵌入模塊。這是GPT-2的一個示意圖,使用Wolfram語言表示:
這里描述的是模型中的embedding模塊。這個模塊的輸入是一個由n個標(biāo)記(以前面所述的方式,用1到大約50000之間的整數(shù)表示)組成的向量。每個標(biāo)記都被轉(zhuǎn)換(通過單層神經(jīng)網(wǎng)絡(luò))成一個嵌入向量(對于GPT-2是長度為768的向量,對于ChatGPT的GPT-3是長度為12288的向量)。同時,有一個“次要路徑”會將標(biāo)記的整數(shù)位置序列轉(zhuǎn)換成另一個嵌入向量。最后,標(biāo)記值和標(biāo)記位置的嵌入向量相加,生成最終的嵌入向量序列。
為什么要將標(biāo)記值和標(biāo)記位置的嵌入向量相加呢?我認(rèn)為這并沒有什么特別的科學(xué)原理。只是嘗試了許多不同的方法,這種方法似乎是行之有效的。并且神經(jīng)網(wǎng)絡(luò)的經(jīng)驗法則是,在某種意義上,只要設(shè)置大致正確,通??梢酝ㄟ^充分的訓(xùn)練來確定細(xì)節(jié),而無需真正需要在工程層面上“理解”神經(jīng)網(wǎng)絡(luò)是如何配置自己的。
這是embedding模塊的操作,針對的是輸入字符串:hello hello hello hello hello hello hello hello hello hello bye bye bye bye bye bye bye bye bye bye:
嵌入模塊的每個標(biāo)記的嵌入向量的元素顯示在頁面下方,而橫跨頁面的第一次運行是“hello”嵌入,其后是“bye”運行。上面的第二個數(shù)組是位置嵌入,其看起來有些隨機的結(jié)構(gòu)只是“GPT-2中所學(xué)到的”(在本例中)。
好的,那么在嵌入模塊之后,transformer的“主要事件”是所謂的“attention blocks”序列(對于GPT-2有12個,對于ChatGPT的GPT-3有96個)。這一切都非常復(fù)雜,令人想起典型的難以理解的大型工程系統(tǒng)或生物系統(tǒng)。但是無論如何,這是單個“attention block”的示意圖(適用于GPT-2):
每個這樣的注意力塊內(nèi)都有一組“注意力頭”(GPT-2為12個,ChatGPT的GPT-3為96個)——每個注意力頭獨立地對嵌入向量中的不同值塊進行操作。(是的,我們并不知道為什么將嵌入向量拆分為幾部分是一個好主意,或者不同部分的含義是什么;這只是那些“被發(fā)現(xiàn)可行”的事情之一。)
那么注意力頭是做什么的呢?基本上,它們是一種“回顧”標(biāo)記序列的方式(即迄今為止生成的文本),并以有用的形式“打包過去”,以便找到下一個標(biāo)記。在上面的第一節(jié)中,我們談到了使用二元概率來根據(jù)它們的直接前驅(qū)選擇單詞。變形金剛中的“注意力”機制所做的是允許“注意”更早的單詞——從而可能捕捉動詞可以指代在句子中出現(xiàn)在它們之前很多個單詞的名詞的方式。
在更詳細(xì)的層面上,注意頭的操作是重新組合與不同標(biāo)記相關(guān)聯(lián)的嵌入向量中的塊,并帶有某些權(quán)重。因此,例如,在上述“hello, bye”字符串中,第一個注意力塊(在GPT-2中)中的12個注意力頭具有以下(“一直向標(biāo)記序列的開頭回顧”)“重新組合權(quán)重”模式:
在經(jīng)過注意力頭處理后,得到的“重新加權(quán)嵌入向量”(對于 GPT-2 的長度為 768,對于 ChatGPT 的 GPT-3 的長度為 12,288)被傳遞到一個標(biāo)準(zhǔn)的“全連接”神經(jīng)網(wǎng)絡(luò)層。很難把握這一層正在做什么。但是這里是它使用的 768×768 權(quán)重矩陣的繪圖(這里是針對 GPT-2):
通過取 64×64 的移動平均值,一些(隨機行走般的)結(jié)構(gòu)開始顯現(xiàn):
這個結(jié)構(gòu)的確定因素是什么?最終可能是人類語言特征的一些“神經(jīng)網(wǎng)絡(luò)編碼”。但是目前為止,這些特征可能是未知的。實際上,我們正在“打開ChatGPT的大腦”(或至少是GPT-2),發(fā)現(xiàn)是的,里面很復(fù)雜,我們不理解它,即使最終它會產(chǎn)生可識別的人類語言。
好的,通過一個注意塊,我們得到了一個新的嵌入向量,然后連續(xù)通過其他注意塊(對于GPT-2是12個;對于GPT-3是96個)。每個注意塊都有其自己特定的“注意力”和“完全連接”權(quán)重模式。這里是GPT-2的“hello,bye”輸入的第一個注意頭的注意力權(quán)重序列:
把這些移動平均后,下面是完全連接層的矩陣:
有趣的是,盡管不同注意力塊中的這些“權(quán)重矩陣”看起來非常相似,但權(quán)重大小的分布可能會有所不同(而且并不總是高斯分布):
因此,在經(jīng)過所有這些注意力塊之后,變形器的凈效應(yīng)是什么?本質(zhì)上,它將標(biāo)記序列的原始嵌入集合轉(zhuǎn)換為最終集合。而ChatGPT的特定工作方式是選擇此集合中的最后一個嵌入,并將其“解碼”以生成應(yīng)該下一個標(biāo)記的概率列表。
這就是ChatGPT內(nèi)部的概述。它可能看起來很復(fù)雜(尤其是因為它有許多不可避免的有些任意的“工程選擇”),但實際上涉及的最終元素非常簡單。因為最終我們處理的只是由“人造神經(jīng)元”組成的神經(jīng)網(wǎng)絡(luò),每個神經(jīng)元都執(zhí)行簡單的操作,即將一組數(shù)字輸入與某些權(quán)重結(jié)合。
ChatGPT的原始輸入是一組數(shù)字(到目前為止標(biāo)記的嵌入向量),當(dāng)ChatGPT“運行”以生成新標(biāo)記時,所發(fā)生的就是這些數(shù)字在神經(jīng)網(wǎng)絡(luò)的層中“漣漪”,每個神經(jīng)元“做自己的事情”,并將結(jié)果傳遞給下一層上的神經(jīng)元。沒有循環(huán)或“返回”。一切都只是通過網(wǎng)絡(luò)“前饋”傳遞。
這種架構(gòu)與典型的計算系統(tǒng)(如圖靈機)非常不同,在該計算系統(tǒng)中,結(jié)果會被相同的計算元素重復(fù)“重新處理”。而在這里——至少在生成給定輸出令牌時——每個計算元素(即神經(jīng)元)僅使用一次。
但在某種意義上,即使在ChatGPT中,仍然存在一個“外部循環(huán)”,即重復(fù)使用計算元素。因為當(dāng)ChatGPT將要生成一個新令牌時,它總是“讀取”(即將其之前的所有標(biāo)記序列作為輸入),包括ChatGPT自己以前“編寫”的標(biāo)記。我們可以將這種設(shè)置視為意味著ChatGPT——至少在其最外層——涉及一個“反饋循環(huán)”,盡管每次迭代都明確可見為出現(xiàn)在其生成的文本中的令牌。
但讓我們回到ChatGPT的核心:被重復(fù)用于生成每個標(biāo)記的神經(jīng)網(wǎng)絡(luò)。在某種程度上,它非常簡單:整個相同的人工神經(jīng)元集合。網(wǎng)絡(luò)的某些部分僅由(“全連接”)神經(jīng)元層組成,在該層中,給定層上的每個神經(jīng)元都連接(帶有一些權(quán)重)到前一層上的每個神經(jīng)元。但是,尤其是在其轉(zhuǎn)換器架構(gòu)方面,ChatGPT具有更多結(jié)構(gòu)的部分,其中僅連接不同層上的特定神經(jīng)元。(當(dāng)然,仍然可以說“所有神經(jīng)元都連接在一起”——但有些神經(jīng)元的權(quán)重為零。)
此外,ChatGPT神經(jīng)網(wǎng)絡(luò)的某些方面并不是最自然的想法,它們不能僅被視為“同質(zhì)”的層。例如,正如上面的圖表所示,注意力塊中存在“復(fù)制多個輸入數(shù)據(jù)”的地方,每個數(shù)據(jù)副本都會經(jīng)過不同的“處理路徑”,可能涉及不同數(shù)量的層,然后才進行重新組合。但是,雖然這可能是對正在發(fā)生的事情的方便表示,但總體上來說,在原則上可以考慮“密集填充”層,只是有一些權(quán)重為零。
如果看一下ChatGPT中最長的路徑,涉及到約400個(核心)層,從某些方面來看并不是一個巨大的數(shù)字。但是有數(shù)百萬個神經(jīng)元,總共有1750億個連接和因此有1750億個權(quán)重。一個需要意識到的事情是,每次ChatGPT生成一個新的標(biāo)記時,它都必須進行一次涉及每個權(quán)重的計算。從實現(xiàn)的角度來看,這些計算可以按“層”組織成高度并行的數(shù)組操作,可以方便地在GPU上執(zhí)行。但是對于生成的每個標(biāo)記,仍然需要進行1750億次計算(最終還需要更多)——因此,不難理解使用ChatGPT生成一長段文本需要一定時間。
但最終,令人驚異的是,所有這些操作 - 盡管它們各自都很簡單 - 怎么能一起成功地完成“人類化”的生成文本的工作。必須再次強調(diào)的是(至少就我們目前所知),沒有“終極理論原因”說明為什么這樣的方法會奏效。實際上,正如我們將要討論的那樣,我認(rèn)為我們必須將其視為一種(潛在令人驚訝的)科學(xué)發(fā)現(xiàn):在像ChatGPT這樣的神經(jīng)網(wǎng)絡(luò)中,不知何故,可以捕捉到人類大腦在生成語言方面的本質(zhì)。
好了,現(xiàn)在我們已經(jīng)概述了ChatGPT設(shè)置后的工作原理。但是它是如何設(shè)置的呢?它的所有1750億個權(quán)重是如何確定的呢?基本上,它們是通過基于人類編寫的大量文本 - 在網(wǎng)上、書籍中等 - 進行大規(guī)模訓(xùn)練得到的。正如我們所說,即使考慮到所有這些訓(xùn)練數(shù)據(jù),神經(jīng)網(wǎng)絡(luò)能夠成功地生成“人類化”的文本,這顯然并不明顯。再一次,似乎需要詳細(xì)的工程部分才能使這一切發(fā)生。但ChatGPT的重大驚喜 - 和發(fā)現(xiàn) - 是這是可能的。實際上,“只有”1750億個權(quán)重的神經(jīng)網(wǎng)絡(luò)可以生成人類寫作的“合理模型”。
現(xiàn)代社會中,有大量由人類書寫的文本以數(shù)字形式存在。公共網(wǎng)絡(luò)上至少有幾十億人類書寫的網(wǎng)頁,總共可能有萬億字的文本。如果包括非公開網(wǎng)頁,則數(shù)字可能至少增加100倍。迄今已經(jīng)有超過500萬本數(shù)字化圖書可供使用(約占有史以來出版的1億本書的一半),提供另外約1000億字的文本。這還沒有提到從視頻等語音中產(chǎn)生的文本。(作為個人對比,我一生中發(fā)表的總文字量略低于300萬字,過去30年我寫了約1500萬字的電子郵件,總共輸入的文字可能有5000萬字。在過去幾年中,我在直播中說了超過1000萬個詞。是的,我會從所有這些中訓(xùn)練一個聊天機器人。)
但是,好的,有了所有這些數(shù)據(jù),如何從中訓(xùn)練神經(jīng)網(wǎng)絡(luò)呢?基本過程與我們在上面簡單示例中討論的非常相似。您提供一批示例,然后調(diào)整網(wǎng)絡(luò)中的權(quán)重以最小化網(wǎng)絡(luò)在這些示例上產(chǎn)生的誤差(“損失”)。“反向傳播”錯誤的主要昂貴之處在于每次這樣做時,網(wǎng)絡(luò)中的每個權(quán)重通常至少會微調(diào)一點,而要處理的權(quán)重數(shù)量非常多。(實際的“反向計算”通常僅比前向計算更難處理一個小常數(shù)因子。
通過現(xiàn)代GPU硬件,可以輕松并行計算數(shù)千個示例的結(jié)果。但是,在實際更新神經(jīng)網(wǎng)絡(luò)的權(quán)重時,當(dāng)前的方法基本上需要逐批次進行。 (是的,這可能是實際的大腦現(xiàn)在至少具有架構(gòu)優(yōu)勢的地方,因為它們具有組合計算和存儲元素。)
即使在我們之前討論學(xué)習(xí)數(shù)值函數(shù)的看似簡單的情況下,我們發(fā)現(xiàn)我們通常需要使用數(shù)百萬個示例才能成功地從頭開始訓(xùn)練網(wǎng)絡(luò)。那么,這意味著我們需要多少示例才能訓(xùn)練出“類似人類語言”的模型呢?理論上似乎沒有任何確定的方法。但實踐中,ChatGPT 成功地從幾百億個單詞的文本中進行了訓(xùn)練。
它有時會多次處理某些文本,有時只會處理一次。但是,它從所看到的文本中“獲取了所需的內(nèi)容”。但是,考慮到這么多文本要從中學(xué)習(xí),它應(yīng)該需要多大的神經(jīng)網(wǎng)絡(luò)才能“學(xué)習(xí)得好”呢?同樣,我們尚無根本性的理論方法來確定。最終 - 如下面將進一步討論的那樣 - 人類語言和人們通常使用它說的內(nèi)容應(yīng)該存在一定的“總算法內(nèi)容”。但是,下一個問題是神經(jīng)網(wǎng)絡(luò)在實現(xiàn)基于該算法內(nèi)容的模型時的效率如何。我們還不知道,盡管 ChatGPT 的成功表明它是相當(dāng)有效的。
最終我們可以注意到,ChatGPT使用了數(shù)百億個權(quán)重來完成它的任務(wù)——與其訓(xùn)練數(shù)據(jù)中的總單詞(或標(biāo)記)數(shù)量相當(dāng)。在某些方面,這或許令人驚訝(雖然在ChatGPT的較小模型中也經(jīng)驗證實),好像“工作良好的網(wǎng)絡(luò)大小”與“訓(xùn)練數(shù)據(jù)大小”非常相似。畢竟,這當(dāng)然不是因為“ChatGPT內(nèi)部”某種方式“直接存儲”了來自網(wǎng)絡(luò)、圖書等所有文本的內(nèi)容。因為ChatGPT內(nèi)部實際上是一堆數(shù)字,具有稍少于10位數(shù)的精度,是所有文本的集合結(jié)構(gòu)的某種分布式編碼。
換句話說,我們可以問人類語言及其典型用法的“有效信息內(nèi)容”是什么。有語言的原始語料庫,還有ChatGPT中的神經(jīng)網(wǎng)絡(luò)表示。這種表示很可能遠(yuǎn)非“算法上最小”的表示(如下文所討論的)。但它是神經(jīng)網(wǎng)絡(luò)容易使用的表示。在這種表示中,訓(xùn)練數(shù)據(jù)似乎最終沒有太多壓縮;平均而言,基本上只需要不到一個神經(jīng)網(wǎng)絡(luò)權(quán)重來承載一個訓(xùn)練數(shù)據(jù)單詞的“信息內(nèi)容”。
當(dāng)我們運行ChatGPT來生成文本時,我們基本上必須使用每個權(quán)重一次。因此,如果有n個權(quán)重,我們需要大約n次計算步驟——盡管在實踐中,許多計算步驟通常可以在GPU中并行完成。但是如果我們需要大約n個單詞的訓(xùn)練數(shù)據(jù)來設(shè)置這些權(quán)重,那么根據(jù)上面所說的內(nèi)容,我們可以得出結(jié)論,我們將需要大約n2個計算步驟來進行網(wǎng)絡(luò)的訓(xùn)練。這就是為什么,用當(dāng)前的方法,我們最終需要談?wù)摵馁M數(shù)十億美元的訓(xùn)練工作的原因。
在 ChatGPT 的訓(xùn)練中,大部分的工作是“向它展示”來自網(wǎng)絡(luò)、書籍等的大量現(xiàn)有文本。但事實證明還有另一個似乎非常重要的部分。
一旦 ChatGPT 從它展示的原始文本語料庫中完成“原始訓(xùn)練”,神經(jīng)網(wǎng)絡(luò)內(nèi)部就可以開始生成自己的文本,并從提示中繼續(xù)生成。盡管這些結(jié)果通常似乎是合理的,但它們往往會在較長的文本中“偏離”,經(jīng)常表現(xiàn)出非常非人類化的方式。這不是通過對文本進行傳統(tǒng)的統(tǒng)計分析可以輕松檢測到的,但人們閱讀文本時很容易注意到。
ChatGPT 構(gòu)建的一個關(guān)鍵思想是,在“被動閱讀”像網(wǎng)絡(luò)這樣的東西之后,還有另一步:讓實際的人們積極與 ChatGPT 互動,看看它生成了什么,從而對“如何成為一個好的聊天機器人”給予反饋。但神經(jīng)網(wǎng)絡(luò)如何使用這些反饋呢?第一步是讓人類評價神經(jīng)網(wǎng)絡(luò)的結(jié)果。然后建立另一個神經(jīng)網(wǎng)絡(luò)模型,試圖預(yù)測這些評分。但現(xiàn)在這個預(yù)測模型可以被運行,在原始網(wǎng)絡(luò)上實際上像損失函數(shù)一樣進行運算,從而允許該網(wǎng)絡(luò)通過人類反饋進行“調(diào)整”。實踐中的結(jié)果似乎對系統(tǒng)成功產(chǎn)生“類人”的輸出有很大的影響。
總的來說,有趣的是,要讓“原始訓(xùn)練”的網(wǎng)絡(luò)朝特定方向有用地發(fā)展,似乎只需要很少的“刺激”。人們可能會認(rèn)為,要讓網(wǎng)絡(luò)表現(xiàn)得好像“學(xué)會了新東西”,就需要運行訓(xùn)練算法,調(diào)整權(quán)重等等。
但事實并非如此。相反,似乎只需要在提示中告訴ChatGPT一次東西,它就可以成功地在生成文本時利用它所學(xué)到的內(nèi)容。再一次,這種方法的可行性是我認(rèn)為理解ChatGPT“真正在做什么”以及它與人類語言和思維結(jié)構(gòu)的關(guān)系的重要線索之一。
這其中肯定有一些類似于人類的東西:至少在完成了所有的預(yù)訓(xùn)練后,你只需要告訴它一次東西,它就可以“記住”它——至少“足夠長時間”以便使用它生成一段文本。那么,在這種情況下發(fā)生了什么呢?可能“你要告訴它的一切內(nèi)容已經(jīng)在里面了”,你只是引導(dǎo)它到正確的位置。但這似乎不太可能。相反,更有可能的是,是的,這些元素已經(jīng)在里面了,但是具體內(nèi)容是由類似于“這些元素之間的軌跡”之類的東西定義的,而當(dāng)你告訴它一些內(nèi)容時,就是在引入這些軌跡。
實際上,與人類相似,如果你告訴ChatGPT一些奇怪和意想不到的東西,完全不符合它已知的框架,它似乎不能成功地“整合”它。只有當(dāng)它基本上在現(xiàn)有框架的基礎(chǔ)上以相當(dāng)簡單的方式運行時,它才能“整合”它。
還值得再次指出,神經(jīng)網(wǎng)絡(luò)“捕捉”信息的能力必然有“算法限制”。告訴它“這個東西去那個地方”的“淺層規(guī)則”,神經(jīng)網(wǎng)絡(luò)很可能能夠很好地表示和再現(xiàn)這些規(guī)則,而且它已經(jīng)從語言中“已知”的東西將給它一個立即跟隨的模式。但是,如果你嘗試為涉及許多潛在的計算不可化簡步驟的實際“深層計算”提供規(guī)則,它就行不通了。(請記住,在每個步驟中,它總是在其網(wǎng)絡(luò)中“向前傳遞數(shù)據(jù)”,除了生成新標(biāo)記外,它永遠(yuǎn)不會循環(huán)。)
當(dāng)然,網(wǎng)絡(luò)可以學(xué)習(xí)特定的“不可化簡”計算的答案。但是,一旦存在組合數(shù)目的可能性,這種“表格查找樣式”的方法就行不通了。因此,像人類一樣,神經(jīng)網(wǎng)絡(luò)現(xiàn)在需要“伸手”使用實際的計算工具。(是的,Wolfram|Alpha和Wolfram Language非常適合,因為它們被建立用于“談?wù)撌澜缟系氖虑椤?,就像語言模型神經(jīng)網(wǎng)絡(luò)一樣。)
人類語言和生成它所涉及的思維過程一直被認(rèn)為是一種復(fù)雜的頂峰。實際上,人類大腦的“僅有”約1000億個神經(jīng)元(以及可能有1萬億個連接)的網(wǎng)絡(luò)能夠負(fù)責(zé)這一過程,一直讓人感到驚訝。也許人們會想象,大腦不僅僅是神經(jīng)元網(wǎng)絡(luò),還有一些未被發(fā)現(xiàn)的新物理層面。但現(xiàn)在,我們有了一個重要的新信息:我們知道一個僅有約人類神經(jīng)元數(shù)量的純?nèi)斯ど窠?jīng)網(wǎng)絡(luò)能夠出奇地成功地生成人類語言。
是的,這仍然是一個龐大而復(fù)雜的系統(tǒng),其神經(jīng)網(wǎng)絡(luò)權(quán)重數(shù)量約等于當(dāng)前世界上可用文本的單詞數(shù)。但在某種程度上,仍然難以相信語言的豐富性和它所能談?wù)摰氖虑榭梢员环庋b在這樣一個有限的系統(tǒng)中。部分原因在于,計算過程實際上可以大大增加系統(tǒng)的表面復(fù)雜性,即使其基本規(guī)則是簡單的(這在規(guī)則30的例子中首次顯現(xiàn)出來)。但實際上,正如我們上面所討論的那樣,ChatGPT中使用的神經(jīng)網(wǎng)絡(luò)傾向于特別構(gòu)造以限制這種現(xiàn)象的影響和與之相關(guān)的計算不可簡化性,以使其訓(xùn)練更易于接受。
那么,像ChatGPT這樣的系統(tǒng)是如何實現(xiàn)語言生成的呢?我認(rèn)為,基本答案是語言在根本上比它看起來要簡單。這意味著即使使用了最終相對簡單的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),ChatGPT也能成功地“捕捉到”人類語言及其背后的思維本質(zhì)。而且,在其訓(xùn)練中,ChatGPT已經(jīng)“隱含地發(fā)現(xiàn)”了使這一切成為可能的語言(和思維)的規(guī)律。
我認(rèn)為,ChatGPT的成功為我們提供了一項基礎(chǔ)和重要的科學(xué)證據(jù):它表明我們可以期望有重大的新“語言定律”——實際上是“思維定律”——有待發(fā)現(xiàn)。在以神經(jīng)網(wǎng)絡(luò)為基礎(chǔ)的ChatGPT中,這些定律至多是隱含的。但是,如果我們能夠以某種方式使這些定律明確,那么就有可能以更直接、高效、透明的方式做到ChatGPT所能做的事情。
那么,這些定律可能是什么樣子的呢?最終,它們必須為我們提供某種方法,描述語言及其表達(dá)的東西是如何組合在一起的。稍后我們將討論“觀察ChatGPT內(nèi)部”可能如何為我們提供一些提示,以及我們從構(gòu)建計算語言中所知道的是如何前進的。但首先,讓我們討論兩個長期以來已知的“語言定律”的例子,以及它們與ChatGPT的操作的關(guān)系。
第一條是語言的語法。語言不是一堆隨機混合的單詞。相反,有相對明確的語法規(guī)則來指導(dǎo)不同類型的單詞如何組合:例如,在英語中,名詞可以被形容詞修飾,并且后面可以跟動詞,但通常兩個名詞不能緊挨著。這種語法結(jié)構(gòu)可以(至少近似地)通過定義“語法樹”的規(guī)則集來捕捉:
ChatGPT沒有任何明確的“知識”來描述這樣的規(guī)則,但在其訓(xùn)練中它隱式地“發(fā)現(xiàn)”了這些規(guī)則,然后似乎能夠很好地遵循它們。那么這是如何工作的呢?在“大局”層面上,這并不清楚。但為了獲得一些洞察力,也許看一個更簡單的例子會很有啟發(fā)性。
考慮由(和)序列組成的“語言”,其語法規(guī)定括號始終要保持平衡,如下所示的解析樹:
我們可以訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)來生成“語法正確”的括號序列嗎?在神經(jīng)網(wǎng)絡(luò)中,處理序列的方式有很多種,但讓我們使用變壓器網(wǎng)絡(luò),就像ChatGPT一樣。給定一個簡單的transformer網(wǎng)絡(luò),我們可以開始將語法正確的括號序列作為訓(xùn)練樣本。一個細(xì)節(jié)(實際上也出現(xiàn)在ChatGPT生成人類語言的情況下)是,除了我們的“內(nèi)容標(biāo)記”(在這里是“(”和“)”)之外,我們還必須包括一個“結(jié)束”標(biāo)記,用于指示輸出不應(yīng)再繼續(xù)(即對于ChatGPT,這意味著已經(jīng)到達(dá)了“故事的結(jié)尾”)。
如果我們設(shè)置一個只有一個注意塊,具有8個頭和長度為128的特征向量的簡單transformer網(wǎng)絡(luò)(ChatGPT也使用長度為128的特征向量,但具有96個注意塊,每個塊有96個頭),那么它似乎無法學(xué)習(xí)太多關(guān)于括號語言的知識。但是,使用2個注意塊,學(xué)習(xí)過程似乎會收斂 - 至少在提供了大約1000萬個示例后(并且,與transformer網(wǎng)絡(luò)的常見情況一樣,提供更多示例似乎只會降低其性能)。
因此,對于這個網(wǎng)絡(luò),我們可以做類似于ChatGPT的操作,并要求它輸出下一個標(biāo)記的概率 - 在括號序列中:
在第一種情況下,該網(wǎng)絡(luò)“非常確定”序列無法在此結(jié)束——這很好,因為如果結(jié)束了,括號就會不平衡。然而,在第二種情況下,它“正確地識別”序列可以在這里結(jié)束,但它也“指出”可以“重新開始”,放下一個“(”,可能會有一個“)”跟隨。但是,糟糕的是,即使有著它那 400,000 個辛苦訓(xùn)練的權(quán)重,它也說有 15% 的概率下一個標(biāo)記是“)”,這是不正確的,因為這必然會導(dǎo)致不平衡的括號。
以下是我們對網(wǎng)絡(luò)詢問括號序列中逐漸變長的最高概率完成情況的結(jié)果:
是的,在一定長度范圍內(nèi),神經(jīng)網(wǎng)絡(luò)做得很好。但是隨后它開始失敗。這是在“精確”情況下使用神經(jīng)網(wǎng)絡(luò)(或者說機器學(xué)習(xí))時所看到的典型情況。人類“一眼就能解決”的問題,神經(jīng)網(wǎng)絡(luò)也能解決。但是對于需要執(zhí)行“更多算法性操作”的問題(例如顯式計算括號數(shù)量以查看是否已關(guān)閉),神經(jīng)網(wǎng)絡(luò)似乎“計算能力不夠”,無法可靠地完成任務(wù)。(順便說一句,即使是完整的ChatGPT當(dāng)前版本在長序列中也難以正確匹配括號。)
那么這對ChatGPT之類的事物以及英語這種語言的語法意味著什么?括號語言是“嚴(yán)格”的,更像是“算法性的故事”。但是在英語中,基于局部單詞選擇和其他線索來“猜測”語法上合適的東西是更現(xiàn)實的。是的,神經(jīng)網(wǎng)絡(luò)在這方面表現(xiàn)得更好——盡管可能會錯過一些“形式上正確”的情況,但這也可能是人類會犯的錯誤。但是主要觀點是,語言存在整體句法結(jié)構(gòu),具有所有規(guī)律性的含義,這在某種程度上限制了神經(jīng)網(wǎng)絡(luò)需要學(xué)習(xí)的“程度”。一個關(guān)鍵的“類自然科學(xué)”的觀察是,像ChatGPT中的轉(zhuǎn)換器體系結(jié)構(gòu)似乎能夠成功地學(xué)習(xí)這種類似于樹形嵌套結(jié)構(gòu)的語法結(jié)構(gòu),這種結(jié)構(gòu)似乎在所有人類語言中都存在(至少是某種近似)。
語法提供了一種對語言的限制。但是還有其他方面的限制。像“好奇的電子在吃魚的時候吃藍(lán)色的理論”這樣的句子在語法上是正確的,但不是人們通常會說的內(nèi)容,如果ChatGPT生成這樣的內(nèi)容,也不會被認(rèn)為是成功的,因為這個句子在其常規(guī)單詞含義下基本上毫無意義.
但是,有沒有一般性的方法可以確定一個句子是否有意義?傳統(tǒng)上沒有一個總體理論可以解決這個問題。但是在被數(shù)十億條(可能有意義的)來自網(wǎng)絡(luò)等的句子訓(xùn)練之后,人們可以認(rèn)為ChatGPT已經(jīng)隱含地“發(fā)展了一種理論”。
這種理論會是什么樣子呢?在邏輯方面,有一小部分基本上已經(jīng)被人們了解了兩千年,那就是邏輯學(xué)。特別是在亞里士多德發(fā)現(xiàn)的三段論形式中,邏輯學(xué)基本上是一種說法,即遵循某些模式的句子是合理的,而其他句子則不合理。因此,例如,說“所有的X都是Y。這不是Y,所以它不是X”是合理的(例如,“所有的魚都是藍(lán)色的。這不是藍(lán)色的,所以它不是魚?!保?。就像可以有些幽默地想象亞里士多德通過大量的修辭例子(“機器學(xué)習(xí)式”)發(fā)現(xiàn)三段論邏輯一樣,人們也可以想象,在ChatGPT的訓(xùn)練過程中,它會通過查看網(wǎng)絡(luò)上的大量文本等方式“發(fā)現(xiàn)三段論邏輯”(當(dāng)然,在更復(fù)雜的形式邏輯方面,情況會有所不同,并且我認(rèn)為可以預(yù)期它會像匹配括號一樣在這里失敗)。
但是,在邏輯的狹義例子之外,有什么方法可以系統(tǒng)地構(gòu)建(或識別)即使是可能有意義的文本嗎?是的,有像Mad Libs這樣使用非常特定的“短語模板”的東西。但是,一些ChatGPT似乎隱含地有一種更普遍的方法來做到這一點。也許在它的1750億個神經(jīng)網(wǎng)絡(luò)權(quán)重下,這種能力似乎是自然而然發(fā)生的。但我強烈懷疑,其實有一種更簡單而強大的方法。
我們上面討論過,在ChatGPT內(nèi)部,任何一段文本都可以被表示為一個數(shù)字?jǐn)?shù)組,我們可以把它想象成某種“語言特征空間”中的點的坐標(biāo)。因此,當(dāng)ChatGPT繼續(xù)一段文本時,這相當(dāng)于在語言特征空間中描繪出一條軌跡。但現(xiàn)在我們可以問,在這個軌跡與我們認(rèn)為有意義的文本相對應(yīng)時,什么使它成為有意義的呢?或許會有一些“語義動力學(xué)規(guī)律”來定義或至少限制著在保持“有意義性”的同時,語言特征空間中的點如何移動呢?
那么這個語言特征空間是什么樣子的呢?如果我們將這樣一個特征空間投影到二維平面上,以下是單個單詞(這里是普通名詞)的可能布局示例:
我們在上面看到了另一個基于代表植物和動物的單詞的示例。但是在這兩種情況下,“語義相似的單詞”會被放在附近。
作為另一個示例,這里是不同詞性的單詞如何排列的:
當(dāng)然,一個單詞通常不僅有“一個意思”(或者并不一定對應(yīng)于一個詞性)。通過查看包含一個單詞的句子在特征空間中的布局,人們經(jīng)常可以“分解”不同的含義-例如,對于單詞“crane”(是指鳥還是機器?)在這里的示例中:
好的,所以我們至少可以認(rèn)為這個特征空間將“在意義上相似的單詞”放在空間中靠近的位置。但是在這個空間中,我們可以識別出什么樣的額外結(jié)構(gòu)呢?例如,是否有某種“平行輸運”的概念,反映了空間的“平直性”?一個了解這個問題的方法是觀察類比:
當(dāng)然,即使我們將空間投影到2D,通常也至少有“平坦的暗示”,盡管它肯定不是普遍存在的。
那么軌跡呢?我們可以查看ChatGPT中一個提示在特征空間中遵循的軌跡,然后看看ChatGPT如何繼續(xù)它:
這里當(dāng)然沒有“幾何上顯然”的運動規(guī)律。這一點毫不令人驚訝;我們完全期望這是一個更加復(fù)雜的故事。例如,即使存在“語義運動規(guī)律”,它最自然的表述方式(或者實際上是哪些“變量”)也很不明顯。
在上面的圖中,我們展示了“軌跡”的幾個步驟,其中每一步我們選擇 ChatGPT 認(rèn)為最有可能的單詞(“零溫度”情況)。但我們也可以詢問在給定點上下一個可能出現(xiàn)的單詞以及其概率:
我們可以看到,在這種情況下,存在一個“扇形”,其中高概率單詞在特征空間中似乎朝著一個或多個方向移動。如果我們繼續(xù)下去,會發(fā)生什么?以下是隨著我們“沿著”軌跡“移動”而出現(xiàn)的連續(xù)“扇形”:
這是一個三維的圖形,共計40步:
是的,這看起來像一團亂麻,并沒有特別鼓勵人們相信我們可以通過經(jīng)驗研究“ChatGPT內(nèi)部的工作方式”來識別“數(shù)學(xué)物理般的”“語義運動定律”。但也許我們只是在看“錯誤的變量”(或錯誤的坐標(biāo)系),只要我們看到正確的變量,我們就會立即看到ChatGPT正在做一些“數(shù)學(xué)物理簡單”的事情,比如遵循測地線。但是目前為止,我們還沒有準(zhǔn)備好從其“內(nèi)部行為”中“經(jīng)驗性解碼”出ChatGPT已經(jīng)“發(fā)現(xiàn)”的有關(guān)人類語言“組合”的信息。
要產(chǎn)生“有意義的人類語言”,需要什么?在過去,我們可能會認(rèn)為這只能是人類的大腦所能做到的。但現(xiàn)在,我們知道ChatGPT的神經(jīng)網(wǎng)絡(luò)也可以做得相當(dāng)不錯。但是,也許這就是我們所能做到的最好的了,沒有更簡單或更易于理解的東西能夠勝任。但我強烈懷疑ChatGPT的成功隱含了一個重要的“科學(xué)”事實:有意義的人類語言實際上比我們所知道的更具結(jié)構(gòu)和簡單性,在最終可能會有相當(dāng)簡單的規(guī)則來描述如何組合這樣的語言。
正如我們之前提到的,語法語法為人類語言中的不同詞性對應(yīng)的單詞如何組合提供規(guī)則。但為了處理意義,我們需要更進一步。其中一種方法是不僅考慮語法語法,還要考慮語義語法。
對于語法,我們可以識別名詞和動詞等事物。但對于語義,我們需要“更細(xì)致的分級”。例如,我們可能會識別“移動”概念和“維持其獨立于位置的身份”的“對象”概念。這些“語義概念”有無數(shù)具體的例子。但是,對于我們的語義語法,我們將只有一些基本規(guī)則,基本上是說“對象”可以“移動”。關(guān)于如何處理這一點,有很多要說的(我之前已經(jīng)說過一些)。但在這里,我會滿足于提出一些簡要的評論,以表明前進的一些潛在途徑。
值得一提的是,即使根據(jù)語義語法,一個句子是完全可以的,這并不意味著它已經(jīng)在實踐中實現(xiàn)了(甚至可能無法實現(xiàn))?!按笙笕ピ虑蚵眯小睙o疑會“通過”我們的語義語法,但它當(dāng)然還沒有在我們實際的世界中實現(xiàn)(至少目前還沒有)——盡管它絕對適用于虛構(gòu)的世界。
當(dāng)我們開始談?wù)摗罢Z義語法”時,我們很快會問:“它的底層是什么?” 它假設(shè)了什么“世界模型”? 語法語法實際上只是關(guān)于如何從單詞構(gòu)建語言的方式。 但是語義語法必然涉及某種“世界模型”——某些東西可以作為“骨架”,在其上可以構(gòu)建由實際單詞組成的語言。
直到最近,我們可能認(rèn)為(人類的)語言是描述我們“世界模型”的唯一一種通用方法。幾個世紀(jì)以前就開始對特定事物進行形式化,特別是基于數(shù)學(xué)。但現(xiàn)在有一種更通用的形式化方法:計算語言。
是的,這是我四十多年來的大型項目(現(xiàn)在體現(xiàn)在 Wolfram 語言中):開發(fā)精確的符號表示,可以盡可能廣泛地談?wù)撌澜缟系氖挛?,以及我們關(guān)心的抽象事物。因此,例如,我們具有城市、分子、圖像和神經(jīng)網(wǎng)絡(luò)的符號表示,并且我們具有關(guān)于如何計算這些東西的內(nèi)置知識。
現(xiàn)在在 Wolfram 語言中,我們已經(jīng)內(nèi)置了大量關(guān)于很多事物的計算知識。但是要建立一個完整的符號論述語言,我們還需要建立關(guān)于世界上普遍事物的其他“演算法”,例如:如果一個物體從 A 移動到 B,然后從 B 移動到 C,那么它就從 A 移動到 C,等等。
給定一個符號論述語言,我們可以使用它來做“獨立的陳述”。但我們也可以像“Wolfram|Alpha”一樣使用它來問關(guān)于世界的問題?;蛘呶覀兛梢允褂盟鼇黻愂鑫覀儭跋胍獙崿F(xiàn)的事情”,可能需要一些外部激活機制?;蛘呶覀兛梢允褂盟鼇碜鰯嘌浴赡苁顷P(guān)于實際世界,或者是關(guān)于我們考慮的某個特定的世界,無論是虛構(gòu)的還是其他的。
人類語言在根本上是不精確的,因為它沒有與特定的計算機實現(xiàn)“連接”,它的含義基本上只由其使用者之間的“社會契約”來定義。但是,由于其本質(zhì)的特性,計算機語言具有一定的基本精度——因為最終它所指定的內(nèi)容都可以在計算機上“明確地執(zhí)行”。人類語言通??梢蕴颖芤欢ǖ暮磺澹ó?dāng)我們說“行星”時,它是否包括系外行星等等?)。但在計算機語言中,我們必須明確和清楚地表達(dá)我們所做的所有區(qū)分。
通常情況下,利用普通人類語言來構(gòu)建計算語言中的名稱是很方便的。但是它們在計算語言中的含義必須是精確的,可能涵蓋或不涵蓋典型的人類語言用法中的某些內(nèi)涵。
如何確定適用于一般符號話語語言的基本“本體論”?嗯,這并不容易。這或許就是為什么自亞里士多德兩千多年前做出原始的開端以來,很少有人在這方面做過什么。但今天我們現(xiàn)在對如何以計算方式思考世界有如此深入的了解,這確實有所幫助(而我們的物理項目的“基本形而上學(xué)”的概念也不無幫助)。
但是,這一切在ChatGPT的背景下意味著什么呢?通過訓(xùn)練,ChatGPT已經(jīng)有效地“拼湊出”了某種(相當(dāng)驚人的)語義語法數(shù)量。但它的成功使我們有理由認(rèn)為,構(gòu)建更完整的計算語言形式是可行的。并且,與我們迄今為止已經(jīng)了解的有關(guān)ChatGPT內(nèi)部的情況不同,我們可以期望設(shè)計計算語言,使其易于人類理解。
當(dāng)我們談?wù)撜Z義語法時,可以將其類比于三段論邏輯。最初,三段論邏輯本質(zhì)上是有關(guān)用人類語言表達(dá)陳述的規(guī)則集合。但是(是的,兩千年后),當(dāng)形式邏輯被發(fā)展出來時,三段論邏輯的原始基本結(jié)構(gòu)現(xiàn)在可以用于構(gòu)建巨大的“形式塔”,包括現(xiàn)代數(shù)字電路的運算。因此,我們可以期待,更一般的語義語法也會是這樣。起初,它可能只能處理簡單的模式,比如文本。但一旦它的整個計算語言框架被建立起來,我們可以期待,它將能夠被用于建立“廣義語義邏輯”的高大塔樓,使我們能夠以精確和形式化的方式處理以前從未可及的各種事物,除了普通的人類語言外,它們的含糊不清只能停留在“地面層次”。
我們可以認(rèn)為計算語言和語義語法的構(gòu)建代表了一種表示事物的終極壓縮。因為它允許我們談?wù)摽赡苄缘谋举|(zhì),而不必處理存在于普通人類語言中的所有“說法”。我們可以將ChatGPT的巨大優(yōu)勢視為類似的東西:因為它也在某種程度上“穿透了”到了可以“以語義方式將語言組合起來”的地步,而不必考慮不同的可能說法。
那么,如果將ChatGPT應(yīng)用于基礎(chǔ)計算語言會發(fā)生什么呢?計算語言可以描述可能性。但是仍然可以添加“流行的東西”的感覺,例如基于閱讀網(wǎng)絡(luò)上的所有內(nèi)容。但是,然后,在計算語言下面運行意味著類似ChatGPT這樣的東西具有立即和根本的訪問權(quán),可以利用潛在的不可約算的終極工具。這使得它不僅可以“生成合理的文本”,而且可以期望能夠解決關(guān)于該文本是否實際上對世界或它所要談?wù)摰氖虑檫M行“正確”陳述的所有問題。
ChatGPT的基本概念在某種程度上相當(dāng)簡單。首先,從網(wǎng)絡(luò)、書籍等人類創(chuàng)作的大量文本樣本中出發(fā),然后訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)生成“類似”的文本。尤其是,使它能夠從“提示”開始,然后繼續(xù)生成“類似于它所訓(xùn)練的內(nèi)容”的文本。
正如我們所見,ChatGPT中的實際神經(jīng)網(wǎng)絡(luò)由非常簡單的元素組成——盡管有數(shù)十億個。神經(jīng)網(wǎng)絡(luò)的基本操作也非常簡單,基本上是將源自其迄今為止生成的文本的輸入“傳遞一次其元素”(不帶任何循環(huán)等)用于每個新單詞(或部分單詞)的生成。
但是值得注意的,以及出乎意料的是,這個過程可以生成成功的文本,其“類似于”網(wǎng)絡(luò)、書籍等的內(nèi)容。而且,它不僅是連貫的人類語言,而且“表達(dá)”了“遵循它的提示”的內(nèi)容,利用了它“讀到”的內(nèi)容。它并不總是說出“全局上有意義的話”(或?qū)?yīng)于正確的計算),因為(如果沒有訪問Wolfram|Alpha的“計算超級能力”),它只是在根據(jù)其訓(xùn)練材料中的“聽起來正確”的內(nèi)容說出一些話。
ChatGPT的具體工程使其變得非常引人注目。但最終(至少在它能夠使用外部工具之前),ChatGPT只是從它積累的“常規(guī)智慧的統(tǒng)計數(shù)據(jù)”中提取出一些“連貫的文本線索”。但令人驚奇的是,它的結(jié)果非常類似于我們?nèi)祟悤a(chǎn)生的結(jié)果。正如我所討論的,這表明了一些至少在科學(xué)上非常重要的事情:人類語言(及其背后的思維模式)在其結(jié)構(gòu)上比我們想象的要更簡單、更“有法則性”。ChatGPT已經(jīng)隱含地發(fā)現(xiàn)了這一點。但我們可能可以通過語義語法、計算語言等方式將其明確地暴露出來。
ChatGPT生成文本的能力非常令人印象深刻——其結(jié)果通常非常接近我們?nèi)祟惖漠a(chǎn)出。那么這是否意味著ChatGPT像一個大腦一樣工作呢?它的底層人工神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)最終是基于對大腦的理想化建模的。而且當(dāng)我們?nèi)祟惿烧Z言時,很多方面正在發(fā)生的事情似乎是相當(dāng)相似的。
當(dāng)涉及到訓(xùn)練(也就是學(xué)習(xí))大腦和當(dāng)前計算機的不同“硬件”(以及也許一些未開發(fā)的算法思想)時,ChatGPT被迫使用一種與大腦相比可能相當(dāng)不同(在某些方面更不高效)的策略。還有另一件事:與典型的算法計算甚至不同,ChatGPT內(nèi)部不具有“循環(huán)”或“重新計算數(shù)據(jù)”的能力。這不可避免地限制了它的計算能力,即使相對于當(dāng)前的計算機,但絕對是相對于大腦而言。
目前尚不清楚如何“修復(fù)這個問題”,同時仍保持系統(tǒng)的合理效率。但這樣做可能會讓未來的ChatGPT能夠執(zhí)行更多“類腦”的任務(wù)。當(dāng)然,大腦和ChatGPT這樣的系統(tǒng)在某些方面也有不足之處——尤其是涉及不可簡化計算的情況。對于這些問題,大腦和ChatGPT都需要尋求“外部工具”,例如Wolfram Language。
但就目前而言,看到ChatGPT已經(jīng)能夠做到什么是令人興奮的。從某種程度上說,這是一個很好的例子,說明大量簡單的計算元素可以做出非凡和出乎意料的事情。但它也提供了自2000年以來我們更好地理解人類語言和思維過程的基本特征和原則的最好動力。
在過去的43年中,我一直關(guān)注神經(jīng)網(wǎng)絡(luò)的發(fā)展,并與許多人互動過。其中包括:Giulio Alessandrini、Dario Amodei、Etienne Bernard、Taliesin Beynon、Sebastian Bodenstein、Greg Brockman、Jack Cowan、Pedro Domingos、Jesse Galef、Roger Germundsson、Robert Hecht-Nielsen、Geoff Hinton、John Hopfield、Yann LeCun、Jerry Lettvin、Jerome Louradour、Marvin Minsky、Eric Mjolsness、Cayden Pierce、Tomaso Poggio、Matteo Salvarezza、Terry Sejnowski、Oliver Selfridge、Gordon Shaw、Jonas Sj?berg、Ilya Sutskever、Gerry Tesauro和Timothee Verdier。在撰寫本文時,我特別要感謝Giulio Alessandrini和Brad Klee的幫助。
本文由聞數(shù)起舞和ChatGPT翻譯自
https://writings.stephenwolfram.com/2023/02/what-is-chatgpt-doing-and-why-does-it-work/
聯(lián)系客服