Karpathy後悔了:2015年就看到了語言模型的潛力,卻搞了多年強化學習
机器之心發表於2024-11-18
「這是有史以來最大、最令人困惑的研究生涯錯誤,」Andrej Karpathy 感嘆道。上個週末,OpenAI 創始成員、研究科學家、原特斯拉前 AI 高階總監、AI 領域的大神 Andrej Karpathy 一直在後悔。後悔自己沒有早點帶領 OpenAI 開創大模型時代。是怎麼一回事?看起來 Karpathy 認為當年早已認識到自迴歸語言模型的強大潛力,但卻在很長一段時間裡「誤入歧途」,隨大溜一起搞強化學習。2013 年的 Atari RL 論文被認為是深度強化學習的開山之作:一個通用學習演算法就發現了 Breakout 和許多其他遊戲的最佳策略,看起來,在很多工上我們只需要對其進行足夠的改進和擴充套件,就可以構建出強大的 AI 模型了。我們也還記得,在 Karpathy 跳槽去到特斯拉一年後,2018 年 OpenAI 推出了 OpenAI Five,利用強化學習的方法在 Dota 2 遊戲上開始與職業選手過招。在 2019 年,OpenAI 的研究者還訓練神經網路,利用一隻類人機械手來玩魔方,表明強化學習工具不僅僅可以處理虛擬任務,而且還能夠解決需要高度靈活性的真實世界問題。這個時候 OpenAI 在另一邊已經推出「迄今為止最大模型」GPT-2 了,強化學習的盛世,似乎很快就被後來興起的大語言模型(LLM)所覆蓋。Karpathy 還提到:「Yann LeCun 當時就不太看好強化學習,他一遍又一遍地談論『蛋糕』,而強化學習(RL)只是蛋糕頂部最後一顆櫻桃,表徵學習是蛋糕主體,監督學習是錦上添花。至少在今天看來,他在概念上是完全正確的(預訓練 = 蛋糕主體,監督微調(SFT)= 糖衣,RLHF = 櫻桃,即基本的 ChatGPT 訓練 pipeline)。這很有趣,因為今天他仍然不太看好 LLM。」說了這麼多,如今已是「事後諸葛亮」了,當初明明看好卻沒把握住,看起來比當初根本沒想過這回事還讓人懊惱。讓我們看看 Karpathy 那篇預言瞭如今大模型時代的文章,說了些什麼。其實關於 RNN,Karpathy 早在 15 年就已經注意到了。為此他還專門寫了一篇名為《RNN 的不合理有效性》 文章。文章深入探討了迴圈神經網路(RNN)的潛力與實際應用。文中提到了幾個實驗示例,包括使用 RNN 來生成類似莎士比亞作品的文字,以及模擬程式設計程式碼和數學公式的生成。 Karpathy 用簡單易懂的語言介紹了 RNN。RNN 是一種能夠處理序列資料的神經網路,它透過其迴圈連線能夠記住之前的資訊,這對於時間序列資料或任何序列資料的處理尤為關鍵。 Karpathy 描述了使用 RNN 進行影像描述任務的初次嘗試,並分享了這一過程中的神奇體驗。他回憶稱,在使用 RNN 進行訓練後不久,即使是隨意選擇的超引數配置下,他的模型開始生成看起來非常不錯的影像描述,這些描述接近於有意義。這種簡單模型與所獲得的結果質量之間的比例,有時會遠遠超出預期,這讓人感到驚訝。當時的普遍看法認為 RNN 難以訓練,但 Karpathy 後來的經驗卻讓他得出了相反的結論。隨著時間的推移,Karpathy 頻繁地訓練 RNN,並多次見證了它們的強大和穩健,儘管如此,這些網路產生的有趣輸出仍然讓他感到新奇和有趣。 關於如何利用 RNN 逐字元生成文字的介紹,引發了對「這怎麼可能?」這一問題的思考。 事實上,眾所周知,RNN 是圖靈完備的,因為它們可以模擬任意程式(具有適當的權重)。但與神經網路的通用近似定理類似,你不應該對此進行過多的解讀。如果訓練普通神經網路是對函式的最佳化,那麼訓練迴圈網路就是對程式的最佳化。接下來,Karpathy 在部落格中講解了 RNN 的基本工作原理,並透過一個具體的字元級語言模型應用來說明其實際操作過程。 具體而言,Karpathy 為 RNN 提供一大段文字,並要求它根據前面的字元序列對序列中下一個字元的機率分佈進行建模。這樣,就可以一次一個字元地生成新文字。假設詞彙表為 hello, 這段訓練資料可以被拆分為 4 個獨立的訓練樣本: 每個字元會被編碼為一個向量,採用 1-of-k 編碼,即向量中只有一個位置為 1,其餘位置為 0,然後使用 step 函式將它們逐個輸入到 RNN。接著會觀察到一個 4 維輸出向量序列(每個字元一維),並將其解釋為 RNN 當前分配給序列中下一個字元的置信度。接下來可以看到 RNN 的訓練過程及其背後的邏輯:在第一個 step 中,RNN 看到字元 h 後,預測下一個字元的機率分佈如下:但根據訓練資料 hello,正確的下一個字元應該是 e。因此,需要提高 e 的置信度(綠色表示),同時降低其他字元的置信度(紅色表示)。在這過程中,每個 step 都有一個期望的目標字元。目標是讓網路對正確字元的置信度更高,而對錯誤字元的置信度更低。因此需要反向傳播演算法計算每個權重的梯度。根據梯度調整 RNN 的權重(引數),讓正確字元的置信度提高(例如 e 的置信度從 2.2 提高到 2.3)。錯誤字元的置信度則會相應降低。 這一過程會重複多次,直到模型收斂。收斂後,RNN 的預測會與訓練資料更加一致,即每一步都能夠正確預測下一個字元。 為了進一步說明,出於教學目的,Karpathy 還用 Python/numpy 編寫了一個最小的字元級 RNN 語言模型。程式碼大約只有 100 行。感興趣的讀者可以參考:- 專案連結:https://gist.github.com/karpathy/d4dee566867f8291f086
更進一步的,Karpathy 在這篇部落格中還列舉了 5 個其他示例展示。所有示例字元模型都是在 Github 上釋出的程式碼進行訓練的。- 專案連結:https://github.com/karpathy/char-rnn
Karpathy 希望探索 RNN 是否能夠學習並生成具有更多結構和風格的文字內容。為此,他下載了莎士比亞的所有作品,並將它們合併成一個 4.4MB 的檔案,用作訓練資料。接著,Karpathy 使用了一個包含 3 層 RNN 的模型,每層有 512 個隱藏節點,訓練這個模型耗費了數小時。最後,模型生成了一些文字樣本,包括角色名字和內容對話,有時還能生成較長的獨白片段。不過,從結果來看,儘管生成的文字看起來像莎士比亞的作品,但仍有一定的差異。Karpathy 認為這些生成結果表現出了模型的能力和侷限性,同時也展現了 RNN 在字元級語言建模上的潛力。Karpathy 還列舉了如何生成嬰兒名字這種有趣的示例,感興趣的讀者可以參考原部落格瞭解更多內容。隨後的故事我們都知道了,2017 年穀歌釋出了 Transformer 論文,提出了自注意力機制。在這個基礎上,人們逐步探索出大模型的 Scaling Laws,將 AI 技術向通用化快速延伸,直到今天。既然連 Andrej Karpathy 這樣的 AI 大佬也在研究方向上「走過彎路」,我們是不是也該回看一下過去?參考連結:https://karpathy.github.io/2015/05/21/rnn-effectiveness/