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