ChatGPT 的工作原理,這篇文章說清楚了!

作者:Stephen Wolfram

來源:Python 數據之道

作者:史蒂芬 · 沃爾弗拉姆(Stephen Wolfram)英、美籍  計算機科學家, 物理學家。他是 Mathematica 的首席設計師,《一種新科學》一書的作者。

ChatGPT 能夠自動生成一些讀起來表面上甚至像人寫的文字的東西,這非常了不起,而且出乎意料。但它是如何做到的?爲什麼它能發揮作用?我在這裏的目的是大致介紹一下 ChatGPT 內部的情況,然後探討一下爲什麼它能很好地生成我們認爲是有意義的文本。

我首先要說明一下,我將把重點放在正在發生的事情的大的方向上,雖然我會提到一些工程細節,但我不會深入研究它們。(我所說的實質內容也同樣適用於目前其他的 “大型語言模型” LLM 和 ChatGPT)。

首先要解釋的是,ChatGPT 從根本上說總是試圖對它目前得到的任何文本進行 “合理的延續”,這裏的 “合理” 是指 “在看到人們在數十億個網頁上所寫的東西之後,人們可能會期望某人寫出什麼”。

因此,假設我們已經得到了 “人工智能最好的是它能去做 ……” 的文本(“The best thing about AI is its ability to”)。想象一下,掃描數十億頁的人類書寫的文本(例如在網絡上和數字化書籍中),並找到這個文本的所有實例 —— 然後看到什麼詞在接下來的時間裏出現了多少。

ChatGPT 有效地做了類似的事情,除了(正如我將解釋的)它不看字面文本;它尋找在某種意義上 “意義匹配” 的東西。但最終的結果是,它產生了一個可能出現在後面的詞的排序列表,以及 “概率”。

值得注意的是,當 ChatGPT 做一些事情,比如寫一篇文章時,它所做的基本上只是反覆詢問 “鑑於到目前爲止的文本,下一個詞應該是什麼?” —— 而且每次都增加一個詞。(更準確地說,正如我將解釋的那樣,它在添加一個 “標記”,這可能只是一個詞的一部分,這就是爲什麼它有時可以 “編造新詞”)。

在每一步,它得到一個帶有概率的單詞列表。 但是,它究竟應該選擇哪一個來添加到它正在寫的文章(或其他什麼)中呢?人們可能認爲它應該是 “排名最高” 的詞(即被分配到最高 “概率” 的那個)。

但是,這時就會有一點巫術開始悄悄出現。因爲出於某種原因 —— 也許有一天我們會有一個科學式的理解 —— 如果我們總是挑選排名最高的詞,我們通常會得到一篇非常 “平淡” 的文章,似乎從來沒有 “顯示出任何創造力”(甚至有時一字不差地重複)。但是,如果有時(隨機的)我們挑選排名較低的詞,我們會得到一篇 “更有趣” 的文章。

這裏有隨機性的事實意味着,假如我們多次使用同一個提示,我們也很可能每次都得到不同的文章。 而且,爲了與巫術的想法保持一致,有一個特定的所謂 “溫度” 參數(temperature parameter),它決定了以什麼樣的頻率使用排名較低的詞,而對於論文的生成,事實證明,0.8 的 “溫度” 似乎是最好的。(值得強調的是,這裏沒有使用任何 “理論”;這只是一個在實踐中被發現可行的問題)。例如,“溫度” 的概念之所以存在,是因爲恰好使用了統計物理學中熟悉的指數分佈,但沒有 “物理” 聯繫 —— 至少到目前爲止我們如此認爲。)

在我們繼續之前,我應該解釋一下,爲了論述的目的,我大多不會使用 ChatGPT 中的完整系統;相反,我通常會使用更簡單的 GPT-2 系統,它有一個很好的特點,即它足夠小,可以在標準的臺式電腦上運行。

因此,對於我展示的所有內容,包括明確的沃爾弗拉姆語言(Wolfram Language)代碼,你可以立即在你的計算機上運行。(點擊這裏的任何圖片都可以複製其背後的代碼 —— 譯者注:請查看文末的 “原文鏈接”,在其中點擊圖片獲取代碼)。

例如,這裏是如何獲得上述概率表的。首先,我們必須檢索底層的 “語言模型” 神經網:

稍後,我們將看看這個神經網的內部,並談談它是如何工作的。但現在我們可以把這個 “網絡模型” 作爲一個黑匣子應用於我們迄今爲止的文本,並要求按概率計算出該模型認爲應該選擇的前五個詞:

這就把這個結果變成了一個明確的格式化的 “數據集”:

如果重複 “應用模型” —— 在每一步中加入概率最高的詞(在此代碼中被指定爲模型的 “決定”),會發生什麼:

如果再繼續下去會發生什麼?在這種情況下(“零溫度”),很快就會出現相當混亂和重複的情況:

但是,如果不總是挑選 “頂級” 詞,而是有時隨機挑選 “非頂級” 詞(“隨機性” 對應 “溫度” 爲 0.8)呢?人們又可以建立起文本:

而每次這樣做,都會有不同的隨機選擇,文本也會不同 —— 如這 5 個例子:

值得指出的是,即使在第一步,也有很多可能的 “下一個詞” 可供選擇(溫度爲 0.8),儘管它們的概率下降得很快(是的,這個對數圖上的直線對應於 n-1 的 “冪律” 衰減,這是語言的一般統計的特點):

那麼,如果繼續下去會發生什麼?這裏有一個隨機的例子。它比頂層詞(零溫度)的情況要好,但頂多還是有點奇怪:

這是用最簡單的 GPT-2 模型(來自 2019 年)做的。用較新和較大的 GPT-3 模型,結果更好。這裏是用同樣的 “提示” 產生的頂部文字(零溫度),但用最大的 GPT-3 模型:

這是 “溫度爲 0.8” 時的一個隨機例子:

1 概率從何而來?

好吧,ChatGPT 總是根據概率來選擇下一個詞。但是這些概率從何而來?讓我們從一個更簡單的問題開始。讓我們考慮一次生成一個字母(而不是單詞)的英語文本。我們怎樣才能算出每個字母的概率呢?

我們可以做的一個非常簡單的事情就是取一個英語文本的樣本,然後計算不同字母在其中出現的頻率。因此,舉例來說,這是計算維基百科上關於 “貓”(cat) 的文章中的字母:

而這對 “狗”(dog) 也有同樣的作用:

結果相似,但不一樣(“o” 在 “dogs” 文章中無疑更常見,因爲畢竟它出現在 “dog” 這個詞本身)。儘管如此,如果我們採取足夠大的英語文本樣本,我們可以期待最終得到至少是相當一致的結果。

下面是我們得到的一個樣本,如果我們用這些概率生成一個字母序列:

我們可以通過添加空格將其分解爲 “單詞”,就像它們是具有一定概率的字母一樣:

我們可以通過強迫 “字長” 的分佈與英語中的分佈相一致,在製造 “單詞” 方面做得稍微好一點:

我們在這裏沒有碰巧得到任何 “實際的詞”,但結果看起來稍好一些。不過,要想更進一步,我們需要做的不僅僅是隨機地分別挑選每個字母。例如,我們知道,如果我們有一個 “q”,下一個字母基本上必須是 “u”:

這裏有一個字母本身的概率圖:

這是一個顯示典型英語文本中成對字母(“2-grams”)概率的圖。可能的第一個字母顯示在頁面上,第二個字母顯示在頁面下:

例如,我們在這裏看到,除了 “u” 行,“q” 列是空白的(概率爲零)。好了,現在我們不再是一次生成一個字母的 “單詞”,而是使用這些 “2-gram” 概率,一次看兩個字母來生成它們。下面是一個結果的樣本 —— 其中恰好包括一些 “實際的詞”:

有了足夠多的英語文本,我們不僅可以對單個字母或成對字母(2-grams)的概率進行很好的估計,而且還可以對較長的字母進行估計。如果我們用逐漸變長的 n-gram 概率生成 “隨機詞”,我們就會發現它們逐漸變得 “更現實”:

但現在讓我們假設 —— 或多或少像 ChatGPT 那樣 —— 我們處理的是整個單詞,而不是字母。英語中大約有 40,000 個合理的常用詞。通過查看大型英語文本語料庫(比如幾百萬本書,總共有幾千億個單詞),我們可以得到每個單詞的常見程度的估計。利用這一點,我們可以開始生成 “句子”,其中每個詞都是獨立隨機抽取的,其出現的概率與語料庫中的相同。下面是我們得到的一個樣本:

顯然,這是一派胡言。那麼,我們如何才能做得更好呢?就像對待字母一樣,我們可以開始考慮的不僅僅是單個詞的概率,還有成對的或更長的詞的 n-grams 的概率。在成對的情況下,以下是我們得到的 5 個例子,所有情況都是從 “貓” 這個詞開始的:

它變得稍微 “看起來很合理” 了。我們可以想象,如果我們能夠使用足夠長的 n-grams,我們基本上會 “得到一個 ChatGPT” —— 在這個意義上,我們會得到一些東西,以 “正確的總體論文概率” 生成論文長度的單詞序列。但問題是:沒有足夠的英文文本可以推導出這些概率。

在網絡的抓取中,可能有幾千億個單詞;在已經數字化的書籍中,可能有另外幾千億個單詞。但是有了 4 萬個常用詞,即使是可能的 2-grams 的數量也已經是 16 億了,可能的 3-grams 的數量是 60 萬億。

所以我們沒有辦法從現有的文本中估計出所有這些的概率。而當我們達到 20 個字的 “文章片段” 時,可能性的數量比宇宙中的粒子數量還要多,所以從某種意義上說,它們永遠不可能全部被寫下來。

那麼我們能做什麼呢?最大的想法是建立一個模型,讓我們估計序列出現的概率 —— 即使我們在所看的文本語料庫中從未明確見過這些序列。而 ChatGPT 的核心正是一個所謂的 “大型語言模型”(LLM),它的建立可以很好地估計這些概率。

2 什麼是模型?

假設你想知道(就像伽利略在 15 世紀末所做的那樣),從比薩塔的每一層落下的炮彈要多長時間才能落地。那麼,你可以在每一種情況下測量它,並將結果製成表格。或者你可以做理論科學的精髓:建立一個模型,給出某種計算答案的程序,而不是僅僅測量和記住每個案例。

讓我們想象一下,我們有(有點理想化的)數據,說明炮彈從不同樓層落下需要多長時間。

我們如何計算出它從一個我們沒有明確數據的樓層落下需要多長時間?在這種特殊情況下,我們可以用已知的物理學定律來計算。但是,如果說我們所得到的只是數據,而我們不知道有什麼基本定律在支配它。那麼我們可以做一個數學上的猜測,比如說,也許我們應該用一條直線作爲模型。

我們可以選擇不同的直線。但這是平均來說最接近我們所給的數據的一條。而根據這條直線,我們可以估算出任何樓層的下降時間。

我們怎麼知道要在這裏嘗試使用一條直線呢?在某種程度上我們不知道。這只是數學上簡單的東西,而我們已經習慣了這樣的事實:我們測量的很多數據都被數學上簡單的東西很好地擬合了。我們可以嘗試一些數學上更復雜的東西 —— 比如說 a + bx + cx2,然後在這種情況下,我們做得更好:

不過,事情可能會出大問題。比如這裏是我們用 a + b/c + x sin(x) 最多也就做成:

值得理解的是,從來沒有一個 “無模型的模型”。你使用的任何模型都有一些特定的基礎結構,然後有一組 “你可以轉動的旋鈕”(即你可以設置的參數)來適應你的數據。而在 ChatGPT 的案例中,使用了很多這樣的 “旋鈕” —— 實際上,有 1750 億個。

但令人矚目的是,ChatGPT 的底層結構 —— “僅僅” 有這麼多的參數 —— 足以使一個計算下一個單詞概率的模型 “足夠好”,從而爲我們提供合理的文章長度的文本。

3 類人的任務模型

我們上面舉的例子涉及到爲數字數據建立模型,這些數據基本上來自於簡單的物理學 —— 幾個世紀以來我們都知道 “簡單數學適用”。但是對於 ChatGPT 來說,我們必須爲人類語言文本建立一個模型,即由人腦產生的那種模型。 而對於這樣的東西,我們(至少現在)還沒有類似 “簡單數學” 的東西。那麼,它的模型可能是什麼樣的呢?

