萬字長文解釋 ChatGPT 在做什么,以及為什么它能發揮作用?(3)
到目前為止,我們一直在談論那些 “已經知道” 如何完成特定任務的神經網絡。但是,神經網絡之所以如此有用(估計也是在大腦中),是因為它們不僅在原則上可以完成各種任務,而且可以逐步 “根據實例訓練” 來完成這些任務。
當我們制作一個區分貓和狗的神經網絡時,我們實際上不需要寫一個程序來(比如說)明確地找到胡須;相反,我們只需要展示大量關于什么是貓和什么是狗的例子,然后讓網絡從這些例子中 “機器學習” 如何去區分它們。
重點是,訓練有素的網絡從它所展示的特定例子中 “概括” 出來。正如我們在上面看到的,這并不是簡單地讓網絡識別它所看到的貓咪圖像的特定像素模式;而是讓神經網絡以某種方式設法在我們認為是某種 “一般貓性” 的基礎上區分圖像。
那么,神經網絡的訓練究竟是如何進行的呢?從本質上講,我們一直在努力尋找能夠使神經網絡成功重現我們所給的例子的權重。然后,我們依靠神經網絡以 “合理” 的方式在這些例子之間進行 “插值”(或 “概括”)。
讓我們看看一個比上面的最近點的問題更簡單的問題。讓我們只嘗試讓一個神經網絡學習函數:
對于這個任務,我們需要一個只有一個輸入和一個輸出的網絡,比如:
但我們應該使用什么權重等?在每一組可能的權重下,神經網絡都會計算出一些函數。例如,這里是它用幾組隨機選擇的權重所做的事情:
是的,我們可以清楚地看到,在這些情況下,它甚至都沒有接近再現我們想要的函數。那么,我們如何找到能夠重現該函數的權重呢?
基本的想法是提供大量的 “輸入→輸出” 的例子來 “學習” —— 然后嘗試找到能重現這些例子的權重。下面是用逐漸增多的例子來做的結果:
在這個 “訓練” 的每個階段,網絡中的權重都被逐步調整 —— 我們看到,最終我們得到了一個能成功重現我們想要的函數的網絡。那么,我們是如何調整權重的呢?基本的想法是在每個階段看看我們離得到我們想要的函數 “有多遠”,然后以這樣的方式更新權重,使之更接近。
為了找出 “我們有多遠”,我們計算通常被稱為 “損失函數”(或有時稱為 “成本函數”)的東西。這里我們使用的是一個簡單的(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 等完成的,我們傾向于突然認為計算機一定是變得更加強大了,特別是超越了它們已經基本能夠做到的事情(比如逐步計算蜂窩自動機等計算系統的行為)。
但這并不是正確的結論。計算上不可還原的過程仍然是計算上不可還原的,而且對計算機來說仍然是根本性的困難 —— 即使計算機可以輕易地計算它們的單個步驟。相反,我們應該得出的結論是,我們人類可以做的,但我們不認為計算機可以做的任務,比如寫文章,實際上在某種意義上比我們想象的更容易計算。
換句話說,神經網絡之所以能夠成功地寫出一篇文章,是因為寫一篇文章被證明是一個比我們想象的 “計算上更淺” 的問題。從某種意義上說,這使我們更接近于 “擁有一種理論”,即我們人類是如何做到像寫文章這樣的事情的,或在一般情況下處理語言。
如果你有一個足夠大的神經網絡,那么,是的,你可能能夠做任何人類能夠輕易做到的事情。但是,你不會捕捉到自然界一般能做的事情 —— 或者我們從自然界塑造的工具能做的事情。而正是這些工具的使用 —— 無論是實用的還是概念性的 —— 使得我們在近幾個世紀里能夠超越 “純粹的無助的人類思維” 所能達到的界限,并為人類的目的捕捉到物理和計算宇宙中的更多東西。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。