在近日舉辦的微軟開發(fā)者大會 Microsoft Build 2023 上,OpenAI 聯(lián)合創(chuàng)始人 Andrej Karpathy 做了一個題為《State of GPT》演講,其中他首先直觀地介紹了 GPT 的訓(xùn)練流程的各個階段,然后展示了如何使用 GPT 來完成任務(wù)并給出了直觀的示例,最后他還給出了一些非常具有實際意義的使用建議。機器之心詳細整理了該演講,以饗讀者。
如何訓(xùn)練 GPT?
首先,我們概括性地看看 GPT 大模型的訓(xùn)練流程。要記住,這是個新領(lǐng)域,變化很快。現(xiàn)在的流程是這樣,以后新技術(shù)出現(xiàn)時可能會不一樣。
可以看到,GPT 的訓(xùn)練流程可粗略分為四個階段:預(yù)訓(xùn)練、監(jiān)督式微調(diào)、獎勵建模、強化學(xué)習(xí)。
這四個階段按順序進行。每個階段都有各自的數(shù)據(jù)集,每個階段也有各自用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的算法。第三行是所得到的模型。最后底部有一些備注信息。
在所有階段中,預(yù)訓(xùn)練階段所需的計算量是最大的,可以說 99% 的訓(xùn)練計算時間和浮點運算量都集中在這個階段。因為這一階段需要處理超大規(guī)模的互聯(lián)網(wǎng)數(shù)據(jù)集,可能需要數(shù)千 GPU 構(gòu)成的超級計算機工作幾個月時間。其它三個階段都算是微調(diào)(fine tuning)階段,所需的 GPU 數(shù)量和訓(xùn)練時間都少得多。
下面我們將分階段詳解 GPT 的整個訓(xùn)練流程。
預(yù)訓(xùn)練階段
預(yù)訓(xùn)練階段的目標是得到一個基礎(chǔ)模型。
首先第一步:數(shù)據(jù)收集。這一階段需要海量的數(shù)據(jù),下面給出了一個例子,這是來自 Meta 的 LLaMA 模型的數(shù)據(jù)混合(data mixture)方法:
可以看到,LLaMA 的預(yù)訓(xùn)練數(shù)據(jù)按不同比例混用了多個不同類型的數(shù)據(jù)集,其中比例最大的是爬取自互聯(lián)網(wǎng)的 CommonCrawl 以及基于 CommonCrawl 構(gòu)建的 C4,此外還有 GitHub、維基百科等數(shù)據(jù)集。
收集到這些數(shù)據(jù)之后,還需要對它們進行預(yù)處理,這一步也被稱為「token 化」。簡單來說,這就是一個轉(zhuǎn)譯過程,即把原始文本轉(zhuǎn)譯成某種整數(shù)序列,因為這種整數(shù)序列就是 GPT 實際工作時所操作的本地表征。
這種從文本到 token 和整數(shù)的轉(zhuǎn)譯過程是無損的,而具體執(zhí)行這一過程的算法有好幾種。舉個例子,如上圖所示,我們可以使用一種名為字節(jié)對編碼(byte pair encoding)的技術(shù),其工作方式是迭代式地合并短文本塊并將它們分組成 token。最后實際輸入 Transformer 的就是那些整數(shù)序列。
下面來看兩個示例模型 GPT-3 和 LLaMA 在預(yù)訓(xùn)練階段需要考慮的一些主要的超參數(shù)。Karpathy 表示由于他們還沒有發(fā)布有關(guān) GPT-4 的相關(guān)信息,因此在演講中使用了 GPT-3 的數(shù)據(jù)。
可以看到,詞匯庫的大小通常是 10000 數(shù)量級的;上下文長度通常為 2000 或 4000 左右,而現(xiàn)在更是有長達 10 萬的。上下文長度決定著 GPT 在預(yù)測序列的下一個整數(shù)時所查看的最大整數(shù)數(shù)量。
對于參數(shù)數(shù)量,可以看到 GPT-3 的為 1750 億,而 LLaMA 的為 650 億,但實際上 LLaMA 的性能表現(xiàn)遠勝于 GPT-3。原因何在?因為 LLaMA 訓(xùn)練的 token 要長得多,達到了 1.4 萬億,而 GPT-3 僅有大約 3000 億。因此,評價一個模型時,光看參數(shù)數(shù)量是不夠的。
上圖中部的表格中給出了 Transformer 神經(jīng)網(wǎng)絡(luò)中一些需要設(shè)定的超參數(shù),比如頭的數(shù)量、維度大小、學(xué)習(xí)率、層數(shù)等等。
下方則是一些訓(xùn)練超參數(shù);比如為了訓(xùn)練 650 億參數(shù)的 LLaMA 模型,Meta 使用 2000 個 GPU 訓(xùn)練了大約 21 天,資金成本大約為 500 萬美元。這大概能體現(xiàn)出預(yù)訓(xùn)練階段各項成本的數(shù)量級。
接下來看實際的預(yù)訓(xùn)練過程究竟會發(fā)生什么。大致來說,首先會把 token 分批組成 data batch。這些分配數(shù)據(jù)構(gòu)成數(shù)組,再被輸入到 Transformer 中。這些數(shù)組的大小為 B×T;其中 B 是分批大小,即堆疊的獨立樣本的行數(shù);T 是最大上下文長度。下圖給出了一個示例。
在圖中示例中,上下文長度 T 僅為 10,但實際模型的 T 可達到 2000 或 4000 乃至更長。也就是說,實際模型的一行數(shù)據(jù)可以非常長,比如一整個文檔。我們可以將許多文檔打包到各行中,并用這些特殊的文本結(jié)束 token <|endoftext|> 來分隔它們。簡單來說,這些 token 是告訴 Transformer 新文檔開始的位置。比如圖中的 4 行文檔就轉(zhuǎn)換成了底部的 4×10 的數(shù)組。
現(xiàn)在,需要將這些數(shù)字輸入到 Transformer。這里我們僅看其中一個單元格(綠色),而實際上每個單元格都會經(jīng)歷同樣的處理流程。
這個綠色單元格會查看其之前的所有 token,即所有黃色單元格的 token。我們要將這里的全部上文輸入到 Transformer 神經(jīng)網(wǎng)絡(luò),Transformer 則需要預(yù)測出該序列的下一個 token,即圖中的紅色 token。
為了給出準確的預(yù)測,神經(jīng)網(wǎng)絡(luò)需要調(diào)整其上百億個參數(shù)。每次調(diào)整后,神經(jīng)網(wǎng)絡(luò)對每個單元格 token 的預(yù)測分布就會不同。舉個例子,如果詞匯庫的大小為 50257 個 token,那么我們就需要同樣多的數(shù)字,以便得到下一個 token 的概率分布,其預(yù)測了下一個 token 的可能值及相應(yīng)概率。
在圖中的示例中,下一個單元格應(yīng)該是 513,因此就可以將其用作監(jiān)督源來更新 Transformer 的權(quán)重。我們可以并行地對每個單元格采取同樣的操作。我們不斷更換數(shù)據(jù)批,努力讓 Transformer 有能力正確地預(yù)測序列的下一個 token。
下面再看一個更具體的示例。這是《紐約時報》用莎士比亞作品訓(xùn)練的一個小型 GPT。這里給出了莎士比亞作品中的一小段以及在其上訓(xùn)練 GPT 的情況。
首先,在 GPT 初始化時,權(quán)重是完全隨機的,所以其輸出結(jié)果也是完全隨機的。隨著時間推移,訓(xùn)練時間越來越長,GPT 不斷迭代,模型給出的結(jié)果樣本也就越來越連貫通順了。最后,可以看到 Transformer 學(xué)到了一些有關(guān)詞的東西,也知道應(yīng)該在哪些地方放置空格了。
在實際預(yù)訓(xùn)練過程中,要通過一些量化指標來確定模型迭代中的表現(xiàn)變化。一般來說,研究者監(jiān)測是損失函數(shù)。損失低說明 Transformer 更可能給出正確預(yù)測,即序列中下一個整數(shù)是正確值的概率更高。
預(yù)訓(xùn)練其實就是一個語言建模過程,這個過程的訓(xùn)練時間可長達一個月。之后,GPT 學(xué)到了一個非常強大的通用型語言表征。然后我們可以針對具體的下游任務(wù)高效地對其進行微調(diào)。
舉個例子,如果下游任務(wù)是情緒分類。過去,你采用的方法可能是收集大量標注好「正面」或「負面」情緒的樣本,然后訓(xùn)練一個 NLP 模型。但現(xiàn)在的新方法不需要預(yù)先做情緒分類了,你只需要拿一個預(yù)訓(xùn)練過的大型語言模型,然后只需要少量示例樣本,就能非常高效地針對你的具體任務(wù)對模型進行微調(diào)。
這對實際應(yīng)用來說非常有用。那么為什么預(yù)訓(xùn)練后的大型語言模型(LLM)只需要簡單微調(diào)就能用呢?這是因為語言建模過程本身就已經(jīng)涵蓋了大量任務(wù) —— 模型為了預(yù)測下一個 token,必須理解文本的結(jié)構(gòu)以及其中內(nèi)含的各種不同概念。
這就是 GPT-1。
現(xiàn)在來看 GPT-2。人們注意到 GPT-2 甚至可以不用微調(diào)就能非常有效地讓這些模型執(zhí)行 prompt。這些語言模型的訓(xùn)練目標是完成文檔,因此用戶實際上只需通過編排適當(dāng)?shù)奶摷傥臋n,就可以誘導(dǎo)模型執(zhí)行具體任務(wù)。下面給出了一個例子。
其中給出了一篇文章,用戶想完成的任務(wù)是做相關(guān)的問答。因此,只需要在文章后面加幾個有答案的問答(這被稱為 few-shot prompt),然后再提問,那么由于 Transformer 的目標是完成這個文檔,也就相當(dāng)于回答了問題。這個例子是用 prompt 來調(diào)教基礎(chǔ)模型,使其相信它在模仿一個文檔,結(jié)果卻完成了問答任務(wù)。
Karpathy 認為,以提供 prompt 替代微調(diào)的方式昭示著大型語言模型的新時代。這讓基礎(chǔ)模型本身就足以應(yīng)對許多不同類型的任務(wù)。
也因此,相關(guān)領(lǐng)域的研究前沿就轉(zhuǎn)向了基礎(chǔ)模型的進化。各大研究機構(gòu)和企業(yè)都在打造自己的基礎(chǔ)大模型。不過這些模型并不都是公開可用的,比如 OpenAI 一直沒有發(fā)布 GPT-4 基礎(chǔ)模型。我們通過 API 調(diào)用的 GPT-4 模型其實并不是基礎(chǔ)模型,而是一個助理模型(assistant model)。
GPT-3 基礎(chǔ)模型可通過 DaVinci API 使用,GPT-2 基礎(chǔ)模型也是公開的,用戶甚至可以在 GitHub 上找到其參數(shù)權(quán)重配置:https://github.com/openai/gpt-2 。不過總體而言,目前最開放的基礎(chǔ)模型還是 Meta 的 LLaMA 系列模型,但該系列也沒有授權(quán)給商業(yè)使用。
現(xiàn)在需要指出一點:基礎(chǔ)模型不等于助理模型。基礎(chǔ)模型不會回答用戶提問,它們只會完成文檔。所以如果你對基礎(chǔ)模型說:「寫一首關(guān)于面包和奶酪的詩」,你可能不會如愿 —— 它只會把你的要求看成一個文檔,然后試圖完成它。
但是,你可以通過適當(dāng)?shù)?prompt 誘導(dǎo)基礎(chǔ)模型寫詩,如上圖右側(cè)所示。
當(dāng)然,你也可以誘導(dǎo)模型變成助理。為此,你需要創(chuàng)建一些特定的少樣本 prompt,使其看起來像是人類與助理交換信息的交互過程的文檔。如下圖所示,然后你只需要在文檔結(jié)尾處附上你的提問,基礎(chǔ)模型就能在一定程度上化身為一個有用的助理,給出某個答案。但這個過程并不非常可靠,實踐效果也不好。
因此,為了打造出真正的 GPT 助理,需要另外的方法,即監(jiān)督式微調(diào)(supervised fine tuning,即 SFT)。
監(jiān)督式微調(diào)階段
在監(jiān)督式微調(diào)階段,需要收集少量但高質(zhì)量的數(shù)據(jù)集。OpenAI 的方法是以人工方式收集由 prompt 和理想響應(yīng)構(gòu)成的數(shù)據(jù)。這些數(shù)據(jù)需要不少,一般需要幾萬個。
然后,繼續(xù)在這些數(shù)據(jù)上執(zhí)行語言建模。算法不變,只是換了訓(xùn)練數(shù)據(jù)集:從大量低質(zhì)量的互聯(lián)網(wǎng)文檔換成了少量高質(zhì)量的問答式「prompt - 響應(yīng)」數(shù)據(jù)。
這個訓(xùn)練過程完成后,就得到了一個 SFT 模型。部署這些模型就能得到助理,它們已經(jīng)能完成一定程度的工作。
依然來看個例子。這是人類合同工寫出的數(shù)據(jù),其中有一個 prompt,然后人類再寫出理想的響應(yīng)。
理想的響應(yīng)自然不能讓人隨意發(fā)揮,而是需要遵循許多規(guī)則(如上右圖),其中有格式上的要求并且要保證給出的答案有用、真實可信且無害。
接下來還需要基于人類反饋的強化學(xué)習(xí)(RLHF),其中包含獎勵建模階段和強化學(xué)習(xí)階段。
獎勵建模階段
在這一階段,需要將數(shù)據(jù)收集轉(zhuǎn)變成比較的形式。這里給出了一個示例。對于同樣的 prompt,即要求助理寫一個能檢查給定字符串是否為回文的程序或函數(shù)。再使用已經(jīng)訓(xùn)練好的 SFT 模型生成多個結(jié)果,這里給出了三個。然后再讓人類給這些結(jié)果排名。
這件事做起來可并不簡單,畢竟要是讓人類來完成一個 prompt,可能需要耗費幾個小時時間。現(xiàn)在假設(shè)排名完成了,然后就需要在這些結(jié)果的所有可能配對上執(zhí)行類似二元分類的操作。
如下圖所示,具體的做法是這樣的:將 prompt 按行排列;這里的三行 prompt 是一樣的,但完成的結(jié)果不同,即圖中黃色 token(來自 SFT 模型)。然后在其后添加一個特殊的獎勵讀出 token。這樣,只需要在綠色 token 位置對 Transformer 執(zhí)行監(jiān)督,就能使 Transformer 預(yù)測出某個獎勵,從而判斷 prompt 的完成結(jié)果是否優(yōu)良。
這基本上就是讓 Transformer 猜測每個完成結(jié)果的質(zhì)量。當(dāng)其猜測完每個不同結(jié)果的質(zhì)量后,開發(fā)者就可以動用已有的基本真值(ground truth)強行讓某些結(jié)果的質(zhì)量分數(shù)高于其它結(jié)果,從而使模型的獎勵預(yù)測結(jié)果與人工給出的基本真值保持一致。這個過程可以通過一個損失函數(shù)完成。
有了獎勵模型之后,GPT 依然還不能成為一個有用的助理,但獎勵模型卻對后面的強化學(xué)習(xí)階段很有用,因為獎勵模型可以評估任意給定 prompt 的任意完成結(jié)果的質(zhì)量。
強化學(xué)習(xí)階段
強化學(xué)習(xí)階段做的事情就是基于獎勵模型,使用強化學(xué)習(xí)算法對大量 prompt 對應(yīng)的結(jié)果進行評分。
這里以一個 prompt 為例,將 SFT 模型完成的結(jié)果(黃色)排列成行,然后在后面加上獎勵 token(綠色)。這些獎勵來自獎勵模型,并且已經(jīng)固定不變。
現(xiàn)在使用同樣的語言建模損失函數(shù),只是現(xiàn)在是在黃色 token 上訓(xùn)練,并根據(jù)獎勵模型指示的獎勵來重新權(quán)衡語言建模目標。
比如在第一行,獎勵模型認為這個完成結(jié)果的評分相當(dāng)高。因此,模型在第一行采樣的所有 token 都會得到強化,也就是在未來會有更高的概率被采用。對比之下,獎勵模型不喜歡第二個完成結(jié)果,給出了負分評價,因此該行的所有 token 在未來出現(xiàn)的概率就會降低。
如此這般在許多 prompt 上操作一遍又一遍,經(jīng)過許多數(shù)據(jù)批次,就能得到一個創(chuàng)建黃色 token 的策略。依照這個策略,所有完成結(jié)果都能被獎勵模型給予高分。
這就是 RLHF 的訓(xùn)練流程。最后得到的模型就可以部署成應(yīng)用了。
ChatGPT 就是一個 RLHF 模型,而其它一些模型則可能是 SFT 模型,比如 Claude 等。
那么 OpenAI 為什么要使用 RLHF 呢?Karpathy 表示,原因很簡單,使用 RLHF 能讓模型表現(xiàn)更好。根據(jù) OpenAI 之前做的一些實驗,可以看到使用了 PPO(近端策略優(yōu)化)算法的 RLHF 模型整體上都更好一些。當(dāng)把結(jié)果提供給人類時,相比于 SFT 模型和通過 prompt 化身為助理的基礎(chǔ)模型,人類也基本更喜歡來自 RLHF 模型的 token。
那 RLHF 為什么能讓模型更好呢?目前 AI 研究界還沒有找到一個得到大家認可的理論,但 Karpathy 還是給出了自己的見解。他認為這可能與比較和生成的計算難度之間的不對稱性有關(guān)。
舉個例子說明一下:假設(shè)我們要讓一個模型寫一首關(guān)于回形針的俳句。如果你是一位正努力創(chuàng)建訓(xùn)練數(shù)據(jù)的合同工,正在為 SFT 模型收集數(shù)據(jù)。那么你該怎樣寫出一首關(guān)于回形針的好俳句呢?而你可能并不是一位優(yōu)秀的俳句詩人。但是,如果給你幾首俳句,你卻有能力辨別它們中哪首更好一些。也就是說,比起創(chuàng)建一個好樣本,判斷哪個樣本更好是簡單得多的任務(wù)。因此,這種不對稱性可能使得比較是一種更好的方法 —— 能更好地利用人類的判斷來創(chuàng)造出好一些的模型。
現(xiàn)在來看另一個方面:RLHF 并不總是會為基礎(chǔ)模型帶來提升。在某些情況下,RLHF 模型會失去一些熵,也就是說它們會輸出更加單調(diào)、變化更少的結(jié)果。而基礎(chǔ)模型的熵更高,可以輸出更加多樣化的結(jié)果。
比如下面的任務(wù)可能就更適合使用基礎(chǔ)模型,即生成與已有的 n 個示例相似的東西。這里的示例任務(wù)是生成更多寶可夢名字。首先,用戶向模型提供了 7 個寶可夢名字,然后讓基礎(chǔ)模型完成文檔。基礎(chǔ)模型生成了大量寶可夢名字。這些名字都是虛構(gòu)的,畢竟寶可夢并不真實存在。Karpathy 認為這類任務(wù)使用基礎(chǔ)模型會得到更好的結(jié)果,因為基礎(chǔ)模型的熵更高,給出的結(jié)果既與之前的示例相似,又更加多樣化和炫酷。
現(xiàn)在,用戶可以使用的助理模型已有不少了。伯克利有個團隊正對許多助理模型進行排名并給出了基本的 ELO 評分。當(dāng)然,現(xiàn)目前最好的模型是 GPT-4;Claude 和 GPT-3.5 緊隨其后。有些模型公開提供模型權(quán)重,比如 Vicuna、Koala 等。在這個榜單中,前三名都是 RLHF 模型,其它模型基本都是 SFT 模型。
上面就是訓(xùn)練模型的方式。下面調(diào)轉(zhuǎn)方向,看看我們可以怎么將 GPT 助理模型應(yīng)用于實際問題。
如何使用 GPT?
???
下面會通過實際示例來展示如何最好地使用 GPT。假設(shè)你在寫一篇文章,需要在結(jié)尾加上這樣一句:「California’s population is 53 times that of Alaska.」(加州的人口是阿拉斯加州的 53 倍)。但現(xiàn)在你不知道這兩個州的人口數(shù)據(jù),你需要智能助理來幫你。
人類會怎樣完成這個任務(wù)呢?大致推想,人類很可能會經(jīng)歷一連串的思考過程,如下圖所示:首先會想到為了得到結(jié)果,需要比較人口數(shù)量,那么就需要查詢?nèi)丝跀?shù)據(jù);然后使用查詢工具查一下 —— 在維基百科上找到了加州和阿拉斯加的人口數(shù)據(jù);接下來很顯然需要做個除法運算,可能會需要計算器;然后得到倍數(shù)結(jié)果 53;然后我們的大腦可能會用經(jīng)驗理智快速檢驗一下 ——53 倍感覺挺合理的,畢竟加州是美國人口最多的州。
信息有了之后,就進入了創(chuàng)造性寫作的部分。你可能首先會寫下:「California has 53x times greater」,然后你想一下感覺又不太合適,又刪了重新想哪種表達更合適一點,最終得到你滿意的句子表達。
簡單來說,為了寫這樣一句話,你的內(nèi)心會經(jīng)歷大量獨白式的思考。那么 GPT 在生成這樣一句話時又會經(jīng)歷什么呢?
GPT 處理的都是 token 序列。不管是閱讀還是生成,它都是按部就班地一塊塊地進行,其中每一塊都是針對一個 token,計算工作量也都一樣。這些 Transformer 的層數(shù)不少,足有 80 個推理層,但話說回來 80 也不是非常多。Transformer 會通過這些來盡力模仿寫作,但其思考過程和人類的大不相同。
也就是說與人類不同,GPT 沒有什么內(nèi)心獨白,它只會檢視每一個 token 并在每個 token 上投入同等的計算量,僅此而已。它們就像是 token 模擬器 —— 它們不知道自己知道什么或不知道什么,只是模仿地寫出下一個 token;它們也不會反思,內(nèi)心不會思考結(jié)果是否合理;它們寫錯了也不會反過來修改。它們只是按序列采樣 token。
但即便如此,Karpathy 認為 GPT 依然具有某種形式的認知能力優(yōu)勢,比如它們具備非常廣博的事實知識,涵蓋許多不同領(lǐng)域,因為它們數(shù)以百億計的參數(shù),足以儲存大量事實。同時它們還有相對來說很大且完美的工作記憶。只要能填入 Transformer 的上下文窗口,它就能通過其內(nèi)部自注意機制來加以利用。也就是說 GPT 能以無損的方式記住能嵌入其上下文窗口的任何內(nèi)容。
Karpathy 表示:人類通過 prompt 使用 GPT 的過程本質(zhì)上是大腦和 LLM 這兩種不同的認知架構(gòu)互相配合的過程。
用 GPT 執(zhí)行推理
再來看 Transformer 在實踐中表現(xiàn)相當(dāng)好的一種用例:推理。
如果只有單個 token,當(dāng)然不能指望 Transformer 推理出什么。推理的執(zhí)行需要涉及更多 token。比如,你不能向 Transformer 提一個非常復(fù)雜的問題,然后指望它通過單個 token 就找到答案。Transformer 需要通過 token 來「思考」。
上圖右側(cè)給出了一個例子。可以在輸出結(jié)果中看到 Transformer 為了解答問題而進行的「思考」。如果你提供了一些示例(上方) ,那么 Transformer 就會模仿那個模板,結(jié)果看起來相當(dāng)不錯。當(dāng)然,你也可以通過說「Let’s think step by step」(請按步驟解答)引導(dǎo) Transformer 給出類似的輸出 —— 這在某種程度上展示了其工作過程。而且由于它有點像是進入了工作過程展示模式,那么其在每個單獨 token 上投入的計算量就會少一點。這樣一來,它執(zhí)行的就是一個速度更慢的推理過程,也就更可能成功得到正確答案。
再看一例。如下圖所示,人類寫作時會寫不好,類似地,Transformer 在選擇下一個 token 時可能會出錯,但不同于人類可以及時停下進行修改,Transformer 會繼續(xù)生成,一錯到底,最終得到錯誤答案。
但類似于人類寫作時沒寫好可以重來一樣,Transformer 也可以多次采樣,然后我們可以使用某個過程找到其中較好的。這被稱為自我一致性(self-consistency)。
有趣的是,通過讓模型反思(reflection),可以發(fā)現(xiàn)模型其實能知道自己出錯了。舉個例子,如果讓 GPT-4 生成一首不押韻的詩然后它生成的詩卻押韻了。然后你只需要問它「你完成任務(wù)了嗎?」它就會知道自己沒有完成任務(wù),然后為你重新完成任務(wù)。
但如果你不給出那樣的 prompt,它就不知道自己錯了。它并不會自己去回顧,畢竟它只是一個 token 模擬器。你必須通過 prompt 讓它回顧。
Karpathy 表示可以按照目的將 AI 模型分為兩種:一類系統(tǒng)(System 1)和二類系統(tǒng)(System 2)。一類系統(tǒng)的處理過程速度快并且是自動化的,對應(yīng)于只是采樣 token 的大型語言模型。而二類系統(tǒng)的速度慢一些,會反復(fù)思考進行規(guī)劃。
現(xiàn)在有很多人在通過設(shè)計 prompt 來讓 LLM 表現(xiàn)出類似人類大腦的思維過程。如上左圖 (d) 所示,這是近期一篇論文提出的 Tree of Thought(思維樹)。該論文提出為任意給定 prompt 維持多個完成結(jié)果,然后對這些結(jié)果進行評分,保留得分較好的結(jié)果。
要做到這一點,不只要用一個 prompt,而是需要用 Python Glue 代碼將多個 prompt 組合到一起。這實質(zhì)上是維持多個 prompt,還需要執(zhí)行某個樹搜索算法來找到可擴展的 prompt。可以說這是 Python Glue 代碼與各個 prompt 組成的共生體。
Karpathy 在這里類比了 AlphaGo。AlphaGo 的每一步都是下接下來的一步棋,其策略的訓(xùn)練方式最初是模仿人類。但除了這個策略之外,它還會執(zhí)行蒙特卡洛樹搜索。由此造成的結(jié)果是,AlphaGo 會在頭腦里嘗試大量不同的可能性然后對它們進行評估,最后僅保留其中效果好的。思維樹就有點像是 AlphaGo 下圍棋時的思維過程,只不過處理的是文本。
不只是思維樹,現(xiàn)在也有更多人在實驗讓 LLM 完成比簡單問答更加復(fù)雜的任務(wù),但很多都像是 Python Glue 代碼,將許多 prompt 連接起來。
上圖給出了兩個例子。其中右圖的論文提出了 ReAct,研究者是將 prompt 的答案構(gòu)造成一個思維、動作、觀察構(gòu)成的序列,其中在動作部分,模型還能使用工具。這就像是某種回答查詢的思維過程。
左圖則是 AutoGPT。這個項目最近有些炒作,但也確實是很有趣的研究。AutoGPT 能夠保存一個任務(wù)清單并遞歸式地分解這些任務(wù)。目前來說這種做法的效果并不很好,Karpathy 也不建議人們將其用于實際應(yīng)用,但他表示從研究角度看,這種方法還是很有啟發(fā)性。
以上就是創(chuàng)造二類系統(tǒng)思維方式的一些研究成果。
Karpathy 接下來談到了 LLM 的另一個有趣現(xiàn)象,他說:「LLM 就好像有種心理怪癖。它們不想成功,只想模仿。」你想要它給出正確答案,你就要明確要求它。這是因為 Transformer 的訓(xùn)練數(shù)據(jù)集中數(shù)據(jù)并不總是正確的,也存在低質(zhì)量的數(shù)據(jù)。
舉個例子,假如有某個物理問題,數(shù)據(jù)集中可能有某個學(xué)生給出的錯誤答案,同時也會有某個專家給出的正確答案。而 Transformer 不知道該模仿哪個或者說它都想模仿,畢竟它們的訓(xùn)練目標是語言建模,不是分辨對錯。因此在使用和測試時,如果你想要正確答案,你就要明確提出要求。
比如在上圖的論文中,研究者嘗試了多種不同的 prompt,發(fā)現(xiàn)對于同一問題,不同 prompt 得到的輸出結(jié)果準確度竟然不一樣!可以看到,如果在 prompt 中明確要求模型一步步推理并給出正確結(jié)果,其準確度會高一些,因為這樣 Transformer 就不必再為低質(zhì)量解答分配概率了。
因此,如果你想要正確答案,就大聲說出來!像是在 prompt 中添加「你是某領(lǐng)域的專家」或「假設(shè)你的 IQ 為 120」。但是也不要太過了,比如要求模型假設(shè)自己的 IQ 為 400,這樣的話你的問題可能會超出數(shù)據(jù)的分布或者雖在分布中但結(jié)果卻很科幻 —— 這樣模型可能就會開始扮演什么科幻角色了。
讓 LLM 使用工具 / 插件
針對具體問題,使用合適的工具往往能事半功倍。對 LLM 來說也是如此。根據(jù)具體任務(wù)的不同,我們可能希望 LLM 能使用計算器、代碼解釋器、搜索引擎等工具。
但首先我們需要記住一點:Transformer 默認情況下可能并不知道它們無法做到某些事情。用戶甚至可能需要在 prompt 中明確告知 Transformer:「你不擅長心算,如果要做大數(shù)運算,請使用這個計算器,這是使用這個計算器的方法。」你必須明確要求它使用某個工具,因為模型自身不知道自己擅長或不擅長什么。
檢索是能極大提升 LLM 性能的重要工具。因為 LLM 是專精于記憶的(memory only),因此專精于檢索的搜索引擎能為 LLM 提供極大補充。實踐也證明,能使用檢索工具的 LLM 的實用性會大大提升。
之前已經(jīng)提到,Transformer 的上下文窗口就是其工作記憶范圍。如果能在其工作記憶中載入與當(dāng)前任務(wù)相關(guān)的信息,那么模型的表現(xiàn)就會更好,因為模型能夠立即讀取所有記憶。實際上用檢索增強生成也是很多人感興趣的課題。上圖下方展示了 LlamaIndex,其中有一個連接大量不同類型數(shù)據(jù)的數(shù)據(jù)連接器。這個工具可以索引各種數(shù)據(jù)并將它們提供給 LLM 使用。
現(xiàn)在時興的做法是:選取相關(guān)文檔,然后將其分成文本塊,再執(zhí)行嵌入操作,得到表示那些數(shù)據(jù)的嵌入向量。這些嵌入向量會被保存起來。當(dāng)使用模型時,我們可以向存儲的向量發(fā)出查詢,從中取用與當(dāng)前任務(wù)相關(guān)的文本塊。然后將這些文本塊加入到 prompt,再讓 LLM 生成。這種做法在實踐中的效果很好。
這其實與人類完成任務(wù)的方法類似。人也可以僅靠自己的記憶做事,但如果能檢索到與任務(wù)相關(guān)的資料,做起事來也自然會更容易。Transformer 雖然記憶廣博,但也能從檢索中受益。
在 prompt 中添加約束條件
在 prompt 中設(shè)定約束條件能迫使 LLM 按特定模板輸出結(jié)果。下圖給出了微軟幫助用戶更好使用 LLM 的 Guidance 工具,具體可訪問 https://github.com/microsoft/guidance 。在這里給出的例子中,LLM 輸出的結(jié)果會是 JSON 格式。這是可以得到保證的,因為 prompt 會調(diào)整 Transformer 輸出不同 token 的概率,而這些 token 的輸出位置受限了,即只能填補文本中的空缺位置。這樣就實現(xiàn)了對文本留空處的嚴格限制。帶約束條件的采樣對某些任務(wù)來說非常有用。
微調(diào)
通過設(shè)計 prompt 能讓 LLM 模型完成更多不同任務(wù),但我們其實也能通過微調(diào)來做到這一點。
對模型進行微調(diào)是指改變模型的權(quán)重分布。這種事情做起來不難,因為現(xiàn)在已經(jīng)有 LLaMA 等開源的大模型以及一些用于微調(diào)的軟件庫。
比如 LoRA 等參數(shù)高效型微調(diào)技術(shù)讓用戶可以僅訓(xùn)練模型中少量稀疏的部分。使用該技術(shù)時,基礎(chǔ)模型的大部分都保持不變,而某些部分可以變化。在實踐中,這種技術(shù)用起來很不錯,能讓人以很低的成本對模型做少量調(diào)整。同時,因為模型大部分都是固定不變的,所以可以使用非常低精度的推理來計算那些部分,因為梯度下降不會更新它們。由此,整體的微調(diào)效率就能非常高。
不過需要記住,微調(diào)需要專業(yè)技術(shù),而且多半還需要相應(yīng)的專業(yè)領(lǐng)域知識,畢竟不管是雇傭人類專家來編寫數(shù)據(jù)集還是通過自動方法合成數(shù)據(jù)都非常復(fù)雜,而這也會拉長迭代周期。
另外,Karpathy 還指出,對用戶來說,監(jiān)督式微調(diào)(SFT)還是可以做到的,因為這其實就是繼續(xù)執(zhí)行語言建模任務(wù);但 RLHF 是還需進一步研究的課題,實現(xiàn)難度就大多了,因此不建議初學(xué)者來做。
Karpathy 的 GPT 使用建議
為了幫助人們更好使用 GPT,Karpathy 給出了一些建議。在使用 GPT 來完成任務(wù)時,可以將任務(wù)分成兩個部分:一,取得最佳結(jié)果;二,依照指定順序優(yōu)化結(jié)果。
對于第一部分,首先是選模型,目前最強的模型是 GPT-4。有了模型后,當(dāng)執(zhí)行具體任務(wù)時,你需要把 prompt 設(shè)計得足夠詳細,其中要包含任務(wù)的背景、相關(guān)信息和說明。你要想一想人類會怎么完成這一任務(wù),但你同時也要明白人類有內(nèi)心獨白、能夠自省,LLM 卻不行。了解 LLM 的工作方式對設(shè)計 prompt 大有裨益。你可以檢索一些相關(guān)背景和信息并將其添加到 prompt 中。網(wǎng)上已有不少人分享過相關(guān)經(jīng)驗和技術(shù)。
你不用急于讓 LLM 一步到位完成你的任務(wù)。可以多做幾次實驗,測試一下各種可能性。你可以向 LLM 提供一些例子,讓它真正理解你的意圖。
對于原生 LLM 難以解決的問題,可以將其交給工具和插件處理。你要想想如何將工具整合進來,這當(dāng)然無法通過單個 prompt 問答就可以解決。你需要多做幾次實驗,實踐出真知。
最后,如果你成功搞出了適合自己的 prompt 設(shè)計方案,你可以再繼續(xù)堅持一下,看看可以如何對模型進行微調(diào)以更好地服務(wù)你的應(yīng)用;但要明白微調(diào)模型的速度會更慢,也需要投入更多。對于想要使用 RLHF 的研究型專家來說,雖然如果真能用起來,RLHF 目前是會比 SFT 好一些,但成本也會更高。為了節(jié)省成本,探索性研究可以使用性能更低的模型或更短的 prompt。
Karpathy 強調(diào)用 LLM 解決用例時可能會出現(xiàn)一些問題,比如結(jié)果可能有偏見、編造出幻覺信息、推理錯誤、無法理解應(yīng)用類型(比如拼寫相關(guān)任務(wù))、知識隔斷(GPT-4 的訓(xùn)練數(shù)據(jù)截止于 2021 年 9 月)、可能會被攻擊(比如 prompt 注入攻擊、越獄攻擊、數(shù)據(jù)毒化攻擊)……
Karpathy 建議用戶目前僅在低風(fēng)險程度的應(yīng)用中使用 LLM 并且要搭配人工監(jiān)督一起使用。LLM 可以作為靈感和建議來源,讓它們輔助我們而不是完全自主地替代我們工作。
結(jié)語
Karpathy 在總結(jié)時說:「GPT-4 是了不起的造物。我很感激它存在于世而且它很美麗。」它具有非凡的能力,能幫助用戶解答疑問、編寫代碼等等。圍繞它的生態(tài)系統(tǒng)也正在蓬勃發(fā)展。
最后,Karpathy 向 GPT-4 提了一個問題:「如果要激勵 Microsoft Build 2023 的觀眾,你會說點什么?」
GPT-4 給出了如下回答:
筆者也在這里取巧,請 ChatGPT 將這段話翻譯成了漢語:
審核編輯 :李倩
-
AI
+關(guān)注
關(guān)注
87文章
28902瀏覽量
266275 -
GPT
+關(guān)注
關(guān)注
0文章
347瀏覽量
15182 -
OpenAI
+關(guān)注
關(guān)注
9文章
990瀏覽量
6258
原文標題:OpenAI聯(lián)合創(chuàng)始人親自上場科普GPT,讓技術(shù)小白也能理解最強AI
文章出處:【微信號:AI智勝未來,微信公眾號:AI智勝未來】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論