在我們談論語言之前,讓我們先談談另一項類似人類的任務:識別圖像。而作爲一個簡單的例子,讓我們考慮數字的圖像(是的,這是一個經典的機器學習例子):

我們可以做的一件事是爲每個數字獲取一堆樣本圖像:

然後,爲了找出我們輸入的圖像是否對應於某個特定的數字,我們只需與我們擁有的樣本進行明確的逐像素比較。但作爲人類,我們似乎可以做得更好 —— 因爲我們仍然可以識別數字,即使它們是手寫的,並且有各種各樣的修改和扭曲。

當我們爲上面的數字數據建立一個模型時,我們能夠取一個給定的數字值 x,然後爲特定的 a 和 b 計算 a + bx。

因此,如果我們把這裏的每個像素的灰度值當作某個變量 xi,是否有一些所有這些變量的函數,在評估時告訴我們這個圖像是什麼數字?事實證明,有可能構建這樣一個函數。不足爲奇的是,這並不特別簡單。一個典型的例子可能涉及 50 萬次數學運算。

但最終的結果是,如果我們把一幅圖像的像素值集合輸入這個函數,就會得出一個數字,指定我們的圖像是哪個數字。稍後,我們將討論如何構建這樣一個函數,以及神經網絡的概念。但現在讓我們把這個函數當作黑匣子,我們輸入例如手寫數字的圖像(作爲像素值的陣列),然後我們得到這些數字對應的數字:

但這裏到底發生了什麼?比方說,我們逐步模糊一個數字。有一段時間,我們的函數仍然 “識別” 它,在這裏是一個 “2”。但很快它就 “失去” 了,並開始給出 “錯誤” 的結果:

但爲什麼我們說這是一個 “錯誤” 的結果呢?在這種情況下,我們知道我們通過模糊一個 “2” 得到所有的圖像。但是,如果我們的目標是製作一個人類識別圖像的模型,那麼真正要問的問題是,如果遇到這些模糊的圖像,在不知道其來源的情況下,人類會做什麼。

如果我們從我們的功能中得到的結果通常與人類會說的話一致,我們就有一個 “好的模型”。而非微不足道的科學事實是,對於像這樣的圖像識別任務,我們現在基本上知道如何構建這樣的函數。

我們能 “從數學上證明” 它們的作用嗎?嗯,不能。因爲要做到這一點,我們必須有一個關於我們人類正在做什麼的數學理論。以 “2” 圖像爲例,改變幾個像素。我們可以想象,只有幾個像素 “不合適”,我們還是應該認爲這個圖像是 “2”。但這應該到什麼程度呢?這是一個關於人類視覺感知的問題。而且,是的,對於蜜蜂或章魚來說,答案無疑是不同的 —— 對於假定的外星人來說,可能完全不同。

好吧,那麼我們用於圖像識別等任務的典型模型究竟是如何工作的呢?目前最流行、最成功的方法是使用神經網絡。 在 20 世紀 40 年代,神經網絡的發明形式與今天的使用非常接近,它可以被認爲是大腦似乎工作方式的簡單理想化。

在人類的大腦中,有大約 1000 億個神經元(神經細胞),每個神經元都能產生電脈衝,每秒可能有一千次。這些神經元在一個複雜的網絡中連接起來,每個神經元都有樹狀的分支,允許它將電信號傳遞給可能有成千上萬的其他神經元。

粗略估計,任何給定的神經元是否在某一時刻產生電脈衝,取決於它從其他神經元那裏收到的脈衝 —— 不同的連接有不同的 “權重” 貢獻。

當我們 “看到一個圖像” 時,所發生的事情是,當圖像的光子落在眼睛後面的(“光感受器”)細胞上時,它們在神經細胞中產生電信號。這些神經細胞與其他神經細胞相連,最終信號通過一整層的神經元。而正是在這個過程中,我們 “識別” 了圖像,最終 “形成了一個想法”,即我們 “看到了一個 2”(也許最後會做一些事情,如大聲說 “2” 這個詞)。

上一節中的 “黑盒子” 函數是這樣一個神經網絡的 “數學化” 版本。它剛好有 11 層(雖然只有 4 個 “核心層”)。

這個神經網並沒有什麼特別的 “理論推導”;它只是在 1998 年作爲一項工程而構建的東西,並且被發現是有效的。(當然,這與我們描述我們的大腦是通過生物進化過程產生的沒有什麼不同)。

好吧,但是像這樣的神經網絡是如何 “識別事物” 的?關鍵在於吸引器的概念。想象一下,我們有 1 和 2 的手寫圖像:

我們希望所有的 1 都 “被吸引到一個地方”,而所有的 2 都 “被吸引到另一個地方”。或者,換一種方式,如果一個圖像在某種程度上 “更接近於 1”,而不是 2,我們希望它最終出現在 “1 的地方”,反之亦然。

作爲一個直接的類比,我們假設在平面上有某些位置,用點表示(在現實生活中,它們可能是咖啡店的位置)。那麼我們可以想象,從平面上的任何一點開始,我們總是想在最近的點結束(即我們總是去最近的咖啡店)。我們可以通過將平面劃分爲由理想化的 “分水嶺” 分隔的區域(“吸引盆地”)來表示這一點:

我們可以認爲這是在執行一種 “識別任務”,我們不是在做類似於識別給定圖像 “看起來最像” 的數字的事情 —— 而是很直接地看到給定點最接近哪個點。(我們在這裏展示的 “Voronoi 圖” 設置是在二維歐幾里得空間中分離點;數字識別任務可以被認爲是在做非常類似的事情 —— 但卻是在一個由每張圖像中所有像素的灰度等級形成的 784 維空間中。)

那麼,我們如何使一個神經網絡 “完成一個識別任務”?讓我們考慮這個非常簡單的案例:

我們的目標是獲取一個對應於 {x,y} 位置的 “輸入”,然後將其 “識別” 爲它最接近的三個點中的任何一個。或者,換句話說,我們希望神經網絡能夠計算出一個類似於 {x,y} 的函數:

那麼,我們如何用神經網絡做到這一點呢?歸根結底,神經網是一個理想化的 “神經元” 的連接集合 —— 通常按層排列 —— 一個簡單的例子是:

每個 “神經元” 都被有效地設置爲評估一個簡單的數字函數。爲了 “使用” 這個網絡,我們只需在頂部輸入數字(如我們的座標 x 和 y),然後讓每一層的神經元 “評估它們的功能”,並通過網絡向前輸入結果 —— 最終在底部產生最終的結果。

在傳統的(受生物啓發的)設置中,每個神經元實際上都有一組來自上一層神經元的 “傳入連接”,每個連接都被賦予一定的 “權重”(可以是一個正數或負數)。一個給定的神經元的值是通過將 “前一個神經元” 的值乘以其相應的權重來確定的,然後將這些值相加並乘以一個常數,最後應用一個 “閾值”(或 “激活”)函數。

在數學術語中,如果一個神經元有輸入 x = {x1, x2 ……},那麼我們計算 f[w.x + b],其中權重 w 和常數 b 通常爲網絡中的每個神經元選擇不同;函數 f 通常是相同的。

計算 w.x + b 只是一個矩陣乘法和加法的問題。激活函數 “f 引入了非線性(並最終導致了非線性行爲)。通常使用各種激活函數;這裏我們只使用 Ramp(或 ReLU):

對於我們希望神經網絡執行的每一項任務(或者說,對於我們希望它評估的每一個整體函數),我們將有不同的權重選擇。(正如我們稍後要討論的那樣,這些權重通常是通過使用機器學習從我們想要的輸出實例中 “訓練” 神經網絡來確定的)。

最終,每個神經網絡都對應於一些整體的數學函數 —— 儘管它可能寫得很亂。對於上面的例子,它就是:

ChatGPT 的神經網絡也只是對應於這樣的一個數學函數 —— 但實際上有數十億個術語。

但讓我們回到單個神經元上。下面是一個有兩個輸入(代表座標 x 和 y)的神經元在選擇不同的權重和常數(以及 Ramp 作爲激活函數)後可以計算的函數的一些例子:

但是,上面那個更大的網絡是怎麼回事?嗯,這是它的計算結果:

這不是很 “正確”,但它接近於我們上面展示的 “最近點” 函數。

讓我們看看其他一些神經網絡的情況。在每一種情況下,正如我們稍後所解釋的,我們都在使用機器學習來尋找最佳的權重選擇。然後,我們在這裏展示帶有這些權重的神經網絡的計算結果:

更大的網絡通常能更好地逼近我們的目標函數。而在 “每個吸引子盆地的中間”,我們通常會得到我們想要的答案。 但在邊界 —— 神經網絡 “很難下定決心” 的地方 —— 情況可能會更加混亂。

在這個簡單的數學風格的 “識別任務” 中,“正確答案” 是什麼很清楚。但在識別手寫數字的問題上,就不那麼清楚了。如果有人把 “2” 寫得很糟糕,看起來像 “7”,等等,怎麼辦?不過,我們還是可以問,神經網絡是如何區分數字的 —— 這就給出了一個指示:

我們能 “從數學上” 說說網絡是如何區分的嗎?並非如此。它只是在 “做神經網絡所做的事” 而已。但事實證明,這通常似乎與我們人類所作的區分相當吻合。

讓我們舉一個更復雜的例子。比方說,我們有貓和狗的圖像。我們有一個神經網絡,它被訓練來區分它們。下面是它在一些例子中可能做的事情:

現在,“正確答案” 是什麼就更不清楚了。穿着貓衣的狗怎麼辦?等等。無論給它什麼輸入,神經網絡都會產生一個答案。而且,事實證明,這樣做的方式與人類可能做的事情是合理一致的。

正如我在上面所說的,這不是一個我們可以 “從第一原理推導” 的事實。它只是根據經驗被發現是真的,至少在某些領域是這樣。但這是神經網絡有用的一個關鍵原因:它們以某種方式捕捉了 “類似人類” 的做事方式。

給自己看一張貓的照片,然後問 “爲什麼那是一隻貓?”。也許你會開始說 “嗯,我看到它的尖耳朵,等等”。但要解釋你是如何認出這張圖片是一隻貓的,並不是很容易。只是你的大腦不知怎麼想出來的。但是對於大腦來說,沒有辦法(至少現在還沒有)“進入” 它的內部,看看它是如何想出來的。

那麼對於一個(人工)神經網來說呢?好吧,當你展示一張貓的圖片時,可以直接看到每個 “神經元” 的作用。但是,即使要獲得一個基本的可視化,通常也是非常困難的。

在我們用於解決上述 “最近點” 問題的最終網絡中,有 17 個神經元。在用於識別手寫數字的網絡中,有 2190 個。而在我們用來識別貓和狗的網絡中,有 60,650 個。

通常情況下,要將相當於 60,650 個維度的空間可視化是相當困難的。但由於這是一個爲處理圖像而設置的網絡,它的許多神經元層被組織成陣列,就像它所看的像素陣列一樣。

如果我們採取一個典型的貓圖像:

那麼我們就可以用一組衍生圖像來表示第一層神經元的狀態 —— 其中許多圖像我們可以很容易地解釋爲 “沒有背景的貓” 或 “貓的輪廓” 等:

到了第十層,就更難解釋發生了什麼:

但總的來說,我們可以說神經網絡正在 “挑選出某些特徵”(也許尖尖的耳朵也在其中),並利用這些特徵來確定圖像是什麼。但這些特徵是我們有名字的,比如 “尖耳朵”?大多數情況下不是。

我們的大腦在使用類似的特徵嗎?大多數情況下我們不知道。但值得注意的是,像我們在這裏展示的神經網絡的前幾層似乎可以挑出圖像的某些方面(如物體的邊緣),這些方面似乎與我們知道的由大腦中第一層視覺處理挑出的特徵相似。

但是,假設我們想要一個神經網絡的 “貓識別理論”。我們可以說 “看,這個特定的網絡做到了” —— 這立即給了我們一些關於 “問題有多難” 的感覺(例如,可能需要多少個神經元或層)。

但至少到現在爲止,我們還沒有辦法對網絡正在做的事情進行 “敘述性描述”。也許這是因爲它在計算上確實是不可簡化的,而且除了明確地追蹤每一個步驟之外,沒有一般的方法可以找到它在做什麼。 也可能只是因爲我們還沒有 “弄清科學”,還沒有確定 “自然法則”,使我們能夠總結出正在發生的事情。

