Wolfram語言之父Stephen Wolfram,又來替ChatGPT背書了。
上個月,他也特別寫過一篇文章,力薦自家的計算知識搜尋引擎WolframAlpha,希望能跟ChatGPT來個完美結合。
大概表達的意思就是,「你計算能力不達標,那可以把我的』超能力』注入進去嘛」。
而時隔一個多月,Stephen Wolfram圍繞著「ChatGPT是什麼」和「為什麼它能這麼有效」兩個問題,再次發表萬字長文做了番深入淺出的詳解。
(為了保證閱讀體驗,以下內容將以Stephen Wolfram的第一人稱來敘述;文字結尾有彩蛋!)
ChatGPT 能夠自動生成類似於人類撰寫的文本,這一點非常引人注目,也是出乎意料的。那麼,它是如何實現的呢?為什麼它能夠如此出色地產生有意義的文字呢?
在本文中,我將大致介紹 ChatGPT 內部運作的機制,並探討為什麼它能夠成功地產生令人滿意的文本。
要說明的是,我將重點放在 ChatGPT 的整體機制,雖然會提到一些技術細節,但不會做深入的探討。同時,也要強調的一點是,我所說的內容同樣適用於目前其它的「大型語言模型」(LLM),而不僅限於 ChatGPT。
首先需要解釋的一點是,ChatGPT 的核心任務始終是產生一個“合理的延續”,即根據現有的文本,產生一個符合人類書寫習慣的下一個合理內容。所謂“合理”,是指根據數十億個網頁、數位化書籍等人類撰寫內容的統計規律,推測接下來可能出現的內容。
例如,我們輸入了文字“AI 最好的事情是它的能力”,ChatGPT 就會在數十億頁的人類文本中查找類似文本,然後統計下一個單字出現的機率。需要注意的是,ChatGPT 並不是直接比較文字本身,而是以某種意義上的「意思匹配」為依據。最終,ChatGPT 會產生一個可能的單字列表,並給出每個單字的機率排名:
#值得注意的是,當ChatGPT完成像寫文章這樣的任務時,它實際上只是一遍又一遍地詢問:「在已有的文本的基礎上,下一個詞應該是什麼?」——並且每次都會添加一個詞(更準確地說,如我所解釋的,它添加一個“token”,這可能只是單字的一部分,這就是為什麼它有時會“創造新單字”的原因)。
在每一步中,它都會得到一個帶有機率的單字清單。但是,它應該選擇哪個單字來添加到它正在寫作的文章(或任何其他東西)中呢?
有人可能認為應該選擇「排名最高」的單字(即被分配最高「機率」的單字)。但這就是一些神秘的事情開始悄悄發生的地方。因為由於某種原因——也許有一天我們會有一種科學式的理解——如果我們總是選擇排名最高的單詞,我們通常會得到一篇非常“平淡”的文章,從不顯示任何創造力(有時甚至逐字重複)。如果有時(隨機地)我們選擇較低排名的單詞,可能會得到一篇「更有趣」的文章。
這裡存在隨機性意味著,如果我們多次使用相同的提示,很可能每次都會得到不同的文章。與voodoo理念一致,過程中會有一個特定的所謂「溫度」(temperature)參數,它決定較低排名的單字會被使用的頻率,對於文章生成,這個「溫度」最好設定為0.8。值得強調的是,這裡沒有使用「理論」;這只是已被證明在實踐中起作用的事實。例如,「溫度」概念之所以存在,是因為指數分佈(來自統計物理學的熟悉分佈)恰好被使用,但至少就我們所知,它們之間沒有「物理」聯繫。
在繼續之前,我應該解釋一下,為了表達的目的,我大多數時候不會使用ChatGPT中的完整系統;相反,我通常會使用一個更簡單的GPT-2系統,它具有很好的特性,即它足夠小,可以在標準桌上型電腦上運行。因此,我所展示的幾乎所有內容都將包含明確的Wolfram語言程式碼,您可以立即在電腦上執行。
例如,下面這張圖展示如何獲得上述機率表的。首先,我們必須檢索底層的「語言模型「神經網路:
稍後,我們將深入了解這個神經網絡,並討論它是如何工作的。但目前為止,我們可以將這個「網路模型」作為一個黑盒子應用到我們的文本中,並根據模型認為應該遵循的機率,請求前5個單字:
在取得結果後,會轉換為明確格式化的「資料集」:
下面是重複「應用模型「的情況—在每個步驟中加入機率最高的單字(在此程式碼中指定為模型中的「決定」):
如果再繼續下去會怎麼樣?在這種(”零度”)情況下,很快就會出現相當混亂和重複的情況。
但如果不總是挑選「頂級「詞,而是有時隨機挑選「非頂級「詞(」隨機性「對應「溫度「為0.8)呢?我們就又可以續寫文字了:
而每次這樣做,都會有不同的隨機選擇,對應的文字也會不同。例如以下這5個例子:
值得指出的是,即使在第一步,根據已有的文本,也有很多可能的“下一個字」可供選擇(在溫度為0.8的情況下),儘管它們的機率很快就會下降(是的,在這個對數圖上的直線對應於一個n–1 的「冪律」衰減,這是語言的一般統計特徵):
#那麼如果我們繼續寫下去會發生什麼事呢?這裡有一個隨機的例子。它比使用最高排名的單字(零度)的情況要好一些,但仍然有點奇怪:
#這是使用最簡單的GPT- 2模型(來自2019年)完成的。使用更新的更大的GPT-3模型結果更好。這裡是使用相同的“提示”,但使用最大的GPT-3模型產生的使用最高排名單字(零度)的文字:
##接下來是一個「溫度為0.8」的隨機例子:ChatGPT總是基於機率來選擇下一個單字。但這些機率從何而來呢?
讓我們先從一個更簡單的問題開始。當我們考慮逐字母(而非逐詞)產生英文文本,該如何確定每個字母的機率呢?
最簡單的方法是取一份英文文字樣本,然後計算其中不同字母的出現頻率。例如,這是“貓”在維基百科文章中字母的計數情況(此處省略了計數結果):
這是“狗」的情況:
結果相似,但並不完全一樣(畢竟,「o」在「dogs」文章中更常見,因為它本身就出現在「dog」這個字)。然而,如果我們取足夠大的英文文本樣本,最終可以期望得到至少相當一致的結果:
#下面是我們只用這些機率產生字母序列的樣本:
我們可以透過像是將空格視為帶有一定機率的字母來將其分解為“單字” :
可以透過強制「單字長度」的分佈與英文一致,來更好地分割「單字」:
#這裡我們沒有產生任何“真實的單字”,但結果看起來稍微好了一些。然而,要進一步推進,我們需要比僅僅隨機選擇每個字母更多的工作。例如,我們知道如果出現了“q”,下一個字母基本上必須是“u”。
這是字母本身的機率圖:
#這是典型英文文本中字母對(「2-grams」)的機率圖。橫軸是可能的第一個字母,縱軸是第二個字母(此處省略了機率圖):
#在這裡,我們可以看到,「q」列除了在「u」行上以外,其他地方都是空白(零機率)。那麼,現在我們不再逐個字母地產生“單字”,而是使用這些“2-gram”機率,一次產生兩個字母來產生它們。以下是結果的一個樣本——恰好包括一些「實際單字」:
通過足夠多的英語文本,我們不僅可以很好地估計單個字母或字母對(2-gram)的機率,還可以估計更長的字母組合的機率。如果我們使用逐漸變長的n-gram機率來產生“隨機單字”,我們會發現它們逐漸變得“更加真實”。
但現在讓我們假設——與ChatGPT一樣——我們處理的是整個單詞,而不是字母。英語中大約有40,000個常用單字。透過查看大量的英語文本(例如幾百億個單字的數百萬本書),我們可以估計每個單字的出現頻率。使用這個估計,我們可以開始產生“句子”,其中每個單字都是獨立地隨機選擇的,其機率與它在語料庫中出現的機率相同。以下是我們得到的一個樣本:
毫不意外,這是無意義的。那我們該怎麼做才能更好地產生句子?就像處理字母一樣,我們可以開始考慮不僅單字的機率,還可以考慮單字對或更長的n-gram的機率。對於單字對,以下是5個例子,所有情況都是從單字“cat”開始:
#看起來稍微“更有意義”了一點。如果我們能夠使用足夠長的n-grams,我們可能會想像基本上會「得到一個ChatGPT」——也就是說,我們會得到一些產生具有「正確的整體文章機率」的長篇文字序列的東西。但是問題在於:實際上沒有足夠的英語文本被寫出來,以便能夠推斷這些機率。
在網路爬蟲中可能有數百億個單字;在數位化的書籍中可能還有另外數百億個單字。但是,即使是 4 萬個常用單詞,可能的 2 元組數量已經達到 16 億,而可能的 3 元組數量則高達 60 兆。因此,我們無法透過現有的文本估計這些可能性的機率。當我們需要產生 20 個單字的「文章片段」時,可能性的數量已經超過了宇宙中的粒子數量,所以在某種意義上,它們無法全部被寫下來。
那麼,我們該怎麼辦呢?關鍵的想法是建立一個模型,讓我們能夠估計序列應該出現的機率,即使我們從未在我們查看的文本語料庫中明確看到這些序列。而在ChatGPT的核心正是所謂的「大型語言模型」(LLM),它被建構出來可以很好地估計這些機率。
(由於篇幅原因,此處省略「什麼是模型」、「神經網路」、「機器學習與神經網路的訓練」、「神經網路訓練的實踐與知識」、「Embedding概念」等章節的編譯,有興趣讀者可自行閱讀原文)
毫無疑問,它最終是一個巨大的神經網絡,目前版本是一個擁有1750 億個權重的GPT-3 網路。在許多方面,這個神經網路與我們討論過的其它神經網路非常相似,但它是一個專門用於處理語言的神經網路。最顯著的特徵是一個被稱為「Transformer」的神經網路架構。
在我們上面討論的第一類神經網路中,每個神經元在任何給定層都與前一層的每個神經元基本上相連(至少有一些權重)。但是,如果要處理具有特定已知結構的數據,這種完全連接的網路(大概)是overkill的。因此,在處理影像的早期階段,通常會使用所謂的捲積神經網路(“convnets”),其中神經元實際上是佈置在類似於影像像素的網格上,並且僅與網格附近的神經元相連。
Transformer的想法是對組成文字的token序列做出至少有點類似的事情。但是,Transformer不僅定義了一個固定區域,在該區域內可以建立連接,還引入了「注意力」的概念——「注意力」的概念更多地集中在序列的某些部分而不是其他部分。也許有一天,透過訓練,直接啟動通用神經網路並進行所有自訂都會有意義。但至少目前在實踐中,模組化東西是至關重要的,就像Transformer一樣,也可能是我們的大腦所做的一樣。
那麼 ChatGPT(或更準確地說,它所基於的GPT-3網路)實際上是在做什麼呢?請記住,它的總體目標是基於其從訓練中看到的東西(其中包括查看了來自網路等數十億個頁面的文字),並「合理地」續寫文字。因此,在任何給定的時刻,它都有一定程度的文本,並且其目標是為下一個token pick一個適當的選擇。
ChatGPT的運作是基於三個基本階段。首先,它會取得與目前文字對應的token序列,並找到代表它們的embedding(即一個數字陣列)。然後,它以“標準神經網路方式”對此embedding進行操作,使值在網路中的連續層中“波動”,以產生一個新的embedding(即一個新的數字數組)。接著,它獲取該數組的最後一部分並產生一個包含約50,000個值的數組,這些值將轉化為不同且可能的下一個token的機率(是的,恰好有與英語常用詞彙相同數量的token,儘管只有大約3000個token是完整單詞,其餘是片段。)
關鍵的一點是,這個pipeline的每個部分都由神經網路實現,其權重由網路的端到端訓練決定。換句話說,實際上,除了整體架構之外,沒有什麼是「明確設計的」;一切都是從訓練資料中「學習」的。
而,在架構建立的方式上有很多細節——反映了各種各樣的經驗和神經網路知識。雖然這絕對是一個細節問題,但我認為討論其中一些細節很有用,至少可以了解建造ChatGPT所需的內容。
首先是embedding模組。這是GPT-2的一個示意圖,用Wolfram語言表示:
#這段文字介紹了一個名為「embedding module」的模組,它有三個主要步驟。第一步,將文字轉換為token序列,每個token都用一個單層神經網路轉換為長度為768(對於GPT-2)或12288(對於ChatGPT的GPT-3)的embedding向量。同時,模組中還有一個「輔助通路」(secondary pathway),用於將token的整數位置轉換為embedding向量。最後,將token值和token位置的embedding向量加在一起,產生最終的embedding向量序列。
為什麼要將token值和token位置的embedding向量相加呢?似乎並沒有特別科學的解釋。只是嘗試了各種不同的方法,這種方法似乎能夠奏效。而且神經網路的傳統也認為,只要初始設定“大致正確”,透過足夠的訓練,通常可以自動調整細節,而不需要真正“理解神經網路是如何進行工程配置的”。
這個「embedding module」模組的作用是將文字轉換為embedding向量序列。以字串「hello hello hello hello hello hello hello hello hello hello bye bye bye bye bye bye bye bye bye bye」為例,它可以將其轉換為一系列長度為768的embedding向量,其中包括從每個token的值和位置中提取的資訊。
這裡展示了每個tokenembedding向量的元素,橫向顯示了一系列「hello」embedding,其後是一系列「bye」的embedding。上面的第二個陣列是位置embedding,其看似隨機的結構只是因為「(在這種情況下在GPT-2中)恰好被學習到了」。
好的,embedding模組之後是Transformer的「主要部分」:一系列所謂的「注意力塊」(GPT-2為12個,ChatGPT的GPT-3為96個)。這很複雜,讓人想起典型的難以理解的大型工程系統,或者說生物系統。但是,這裡是GPT-2的單一「注意力塊」的示意圖:
#在每個注意力區塊中,都有一組「 attention heads」(GPT-2有12個,ChatGPT的GPT-3有96個),每個attention head都獨立地作用於embedding向量中不同值的塊。 (是的,我們不知道將embedding向量拆分成若干部分的好處,也不知道它們的不同部分的含義;這只是已被發現可行的技術之一。)
那麼,attention head的作用是什麼呢?基本上,它們是一種「回顧」token序列(即已經產生的文本),並以有用的形式「打包」歷史資訊以便於找到下一個token的方式。在上文中,我們提到使用二元機率來基於它們的前一個token選擇單字。 Transformer中的“注意力”機制允許對更早的單字進行“注意力”,從而可能捕捉到例如動詞引用在句子中出現在它們前面多個單字的名詞的方式。
具體而言,attention head的作用是重新組合與不同token相關的embedding向量的區塊,並賦予一定的權重。因此,例如,GPT-2中第一個注意區塊中的12個attention head對於上面的“hello,bye”字串具有以下(“回顧token序列一直到開頭”的)“重新組合權重”模式:
經過注意力機制的處理,得到了一個「重新加權的embedding向量」(對於GPT-2長度為768,對於ChatGPT的GPT -3長度為12,288),然後通過一個標準的「全連接」神經網路層。很難理解這一層在做什麼。但這裡是它所使用的768×768權重矩陣的繪圖(這裡是GPT-2):
透過64×64的移動平均,一些(隨機遊走狀的)結構開始出現:
是什麼決定了這個結構呢?這可能是一些關於人類語言特徵的「神經網路編碼」。但是到目前為止,這些特徵可能還是未知的。實際上,我們正在「打開ChatGPT的大腦」(或至少是GPT-2),並發現,是的,裡面很複雜,我們並不理解,儘管最終它產生了可識別人類語言的能力。
好的,經過一個注意力模組之後,我們得到了一個新的embedding向量,然後連續通過其他注意力模組(對於GPT-2總共有12個,對於GPT-3則有96個)。每個注意力模組都有其特定的「注意力」和「全連接」權重模式。這裡是針對「hello, bye」輸入的第一個attention head的注意力權重的序列(對於GPT-2):
##以下是(移動平均後的)全連接層的「矩陣」: 有趣的是,即使在不同的注意力區塊中,這些「權重矩陣」看起來非常相似,權重大小的分佈也可能有所不同(並且並不總是高斯分佈): 那麼,經過所有這些注意力區塊後,Transformer的淨效應是什麼?本質上,它將token序列的原始embedding集合轉換為最終集合。而ChatGPT的特定工作方式是選擇該集合中的最後一個embedding,並對其進行“解碼”,以產生下一個token的機率列表。 因此,這就是ChatGPT內部的概述。它可能看起來很複雜(其中許多選擇都是不可避免的、有些任意的「工程選擇」),但實際上,最終涉及的元素非常簡單。因為最終我們處理的只是由「人造神經元」構成的神經網絡,每個神經元都執行將一組數字輸入與某些權重組合的簡單操作。 ChatGPT的原始輸入是數字數組(到目前為止token的embedding向量),當ChatGPT“運行”以產生新的token時,這些數字只是通過神經網路的層“傳播”,每個神經元「做自己的事情」並將結果傳遞給下一層的神經元。沒有循環或“回溯”。所有東西都只是透過網路「前饋」。這與典型的計算系統(如圖靈機)完全不同,後者透過相同的計算元素重複「重新處理」結果。在這裡——至少在生成給定輸出token方面——每個計算元素(即神經元)只使用一次。
但在ChatGPT中仍然存在某種意義上的“外部循環”,即使在計算元素中也會重複使用。因為當ChatGPT要產生新token時,它總是「讀取」(即將其作為輸入)在它之前出現的整個token序列,包括ChatGPT自己先前「編寫」的token。我們可以將這個設定視為意味著ChatGPT在其最外層至少涉及一個“反饋循環”,儘管每次迭代都明確可見為在其生成的文本中出現的token。
讓我們回到ChatGPT的核心:用來產生每個token的神經網路。從某個層面上來說,它非常簡單:一個由相同人工神經元所構成的集合。網路的某些部分僅由(「完全連接」)神經元層組成,在該層上的每個神經元都連接到前一層上的每個神經元(具有某些權重)。但特別是在其Transformer架構中,ChatGPT具有更多結構化的部分,其中僅特定層上的特定神經元相連。 (當然,人們仍然可以說「所有神經元都連接」-但有些神經元的權重為零)。
此外,ChatGPT中的神經網路的一些方面並不是最自然的「同質」層。例如,在一個注意力區塊中,有一些地方會對傳入的資料進行“多份拷貝”,然後每份都經過不同的“處理路徑”,可能涉及不同數量的層,直到後來才重新組合。雖然這可能是一種方便的表示方式,但至少在原則上,總是可以考慮“densely filling in”層,只是讓一些權重為零。
如果你看一下ChatGPT的最長路徑,大約有400層(核心層)-在某些方面並不是一個龐大的數字。但是有數百萬個神經元,總共有1750億個連接,因此有1750億個權重。需要意識到的一件事是,每次ChatGPT產生一個新token時,它都必須進行涉及每個權重的計算。在實作上,這些計算可以被組織成高度並行的陣列操作,可以方便地在GPU上完成。但是對於產生的每個token,仍然需要進行1750億次計算(最後還要多一點)——所以,是的,用ChatGPT生成一長段文本需要一段時間也就不足為奇了。
但最終我們還需要值得注意的是,所有這些操作都能以某種方式共同完成如此「類似人類」的生成文本的工作。必須再次強調的是,(至少就我們所知)沒有「終極理論原因」可以解釋為什麼像這樣的任何東西應該起作用。實際上,正如我們將要討論的那樣,我認為我們必須將其視為一項-潛在令人驚訝的-科學發現:在像ChatGPT這樣的神經網路中,有可能捕捉到人類大腦在生成語言方面所能夠做到的本質。
(由於原文篇幅過長,有興趣的夥伴可以戳文末鏈接閱讀全文)
或許在打開這篇文章的時候,有些小夥伴已經注意到了一些細微變化:
#沒錯,這篇文章核心內容的編輯,正是ChatGPT!
以及,它自己談了對Stephen Wolfram這篇文章的看法:
參考連結:
[1] https://www.php.cn/link/e3670ce0c315396e4836d7024abcf3dd
##[2] ##https://www.php.cn /link/b02f0c434ba1da7396aca257d0eb1e2f
#[3] #://www.php.cn/link/76e9a17937b75b73a8a430acf#210fef#
以上是ChatGPT為啥這麼強:萬字長文詳解 by WolframAlpha之父的詳細內容。更多資訊請關注PHP中文網其他相關文章!