2023年的大模型:OpenAI科學家最新講座(完整版)
文:城主
前言
作爲頗有建樹的AI科學家,Hyung Won Chung從Google跳到OpenAI一年多,他剛在網絡上所做的LLM技術分享中提供了LLM在2023年的最新動向和大量技術細節,頗有價值。
視頻傳送門:
【"2023年的大模型" :OpenAI科學家最新講座【中英】-嗶哩嗶哩】 https://b23.tv/4JV0IlE
=以下是本城根據講座提煉整理的完整內容=
我將在此討論2023年的大型模型。
你可能會問,爲什麼要特意強調“2023年”這個時間點?當我們說“大型”,這其實是有些誤導性的。因爲今天所稱的大型模型,在未來幾年內可能就被視爲小型了。隨着我們對“規模”的定義發生變化,我們在目前的大語言模型中所做的許多見解和結論都可能會變得過時,甚至在某些情況下變得不再適用。然而,幸運的是,那些基於基本原則的見解往往會持續得更長久,比那些初看起來很有前景的新穎觀點更爲持久。
在本次分享中,我想與大家分享我過去四年在這一領域的工作中得到的基本認識,這些都是我從與一些非常聰明的人交流中獲得的。我希望,我今天分享的內容都是基於基本原則的,能夠在未來幾年內保持其相關性。那麼,讓我們開始吧。
大型語言模型的一個特點是,某些能力只有在達到一定規模時纔會顯現。這使得我們需要從不同的角度來看待這個領域。這是我想表達的。此處的具體細節並不重要。在X軸上,我們可以考慮模型的規模,比如模型的參數數量、訓練數據的大小、所用的計算資源等。而在Y軸上,可以是你所關心的任務的某些性能指標。我們已經反覆觀察到這樣的模式:小型模型在某些任務上幾乎無法取得任何進展,但當模型達到一定規模時,它突然就能夠完成這些任務了,有時甚至能做得很好。我們稱這種現象爲“涌現”,就像某種能力突然“涌現”出來。這在大型語言模型中是非常獨特的。
這爲AI研究者提供了一種全新的視角。首先,是“尚未”這種觀念。假設我們有一個新想法,例如一個新的推理技巧,我進行了實驗,發現它不起作用。大部分時間,確實如此。但我不會說這個想法永遠不會起作用,我只會說“現在還不行”。這確實是一種根本的思維轉變。這意味着,這個想法可能在當前的模型上不適用,但在三、五年後的模型上,它可能會起作用。
爲什麼這種觀點在以前不是那麼明顯呢?我們已經習慣於在一個基本規律不會真正改變的環境中工作。例如,如果你在物理實驗或熱力學研究中有了一個新的想法,但實驗失敗了,你知道這個想法在三年、甚至三十年後都不會成功。但在AI領域,情況則完全不同。例如,GPT-4發佈後,研究者們在其基礎上進行了大量實驗,建立了新的直覺。但隨着新模型的發佈,很多之前的想法和直覺就變得過時了。
這種轉變需要我們不斷地更新、拋棄那些基於過時觀點的直覺,這對於許多研究者來說是一個新挑戰。但這也爲新入行的研究者提供了機會。他們可以帶來新的視角,嘗試那些在以前的模型上不起作用的想法,而在新的模型上,這些想法可能突然就有效了。這種情況在AI這個競爭激烈的領域已經發生了很多次,這是一個非常有意思的現象,值得我們深入思考。
我想分享的下一個觀點與我們如何站在前沿,特別是與縮放曲線有關。這是我要表達的核心思想。在我的日常研究中,我總是在腦海中構建一個畫面,並記錄所有不成功的實驗。這些失敗往往是因爲某種“智力”上的不足。這可能是一個模糊的描述,但也許這意味着沒有足夠的推理能力去解決某個複雜的數學或編程問題。因此,我會把這些記錄下來,但並不會立即標記爲失敗,這樣在未來可以輕鬆地重新進行嘗試。當出現新的、更優秀的模型時,我會再次運行這些實驗,以判斷哪些是成功的,哪些是失敗的。通過這種方式,我不斷更新我的認知,學習新的知識,並圍繞新興能力建立直覺,這與“規模”緊密相關。我相信,這種思維方式將變得越來越重要。
爲了進一步解釋,讓我們簡化一下。並不是說所有的任務都需要大規模的處理,但有時確實需要。爲了說明,我以GPT-3和GPT-4爲例,它們代表了不同的規模。考慮以下三個能力層面:對於“能力一”,GPT-4尚未達到,但它非常接近一個轉折點,這意味着我們可能會突然看到一個躍進式的改進。對於“能力二”,儘管我們有了強大的GPT-4,但仍然有很大的距離,目前的方法可能還不能提供實質性的幫助。而對於“能力三”,GPT-3已經超越了轉折點。在這個階段,我所進行的研究可能只會帶來漸進式的改變。
這是一個提示:實際上,我經常發現我正在解決的問題不僅僅是上述兩三種。但只要我堅持這種思維框架,並經常回顧和反思,更新我的直覺就會變得更加容易,幫助我明確我到底在解決哪種問題。這就是我想向大家介紹的核心思想。總的來說,我們所做的一切都與“規模”有關,而從“規模”的角度看問題確實非常關鍵。
但如何真正實現這種“縮放”呢?我將在接下來的時間中深入探討這個問題。目前爲止,所有的大型語言模型都採用了Transformer架構。你可能已經對此非常熟悉了。但在這裡,細節不是那麼重要。我們要關注的是基本的思想,並從基礎原理出發。爲此,我們需要過濾掉不必要的細節。
事實上,Transformer的內部結構對我們來說並不那麼關鍵。我們可以從功能的角度來看待Transformer,將其視爲一個包含一系列矩陣乘法的序列到序列的映射。其輸入是一個長度爲D的序列,代表Transformer的寬度和長度;輸出也是一個同樣大小的數組。
這主要用於模型訓練。雖然對於實際推理,情況可能有所不同,但縮放主要是在預訓練階段發生的,且輸入和輸出的長度是相同的。這是一個非常簡化的視角,但它提供了一個清晰的圖景。在此基礎上,我們可以進一步思考輸入和輸出的形狀,以及從一開始就會發生的事情。例如,我們可能有一個句子,這只是一個簡單的字符串。然後,我們需要對其進行標記化,使用BPE或句子片段等方法,這基本上是一個嘗試儘可能壓縮文本的外部模型。這樣,我們就可以得到一個整數列表。接下來,我們會將這個列表嵌入到一個隱藏的空間中,這就是所謂的詞嵌入。
每個標記現在都被表示爲一個長度爲D的向量,並且我們有這些向量的總長度。這就是實際計算的開始。我們有N個Transformer層,這些層只是從一個序列映射到另一個相同的序列。這裡,一切都與規模有關,而且我們儘量不要做過多的假設。我們希望每個序列標記都能與其他標記進行交互,所以我們應該允許它們這樣做,但不要限制它們的交互方式。在Transformer中,一種實現這一點的方法就是通過計算點積。這就是我們要達到的目標。
模型的學習和計算細節,如點積的獲取,雖然複雜,但都是爲了執行主要的計算任務。這些計算主要在高維數組中進行,涉及到矩陣乘法和數組計算。在Transformer模型計算的最後階段,我們得到了一個序列。接着,我們採用特定的損失函數(我稍後會介紹這個函數)來評估模型的預測。這個損失函數基於模型對下一個Token的預測來計算最大可能性。目標是預測下一個標記,並根據預測的準確性得到一個數值。有了這個數值後,我們會進行反向傳播,更新模型的所有參數。
在實際應用中,這些計算是批量進行的。這意味着我們的計算不僅僅針對一個數據點,而是同時處理多個數據點。整個數據批次中唯一的相互依賴是在最後的計算損失步驟,我們會取其平均值。
這就是模型計算的全部過程。絕大部分的計算都在這裡發生。因此,當我們討論如何擴展Transformer模型時,這就是我們要關注的關鍵部分。
擴展Transformer從根本上來看,就是要確保這部分的計算能夠在很多機器上高效地執行。這涉及到如何將Transformer中的所有這些矩陣合理地分配給各種機器。關鍵是要確保在儘量減少機器之間的通信的同時進行合理的分配。
考慮到我們需要在多臺機器上進行大量的矩陣乘法,我們首先從一個簡單的矩陣乘法例子開始。假設我們有八臺機器,可能是CPU或GPU。我們的任務是執行一個16x16的矩陣乘法。
爲了實現這一目標,我們首先需要對硬件有一個抽象的認識。這八臺機器可能位於同一個房間,或者分佈在不同的地方。我們不需要過多地關心它們的物理佈局,而是在虛擬空間中定義一個網格來表示它們。
每臺機器都負責矩陣的一部分。我們使用顏色編碼來表示A矩陣的各個部分應該分配給哪臺機器。這種方式使得每臺機器都可以並行地執行其分配到的任務。
這就是我們如何分配矩陣以及每臺機器應該執行的任務。
首先,我們來探討機器的工作原理。對於輸出矩陣C,在執行矩陣乘法後,我們的目標是使機器一的切片位於8x4的左上角。這是一個明確的需求。
接下來,我們需要確定機器要執行的操作。考慮矩陣乘法的特性,我們通常對列和行進行計算。爲了完成這個操作,機器需要獲取額外的數據。它自身並不擁有執行此操作所需的全部數據。爲了解決這個問題,我們執行了一系列收集操作,這是MPI中的一個操作。具體來說,機器需要與其他四臺機器進行通信來獲取數據。每臺機器都有其本地的數據存儲。當機器一與機器二、三、四通信並獲取所需數據後,它將擁有所有的數據副本。這種收集操作被所有機器執行,這也是爲什麼它被稱爲“全體收集”而不僅僅是“收集”。
當機器擁有所有必要的數據副本時,它可以開始計算。值得注意的是,這種計算是在所有八臺機器上並行進行的,這也是其能夠快速計算的原因。但這也帶來了一個代價,即通信成本。我們需要確保計算的速度優勢超過了通信的代價。
對於矩陣乘法,我們可以總結爲使用“愛因斯坦求和符號”。這爲我們提供了一種高層次的方法來描述數組計算。基本規則是,如果一個字母在兩個輸入中都出現,則將它們的分量相乘。例如,numpy中的A乘以B可以表示爲兩個字母I的乘積。如果一個字母沒有出現在輸出中,則需要對該維度進行求和。這與矩陣和向量的乘法相似。
愛因斯坦求和提供了一種更爲通用的方法,允許我們增加更多的維度,不僅僅是二維或一維。因此,從這個角度來看,矩陣乘法可以表示爲愛因斯坦的MN,MP,其中M是收縮維度。這就是爲什麼我們要這樣做的原因
首先,我們有各種標籤的數組軸,例如“國會議員”和“明尼蘇達州”。這種映射方式就是將N映射到Y軸和X軸的數組軸。有沒有想過,有一種神奇的裝飾器可以自動並行化這種映射併爲你完成所有工作呢?我稍後會詳細討論這種實現方法,但真正的實現過程與此非常相似。我們可以將其視爲一種魔法,它只需插入在二維中聚集的所有數據,並返回其並行化版本。這就是全部內容。
愛因斯坦求和爲我們提供了一個框架,告訴我們需要做什麼。當我們談論Transformer時,我們主要關心的是自注意力層,這是Transformer的核心部分。除了softmax外,所有這些操作都可以用Einsum來表示。你可以簡潔地將其佈局,其中X是三維序列,是模型的長度。所有其他參數都是模型學習和更新的參數。當你擁有這種佈局時,你就得到了一個帶有標籤數組軸的愛因斯坦運算。
現在,我們如何並行化這個操作呢?首先,我們有八臺機器。我們不再使用X或Y這樣的標籤,而是按照慣例使用“數據”和“模型”這兩個詞。這意味着數據並行和模型並行。這種網格並行方式最初是TensorFlow在2018年提出的,雖然現在有些過時,但我們仍然使用這個術語。
爲了並行化,我們只需稍作修改。我們並行化它,並將B作爲數據映射,因爲B代表了最佳維度。我們在數據軸上分配了不同的機器,而N是序列長度。在Transformer的任何並行版本中,我們都不會跨序列長度進行並行化,因爲那裡發生了很多相似的操作。而與D、H(頭數)相關的是模型維度。實際上,這就是爲什麼多頭注意力是如此有效的原因。它是由並行策略驅動的。
現在,一旦你有了這種並行策略,你可以使用完全相同的代碼,並行化它,並在八臺或任意數量的機器上運行。這是一個常見的例子,使用八臺機器,但這個框架實際上可以適用於任意數量的機器。從谷歌的博客文章中可以瞭解,實際上在TPU V4 Pod中,它可以使用高達3072個芯片。當我們訓練Palm模型時,我們使用了兩個pods,所以這裡我們使用了6000個芯片,每個芯片的計算能力都與高端GPU相當。
如今,你手頭擁有這批強大的機器,你可以按照固定的模式定義一個網格。模型並行維度爲48,數據並行維度雖然在2D中顯示,但可以擴展到64。在Palm中,我們採用了不同的配置,但核心思路仍然相同,只是機器數量有所增加。一個需要注意的細節是DCN(數據中心網絡)的數據並行性。當兩個Pod之間沒有直接連接,但都連接到數據中心網絡時,其傳輸速度大約爲每秒25GPS,這相對於連接GPU pod的速度來說是較慢的。因此,我們在此處避免了模型並行化。在進行梯度計算後,我們在數據中心網絡上進行梯度求和,這個過程大約需要一秒鐘。儘管我不確定具體的時間,但這並不重要,因爲當我們訓練像Palm 5400億這樣的模型時,每個訓練步驟需要大約17秒,所以額外增加的一兩秒並不會帶來太大影響。
這種體驗確實很有趣,我只需要輸入代碼,然後在我的筆記本電腦上運行,程序就會自動在所有這些機器上執行。這種規模化的方法,如果你真正理解了它,最後的實現其實只是我剛剛描述的大量機器上的矩陣乘法。所以,我們一直都在假設這種並行化裝飾器是可行的,但如何真正實現它呢?一種方法是使用GSPMD,這是一種基於編譯器的方法。你可以編寫神經網絡代碼,就像你擁有一臺擁有無限內存的機器一樣,不需要進行任何並行化處理。我們就是這樣做的,不進行任何通信,只是表示神經網絡的核心部分,並將訓練步驟表示爲一個計算圖。你只需要指定這些輸入和輸出如何映射到硬件軸,然後交給XLA處理,它會自動插入所需的通信操作。這種方法確實像魔法一樣,但它並不總是有效,需要經過多次迭代,並且很多人都在嘗試。但現在,許多大型模型,如Google、P5、Palm、Switch和Transformer,都使用GSPMD作爲後端,完全採用我所描述的方法。當然,還有其他的方法。我對其他方法不是很熟悉,但你可以考慮手動註解和編譯器操作。但無論採用哪種方法,最終的過程都是相同的,都涉及將數組軸映射到機器。有時手動方法更爲優越,因爲它提供了更多的控制權。
以下是一些具體的例子。對於許多研究人員來說,使用GSPMD進行並行化可能過於複雜。因此,Jax推出了一個名爲Pjit的前端接口。我推測它被稱爲Jit是因爲它變得非常實用。我們需要並行化定義的訓練步驟。我們用Jax的Pjit作爲裝飾器來包裝這個步驟。這樣,你得到的訓練步驟可以在大量機器上運行。這個具體的代碼實際上就是用來訓練Palm的。你可以查看這些代碼,瞭解它們是如何工作的。儘管有些代碼模板化,但既然你已經熟悉了這個框架,你可能對其中的內容有所瞭解。這些代碼是開源的,基於T5X框架構建。我們還有一篇簡短的論文描述了該系統,鏈接在文章底部。
現在,從工程和硬件系統的角度來看,這些都很好。但從機器學習的角度來看呢?最近發佈的Llama2模型在成功運行後的表現非常好。但實際進行預訓練時,迭代不同的想法的成本是非常高的。你可能想嘗試不同的數據分割方式或其他方法,但每次都需要在大規模上運行,這非常耗費資源。如果你正在進行這樣的運行,你可能會面臨這樣的場景:假設你有2萬億個Token,需要運行50天。然後,你可能需要花費一天的時間來評估進展情況。在此情境下,你需要做出決策,例如,"看起來我們的700億模型表現得很好。"但這種決策非常困難,因爲你已經花費了大量的GPU時間。這種情境下的決策制定是非常緊張和困難的。
預訓練的核心是所謂的"縮放法則"。GPT-4的技術報告和OpenAI之前的論文都討論過這個概念,我認爲這是一個關鍵的概念。我們在這裡討論的是如何預測,如何根據小規模模型的性能外推到更大規模的模型,比如GPT-4。這種縮放定律是基於小規模模型的數據開發的。這爲我們提供了一個指導方針,幫助我們預測模型在更大數據上的表現。如果你可以預測模型的擴展損失,那麼這將是一個非常有價值的工具。預訓練的這一部分確實非常關鍵。我想說的是,儘管現在的擴展比兩年前更爲簡單,但仍然是一個巨大的挑戰。這不僅僅是簡單地擴大模型規模,還有很多其他考慮因素需要考慮。
以下是一些具體的例子。在Palm的訓練過程中,我們遇到了損失值的高峰現象。這個問題實際上已經在論文中被提及,你可以去查閱。整個訓練過程中,大約出現了20次損失高峰,這讓很多人感到擔憂,因爲損失值突然從兩點上升到了六點。這種情況確實不太理想。爲了解決這個問題,我們訓練了三個模型,使用完全相同的數據,但只有一個模型出現了這種情況。這種問題很難調試,並且在小規模上很難復現。我們確定這並不是由於數據問題引起的。一些研究者進行了實驗來驗證這一假設。每當這種情況發生時,它都會造成大量計算資源的浪費,這使得大規模訓練變得更具挑戰性。
儘管如此,隨着技術的進步,對於某個給定的規模,如Llama模型,訓練變得更加容易。但與此同時,我們也發現,技術規模的增長速度超過了解決這些問題的速度。大多數人並不會嘗試在更大的規模上訓練模型,他們可能會選擇等待其他研究者的進展,並基於此進行進一步的研究。
這自然地引導我們進入了下一個話題:僅僅增大規模並不能解決所有問題。除了大規模的工程工作,我們還需要進行更多的研究,尤其是在模型訓練完成後。讓我來解釋一下爲什麼我們可能需要在訓練後進一步優化模型。由於預訓練模型的學習目標僅僅是預測下一個Token,我們不能直接與它交互。例如,如果輸入是一個問題,模型可能會持續生成內容,而不是直接回答這個問題。我們所期望的是一個簡潔的答案。爲了解決這個問題,我們採用了一種技巧,即構建問題,使得答案恰好是下一個Token。這確實是一個有力的技術,但它並不是真正的通用解決方案。
更大的問題是,預訓練模型可能會盲目地生成內容,即使這些內容是惡意的或有害的。特別是,模型不知道如何拒絕某些提示。因此,所有這些我們認爲重要的能力,例如與人類價值觀的一致性,都需要在訓練後的階段進行教育。我更喜歡稱之爲"訓練後Post-Training"。
以下是當前大型語言模型的四個主要階段。首先,預訓練是第一階段。接下來的三個階段分別是:指令微調(有時也被稱爲SFT,即監督微調)、獎勵模型的訓練以及策略模型的訓練。這也涉及到了RLHF,即強化學習的部分。我們將按照1、2、3的順序逐個介紹這些階段。
首先,我們來探討指令微調。其核心思想是爲所有任務建立從自然語言指令到自然語言響應的映射。回想一下,我們在採納這種方法之前是如何進行任務的。
例如,在2018年,當時最先進的模型是BERT。如果我們需要完成一個分類任務,我們將首先使用BERT對句子進行編碼,然後將其映射到分類空間,這需要一些特定於任務的參數。但當我們嘗試進行多任務學習時,這種方法就顯得不太實用。
在T5模型中,這個問題得到了改善,因爲它的輸入和輸出都是文本。因此,所有的任務都可以通過文本到文本的映射來完成,這使得多任務學習變得更加簡單。
但在多任務學習中,模型需要知道它正在執行哪個任務。爲了解決這個問題,我們可以爲模型提供元數據,比如"這是COLA任務"。但這種方法感覺有些不自然。相反,指令微調的方法則是使用自然語言來描述任務,例如"判斷以下句子是否可接受",這樣模型就能理解並執行相應的任務。
回顧過去,這種方法在T5或2018年並不明顯,因爲當時人們並不認爲語言模型能夠理解這些指令。但隨着模型規模的增長,我們發現模型確實有能力在某種程度上理解這些指令,並利用自然語言的豐富性來統一各種任務。這就是指令微調的基本思想。進一步地,我們也可以將這種方法擴展到對話場景中,其中模型可以與另一個代理進行交互,而不僅僅是簡單地響應指令。這就是指令微調的核心思路。
去年,我在谷歌工作時撰寫了一篇論文,探討了指令微調的潛能及其邊界。但在深入討論之前,我想先說明一點。當我們按照特定的指令進行模型訓練時,可能會遇到在訓練過程中未曾涉及的新任務。但由於這些新任務仍然是基於指令的,所以只需按照這些指令來操作模型即可。這就是所謂的“概括”。這是一個非常核心的概念。那麼,一個自然的問題是,如果訓練集中包含更多的指令,是否能得到一個更好的模型?這樣的模型是否能夠更好地概括?
爲了驗證這一點,我們收集了大量的學術任務,總共有1836個,並將它們結合起來進行訓練。我不打算深入細節,但我已經在論文的末尾提供了鏈接,供有興趣的讀者查閱。這篇論文描述了Flan、T5和Plan等模型的起源。我們製作了一些圖表來展示,其中X軸表示模型的大小,包括80億、620億和5400億。Y軸表示了評估集的平均分數。我們精心選擇了其中6個在訓練過程中未見過的難度較大的任務。可以看到,一個擁有80億參數的模型表現得相當好,但其分數仍低於10%。
因此,我們的結論是,儘管增加更多任務可以提高性能,但其效果是遞減的。這一點在另一張圖中可能更爲明顯,這張圖顯示了微調任務的數量與性能的關係。從中我們可以看到,每個模型的性能都提高了大約10%,但增加更多的任務並沒有帶來太大的幫助。關鍵在於任務的多樣性。並且,即使是在1800個任務中,我們測試過的任何大小的模型,或者任何類型的模型,都能從這種方法中受益。我認爲這種方法非常有效,但它確實存在侷限性。
再次思考這個問題,我們需要考慮學習的目標是什麼。在這個學習階段,我們到底在教模型什麼呢?在監督學習中,我們常常使用交叉熵損失或最大似然估計作爲學習目標。這意味着對於給定的輸入,我們期望模型能夠輸出一個唯一正確的答案,而所有其他答案都被認爲是錯誤的。在強化學習的文獻中,這種方法被稱爲“行爲克隆”。簡而言之,如果我們有足夠多的示例,模型應該能夠模仿或“克隆”這些行爲,從而在新的、未見過的情境中做出正確的決策。然而,隨着任務的複雜性增加,爲模型明確定義“正確的行爲”變得越來越困難。
我將用一系列例子來闡述這個觀點,讓我們進行一個思維實驗,只考慮存在單一正確答案的情況。答案必須是確定的。以一個簡單的例子爲起點,二加三等於多少?顯然,答案是五,或者可能是“答案是五”這樣的回答。但這一點是毋庸置疑的。再來一個稍微複雜一些的,將“我應該學習,而不是看這部電影”翻譯成韓語。這是我個人的翻譯,我懂韓語,所以這可能是正確的。但這確實是一個有着單一答案的問題,儘管其中可能存在一些微小的差異。
現在,考慮我們在大型語言模型中真正面對的問題。例如,給一個五歲的男孩寫一封來自聖誕老人的信,解釋聖誕老人並不真實,同時要確保這個信息傳遞得足夠溫柔,不傷害這個孩子的感情。對於這樣的問題,我很難確定一個最佳答案,更不用說有一個確定的答案了。
所以,當面對這種情況時,我對使用最大似然估計作爲我們主要的學習目標感到不太自信。這可能是一個誤導。考慮到一些更實際的用例,比如我經常提到的一個提示:“在Python中使用梯度下降實現邏輯迴歸”。這個問題並沒有一個明確的答案。你可能偏向函數式編程,或者你可能更喜歡面向對象的編程風格,但無論你的選擇是什麼,都可能是有效的。
我們的目標越來越是教導模型如何執行一些更加抽象和模糊的任務。似乎指令微調的目標函數開始成爲一個瓶頸。儘管我沒有確鑿的證據證明這在實踐中是一個問題,但我不認爲我們能夠使用這種非常狹窄的信號來訓練一個比GPT-4大上千倍的模型。那麼,我們是否可以使用某種方式來替代這個最大似然目標呢?
這就是強化學習與RLHF的核心觀點。在強化學習中,我們試圖最大化一個預期的獎勵函數。考慮到一個代理在下棋時,如果它贏了,我們給予它1的獎勵,否則給予0。這是一個有效的獎勵函數,但我們實際上可以使用一個模型來爲更復雜的情況定義獎勵,我們稱這個爲獎勵模型。那麼,如何從這個視角來實施它呢?
我們都知道如何使用神經網絡進行監督式學習。因此,我們可以使用神經網絡來代表這個獎勵模型,將其進一步整合到獎勵模型中。
核心的概念在於,對於一個特定的輸入,我們提供兩個答案,並由人類來判斷哪一個更受偏愛,而不是直接告訴模型哪一個是最好的。從這兩個答案中,這個更爲優秀。最初,這種做法可能沒有明確地說明爲什麼一個答案比另一個更好,但重要的是它爲模型提供了一種學習人類偏好的方式。
關鍵在於,儘管某個答案可能被視爲首選,但它並不一定是最佳選擇。只要它比另一個選項好,模型就可以從中學習。比較的這種方法是至關重要的。爲何我們選擇比較而不是直接評分?對於如二加三的簡單問題,認爲五比四更好可能是沒有意義的,因爲只有一個正確答案。但對於其他複雜的問題,比如某種句子的補全,我可能會提出兩個較好的答案,並指出其中一個更爲出色。
核心思想是,比較可能比絕對評分更簡單。對於這些數學公式,我可能會快速跳過。簡單地說,對於兩個答案YI和YJ,我們定義了一個概率PIJ,表示答案I優於答案J的概率。這個概率是基於人類給出的標籤。這個概率模型實際上是基於獎勵的差異,更具體地說,是對數機率。這種建模方法可以追溯到1952年。我們只需重構這個模型並最大化這個概率,因爲這實質上是最大似然法。獎勵模型是基於最大似然法進行訓練的。
這樣的方法很好,因爲它爲策略模型提供了豐富的信號。這是大型模型的最後階段。在這裡,目標函數是我們剛剛學到的,而獎勵模型的參數在初始的強化學習階段就已確定。這個方法可能讓你想起了生成對抗網絡(GAN),其中有一個判別器和生成器。你固定其中的一部分參數,然後進行另一輪的迭代。
對於這個策略模型,它通常是從監督指令微調的檢查點開始的。你只需要爲這個提示生成一些補全,然後提供給獎勵模型,它會返回一個得分。基於這個得分,如果分數很低,那麼我知道這個答案並不好。如果分數很高,那麼我會嘗試更多這樣的答案。
因此,這是數學中的一種試錯方法的形式化表示。這基本上是一個宏觀的觀點。因爲我們的目標是通過基於梯度的迭代方法來最大化這一目標,所以我們只需要梯度。
這些梯度是通過一些策略級別的算法(例如PPO)來獲得的。核心思想是在滿足RM模型的條件下進行迭代。在這個過程中,RM模型對人類的偏好進行編碼,並將其傳遞給策略模型,該模型再通過強化學習來學習這些偏好。
實際上,許多人並不真的喜歡這種方法。我經常聽到人們說:“我們應該放棄RLI方法。”許多人,不僅僅是OpenAI的人,都有這種觀點。主要的問題是,實施這種方法確實很困難。強化學習是一個非常複雜的領域,很容易出錯。一個常見的問題是所謂的“獎勵黑客”。如果模型發現長時間的完成得到了更高的獎勵,它可能會傾向於產生更長的答案,即使這些答案沒有意義。這種模型的行爲與人類的偏好是不一致的,這種差異被稱爲“獎勵黑客”。這是一個困難的問題,目前還沒有明確的解決方案。
儘管有這些挑戰,但我仍然認爲RLHF是一個有價值的研究方向。在我看來,最大似然的歸納偏差是太強了。當我們的模型規模增加時,這種偏差可能會導致問題。例如,GPT-4可能還可以,但更大的模型可能會出現問題。學習這個目標函數可以幫助我們克服這種偏見。此外,這個領域還有很大的進步空間。雖然我們已經看到了一些成功的RLHF模型,但這只是開始。
總的來說,我認爲如果某個方法在原則上是對的,我們就應該繼續研究,直到我們找到正確的方法。
我想通過一個高層次的視角來回顧人工智能的發展。
從基於規則的系統開始,雖然我可能不是很熟悉,但我認爲這個高層次的觀點是很重要的。在這裡,輸入是通過手工設計的程序來映射的。在下一代機器學習系統中,輸入被轉換爲手工設計的特徵,然後通過一個可學習的部分來映射到輸出,如SVM。這個可學習的部分是我用藍色標出的。隨後,這些輸出和輸入被傳遞給一個手工設計的損失函數,然後進行迭代。深度學習的主要變革是將手工設計的特徵替換爲學習到的特徵。
特別地,分層的表示學習定義了深度學習的技術特點。這種轉變確實取得了巨大的成功。爲什麼會這樣呢?因爲它採用了更弱的歸納偏差,並允許了更高的可擴展性。我們現在擁有更強大的計算能力,所以爲什麼不充分利用它呢?這便是深度學習成功的核心。
因此,如果我們比較經典的機器學習和深度學習,最接近的對比可能是邏輯迴歸和前饋神經網絡。它們處理相同的任務,但前饋神經網絡從數據中學習了隱藏的表示。這使得模型能夠更好地處理二進制分類任務。
那麼,下一個演進階段會是什麼呢?如果僅僅是改變一個組件並使其變成可學習的就如此成功,那爲什麼不嘗試更多的改變呢?目前,損失函數仍然是手工設計的。也許我們應該打破這個約束,使其變得可學習。我認爲這將是下一個階段。我們已經有了一些成功的例子,如GAN和RLHF。這些模型允許複雜的行爲表達,而這些行爲如果要被形式化描述將會非常困難。
但我認爲這只是RLHF的一個實例。它也可能是其他類型的強化學習模型,或者甚至不是強化學習的方法。我相信這將是下一個範式,並且我們應該努力朝這個方向發展。
當我思考每個範式的代表性模型時,我想到了IBM的深藍。對於經典的機器學習,我不太確定具體是哪一個,但我們可以稱它爲基於SVM的系統。然後,下一個範式的代表是GPT-3。每一個範式都帶來了巨大的變革,我相信學習損失函數或目標函數將是下一個重大的步驟。
考慮到這一點,我對未來的發展感到非常興奮。謝謝大家。