當我們談論用 ChatGPT 生成語言時,我們會遇到同樣的問題。而且同樣不清楚是否有辦法 “總結它在做什麼”。但是語言的豐富性和細節(以及我們在這方面的經驗)可能會讓我們比圖像走得更遠。

4 機器學習和神經網絡的訓練

到目前爲止,我們一直在談論那些 “已經知道” 如何完成特定任務的神經網絡。但是,神經網絡之所以如此有用(估計也是在大腦中),是因爲它們不僅在原則上可以完成各種任務,而且可以逐步 “根據實例訓練” 來完成這些任務。

當我們製作一個區分貓和狗的神經網絡時,我們實際上不需要寫一個程序來(比如說)明確地找到鬍鬚;相反,我們只需要展示大量關於什麼是貓和什麼是狗的例子,然後讓網絡從這些例子中 “機器學習” 如何去區分它們。

重點是,訓練有素的網絡從它所展示的特定例子中 “概括” 出來。 正如我們在上面看到的,這並不是簡單地讓網絡識別它所看到的貓咪圖像的特定像素模式;而是讓神經網絡以某種方式設法在我們認爲是某種 “一般貓性” 的基礎上區分圖像。

那麼,神經網絡的訓練究竟是如何進行的呢?從本質上講,我們一直在努力尋找能夠使神經網絡成功重現我們所給的例子的權重。然後,我們依靠神經網絡以 “合理” 的方式在這些例子之間進行 “插值”(或 “概括”)。

讓我們看看一個比上面的最近點的問題更簡單的問題。讓我們只嘗試讓一個神經網絡學習函數:

對於這個任務,我們需要一個只有一個輸入和一個輸出的網絡,比如:

但我們應該使用什麼權重等?在每一組可能的權重下,神經網絡都會計算出一些函數。例如,這裏是它用幾組隨機選擇的權重所做的事情:

是的,我們可以清楚地看到,在這些情況下,它甚至都沒有接近再現我們想要的函數。那麼,我們如何找到能夠重現該功能的權重呢?

基本的想法是提供大量的 “輸入→輸出” 的例子來 “學習” —— 然後嘗試找到能重現這些例子的權重。下面是用逐漸增多的例子來做的結果:

在這個 “訓練” 的每個階段,網絡中的權重都被逐步調整 —— 我們看到,最終我們得到了一個能成功重現我們想要的功能的網絡。那麼,我們是如何調整權重的呢?基本的想法是在每個階段看看我們離得到我們想要的功能 “有多遠”,然後以這樣的方式更新權重,使之更接近。

爲了找出 “我們有多遠”,我們計算通常被稱爲 “損失函數”(或有時稱爲 “成本函數”)的東西。這裏我們使用的是一個簡單的(L2)損失函數,它只是我們得到的值與真實值之間的差異的平方之和。

我們看到的是,隨着我們訓練過程的進展,損失函數逐漸減少(遵循一定的 “學習曲線”,不同的任務是不同的) —— 直到我們達到一個點,網絡(至少是一個很好的近似值)成功再現了我們想要的函數:

好了,最後要解釋的重要部分是如何調整權重以減少損失函數。正如我們所說,損失函數給我們提供了我們得到的值與真實值之間的 “距離”。但是 “我們得到的值” 在每個階段都是由當前版本的神經網絡和其中的權重決定的。 但現在想象一下,這些權重是變量 —— 比如說 wi。我們想找出如何調整這些變量的值,以使取決於這些變量的損失最小。

例如,想象一下(對實踐中使用的典型神經網絡進行了不可思議的簡化),我們只有兩個權重 w1 和 w2。那麼我們可能有一個損失,作爲 w1 和 w2 的函數,看起來像這樣:

數值分析提供了各種技術來尋找這樣的情況下的最小值。但一個典型的方法是,從之前的 w1、w2 開始,逐步遵循最陡峭的下降路徑:

就像水從山上流下來一樣,所能保證的是這個過程最終會在地表的某個局部最小值(“一個山湖”);它很可能達不到最終的全球最小值。

在 “重量景觀” 上找到最陡峭的下降路徑並不明顯,這是不可行的。但是,微積分可以幫助我們。正如我們上面提到的,我們總是可以把神經網看作是在計算一個數學函數 —— 它取決於它的輸入和權重。

但現在考慮對這些權重進行微分。事實證明,微積分的連鎖法則實際上可以讓我們 “解開” 神經網中連續幾層所做的運算。其結果是,我們可以 —— 至少在某些局部近似中 —— “反轉” 神經網的操作,並逐步找到使與輸出相關的損失最小的權重。

上圖顯示了在只有 2 個權重的不現實的簡單情況下,我們可能需要做的最小化工作。但事實證明,即使有更多的權重(ChatGPT 使用了 1750 億個),仍有可能做到最小化,至少在某種程度上是近似的。事實上,2011 年左右發生的 “深度學習” 的重大突破與以下發現有關:從某種意義上說,當有很多權重參與時,做(至少是近似)最小化比有相當少的權重更容易。

換句話說 —— 有點反直覺 —— 用神經網絡解決更復雜的問題比簡單的問題更容易。 其大致原因似乎是,當一個人有很多 “權重變量” 時,他有一個高維空間,有 “很多不同的方向”,可以把他引向最小值 —— 而如果變量較少,則更容易陷入一個局部最小值(“山湖”),沒有 “方向可以出去”。

值得指出的是,在典型的情況下,有許多不同的權重集合,它們都能使神經網絡具有幾乎相同的性能。而在實際的神經網絡訓練中,通常會有很多隨機的選擇,導致 “不同但等同的解決方案”,就像這些:

但每一個這樣的 “不同的解決方案” 至少會有輕微的不同行爲。如果我們要求,比如說,在我們提供訓練實例的區域之外進行 “外推”,我們可以得到極大的不同結果:

但是哪一個是 “正確的” 呢?真的沒有辦法說。它們都 “與觀察到的數據一致”。但它們都對應着不同的 “先天” 方式來 “思考” 如何在 “盒子外” 做什麼。對我們人類來說,有些可能比其他的看起來 “更合理”。

特別是在過去的十年裏,在訓練神經網絡的藝術方面取得了許多進展。而且,是的,這基本上是一門藝術。有時,特別是在回顧中,人們至少可以看到正在做的事情有一絲 “科學解釋” 的影子。但大多數情況下,事情都是通過試驗和錯誤發現的,增加了一些想法和技巧,逐步建立了一個關於如何使用神經網絡的重要傳說。

有幾個關鍵部分。首先,對於一個特定的任務,應該使用什麼架構的神經網絡。然後,還有一個關鍵問題,即如何獲得訓練神經網絡的數據。 而且,人們越來越多地不是在處理從頭開始訓練一個網絡的問題:相反,一個新的網絡可以直接納入另一個已經訓練好的網絡,或者至少可以使用該網絡爲自己產生更多的訓練實例。

人們可能認爲,對於每一種特定的任務,人們都需要一個不同的神經網絡結構。但人們發現,即使是對於明顯不同的任務,相同的架構似乎也能發揮作用。

在某種程度上,這讓人想起了通用計算的想法(以及我的計算等價原則),但是,正如我將在後面討論的那樣,我認爲這更多地反映了這樣一個事實,即我們通常試圖讓神經網絡做的任務是 “類似人類” 的,而神經網絡可以捕獲相當普遍的 “類似人類的過程”。

在早期的神經網絡中,人們傾向於認爲應該 “讓神經網絡儘可能地少做”。 例如,在將語音轉換爲文本時,人們認爲應該首先分析語音的音頻,將其分解爲音素,等等。但人們發現,至少對於 “類似人類的任務” 來說,通常更好的做法是嘗試在 “端到端問題” 上訓練神經網絡,讓它自己 “發現” 必要的中間特徵、編碼等。

還有一個想法是,我們應該在神經網絡中引入複雜的單獨組件,讓它實際上 “明確地實現特定的算法想法”。 但是,這又一次被證明是不值得的;相反,最好只是處理非常簡單的組件,讓它們 “自我組織”(儘管通常是以我們無法理解的方式)來實現(大概)那些算法想法的等價物。

這並不是說沒有與神經網絡相關的 “結構化思想”。因此,例如,具有局部連接的二維神經元陣列似乎至少在處理圖像的早期階段非常有用。而擁有專注於 “回顧序列” 的連接模式似乎很有用 —— 我們將在後面看到 —— 在處理人類語言等事物時,例如在 ChatGPT 中。

但神經網絡的一個重要特點是,像一般的計算機一樣,它們最終只是在處理數據。 而目前的神經網絡 —— 目前的神經網絡訓練方法 —— 是專門處理數字陣列的。但在處理過程中,這些數組可以被完全重新排列和重塑。舉個例子,我們上面用來識別數字的網絡從一個二維的 “圖像” 陣列開始,迅速 “增厚” 到許多通道,但隨後 “濃縮” 成一個一維陣列,最終將包含代表不同可能輸出數字的元素:

但是,好吧,如何判斷一個特定的任務需要多大的神經網?這是一門藝術。在某種程度上,關鍵是要知道 “這個任務有多難”。但對於類似人類的任務來說,這通常是很難估計的。

是的,可能有一種系統的方法可以通過計算機非常 “機械” 地完成任務。但很難知道是否存在人們認爲的技巧或捷徑,使人們至少在 “類似人類的水平” 上更容易地完成這項任務。可能需要列舉一個巨大的遊戲樹來 “機械地” 玩某個遊戲;但可能有一個更容易(“啓發式”)的方法來實現 “人類水平的遊戲”。

當人們在處理微小的神經網絡和簡單的任務時,有時可以明確地看到 “從這裏不能到達那裏”。例如,這是人們在上一節的任務中用幾個小的神經網絡似乎能做到的最好的結果:

而我們的情況是,如果網太小,它就不能再現我們想要的功能。但如果超過一定的規模,它就沒有問題了 —— 至少如果一個人用足夠長的時間和足夠多的例子訓練它。順便說一下,這些圖片說明了一個神經網絡的傳說:如果中間有一個 “擠壓”,迫使所有東西都通過一個較小的中間神經元數量,那麼我們往往可以用一個較小的網絡。

(值得一提的是,“無中間層” —— 或所謂的 “感知器” —— 網絡只能學習本質上的線性函數 —— 但只要有一箇中間層,原則上就可以任意很好地近似任何函數,至少如果有足夠的神經元,儘管爲了使其可行地訓練,通常需要某種正則化或規範化)。

好吧,讓我們假設我們已經確定了某種神經網絡架構。現在有一個問題,就是如何獲得數據來訓練網絡。圍繞神經網絡和一般機器學習的許多實際挑戰都集中在獲取或準備必要的訓練數據上。在許多情況下(“監督學習”),人們希望獲得明確的輸入和期望的輸出的例子。

因此,舉例來說,人們可能希望通過圖像中的內容或一些其他屬性來標記圖像。也許我們必須明確地去做 —— 通常是費盡心機地去做標記。但是很多時候,我們可以藉助已經完成的工作,或者將其作爲某種代理。

因此,舉例來說,我們可以使用網絡上已經提供的圖片的 alt 標籤。或者,在另一個領域,我們可以使用爲視頻創建的封閉式字幕。或者在語言翻譯訓練中,可以使用不同語言的網頁或其他文件的平行版本。

你需要向神經網絡展示多少數據來訓練它完成一項特定任務?同樣,這很難從第一原理上估計。當然,通過使用 “轉移學習” 來 “轉移” 諸如已經在另一個網絡中學習過的重要特徵列表的東西,可以大大降低要求。

但一般來說,神經網絡需要 “看到大量的例子” 才能訓練好。而至少對於某些任務來說,神經網絡的一個重要傳說是,這些例子可能是非常重複的。 事實上,向神經網絡展示所有的例子是一個標準的策略,一遍又一遍。在每個 “訓練回合”(或 “epochs”)中,神經網絡至少會處於一個稍微不同的狀態,而以某種方式 “提醒” 它某個特定的例子對於讓它 “記住那個例子” 是很有用的。(是的,也許這類似於人類記憶中的重複的有用性)。

