萬字長文解釋 ChatGPT 在做什么,以及為什么它能發揮作用?(2)
假設你想知道(就像伽利略在 15 世紀末所做的那樣),從比薩塔的每一層落下的炮彈要多長時間才能落地。那么,你可以在每一種情況下測量它,并將結果制成表格。或者你可以做理論科學的精髓:建立一個模型,給出某種計算答案的程序,而不是僅僅測量和記住每個案例。
讓我們想象一下,我們有(有點理想化的)數據,說明炮彈從不同樓層落下需要多長時間。
我們如何計算出它從一個我們沒有明確數據的樓層落下需要多長時間?在這種特殊情況下,我們可以用已知的物理學定律來計算。但是,如果說我們所得到的只是數據,而我們不知道有什么基本定律在支配它。那么我們可以做一個數學上的猜測,比如說,也許我們應該用一條直線作為模型。
我們可以選擇不同的直線。但這是平均來說最接近我們所給的數據的一條。而根據這條直線,我們可以估算出任何樓層的下降時間。
我們怎么知道要在這里嘗試使用一條直線呢?在某種程度上我們不知道。這只是數學上簡單的東西,而我們已經習慣了這樣的事實:我們測量的很多數據都被數學上簡單的東西很好地擬合了。我們可以嘗試一些數學上更復雜的東西 —— 比如說 a + bx + cx2,然后在這種情況下,我們做得更好:
不過,事情可能會出大問題。比如這里是我們用 a + b/c + x sin(x) 也就做成:
值得理解的是,從來沒有一個 “無模型的模型”。你使用的任何模型都有一些特定的基礎結構,然后有一組 “你可以轉動的旋鈕”(即你可以設置的參數)來適應你的數據。而在 ChatGPT 的案例中,使用了很多這樣的 “旋鈕” —— 實際上,有 1750 億個。
但令人矚目的是,ChatGPT 的底層結構 —— “僅僅” 有這么多的參數 —— 足以使一個計算下一個單詞概率的模型 “足夠好”,從而為我們提供合理的文章長度的文本。
我們上面舉的例子涉及到為數字數據建立模型,這些數據基本上來自于簡單的物理學 —— 幾個世紀以來我們都知道 “簡單數學適用”。但是對于 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 生成語言時,我們會遇到同樣的問題。而且同樣不清楚是否有辦法 “總結它在做什么”。但是語言的豐富性和細節(以及我們在這方面的經驗)可能會讓我們比圖像走得更遠。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。