但往往只是反覆重複同一個例子是不夠的。還需要向神經網絡展示這個例子的變化。而神經網絡理論的一個特點是,這些 “數據增強” 的變化不一定要複雜纔有用。只要用基本的圖像處理方法稍微修改一下圖像,就可以使它們在神經網絡訓練中基本上 “像新的一樣好”。同樣,當人們沒有實際的視頻等來訓練自動駕駛汽車時,人們可以繼續從模擬的視頻遊戲環境中獲得數據,而不需要實際的真實世界場景的所有細節。

像 ChatGPT 這樣的東西如何呢?嗯,它有一個很好的特點,那就是它可以進行 “無監督學習”,這使得它更容易得到用於訓練的例子。 回顧一下,ChatGPT 的基本任務是找出如何繼續它所給的一段文字。因此,爲了獲得 “訓練實例”,我們所要做的就是獲得一段文本,並將其結尾遮蓋起來,然後將其作爲 “訓練的輸入” —— “輸出” 是完整的、未被遮蓋的文本。我們稍後會詳細討論這個問題,但主要的一點是,與學習圖片中的內容不同,不需要 “明確的標籤”;ChatGPT 實際上可以直接從它所得到的任何文本例子中學習。

好吧,那麼神經網絡的實際學習過程是怎樣的呢?歸根結底,這都是爲了確定什麼權重能夠最好地捕捉所給的訓練實例。 有各種詳細的選擇和 “超參數設置”(之所以被稱爲超參數,是因爲可以把權重看作是 “參數”),可以用來調整如何完成這一過程。

有不同的損失函數選擇(平方之和、絕對值之和,等等)。有不同的方法來進行損失最小化(每一步要在權重空間中移動多遠,等等)。然後還有一些問題,比如要展示多大的 “一批” 例子來獲得每一個試圖最小化的損失的連續估計。而且,是的,人們可以應用機器學習(例如,我們在 Wolfram 語言中所做的)來實現機器學習的自動化 —— 自動設置超參數等東西。

但最終,整個訓練過程的特點是看到損失是如何逐漸減少的(如這個 Wolfram Language 的小型訓練的進度監視器):

而人們通常看到的是,損失在一段時間內減少,但最終在某個恆定值上趨於平緩。如果這個值足夠小,那麼可以認爲訓練是成功的;否則,這可能是一個應該嘗試改變網絡結構的信號。

能否告訴我們 “學習曲線” 要花多長時間才能變平?就像許多其他事情一樣,似乎有近似的冪律縮放關係,這取決於神經網絡的大小和使用的數據量。但一般的結論是,訓練一個神經網絡是很難的,需要大量的計算努力。 作爲一個實際問題,這些努力的絕大部分都花在了對數字陣列的操作上,而這正是 GPU 所擅長的 —— 這就是爲什麼神經網絡訓練通常受限於 GPU 的可用性。

在未來,是否會有從根本上更好的方法來訓練神經網絡,或者一般地做神經網絡的工作?我認爲,幾乎可以肯定。神經網絡的基本理念是用大量簡單(本質上相同)的組件創建一個靈活的 “計算結構”,並讓這個 “結構” 能夠被逐步修改,以便從實例中學習。

在目前的神經網絡中,人們基本上是使用微積分的思想 —— 應用於實數 —— 來做這種增量修改。但越來越清楚的是,擁有高精度的數字並不重要;即使用目前的方法,8 位或更少的數字可能也足夠了。

像蜂窩自動機這樣的計算系統,基本上是在許多單獨的比特上並行操作的,如何做這種增量修改從來都不清楚,但沒有理由認爲它不可能。事實上,就像 “2012 年深度學習的突破” 一樣,這種增量修改在更復雜的情況下可能比簡單的情況下更容易。

神經網絡 —— 也許有點像大腦 —— 被設定爲擁有一個基本固定的神經元網絡,被修改的是它們之間連接的強度(“重量”)。(也許至少在年輕的大腦中,大量的完全新的連接也可以增長。) 但是,雖然這對生物學來說可能是一個方便的設置,但並不清楚它是否是實現我們所需功能的最佳方式。而涉及漸進式網絡重寫的東西(也許讓人想起我們的物理項目)最終可能會更好。

但即使在現有的神經網絡框架內,目前也有一個關鍵的限制:現在的神經網絡訓練從根本上說是連續的,每一批例子的效果都被傳播回來以更新權重。事實上,就目前的計算機硬件而言 —— 即使考慮到 GPU —— 在訓練期間,神經網絡的大部分時間都是 “閒置” 的,每次只有一個部分被更新。從某種意義上說,這是因爲我們目前的計算機往往有獨立於 CPU(或 GPU)的內存。但在大腦中,這大概是不同的 —— 每一個 “記憶元素”(即神經元)也是一個潛在的活躍的計算元素。如果我們能夠以這種方式設置我們未來的計算機硬件,就有可能更有效地進行訓練。

“當然,一個足夠大的網絡可以做任何事情!”

像 ChatGPT 這樣的能力似乎令人印象深刻,人們可能會想象,如果人們能夠 “繼續下去”,訓練越來越大的神經網絡,那麼它們最終將能夠 “做任何事情”。如果人們關注的是那些容易被人類直接思考的事物,那麼很有可能是這樣的。但是,過去幾百年科學的教訓是,有些東西可以通過形式化的過程來計算出來,但並不容易被人類的直接思維所獲得。

非瑣碎的數學就是一個大例子。但一般的情況其實是計算。而最終的問題是計算的不可還原性現象。有一些計算,人們可能認爲需要很多步驟才能完成,但事實上可以 “簡化” 爲相當直接的東西。但計算的不可簡化性的發現意味着這並不總是有效的。相反,有些過程 —— 可能就像下面這個過程 —— 要弄清楚發生了什麼,必然需要對每個計算步驟進行追蹤:

我們通常用大腦做的那些事情,大概是專門爲避免計算的不可還原性而選擇的。在一個人的大腦中做數學需要特別的努力。而且,在實踐中,僅僅在一個人的大腦中 “思考” 任何非微觀程序的操作步驟,在很大程度上是不可能的。

當然,爲此我們有計算機。有了計算機,我們可以很容易地做很長的、計算上不可簡化的事情。而關鍵的一點是,這些事情一般來說沒有捷徑。

是的,我們可以記住很多關於在某個特定計算系統中發生的具體例子。也許我們甚至可以看到一些(“計算上可還原的”)模式,使我們可以做一點概括。但問題是,計算上的不可還原性意味着我們永遠無法保證意外不會發生 —— 只有通過明確地進行計算,你才能知道在任何特定情況下實際發生了什麼。

最後,在可學習性和計算的不可重複性之間存在着一種基本的緊張關係。學習實際上是通過利用規則性來壓縮數據。但計算上的不可複製性意味着最終對可能存在的規律性有一個限制。

作爲一個實際問題,我們可以想象將一些小的計算設備 —— 如蜂窩自動機或圖靈機 —— 構建成像神經網絡這樣的可訓練系統。而且,這種設備確實可以作爲神經網的好 “工具”,就像 Wolfram|Alpha 可以作爲 ChatGPT 的好工具。但計算的不可簡化性意味着我們不能指望 “進入” 這些設備並讓它們學習。

或者換句話說,在能力和可訓練性之間有一個最終的權衡:你越想讓一個系統 “真正利用” 它的計算能力,它就越會顯示出計算的不可複製性,它的可訓練性就越低。而它越是從根本上可訓練,它就越不能做複雜的計算。

(對於目前的 ChatGPT 來說,情況實際上要極端得多,因爲用於生成每個輸出符號的神經網絡是一個純粹的 “前饋” 網絡,沒有循環,因此沒有能力做任何具有非複雜 “控制流” 的計算)。

當然,人們可能會問,能夠做不可還原的計算是否真的很重要。事實上,在人類歷史的大部分時間裏,這並不特別重要。但我們的現代技術世界是建立在至少使用數學計算的工程之上的,而且越來越多地使用更普遍的計算。如果我們看一下自然界,它充滿了不可簡化的計算 —— 我們正在慢慢理解如何模仿並用於我們的技術目的。

是的,一個神經網絡當然可以注意到自然世界中的各種規律性,而我們也可能很容易通過 “無助的人類思維” 注意到這些規律性。但是,如果我們想要解決屬於數學或計算科學範疇的事情,神經網絡是無法做到的 —— 除非它有效地 “作爲工具” 使用一個 “普通” 的計算系統。

但是,這一切都有一些潛在的混淆之處。在過去,有很多任務 —— 包括寫文章 —— 我們認爲對計算機來說 “從根本上說太難了”。而現在我們看到這些任務是由 ChatGPT 等完成的,我們傾向於突然認爲計算機一定是變得更加強大了,特別是超越了它們已經基本能夠做到的事情(比如逐步計算蜂窩自動機等計算系統的行爲)。

但這並不是正確的結論。計算上不可還原的過程仍然是計算上不可還原的,而且對計算機來說仍然是根本性的困難 —— 即使計算機可以輕易地計算它們的單個步驟。 相反,我們應該得出的結論是,我們人類可以做的,但我們不認爲計算機可以做的任務,比如寫文章,實際上在某種意義上比我們想象的更容易計算。

換句話說,神經網絡之所以能夠成功地寫出一篇文章,是因爲寫一篇文章被證明是一個比我們想象的 “計算上更淺” 的問題。從某種意義上說,這使我們更接近於 “擁有一種理論”,即我們人類是如何做到像寫文章這樣的事情的,或在一般情況下處理語言。

如果你有一個足夠大的神經網絡,那麼,是的,你可能能夠做任何人類能夠輕易做到的事情。但是,你不會捕捉到自然界一般能做的事情 —— 或者我們從自然界塑造的工具能做的事情。而正是這些工具的使用 —— 無論是實用的還是概念性的 —— 使得我們在近幾個世紀裏能夠超越 “純粹的無助的人類思維” 所能達到的界限,併爲人類的目的捕捉到物理和計算宇宙中的更多東西。

神經網絡 —— 至少在它們目前的設置中 —— 從根本上說是基於數字的。因此,如果我們要用它們來處理像文本這樣的東西,我們就需要一種方法來用數字表示我們的文本。

當然,我們可以開始(基本上就像 ChatGPT 那樣)爲字典中的每個詞分配一個數字。但是,有一個重要的想法 —— 例如,它是 ChatGPT 的核心 —— 超出了這個範圍。這就是 “嵌入” 的概念。我們可以把嵌入看作是一種嘗試用數字陣列來表示事物 “本質” 的方式 —— 其特性是 “附近的事物” 由附近的數字來表示。

因此,舉例來說,我們可以把一個詞的嵌入看作是試圖在一種 “意義空間” 中排列詞語,在這個空間中,以某種方式 “在意義上接近” 的詞語在嵌入中出現。實際使用的嵌入 —— 例如在 ChatGPT 中 —— 往往涉及大量的數字列表。但是如果我們把它投射到二維空間,我們就可以顯示出嵌入的單詞是如何排列的例子:

而且,是的,我們看到的東西在捕捉典型的日常印象方面做得非常好。但是,我們怎樣才能構建這樣一個嵌入呢?大致的想法是查看大量的文本(這裏是來自網絡的 50 億個詞),然後看不同的詞出現的 “環境” 有多相似。因此,例如,“alligator” 和 “crocodile” 經常會在其他類似的句子中互換出現,這意味着它們在嵌入中會被放在附近。但是 “蘿蔔” 和 “老鷹” 不會出現在其他類似的句子中,所以它們在嵌入中會被放在很遠的地方。

但是,如何使用神經網絡實際實現這樣的東西呢?讓我們先來討論一下不是針對單詞的嵌入,而是針對圖像的嵌入。我們想找到某種方法,通過數字列表來描述圖像,使 “我們認爲相似的圖像” 被分配到相似的數字列表中。

我們如何判斷我們是否應該 “認爲圖像相似”?好吧,如果我們的圖像是,例如,手寫的數字,我們可能會 “認爲兩個圖像是相似的”,如果它們是相同的數字。早些時候,我們討論了一個被訓練來識別手寫數字的神經網絡。我們可以認爲這個神經網絡被設置成在其最終輸出中把圖像放入 10 個不同的倉,每個數字一個倉。

但是,如果我們在做出 “這是一個 ‘4’” 的最終決定之前,“攔截” 神經網絡內部發生的事情呢?我們可能會想到,在神經網絡中,有一些數字將圖像描述爲 “大部分是 4,但有一點是 2” 或類似的情況。而我們的想法是挑選出這樣的數字作爲嵌入的元素。

所以這裏有一個概念。我們不是直接試圖描述 “什麼圖像在什麼其他圖像附近”,而是考慮一個定義明確的任務(在這種情況下是數字識別),我們可以獲得明確的訓練數據 —— 然後利用這樣一個事實,即在做這個任務時,神經網絡隱含地要做出相當於 “接近度決定” 的決定。因此,我們不需要明確地談論 “圖像的接近性”,而只是談論一個圖像代表什麼數字的具體問題,然後我們 “把它留給神經網絡” 來隱含地決定這意味着什麼 “圖像的接近性”。

那麼,這對數字識別網絡來說是如何更詳細地工作的呢?我們可以認爲這個網絡是由 11 個連續的層組成的,我們可以用圖標來概括它(激活函數顯示爲獨立的層):

在開始時,我們向第一層輸入實際的圖像,用像素值的二維陣列表示。在最後一層,我們得到了一個由 10 個值組成的數組,我們可以認爲這表示網絡對圖像對應於 0 到 9 的每個數字的 “確定程度”。

輸入圖像(手寫的 4),最後一層的神經元的值就是:

換句話說,神經網絡此時已經 “非常確定” 這個圖像是 4,爲了實際得到輸出 “4”,我們只需挑選出數值最大的神經元的位置。

但是,如果我們再往前看一步呢?網絡中的最後一個操作是一個所謂的 softmax,它試圖 “強制確定”。但在這之前,神經元的值是:

代表 “4” 的神經元仍然有最高的數值。但在其他神經元的數值中也有信息。我們可以期望這個數字列表在某種意義上可以用來描述圖像的 “本質”,從而提供我們可以用作嵌入的東西。因此,例如,這裏的每一個 4 都有一個稍微不同的 “簽名”(或 “特徵嵌入”) —— 都與 8 的非常不同:

在這裏,我們基本上是用 10 個數字來描述我們的圖像特徵。但通常情況下,使用比這更多的數字會更好。例如,在我們的數字識別網絡中,我們可以通過挖掘前一層得到一個 500 個數字的陣列。而這可能是一個合理的數組,作爲 “圖像嵌入” 使用。

如果我們想對手寫數字的 “圖像空間” 進行明確的可視化,我們需要 “降低維度”,有效地將我們得到的 500 維向量投射到,例如,三維空間:

我們剛剛談到爲圖像創建一個特徵(從而嵌入),有效地基於識別圖像的相似性,確定(根據我們的訓練集)它們是否對應於同一個手寫數字。如果我們有一個訓練集,比如說,確定每張圖片屬於 5000 種常見類型的物體(貓、狗、椅子…… ),我們就可以更普遍地對圖片做同樣的事情。

通過這種方式,我們可以製作一個圖像嵌入,它被我們對常見物體的識別所 “錨定”,但然後根據神經網絡的行爲 “圍繞它進行概括”。關鍵是,只要這種行爲與我們人類感知和解釋圖像的方式相一致,這將最終成爲一個 “對我們來說是正確的” 的嵌入,並在實踐中做 “類似人類判斷” 的任務時有用。

好吧,那麼我們如何遵循同樣的方法來尋找單詞的嵌入呢?關鍵是要從一個我們可以隨時進行訓練的關於單詞的任務開始。而標準的任務是 “單詞預測”。假設我們得到了 “the cat”。基於一個大型的文本語料庫(比如說,網絡上的文本內容),可能 “填空” 的不同單詞的概率是多少?或者說,給定 “__ 黑 _”,不同的 “側翼詞” 的概率是多少?

我們如何爲神經網絡設置這個問題?**歸根結底,我們必須用數字來表述一切。**做到這一點的一個方法就是爲英語中 5 萬個左右的常用詞中的每一個分配一個獨特的數字。因此,例如,“the” 可能是 914,而 “cat”(前面有一個空格)可能是 3542。(這些是 GPT-2 所使用的實際數字。)所以對於 “the _ cat” 問題,我們的輸入可能是 {914, 3542}。輸出應該是什麼樣子的呢?好吧,它應該是一個由 50000 個左右的數字組成的列表,有效地給出了每個可能的 “填充” 單詞的概率。

再一次,爲了找到一個嵌入,我們要在神經網絡 “達到結論” 之前 “攔截” 它的 “內部” —— 然後撿起在那裏出現的數字列表,我們可以把它看作是 “每個詞的特徵”。

好吧,那麼這些表徵是什麼樣子的呢?在過去的 10 年裏,已經有一系列不同的系統被開發出來(word2vec, GloVe, BERT, GPT, …… ),每一個都是基於不同的神經網絡方法。但最終,所有這些系統都是通過數百到數千個數字的列表來描述單詞的特徵。

在它們的原始形式中,這些 “嵌入向量” 是相當無信息的。例如,這裏是 GPT-2 產生的三個特定詞的原始嵌入向量:

如果我們做一些事情,比如測量這些向量之間的距離,那麼我們就可以發現像單詞的 “接近性” 這樣的東西。稍後我們將更詳細地討論我們可能認爲這種嵌入的 “認知” 意義。但現在主要的一點是,我們有一種方法可以有效地將單詞變成 “神經網絡友好” 的數字集合。

但實際上,我們可以更進一步,不僅僅是用數字的集合來描述單詞;我們還可以對單詞的序列,或者整個文本塊進行描述。在 ChatGPT 中,它就是這樣處理事情的。

它把目前得到的文本,生成一個嵌入矢量來表示它。然後,它的目標是找到接下來可能出現的不同詞彙的概率。它將其答案表示爲一個數字列表,該列表基本上給出了 50,000 個左右的可能詞彙的概率。

(嚴格地說,ChatGPT 不處理單詞,而是處理 “符號” (token)—— 方便的語言單位,可能是整個單詞,也可能只是 “pre” 或 “ing” 或 “ized” 這樣的片段。使用符號使 ChatGPT 更容易處理罕見的、複合的和非英語的詞彙,有時,無論好壞,都可以發明新的詞彙。)

7 ChatGPT 內部

好了,我們終於準備好討論 ChatGPT 內部的內容了。是的,最終,它是一個巨大的神經網絡 —— 目前是所謂的 GPT-3 網絡的一個版本,有 1750 億個權重。在許多方面,這是一個非常像我們討論過的其他神經網絡。但它是一個特別爲處理語言問題而設置的神經網絡。它最顯著的特徵是一個叫做 “轉化器” 的神經網絡架構。

在我們上面討論的第一個神經網絡中,任何給定層的每個神經元基本上都與前一層的每個神經元相連(至少有一些權重)。但是,如果一個人在處理具有特殊的、已知的結構的數據時,這種全連接的網絡(大概)是過剩的。因此,例如,在處理圖像的早期階段,典型的做法是使用所謂的卷積神經網絡(“convnets”),其中的神經元被有效地佈置在一個類似於圖像中的像素的網格上 —— 並且只與網格上附近的神經元相連。

變換器的想法是爲構成一段文本的標記序列做一些至少有點類似的事情。 但是,轉化器並不只是在序列中定義一個可以有連接的固定區域,而是引入了 “注意” 的概念 —— 以及對序列的某些部分比其他部分更 “注意” 的概念。也許有一天,僅僅啓動一個通用的神經網絡並通過訓練進行所有的定製是有意義的。但至少到現在爲止,將事情 “模塊化” 在實踐中似乎是至關重要的,就像變壓器那樣,可能也像我們的大腦那樣。

好吧,那麼 ChatGPT(或者說,它所基於的 GPT-3 網絡)實際上是做什麼的?回想一下,它的總體目標是以 “合理” 的方式延續文本,基於它所看到的訓練(包括從網絡上查看數十億頁的文本等),所以在任何時候,它都有一定數量的文本,它的目標是爲下一個要添加的標記提出適當的選擇。

它的操作分爲三個基本階段:

首先,它獲取與迄今爲止的文本相對應的標記序列,並找到代表這些標記的嵌入(即一個數字陣列)。其次,它以 “標準的神經網絡方式” 對這一嵌入進行操作,數值 “通過” 網絡中的連續層,產生一個新的嵌入(即一個新的數字陣列)。然後,它從這個數組的最後一部分,生成一個大約 50,000 個值的數組,這些值變成了不同的可能的下一個標記的概率。

(而且,是的,恰好使用的標記的數量與英語中的常用詞的數量相同,儘管只有大約 3000 個標記是整個單詞,其餘的是片段。)關鍵的一點是,這個管道的每一部分都是由一個神經網絡實現的,其權重是由網絡的端到端訓練決定的。換句話說,實際上,除了整體架構之外,沒有任何東西是 “明確設計的”;所有東西都是從訓練數據中 “學習” 的。

然而,在架構的設置方式上有很多細節,反映了各種經驗和神經網絡的傳說。而且,儘管這肯定是進入了雜草叢中,但我認爲談論其中的一些細節是有用的,尤其是爲了瞭解建立像 ChatGPT 這樣的東西所需要的東西。

首先是嵌入模塊。下面是 GPT-2 的 Wolfram 語言示意圖:

輸入是一個由 n 個標記組成的向量(如上一節所述,由 1 到 50,000 的整數表示)。這些標記中的每一個都被(通過單層神經網絡)轉換成一個嵌入向量(GPT-2 的長度爲 768,ChatGPT 的 GPT-3 爲 12,288)。同時,還有一個 “二級路徑”,它將標記的(整數)位置序列,並從這些整數中創建另一個嵌入向量。最後,來自令牌值和令牌位置的嵌入向量被加在一起 —— 產生嵌入模塊的最終嵌入向量序列。

爲什麼只是把令牌值和令牌位置的嵌入向量加在一起?我不認爲這有什麼特別的科學依據。只是各種不同的東西都被嘗試過,而這是一個似乎有效的方法。 這也是神經網絡傳說的一部分,從某種意義上說,只要你的設置是 “大致正確的”,通常就可以通過做充分的訓練來確定細節,而不需要真正 “在工程層面上理解” 神經網絡最終是如何配置它的。

下面是嵌入模塊所做的工作,對字符串 “hello hello hello hello hello bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye bye 2”:

每個標記的嵌入向量的元素都顯示在頁面下方,在整個頁面上,我們首先看到的是 “hello” 的嵌入,然後是 “bye” 的嵌入。上面的第二個數組是位置嵌入 —— 其看起來有點隨機的結構只是 “碰巧學到的”(在這種情況下是 GPT-2)。

好了,在嵌入模塊之後,是轉化器的 “主要事件”:一連串所謂的 “注意塊”(GPT-2 爲 12 個,ChatGPT 的 GPT-3 爲 96 個)。這一切都很複雜 —— 讓人想起典型的難以理解的大型工程系統,或者,生物系統。但無論如何,這裏是一個單一的 “注意塊” 的示意圖(對於 GPT-2):

在每個這樣的注意力塊中,有一系列的 “注意力頭”(GPT-2 有 12 個,ChatGPT 的 GPT-3 有 96 個) —— 每一個都是獨立操作嵌入向量中的不同數值塊的。(是的,我們不知道爲什麼分割嵌入向量是個好主意,或者它的不同部分有什麼 “意義”;這只是 “被發現可行” 的事情之一)。

好吧,那麼注意頭是做什麼的?基本上,它們是一種在標記序列中 “回顧” 的方式(即在迄今爲止產生的文本中),並將過去的內容 “打包” 成有助於尋找下一個標記的形式。

在上面的第一節中,我們談到了使用 2-gram 概率來根據它們的直接前身來挑選單詞。變換器中的 “注意” 機制所做的是允許 “注意” 甚至更早的詞 —— 因此有可能捕捉到,比如說,動詞可以指代在句子中出現在它們之前的許多詞的名詞的方式。

在更詳細的層面上,注意力頭所做的是以一定的權重重新組合與不同標記相關的嵌入向量中的大塊。因此,例如,在第一個注意力區塊中的 12 個注意力頭(在 GPT-2 中)對上面的 “hello, bye” 字符串有如下(“look-back-all-the-way-beginning-the-sequence-of-tokens”)模式的 “重組權值”:

在經過注意力頭的處理後,產生的 “重新加權的嵌入向量”(GPT-2 的長度爲 768,ChatGPT 的 GPT-3 的長度爲 12288)被傳遞到一個標準的 “全連接” 神經網層。很難掌握這個層在做什麼。但這裏是它使用的 768×768 權重矩陣的圖(這裏是 GPT-2):

採用 64×64 的移動平均數,一些(隨機漫步式的)結構開始出現:

是什麼決定了這種結構?最終,它可能是人類語言特徵的一些 “神經網絡編碼”。但到現在爲止,這些特徵可能是什麼還很不清楚。實際上,我們正在 “打開 ChatGPT 的大腦”(或至少是 GPT-2),並發現,是的,裏面很複雜,而且我們不瞭解它 —— 儘管最終它產生了可識別的人類語言。

好吧,在經歷了一個注意力區塊之後,我們得到了一個新的嵌入向量 —— 然後它又被連續地傳遞到其他的注意力區塊中(GPT-2 共有 12 個;GPT-3 有 96 個)。每個注意力區塊都有自己特定的 “注意力” 和 “完全連接” 權重模式。這裏是 GPT-2 的 “你好,再見” 輸入的注意權重序列,用於第一個注意頭(attention head):

這裏是全連接層的(移動平均)“矩陣”:

奇怪的是,儘管這些 “權重矩陣” 在不同的注意力塊中看起來很相似,但權重的大小分佈可能有些不同(而且不總是高斯的):

那麼,在經歷了所有這些注意力區塊之後,轉化器的淨效果是什麼?從本質上講,它是將原始的符號序列的嵌入集合轉化爲最終的集合。而 ChatGPT 的具體工作方式是在這個集合中提取最後一個嵌入,並對其進行 “解碼”,以產生一個關於下一個標記應該是什麼的概率列表。

這就是 ChatGPT 的概要內容。它可能看起來很複雜(尤其是因爲它有許多不可避免的、有點武斷的 “工程選擇”),但實際上,所涉及的最終元素非常簡單。因爲最終我們要處理的只是一個由 “人工神經元” 組成的神經網絡,每個神經元都在進行簡單的操作,即接受一組數字輸入,然後將它們與某些權重相結合。

ChatGPT 的原始輸入是一個數字數組(到目前爲止符號的嵌入向量),當 ChatGPT“運行” 以產生一個新的符號時,所發生的只是這些數字 “通過” 神經網的各層,每個神經元 “做它的事”,並將結果傳遞給下一層的神經元。沒有循環或 “回頭”。一切都只是通過網絡 “前饋”。

這是一個與典型的計算系統 —— 如圖靈機 —— 非常不同的設置,在圖靈機中,結果是由相同的計算元素反覆 “再處理” 的。在這裏,至少在生成一個特定的輸出符號時,每個計算元素(即神經元)只被使用一次。

但在某種意義上,即使在 ChatGPT 中,仍然有一個重複使用計算元素的 “外循環”。因爲當 ChatGPT 要生成一個新的標記時,它總是 “讀取”(即作爲輸入)它之前的整個標記序列,包括 ChatGPT 自己之前 “寫” 的標記。我們可以認爲這種設置意味着 ChatGPT —— 至少在其最外層 —— 涉及到一個 “反饋循環”,儘管在這個循環中,每一次迭代都明確地顯示爲一個出現在其生成的文本中的標記。

但讓我們回到 ChatGPT 的核心:反覆用於生成每個標記的神經網絡。 在某種程度上,它非常簡單:一整個相同的人工神經元的集合。網絡的某些部分只是由(“完全連接”)的神經元層組成,其中某一層的每個神經元都與前一層的每個神經元相連(有一定的權重)。但是,特別是它的變壓器結構,ChatGPT 有更多的結構部分,其中只有不同層的特定神經元被連接。(當然,人們仍然可以說,“所有的神經元都是連接的” —— 但有些神經元的權重爲零)。

此外,ChatGPT 中的神經網的某些方面並不是最自然地被認爲是由 “同質” 層組成的。 例如,正如上面的圖標摘要所示,在一個注意力區塊中,有一些地方對傳入的數據進行了 “多份拷貝”,然後每個拷貝經過不同的 “處理路徑”,可能涉及不同數量的層,然後才重新組合。但是,雖然這可能是對正在發生的事情的一種方便的表述,但至少在原則上總是可以考慮 “密集地填入” 層,但只是讓一些權重爲零。

如果我們看一下 ChatGPT 的最長路徑,大約有 400 個(核心)層參與其中 —— 在某些方面不是一個巨大的數字。但是有數以百萬計的神經元 —— 總共有 1750 億個連接,因此有 1750 億個權重。需要認識到的一點是,每當 ChatGPT 生成一個新的令牌時,它都要進行涉及這些權重中每一個的計算。

在實現上,這些計算可以 “按層” 組織成高度並行的陣列操作,可以方便地在 GPU 上完成。但是,對於產生的每一個標記,仍然要進行 1750 億次計算(最後還要多一點) —— 因此,是的,用 ChatGPT 生成一個長的文本需要一段時間,這並不令人驚訝。

但最終,最了不起的是,所有這些操作 —— 它們各自都很簡單 —— 能夠以某種方式共同完成如此出色的 “類似人類” 的文本生成工作。 必須再次強調的是,(至少到目前爲止,我們知道)沒有任何 “最終的理論理由” 來解釋這樣的工作。事實上,正如我們將要討論的那樣,我認爲我們必須把這看作是一個潛在的令人驚訝的科學發現:在像 ChatGPT 這樣的神經網絡中,有可能捕捉到人類大腦在生成語言方面的本質。

8 ChatGPT 的訓練

好了,現在我們已經給出了 ChatGPT 建立後的工作概要。但它是如何建立的呢?其神經網絡中的 1750 億個權重是如何確定的?基本上,它們是非常大規模的訓練的結果,基於一個巨大的文本語料庫 —— 網絡上的、書中的等等 —— 由人類寫的。

正如我們所說的,即使考慮到所有的訓練數據,神經網絡是否能夠成功地產生 “類似人類” 的文本,這一點也不明顯。 而且,再一次,似乎需要詳細的工程來實現這一目標。但 ChatGPT 的最大驚喜和發現是,它是可能的。實際上,一個 “只有”1750 億個權重的神經網絡可以對人類所寫的文本做出一個 “合理的模型”。

在現代,有很多人類寫的文本是以數字形式存在的。公共網絡至少有幾十億人寫的網頁,總共可能有一萬億字的文本。如果包括非公開網頁,這些數字可能至少要大 100 倍。到目前爲止,已經有超過 500 萬本數字化書籍可供使用(在曾經出版過的 1 億本左右的書籍中),又有 1000 億左右的文字。

作爲個人比較,我一生中發表的材料總字數不到 300 萬字,在過去 30 年中,我寫了大約 1500 萬字的電子郵件,總共打了大約 5000 萬字,在過去幾年中,我在直播中說了 1000 多萬字。而且,是的,我將從所有這些中訓練一個機器人)。

但是,好吧,鑑於所有這些數據,我們如何從中訓練出一個神經網絡呢?基本過程與我們在上面的簡單例子中討論的非常相似。你提出一批例子,然後你調整網絡中的權重,使網絡在這些例子上的誤差(“損失”)最小。從錯誤中 “反向傳播” 的主要問題是,每次你這樣做,網絡中的每個權重通常至少會有微小的變化,而且有大量的權重需要處理。(實際的 “反向計算” 通常只比正向計算難一個小常數)。

有了現代的 GPU 硬件,從成千上萬的例子中並行計算出結果是很簡單的。但是,當涉及到實際更新神經網絡中的權重時,目前的方法要求我們基本上是一批一批地做。(是的,這可能是實際的大腦 —— 其計算和記憶元素的結合 —— 目前至少有一個架構上的優勢)。

即使在我們之前討論的看似簡單的學習數字函數的案例中,我們發現我們經常不得不使用數百萬個例子來成功訓練一個網絡,至少從頭開始。那麼,這意味着我們需要多少個例子來訓練一個 “類人語言” 模型呢?似乎沒有任何基本的 “理論” 方法可以知道。但是在實踐中,ChatGPT 已經成功地在幾千億字的文本上進行了訓練。

有些文本被多次輸入,有些只有一次。但不知何故,它從它看到的文本中 “得到了它需要的東西”。但是,考慮到需要學習的文本量,它應該需要多大的網絡才能 “學好”?同樣,我們還沒有一個基本的理論方法來說明。

最終 —— 我們將在下面進一步討論 —— 人類語言大概有某種 “總的算法內容”,以及人類通常用它說什麼。但接下來的問題是,神經網絡在實現基於該算法內容的模型時將會有多大的效率。我們也不知道 —— 儘管 ChatGPT 的成功表明它的效率還算不錯。

最後我們可以注意到,ChatGPT 使用了幾千億個權重 —— 與它所獲得的訓練數據的總字數(或令牌)相比,它所做的事情是相當的。 在某些方面,也許令人驚訝的是(儘管在 ChatGPT 的小型類似物中也有經驗觀察),似乎工作良好的 “網絡規模” 與 “訓練數據的規模” 如此相似。畢竟,這肯定不是說 “在 ChatGPT 內” 所有來自網絡和書籍等的文本都被 “直接存儲” 了。因爲在 ChatGPT 裏面的實際上是一堆數字 —— 精度略低於 10 位 —— 是對所有這些文本的總體結構的某種分佈式編碼。

換句話說,我們可以問人類語言的 “有效信息含量” 是什麼,以及通常用它說什麼。這裏有語言實例的原始語料庫。然後是 ChatGPT 的神經網絡中的表述。這個表徵很可能與 “算法上最小” 的表徵相去甚遠(我們將在下面討論)。但它是一個很容易被神經網絡使用的表徵。 在這種表示法中,訓練數據的 “壓縮” 程度似乎很低;平均而言,似乎只需要不到一個神經網絡的權重就可以承載一個詞的訓練數據的 “信息內容”。

當我們運行 ChatGPT 來生成文本時,我們基本上不得不使用每個權重一次。因此,如果有 n 個權重,我們有 n 個計算步驟要做 —— 儘管在實踐中,許多步驟通常可以在 GPU 中並行完成。但是,如果我們需要大約 n 個字的訓練數據來設置這些權重,那麼從我們上面所說的,我們可以得出結論,我們需要大約 n2 個計算步驟來進行網絡訓練 —— 這就是爲什麼,用目前的方法,人們最終需要談論數十億美元的訓練工作。

9 基本訓練之上

訓練 ChatGPT 的大部分工作是向它 “展示” 大量來自網絡、書籍等的現有文本。但事實證明,還有一個明顯相當重要的部分。

一旦它完成了對所展示的原始語料庫的 “原始訓練”,ChatGPT 內的神經網絡就可以開始生成自己的文本,繼續提示等。 但是,雖然這樣做的結果往往看起來很合理,但它們往往 —— 特別是對於較長的文本 —— 以往往相當非人類的方式 “遊離”。這不是人們可以輕易發現的,比如說,通過對文本做傳統的統計。但這是實際閱讀文本的人很容易注意到的東西。

構建 ChatGPT 的一個關鍵想法是,在 “被動地閱讀” 網絡等事物之後,還有一個步驟:讓實際的人類主動與 ChatGPT 互動,看看它產生了什麼,並在實際上給它反饋 “如何成爲一個好的聊天機器人”。

但神經網絡如何使用這種反饋呢?第一步只是讓人類對神經網絡的結果進行評價。但隨後又建立了另一個神經網絡模型,試圖預測這些評分。但現在這個預測模型可以在原始網絡上運行 —— 基本上就像一個損失函數,實際上是讓該網絡通過人類的反饋來 “調高”。而實踐中的結果似乎對系統成功產生 “類似人類” 的輸出有很大影響。

總的來說,有趣的是,“最初訓練的” 網絡似乎只需要很少的 “戳” 就能讓它向特定的方向有用地發展。人們可能會認爲,要讓網絡表現得像 “學到了新東西”,就必須運行訓練算法,調整權重,等等。

但事實並非如此。相反,基本上只需要告訴 ChatGPT 一些東西,作爲你所給的提示的一部分,然後它就可以在生成文本時成功地利用你告訴它的東西。我認爲,這一點再次成爲理解 ChatGPT “真正在做什麼” 以及它與人類語言和思維結構的關係的一個重要線索。

這當然有一些類似於人類的東西:至少在它接受了所有的預訓練之後,你可以告訴它一些東西,而它可以 “記住它” —— 至少 “足夠長的時間” 來使用它生成一段文本。那麼,在這樣的情況下發生了什麼?

可能是 “你可能告訴它的一切都已經在那裏了” —— 你只是把它引向正確的地方。但這似乎並不靠譜。相反,似乎更有可能的是,是的,這些元素已經在那裏了,但具體細節是由 “這些元素之間的軌跡” 這樣的東西來定義的,這就是你告訴它的東西。

事實上,就像人類一樣,如果你告訴它一些奇怪的、出乎意料的、完全不適合它所知道的框架的東西,它似乎並不能成功地 “整合” 這個。只有當它基本上以一種相當簡單的方式騎在它已經擁有的框架之上時,它才能 “整合” 它。

還值得再次指出的是,對於神經網絡能夠 “接收” 的東西,不可避免地存在 “算法限制”。告訴它 “淺層” 的規則,如 “這個到那個”,神經網絡很可能能夠很好地表示和再現這些規則 —— 事實上,它從語言中 “已經知道” 的東西會給它一個直接的模式來遵循。

但是,如果試圖給它制定一個實際的 “深度” 計算規則,涉及許多潛在的不可簡化的計算步驟,它就無法工作了。(記住,在每一步,它總是在其網絡中 “向前輸送數據”;除了生成新的標記外,從不循環。)

當然,網絡可以學習特定的 “不可簡化的” 計算的答案。但只要有組合數的可能性,這種 “查表式” 的方法就不會奏效。 因此,是的,就像人類一樣,現在是時候讓神經網絡 “伸出手來”,使用實際的計算工具了。(是的,Wolfram|Alpha 和 Wolfram 語言是唯一合適的,因爲它們是爲了 “談論世界上的事物” 而建立的,就像語言模型的神經網絡一樣)。

人類的語言 —— 以及產生語言的思維過程 —— 似乎一直代表着一種複雜性的頂峯。事實上,人類的大腦 —— “僅” 有 1000 億個左右的神經元網絡(也許還有 100 萬億個連接) —— 能夠負責這項工作,似乎有些了不起。也許,人們可能會想象,大腦除了神經元網絡之外還有其他東西,就像一些未被發現的物理學新層。

但現在通過 ChatGPT,我們得到了一個重要的新信息:我們知道,一個純粹的人工神經網絡,其連接數與大腦的神經元一樣多,能夠很好地生成人類語言,令人驚訝。

而且,是的,這仍然是一個龐大而複雜的系統 —— 其神經網絡的權重與目前世界上的文字一樣多。但在某種程度上,似乎仍然很難相信,語言的所有豐富性和它可以談論的東西可以被封裝在這樣一個有限的系統中。

這其中的部分原因無疑是反映了一個無處不在的現象(這在第 30 條規則的例子中首次變得很明顯),即計算過程實際上可以大大放大系統的表面複雜性,即使其基本規則很簡單。但是,實際上,正如我們上面所討論的,ChatGPT 中所使用的那種神經網絡往往是專門用來限制這種現象的影響以及與之相關的計算的不可重複性的,以便使其訓練更容易進行。

那麼,像 ChatGPT 這樣的東西是如何在語言方面走得如此之遠的呢?我想,基本的答案是,語言在根本層面上比它看起來要簡單得多。 這意味着 ChatGPT —— 即使它的神經網絡結構最終是簡單的 —— 能夠成功地 “捕捉” 人類語言的本質和背後的思維。此外,在其訓練中,ChatGPT 以某種方式 “隱含地發現” 了語言(和思維)中的任何規律性,使其成爲可能。

我認爲,ChatGPT 的成功爲我們提供了一個基本的和重要的科學證據:它表明我們可以期待有重大的新 “語言法則” —— 以及有效的 “思維法則” —— 在那裏被發現。 在 ChatGPT 中,作爲一個神經網絡,這些規律充其量是隱含的。但是,如果我們能以某種方式使這些定律明確化,就有可能以更直接、更有效和更透明的方式完成 ChatGPT 所做的各種事情。

但是,好吧,那麼這些法律可能是什麼樣的?最終,它們必須給我們提供某種語言 —— 以及我們用它說的東西 —— 如何組合的處方。稍後我們將討論 “觀察 ChatGPT” 如何能夠給我們一些這方面的提示,以及我們從構建計算語言中瞭解到的情況如何提示我們前進的道路。但首先讓我們來討論兩個長期以來爲人所知的相當於 “語言法則” 的例子 —— 以及它們與 ChatGPT 的運作有何關係。

第一個是語言的語法。 語言並不只是一個隨機的詞語組合。相反,對於不同種類的單詞如何放在一起,有(相當)明確的語法規則:例如,在英語中,名詞前面可以有形容詞,後面可以有動詞,但通常兩個名詞不能緊挨着。這樣的語法結構可以(至少是近似地)被一套規則所捕獲,這些規則定義瞭如何將相當於 “解析樹” 的東西放在一起:

ChatGPT 對這種規則沒有任何明確的 “知識”。但在訓練中,它隱含地 “發現” 了這些規則,然後似乎很擅長遵循這些規則。那麼,它是如何工作的呢?在一個 “大畫面” 的層面上,這並不清楚。但是爲了得到一些啓示,看看一個更簡單的例子也許會有啓發。

考慮一種由()和()序列組成的 “語言”,其語法規定括號應該總是平衡的,如解析樹所表示的那樣:

我們能否訓練一個神經網絡來產生 “語法上正確的” 小括號序列?在神經網絡中處理序列有多種方法,但讓我們使用變換器網絡,就像 ChatGPT 那樣。給定一個簡單的變換器網絡,我們可以開始給它提供語法正確的小括號序列作爲訓練實例。

一個微妙之處(實際上也出現在 ChatGPT 的人類語言生成中)是,除了我們的 “內容標記”(這裏是 “(” 和 “)”),我們還必須包括一個 “結束” 標記,它的生成表明輸出不應該再繼續下去(即對於 ChatGPT 來說,我們已經到達了 “故事的終點”)。

如果我們只用一個有 8 個頭的注意塊和長度爲 128 的特徵向量來設置一個轉換網(ChatGPT 也使用長度爲 128 的特徵向量,但有 96 個注意塊,每個注意塊有 96 個頭),那麼似乎不可能讓它學會很多小括號語言。但是,如果有 2 個注意力頭,學習過程似乎會收斂 —— 至少在給出 1000 萬個左右的例子之後(而且,正如轉化器網絡所常見的那樣,顯示更多的例子似乎會降低其性能)。

因此,對於這個網絡,我們可以做 ChatGPT 的類似工作,並詢問下一個標記應該是什麼的概率 —— 在一個括號序列中:

在第一種情況下,網絡 “非常確定” 序列不能在這裏結束 —— 這很好,因爲如果它結束了,小括號就會留下不平衡。然而,在第二種情況下,它 “正確地認識到” 序列可以在這裏結束,儘管它也 “指出” 有可能 “重新開始”,放下一個 “(”,估計後面還有一個 “)”。但是,哎呀,即使它有 40 萬個左右經過艱苦訓練的權重,它也說有 15% 的概率將 “)” 作爲下一個標記 —— 這是不對的,因爲這必然會導致一個不平衡的括號。

如果我們要求網絡爲逐漸變長的()序列提供最高概率的完成度,我們會得到以下結果:

是的,在一定長度內,網絡做得很好。但隨後它就開始失敗了。這是在神經網絡(或一般的機器學習)的這種 “精確” 情況下看到的非常典型的事情。人類 “一眼就能解決” 的情況,神經網絡也能解決。但是需要做一些 “更多的算法”(例如明確地計算括號是否封閉)的情況,神經網絡往往在某種程度上是 “計算上太淺”,無法可靠地做到。(順便說一句,即使是目前完整的 ChatGPT 也很難正確匹配長序列中的括號)。

那麼,這對像 ChatGPT 和像英語這樣的語言的語法意味着什麼呢?小括號語言是 “樸素的” —— 而且更像是一個 “算法的故事”。但在英語中,能夠在局部選詞和其他提示的基礎上 “猜測” 什麼是符合語法的,則要現實得多。

而且,是的,神經網絡在這方面要好得多 —— 儘管它可能會錯過一些 “形式上正確” 的情況,而人類也可能錯過。但主要的一點是,語言有一個整體的句法結構這一事實 —— 以及它所暗示的所有規律性 —— 在某種意義上限制了神經網絡要學習的 “程度”。一個關鍵的 “類似自然科學” 的觀察是,像 ChatGPT 中的神經網絡的轉化器架構似乎能夠成功地學習所有人類語言中似乎都存在(至少在某種程度上是近似的)的那種嵌套樹狀的句法結構。

句法提供了對語言的一種約束。但顯然還有更多。像 “好奇的電子喫魚的藍色理論” 這樣的句子在語法上是正確的,但並不是人們通常期望說的東西,而且如果 ChatGPT 生成它,也不會被認爲是成功的 —— 因爲,嗯,以其中單詞的正常含義,它基本上沒有意義。

但是,是否有一個一般的方法來判斷一個句子是否有意義?這方面沒有傳統的整體理論。但是,我們可以認爲 ChatGPT 在接受了來自網絡的數十億(可能是有意義的)句子的訓練之後,已經隱含地 “發展了一套理論”。

這個理論可能是什麼樣的呢?好吧,有一個小小的角落,基本上兩千年來一直爲人所知,那就是邏輯。當然,在亞里士多德發現的 Syllogistic 形式中,邏輯基本上是一種說法,即遵循某些模式的句子是合理的,而其他的則不是。

因此,例如,說 “所有的 X 都是 Y,這不是 Y,所以它不是 X” 是合理的(正如 “所有的魚都是藍色的,這不是藍色,所以它不是魚”)。就像人們可以有點異想天開地想象亞里士多德通過(“機器學習式”)大量的修辭學例子來發現對偶邏輯一樣,人們也可以想象在 ChatGPT 的訓練中,它將能夠通過查看網絡上的大量文本等來 “發現對偶邏輯”。

(是的,雖然我們可以期待 ChatGPT 產生包含 “正確推論” 的文本,比如基於對偶邏輯,但當它涉及到更復雜的形式邏輯時,情況就完全不同了 —— 我認爲我們可以期待它在這裏失敗,原因與它在小括號匹配中失敗的原因相同)。

但除了邏輯這個狹隘的例子之外,對於如何系統地構建(或識別)甚至是合理的有意義的文本,又能說些什麼呢?是的,有一些東西,如《瘋狂的自由》,使用非常具體的 “短語模板”。但不知何故,ChatGPT 隱含着一種更普遍的方法。也許除了 “當你有 1750 億個神經網絡權重時,它就會以某種方式發生” 之外,對如何做到這一點沒有什麼可說的。但我強烈懷疑有一個更簡單、更有力的故事。

11 意義空間和語義運動法則

我們在上面討論過,在 ChatGPT 中,任何一段文本都有效地由一個數字陣列來表示,我們可以將其視爲某種 “語言特徵空間” 中的一個點的座標。因此,當 ChatGPT 繼續一個文本時,這相當於在語言特徵空間中追蹤一個軌跡。 但現在我們可以問,是什麼讓這個軌跡對應於我們認爲有意義的文本。也許會有某種 “語義運動法則” 來定義 —— 或者至少是約束 —— 語言特徵空間中的點如何移動,同時保留 “有意義”?

那麼,這個語言學特徵空間是什麼樣子的呢?下面是一個例子,說明如果我們把這樣一個特徵空間投射到二維空間,單個詞(這裏是指普通名詞)是如何佈局的:

我們在上面看到的另一個例子是基於代表植物和動物的詞。但這兩種情況下的重點是,“語義相似的詞” 被放在附近。

作爲另一個例子,這裏是對應於不同語音部分的詞是如何佈置的:

當然,一個給定的詞一般來說並不只有 “一個意思”(或一定只對應一個語篇)。通過觀察包含一個詞的句子在特徵空間中的佈局,我們通常可以 “區分” 出不同的含義 —— 就像這裏的例子 “起重機”(crane, “鳥” 或 “機器”?):

好的,所以我們至少可以認爲這個特徵空間是把 “意義相近的詞” 放在這個空間裏的,這是合理的。但是,在這個空間裏,我們可以確定什麼樣的額外結構?例如,是否存在某種 “平行運輸” 的概念,以反映空間中的 “平坦性”?掌握這個問題的一個方法是看一下類比:

而且,是的,即使當我們投射到二維時,往往至少有一個 “平坦性的暗示”,儘管它肯定不是普遍可見的。

那麼,軌跡呢?我們可以看看 ChatGPT 的提示在特徵空間中的軌跡 —— 然後我們可以看看 ChatGPT 是如何延續這個軌跡的:

這裏當然沒有 “幾何學上明顯的” 運動規律。這一點也不令人驚訝;我們完全可以預料到這是一個相當複雜的故事。而且,舉例來說,即使有一個 “語義上的運動定律” 可以找到,它最自然地以什麼樣的嵌入(或者,實際上,什麼樣的 “變量”)來表述,也遠非明顯。

在上圖中,我們展示了 “軌跡” 中的幾個步驟 —— 在每個步驟中,我們挑選 ChatGPT 認爲最可能的詞(“零溫度” 情況)。但我們也可以問,在某一點上,哪些詞可以以什麼概率 “接下來”:

在這種情況下,我們看到的是有一個高概率詞的 “扇形”,似乎在特徵空間中或多或少有一個明確的方向。如果我們再往前走會怎麼樣呢?下面是我們沿着軌跡 “移動” 時出現的連續的 “扇形”:

這是一個三維表示,總共走了 40 步:

而且,是的,這似乎是一團糟 —— 並沒有做任何事情來特別鼓勵這樣的想法,即我們可以期望通過經驗性地研究 “ChatGPT 在裏面做什麼” 來確定 “類似數學物理學的”“運動語義法則”。但也許我們只是看了 “錯誤的變量”(或錯誤的座標系),只要我們看了正確的變量,我們就會立即看到 ChatGPT 正在做一些 “數學 · 物理學的簡單” 的事情,比如遵循測地線。但是到目前爲止,我們還沒有準備好從它的 “內部行爲” 中 “實證解碼”ChatGPT“發現” 人類語言是如何 “拼湊” 的。

12 語義語法和計算語言的力量

產生 “有意義的人類語言” 需要什麼?在過去,我們可能會認爲這不可能是一個人的大腦。但現在我們知道,ChatGPT 的神經網絡可以很好地完成這一任務。不過,也許這已經是我們能走的最遠的路了,沒有什麼比這更簡單 —— 或者更容易被人類理解 —— 的東西會起作用。

但我強烈懷疑的是,ChatGPT 的成功隱含地揭示了一個重要的 “科學” 事實:有意義的人類語言的結構和簡單性實際上比我們所知道的要多得多,而且最終甚至可能有相當簡單的規則來描述這種語言如何被組合起來。

正如我們上面提到的,句法語法給出了人類語言中對應於不同語篇的詞語如何組合的規則。但是爲了處理意義,我們需要更進一步。而如何做到這一點的一個版本是,不僅要考慮語言的句法語法,還要考慮語義語法。

爲了語法的目的,我們確定名詞和動詞等事物。但爲了語義學的目的,我們需要 “更精細的等級”。 因此,例如,我們可以確定 “移動” 的概念,以及 “保持獨立於位置的身份” 的 “物體” 的概念。這些 “語義概念” 中的每一個都有無盡的具體例子。

但是,爲了我們的語義語法的目的,我們將只是有某種一般性的規則,基本上說 “物體” 可以 “移動”。關於這一切如何運作,有很多東西可以說(其中一些我以前說過)。但我在這裏只想說幾句,指出一些潛在的發展道路。

值得一提的是,即使一個句子根據語義語法是完全可以的,也不意味着它在實踐中已經實現(甚至可以實現)。“大象去了月球” 無疑會 “通過” 我們的語義語法,但是它肯定沒有在我們的實際世界中實現(至少還沒有) —— 儘管對於一個虛構的世界來說,這絕對是公平的遊戲。

當我們開始談論 “語義語法” 時,我們很快就會問:“它的下面是什麼?” 它假設的是什麼 “世界模型”?句法語法實際上只是關於從詞語中構建語言的問題。但是,語義學語法必然涉及某種 “世界模型” —— 作爲 “骨架” 的東西,由實際詞語構成的語言可以在上面分層。

直到最近,我們可能會想象,(人類)語言將是描述我們 “世界模型” 的唯一一般方式。早在幾個世紀前,就已經開始有了對特定種類事物的形式化,特別是以數學爲基礎。但現在有一種更普遍的形式化方法:計算語言。

是的,這是我四十多年來的一個大項目(現在體現在沃爾弗拉姆語言中):開發一個精確的符號表示,可以儘可能廣泛地談論世界上的事物,以及我們關心的抽象事物。因此,例如,我們有城市、分子、圖像和神經網絡的符號表示,而且我們有關於如何計算這些事物的內在知識。

而且,經過幾十年的工作,我們已經用這種方式覆蓋了很多領域。但是在過去,我們並沒有特別處理 “日常話語”。在 “我買了兩磅蘋果” 中,我們可以輕易地表示(並對其進行營養和其他計算)“兩磅蘋果”。但是我們(還沒有)對 “我買了” 有一個符號表示。

這一切都與語義語法的想法有關 —— 目標是爲概念提供一個通用的符號 “構造套件”,這將爲我們提供什麼可以與什麼結合的規則,從而爲我們可能轉化爲人類語言的 “流程” 提供規則。

但是,假設我們有了這種 “符號話語語言”。我們會用它做什麼呢?我們可以開始做一些事情,比如生成 “本地有意義的文本”。但最終我們可能想要更多 “全局意義” 的結果 —— 這意味着 “計算” 更多關於世界上實際存在或發生的事情(或許是在某個一致的虛構世界)。

現在在 Wolfram 語言中,我們有大量的關於許多種類的事物的內置計算知識。但對於一個完整的符號話語語言,我們必須建立關於世界上一般事物的額外 “計算”:如果一個物體從 A 地移動到 B 地,又從 B 地移動到 C 地,那麼它就從 A 地移動到 C 地,等等。

給定一個符號化的話語語言,我們可以用它來做 “獨立的陳述”。但我們也可以用它來問關於世界的問題,“Wolfram|Alpha 風格”。或者我們可以用它來陳述我們 “想讓它變成這樣” 的事情,大概是用一些外部的執行機制。或者我們可以用它來做斷言 —— 也許是關於真實的世界,也許是關於我們正在考慮的某個特定世界,不管是虛構的還是其他的。

人類語言從根本上說是不精確的,這不僅僅是因爲它沒有 “拴” 在一個具體的計算實現上,而且它的意義基本上只是由其使用者之間的 “社會契約” 來定義。但是計算語言,就其性質而言,具有某種基本的精確性 —— 因爲最終它所指定的東西總是可以 “毫不含糊地在計算機上執行”。

人類語言通常可以擺脫某種模糊性。(當我們說 “行星” 時,它是否包括系外行星,等等。)但是在計算語言中,我們必須對我們所做的所有區分精確而清楚。

在計算語言中,利用普通人類語言來編造名字往往很方便。但它們在計算語言中的含義必然是精確的,而且可能涵蓋也可能不涵蓋典型人類語言用法中的某些特定內涵。

我們應該如何找出適合一般符號話語語言的基本 “本體”?嗯,這並不容易。這也許就是爲什麼自亞里士多德兩千多年前的原始開始以來,在這些方面做得很少。但是,今天我們對如何以計算方式思考世界瞭解得如此之多,這確實有幫助(而且,從我們的物理學項目和 ragiad 的想法中得到 “基本形而上學” 也無傷大雅)。

但是這一切在 ChatGPT 的背景下意味着什麼?從它的訓練來看,ChatGPT 已經有效地 “拼湊” 了一定數量的相當於語義語法的東西(相當令人印象深刻)。但是它的成功讓我們有理由認爲,以計算語言的形式構建更完整的東西將是可行的。而且,與我們迄今爲止對 ChatGPT 內部的理解不同的是,我們可以期待將計算語言設計得讓人類容易理解。

當我們談論語義語法的時候,我們可以將其與對偶邏輯相類比。起初,對偶邏輯本質上是用人類語言表達的語句規則的集合。但是(是的,兩千年後)當形式邏輯被開發出來時,音節邏輯最初的基本構造現在可以用來建造巨大的 “形式塔”,包括例如現代數字電路的運作。而且,我們可以預期,更一般的語義語法也會如此。

起初,它可能只是能夠處理簡單的模式,例如以文本形式表達。但是,一旦它的整個計算語言框架建立起來,我們可以預期它將能夠被用來豎起 “廣義語義邏輯” 的高塔,使我們能夠以精確和正式的方式處理各種我們以前從未接觸過的東西,而只是在 “底層” 通過人類語言,以其所有的模糊性。

我們可以認爲計算語言的構造 —— 以及語義語法 —— 代表了一種對事物的終極壓縮。因爲它允許我們談論什麼是可能的本質,而不需要,例如,處理存在於普通人類語言中的所有 “轉折性的措辭”。我們可以把 ChatGPT 的巨大優勢看作是有點類似的東西:因爲它在某種意義上也已經 “鑽研” 到可以 “把語言以一種有語義的方式組合在一起”,而不關心不同的可能的措辭。

那麼,如果我們把 ChatGPT 應用於底層計算語言,會發生什麼呢?計算語言可以描述什麼是可能的。但仍然可以添加的是對 “什麼是流行的” 的感覺 —— 例如基於對網絡上所有內容的閱讀。

但是,在下面,用計算語言操作意味着像 ChatGPT 這樣的東西可以立即和基本地接觸到相當於利用潛在的不可還原的計算的終極工具。這使得它成爲一個不僅可以 “生成合理文本” 的系統,而且可以期望解決任何可以解決的問題,即這些文本是否真的對世界 —— 或者它應該談論的東西做出了 “正確” 的陳述。

13 那麼 ChatGPT 在做什麼,爲什麼它能發揮作用?

ChatGPT 的基本概念在某種程度上相當簡單。從網絡、書籍等人類創造的大量文本樣本開始。然後訓練一個神經網絡來生成 “像這樣” 的文本。特別是,讓它能夠從一個 “提示” 開始,然後繼續生成 “像它被訓練過的那樣” 的文本。

但出乎意料的是,這個過程可以產生成功地 “像” 網絡上、書本上的文字。而且,它不僅是連貫的人類語言,它還 “說了些什麼”,“按照它的提示” 利用它 “讀” 到的內容。它並不總是說 “全局有意義”(或對應於正確的計算)的事情 —— 因爲(例如,在沒有獲得 Wolfram|Alpha 的 “計算超能力” 的情況下),它只是根據訓練材料中的事情 “聽起來像” 說了一些話。

ChatGPT 的具體工程使它相當引人注目。但最終(至少在它能夠使用外部工具之前),ChatGPT“只是” 從它所積累的 “傳統智慧的統計數據” 中抽出一些 “連貫的文本線索”。 但令人驚訝的是,其結果是如此的像人。正如我所討論的,這表明了一些至少在科學上非常重要的東西:人類語言(以及它背後的思維模式)在某種程度上比我們想象的更簡單,更 “像法律”。ChatGPT 已經隱晦地發現了這一點。但我們有可能通過語義語法、計算語言等明確地暴露它。

當涉及到訓練(又稱學習)時,大腦和當前計算機的不同 “硬件”(以及,也許,一些未開發的算法想法)迫使 ChatGPT 使用一種可能與大腦相當不同(在某些方面效率低得多)的策略。還有一點:即使與典型的算法計算不同,ChatGPT 內部也沒有 “循環” 或 “對數據進行重新計算”。而這不可避免地限制了它的計算能力 —— 即使與目前的計算機相比也是如此,但與大腦相比肯定是如此。

目前還不清楚如何 “解決這個問題”,並且仍然保持以合理效率訓練系統的能力。但這樣做大概會讓未來的 ChatGPT 做更多 “類似大腦的事情”。當然,有很多事情是大腦做得不好的 —— 特別是涉及到相當於不可簡化的計算。對於這些,大腦和像 ChatGPT 這樣的東西都必須尋求 “外部工具” —— 比如 Wolfram 語言。

但就目前而言,看到 ChatGPT 已經能夠做到的事情是令人興奮的。在某種程度上,它是基本科學事實的一個很好的例子,即大量簡單的計算元素可以做非凡和意想不到的事情。 但它也爲我們提供了兩千年來最好的動力,以更好地理解人類條件的核心特徵,即人類語言及其背後的思維過程的基本特徵和原則。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/1JUDwn-ibPEJRFRpS7VGhQ