深度解密大語言模型: 數據, 評估和系統 | 斯坦福最新“構建LLM大語言模型”講座三萬字全文(附視頻)
未經許可不得轉載,務必保留原文出處鏈接和公衆號按鈕
(關注本城公衆號並設爲星標,
第一時間獲取最新世界頂級科技認知)
文:Web3天空之城 · 城主
當下,我們所依賴的大型語言模型(LLM)已成爲人工智能領域的核心。無論是OpenAI的ChatGPT,還是其他類似的AI助手,它們的背後都依賴於複雜而精密的模型訓練與優化過程。
儘管對於非LLM專業人士來說,我們都明白了這些大模型在日常應用中的出色表現,但其背後巨量的技術細節卻是難以一窺全貌,頂多淺嘗而止。近日,斯坦福大學一場技術講座以深入淺出的方式,爲我們揭示了LLM最新的核心機制和關鍵挑戰。從模型架構到數據處理,從預訓練到後訓練,這場講座不僅全面覆蓋了構建LLM的所有關鍵步驟,還特別強調了容易被忽視的重要細節。
城主認爲,在不涉及具體編程和數學學習的前提下,這基本是讀者能獲得的關於LLM最詳盡和有價值的技術內容了。通讀本文可以幫助您更好地理解LLM的技術原理和未來發展方向。
B站傳送:【中英精校】構建LLM大語言模型 | 斯坦福cs229機器學習最新入門講座-嗶哩嗶哩】 https://b23.tv/gOGbcTz
以下是本講座的重點內容,有興趣的讀者可以收藏並找時間通讀三萬字乾貨全文。
LLM 的架構與關鍵組件
架構選擇:儘管Transformer是當前LLM的主流架構,但實際上,訓練算法、數據、評估和系統纔是構建高效LLM的核心關注點。
自迴歸語言模型:LLM主要通過自迴歸方式生成文本,通過預測下一個單詞的概率來逐步生成整個句子。
標記化:標記化過程是LLM的重要環節之一,標記器將文本轉換爲模型可以處理的標記(tokens),而標記器的選擇和優化直接影響模型的性能。
預訓練與後訓練
預訓練:預訓練的目標是讓模型學習語言的基本結構和語法,通過在大量文本數據上訓練,模型掌握了基礎的語言知識。
後訓練:後訓練則是爲了讓模型更符合用戶的期望,通過微調模型,使其能夠更好地遵循指令,並減少幻覺現象的出現。
數據處理與評估
數據收集與處理:數據的收集和處理在LLM的構建中至關重要。從網絡爬蟲抓取的海量數據中提取有價值的內容,並進行去重、過濾和分類,是確保模型性能的關鍵。
評估指標:講座特別提到,困惑度(Perplexity)和驗證損失在LLM的預訓練中是常用的評估標準,而在後訓練中,則更多依賴於人類反饋和對齊指標。
強化學習與人類反饋(RLHF)
監督微調(SFT):通過少量高質量的人類標註數據進行微調,使得模型能夠生成更符合人類期望的答案。
強化學習與人類反饋:通過讓模型根據人類的反饋進行強化學習(RLHF),使得模型不僅能生成合理的答案,還能最大化人類的滿意度。
系統優化與未來展望
系統瓶頸與優化:GPU的計算速度雖快,但內存和通信速度的瓶頸限制了模型的效率。低精度計算和運算符融合等技術可以顯著提升計算效率。
未來挑戰與機會:未來的LLM發展面臨數據合法性、推理優化、多模態處理等諸多挑戰,但也爲技術進步提供了廣闊的空間。
==Web3天空之城書面全文版=
今天我將討論如何構建大型語言模型(LLM)。
我想你們很多人以前都聽說過 LLM。作爲快速回顧,LLM(大型語言模型)基本上就是您最近聽到的所有聊天機器人,比如 OpenAI 的 ChatGPT、Anthropic 的 Claude、Gemini 和 Llama 以及其他類似的模型。今天我們將討論它們實際上是如何工作的。
這將是一個概述,因爲只有一堂課,很難壓縮所有內容。但我希望能稍微介紹一下訓練這些 LLM 所需的所有組件。此外,如果您有任何問題,請隨時打斷並提問。
在訓練 LLM 時,有幾個關鍵要素非常重要。首先是架構。大家可能都知道,LLM 是神經網絡。當你考慮神經網絡時,你必須考慮你正在使用什麼架構。另一個非常重要的組件是訓練損失和訓練算法,也就是你如何實際訓練這些模型。然後是數據,你用什麼來訓練這些模型?還有評估,也就是你如何知道你是否真的在朝着 LLM 的目標前進?最後是系統組件,你如何讓這些模型在現代硬件上運行?這真的很重要,因爲這些模型非常大,所以系統實際上是 LLM 的一個非常重要的主題,比以往任何時候都重要。
你們可能都知道,LLM 都是基於 transformer 或至少是某個版本的 transformer。我今天實際上不打算談論架構。第一,因爲我幾周前做了一個關於 transformer 的講座。其次,你可以在網上找到大量有關 transformer 的信息。但我認爲關於其他四個主題的信息要少得多,所以我真的很想談談它們。
另外要說的是,大多數學術界實際上關注的是架構、訓練算法和損失。作爲學者,我在職業生涯的大部分時間裡都是這樣做的,我們只是喜歡認爲這就像我們製造新的架構、新的模型,這似乎非常重要。但實際上,老實說,在實踐中最重要的主要是其他三個主題。因此,數據、評估和系統是大多數行業實際上關注的重點。所以這也是我不想過多談論架構的原因之一,因爲其餘的真的非常重要。
太好了。在講座的概述中,我將談論預訓練。
預訓練是一個你可能聽說過的詞彙。這是一種經典的語言建模範式,基本上是訓練一個語言模型來模擬整個互聯網。與之相對的是後訓練,這是一個較新的範式,它利用這些大型語言模型,使它們本質上成爲 AI 助手。這是自 ChatGPT 以來的最新趨勢。
如果你聽說過 GPT-3 或 GPT-2,那它們屬於預訓練領域。而 ChatGPT 則屬於後訓練領域。我會談論這兩者,但我將從預訓練開始。具體來說,我將討論預訓練大型語言模型(LLM)的任務是什麼,以及人們實際使用的定律是什麼。
首先,快速回顧一下語言建模。高層次的語言模型只是對標記或單詞序列的概率分佈模型。基本上,它是從 x1 到 xl 的概率模型,其中 x1 是第一個單詞,xl 是序列或句子中的最後一個單詞。舉個例子,如果你有一句話,比如“老鼠吃了奶酪”,語言模型給出的只是這句話被人說出或在網上找到的概率。
如果你有另一個句子,比如“老鼠吃奶酪”,這裡就有語法錯誤,模型應該知道這句話在網上出現的可能性較小。如果你有另一個句子,比如“奶酪吃老鼠”,模型應該知道奶酪通常不吃老鼠,所以有一些語義知識,這比第一句話的可能性要小。這基本上是語言模型的高級版本。
你可能在新聞中經常聽到的一個詞是生成模型。生成模型可以生成句子或一些數據。我們之所以說語言模型是生成模型,是因爲一旦你有了一個分佈模型,你就可以簡單地從這個模型中抽樣,然後生成數據。所以你可以使用語言模型生成句子。
目前人們使用的模型類型是自迴歸語言模型。自迴歸語言模型的關鍵思想是,你把這個單詞分佈分解成第一個單詞的分佈,乘以給定第一個單詞的第二個單詞分佈的可能性,再乘以前兩個單詞對應的第三個單詞的概率。這沒有近似值,只是概率鏈式法則,希望你們都知道。這只是對分佈進行建模的一種方法。
更簡潔一點,你可以把它寫成下一個單詞的概率乘積,考慮到過去發生的一切,也就是上下文。自迴歸語言模型是我們討論的主題。需要強調的是,這並不是對分佈進行建模的唯一方法,只是一種方法而已。它有一些優點,也有一些缺點。
自迴歸語言模型的一個缺點是,當你從中實際採樣時,基本上需要一個for循環來生成下一個單詞,然後以生成的單詞爲條件繼續生成下一個單詞。因此,如果你想生成一個更長的句子,就需要更多時間來完成。這是當前範式的一些缺點,但這是我們目前所擁有的。
接下來,我將詳細談談自迴歸語言模型。從高層次上講,自迴歸語言模型的任務就是預測下一個單詞。例如,如果你有一個句子“她可能喜歡”,一個潛在的下一個單詞可能是“狗”。我們首先進行標記,將這些單詞或子單詞進行標記,併爲每個標記賦予一個ID,如1、2、3。然後將其傳遞到模型中,獲得下一個單詞或標記的概率分佈。從該分佈中採樣,獲得一個新的標記,然後進行去標記化,得到一個新的ID,這就是從語言模型中採樣的基本方式。
需要注意的是,最後兩個步驟實際上僅在推理過程中才需要。在訓練時,只需要預測最可能的標記,然後與實際標記進行比較,這在實踐中確實發生過。然後可以改變模型的權重以增加生成該標記的概率。
具體來說,自迴歸神經語言模型的第一步是擁有所有這些標記。在預測下一個標記的概率時,最終輸出向量的維度必須與標記數相同。處理添加更多標記的問題時,雖然有方法可以做到,但基本上人們不會這樣做。因此,如何標記文本非常重要,這也是我們稍後會討論的原因。值得注意的是,詞彙量,即你擁有的標記數,本質上是語言模型的輸出,所以它實際上非常大。自迴歸神經語言模型的工作原理如下:
首先,提取每個單詞或標記,並將它們嵌入到向量表示中。然後,將這些向量傳遞給一個神經網絡,這個網絡通常是一個Transformer模型。通過這種方式,可以獲得上下文中所有單詞的表示,基本上是整個句子的表示。
接下來,將這些表示傳遞到線性層,將其映射到數字,輸出的數量等於標記的數量。然後,將其傳遞到softmax層,得到下一個單詞的概率分佈,給定上下文中的每個單詞。這個過程本質上是對下一個標記進行分類的任務,是一種非常簡單的機器學習任務。
在這種情況下,使用交叉熵定律,可以查看實際發生的目標,即目標分佈,通常是獨熱編碼。例如,如果實際發生的單詞是“cat”,那麼這是“cat”的獨熱分佈。生成的實際分佈與目標分佈進行交叉熵計算,增加生成“cat”的概率並降低生成其他標記的概率。
需要注意的是,這相當於最大化文本對數似然,因爲可以將自迴歸語言建模任務的概率最大值重寫爲最小值,通過添加對數並減去,得到的就是交叉熵損失。因此,最小化損失與最大化文本的可能性是一回事。
接下來討論標記器。標記器是一個非常重要但常被忽視的部分。瞭解標記器的作用非常重要,因爲它比單詞更通用。簡單來說,如果我們只提取每個單詞作爲標記,那麼如果單詞中有拼寫錯誤,就無法將這個有拼寫錯誤的單詞傳遞到大型語言模型中。
此外,對於基於拉丁語的語言,單詞作爲標記是可行的,但對於像泰語這樣的語言,由於單詞之間沒有空格,無法簡單地通過空格進行標記。因此,標記比單詞更通用。
另一種方法是逐個字符地標記每個句子。您可能會說A是一個標記,B是另一個標記。這實際上會起作用,而且可能非常好。問題是您的序列會變得非常長。您可能還記得Transformers的講座,複雜度會隨着序列長度的增加而呈二次方增長。所以您真的不想有一個超長的序列。
Tokenizer基本上試圖解決這兩個問題,併爲常見的子序列賦予特定的token。通常您應該考慮的是,每個token的平均長度大約是3-4個字母。有很多tokenization算法。我只討論其中一種,以便給您一個高層次的理解,也就是我們所說的字節對編碼,這實際上非常常見,是兩種最常見的tokenizer之一。
訓練tokenizer的方式是,首先從一個非常大的文本語料庫開始。這裡我實際上還沒有談論訓練一個大型語言模型,這純粹是爲了tokenization步驟。所以這是我的包含這五個單詞的大型文本語料庫。然後,您將此文本語料庫中的每個字符與不同的標記關聯起來。在這裡我只是用不同的標記拆分每個字符,並用顏色編碼了所有這些標記。
接下來,您要做的就是瀏覽您的文本,每當您看到非常常見的標記對,最常見的標記對,您就把它們合併起來。在這裡您看到三次相鄰的標記T和O,所以您只會說這是一個新的標記。然後您繼續,重複這一點。現在您有了TOK,TOK,發生了三次;帶有E的TOK,發生了兩次;還有TOKEN,發生了兩次;然後是EX,也發生了兩次。
如果您要在這個非常小的文本語料庫上訓練一個標記器,這就是您用一個像訓練過的標記器一樣的標記完成的方式。實際上,您在更大的文本語料庫上做這件事。這是真正的標記器,我認爲這是GPT-3或ChatGPT。在這裡您可以看到它實際上是如何將這些單詞分開的。基本上,您看到的內容與我們在前面的例子中給出的內容相同。標記成爲其自己的標記。因此,標記器實際上分爲兩個標記,TOKEN和EIZER。
這就是關於標記器的全部內容。對此有什麼問題嗎?是的,所以實際上在標記器之前有一個步驟,也就是我們所說的預標記器,這正是您剛纔所說的。理論上,沒有理由分別處理空格和標點符號。每個空格和標點符號都可以有自己的標記,並且可以進行合併。然而,這涉及到效率問題。訓練這些標記器需要很長時間,因此最好考慮每一對標記。
如果有空格,預標記器會非常特定於英語。我們不會在空格之間合併標記,這就像計算優化一樣。理論上,你可以像處理其他字符一樣處理空格,保留較小的標記。實際上,這並不重要,因爲在大型文本語料庫中,你會擁有所有內容,但通常會保留小的標記。
這樣做的原因是,如果出現語法錯誤或拼寫錯誤,你仍然希望能夠用字符表示這些單詞。例如,T-O-K-E-N是否只出現一次,還是需要多次出現以便具有不同的含義?每個標記都有自己獨特的ID。
例如,"銀行"這個詞可能指貨幣銀行,也可能指水邊的銀行。它們會具有相同的標記,但模型會根據周圍的單詞進行學習,將其關聯起來。這是Transformer在做的事情,而不是標記器。
在標記化過程中,首先保留較小的標記。例如,從T開始,保留T,然後將標記器構建爲標準數量的標記。假設沒有對標記進行訓練,但在數據中試圖對標記進行編碼,標記器如何知道用標記對其進行編碼還是用T對其進行編碼?
基本上,當進行標記時,也就是在標記器訓練之後,實際應用標記器時,總是選擇可以應用的最大標記。如果可以做標記,就不會做T,總是會做標記。雖然人們通常不會過多談論標記器,但有很多計算優勢或計算技巧可以讓這些事情變得更快。
老實說,我認爲很多人認爲我們應該擺脫標記器,而只是逐個字符或逐字節地進行標記。正如我所說,目前存在長度問題。然而,也許在五年或十年後,我們將擁有不同的架構,這些架構不會隨着序列的長度而呈二次方擴展。屆時,我們可能會擺脫標記器。
那麼,能否分享一下標記器的缺點?爲什麼人們想要擺脫標記器?
一個很好的例子是數學。如果你考慮數學,現在的數字並沒有被標記。例如,327 可能有它自己的標記,這意味着當模型看到數字時,它們的理解方式與我們不同。這非常煩人,因爲我們之所以能夠用數學來概括,是因爲我們可以單獨處理每個數字,然後進行組合。基本上,如果你添加東西,它就和把每個數字單獨加起來再加上你添加的單位是一樣的。而模型做不到這一點,所以你必須進行特殊的標記化。
GPT-4 所做的一個重大改變就是改變了標記代碼的方式。例如,在 Python 代碼中,你經常會有四個開頭的空格,這些空格以前處理得有點奇怪,導致模型無法真正理解如何處理代碼。因此,標記器實際上很重要。
接下來,我們可以稍後再討論標記器。現在,讓我們談談評估。
評估 LLM(大型語言模型)通常採用的方法是困惑度。從高層次來看,它基本上就是驗證損失。困惑度的細微差別在於,我們使用更易於解釋的東西,即每個標記的平均損失,然後對其進行指數運算。之所以對其進行指數運算,是因爲損失中有一個對數。首先,人類在對數空間中思考的能力實際上很差;其次,對數取決於對數的底數。而當你進行指數運算時,你基本上擁有詞彙量單位中的所有內容。每個標記的平均值只是爲了使困惑度與序列的長度無關。
因此,困惑度只是序列損失的冪平均值的 2。困惑度介於 1 和標記器詞彙表的長度之間。簡單來說,如果你完美地預測了每個單詞的內容,那麼每個單詞基本上都是 1 的乘積。因此,你能擁有的最佳困惑度是 1。如果你真的不知道,你基本上可以用一除以詞彙量來預測。然後你做簡單的數學運算,基本上會得到詞彙量大小的困惑度。
困惑度的直覺是它基本上是你的模型在猶豫的標記數量。如果你的模型是完美的,它不會猶豫,它確切地知道這個詞。如果它真的不知道,那麼它會在所有詞彙之間猶豫。困惑度確實提高了。這是2017年至2023年間標準數據集的困惑度變化。在這5、6年裡,困惑度從70個標記減少到不到10個標記。這意味着模型以前每次生成一個單詞時需要在70個單詞之間選擇,而現在只需在不到10個單詞之間選擇,這顯然是一個很大的進步。
困惑度實際上已不再用於學術基準測試,主要是因爲它取決於所使用的標記器和評估的數據。然而,對於大型語言模型(LLM)的開發,困惑度仍然非常重要。因此,當你真正訓練自己的LLM時,人們仍然會關注這種困惑度。
評估LLM的另一種常見方式(現在在學術界更常見)是採用所有經典的自然語言處理(NLP)基準。我稍後會給你幾個例子,然後將所有內容彙總起來。收集儘可能多的可自動評估的基準,然後對它們進行評估。
我們稱之爲HELM的一個或兩個這樣的基準來自斯坦福大學。另一個是Hugging Face Open LLM排行榜,這可能是目前最常見的兩個。在HELM中有各種類型的任務,大多是可以輕鬆評估的內容,例如問答。問答的好處是你通常知道真正的答案是什麼,因此可以評估這些模型生成真實答案的可能性,而其他答案則不然。這基本上是評估這些模型的高級方法。
舉個具體的例子,MMLU可能是LLM最常見的學術基準。這是一個包含許多領域問題和答案的集合,例如大學醫學、大學物理、天文學等。問題可能包括:“在天文學中,1a型超新星的真實性是什麼?”然後給出四個不同的潛在答案,詢問模型哪一個更有可能。因此,有很多不同的方法可以做到這一點。你可以查看生成所有這些答案的可能性,也可以詢問模型哪一個最有可能。通過不同的方式提示模型,但在高層次上,你知道哪一個是正確的,其他三個是錯誤的。
創建不受約束的文本作爲輸出時,如果模型給出的內容在語義上完全相同,但不是你期望的確切拓撲,那麼如何評估模型?這是一個很好的問題,我稍後會詳細討論這個問題。在這種情況下,我們不做不受約束的事情。
因此,您評估 MMLU 的方式基本上是問第一個問題,然後查看模型生成 A 的可能性,模型生成 B、C 和 D 的可能性,然後查看哪一個最有可能,或者您可以問模型,在 A、B、C、D 中,哪一個最有可能,然後查看最有可能的下一個標記是 A、B、C 還是 D。因此,您限制模型說它只能回答這四個問題。
當您說您限制模型時,您是指您用提示來限制它,還是指整個概率分佈和輸出,您只比較輸出,就像您只比較 A 標記一樣?
在我給出的第二種情況下,您會做完全相同的事情——實際上您會同時做這兩項。您會提示模型說 A、B、C 或 D,另外您會限制只查看這四個標記。在第一種情況下,您甚至不需要生成任何東西。實際上,您只是查看,鑑於它是一個語言模型,它可以給出句子的分佈。您只需查看生成所有這些單詞的可能性是多少,生成第二個選擇的可能性是多少?您只需查看最可能的句子是否真的是真正的答案。因此,您實際上並沒有從中抽樣,您實際上只是使用 X1 到 XL 的 P。話雖如此,我們稍後會討論開放式問題的評估,這實際上非常重要且具有挑戰性。
之前您提到,通常不使用複雜度等指標,因爲這取決於您如何進行標記化,以及一些設計選擇。我想知道您是否可以就此多說幾句。
那麼想想困惑度。我告訴過你困惑度介於 1 和詞彙量之間。現在想象一下,ChatGPT 使用一個有 10,000 個標記的標記器,但谷歌的 Gemini 使用一個有 100,000 個潛在標記的標記器。那麼實際上 Gemini 的困惑度上限實際上比 ChatGPT 更差。這有道理嗎?所以這只是一個想法。實際上它比這稍微複雜一點,但這就像一個一階位,你可以看到標記器實際上很重要。
所以評估挑戰有很多。我只想簡單談兩個。首先,正如我所說的,有兩種方法可以評估這些 MMLU。實際上,方法遠不止兩種,但我只舉了兩個例子。
事實上,很長一段時間以來,儘管這是每個人都使用的非常經典的基準,但不同的公司和組織實際上使用不同的方法來評估MMLU。結果,你會得到完全不同的結果。例如,65B的Lammas,這是Lammas系列中的第一個元模型,在Helm上的準確率爲63.7,但在另一個基準上準確率爲48.8。
真正的評估方式,這甚至不是在談論提示,這實際上只是你評估模型的方式。提示是另一個問題。所以真的有很多不一致之處,這並不像看起來那麼簡單。
首先,我們如何確保所有這些模型都在基準上進行訓練?這是一個很好的問題。訓練、測試、污染,我想說,這是學術界真正重要的事情。鑑於討論的主要是訓練大型語言模型,對於公司來說,這可能並不那麼重要,因爲他們知道他們訓練的是什麼。對我們來說,我們不知道,所以對我們來說,這是一個真正的問題。
因此,有很多不同的方法可以嘗試測試測試集是否真的在訓練集中。Tatsu實驗室的人們發現了一種巧妙的技巧,鑑於大多數在線數據集都不是隨機的,你可以查看,在語言模型中,它們所做的只是預測下一個單詞。你可以查看整個測試集,如果你按順序生成所有示例,而不是按不同的順序生成所有示例,結果會怎樣。如果更有可能按順序生成某個東西,考慮到那裡沒有真正的順序,那麼這意味着它可能在訓練集中。這只是其中之一,還有許多其他方法可以做到這一點。
訓練測試污染,同樣,對於開發來說並不那麼重要,但對於學術基準測試來說非常重要。
數據是另一個非常大的話題。在高層次上,人們只是說,你基本上是在整個互聯網上訓練大型語言模型。這是什麼意思?因此,人們有時會說所有乾淨的互聯網,這甚至定義得更少。互聯網非常骯髒,實際上並不代表我們在實踐中想要的東西。如果我現在下載一個隨機網站,你會對裡面的內容感到震驚。這絕對不是你的維基百科。所以我會簡要介紹一下人們的做法。我可以回答一些問題,但數據本身就是一個巨大的話題。
首先,你需要下載整個互聯網。這意味着你要使用網絡爬蟲爬取互聯網上的每個網頁或 Google 上的每個網頁。目前大約有 2500 億個網頁,這些數據大約有 1PB。因此,使用網絡爬蟲是一個常見的做法。人們通常不會編寫自己的網絡爬蟲,而是使用標準的網絡爬蟲。常見的網絡爬蟲每個月都會添加 Google 在互聯網上發現的所有新網站,並將其放入一個大數據集中。現在,常見的爬蟲中大約有 2500 億個頁面。
這些數據大約是 6GB。一旦你有了這些數據,你會發現它們是隨機的網頁,就像從常見的爬蟲中隨機獲得的一樣。你看到的實際上是一個 HTML 頁面,雖然很難看清,但如果仔細查看,你會看到一些內容。例如,這裡有一句話:“測試世界是系統 X 高性能服務器的最終來源。”但句子還沒有完成。這就是隨機互聯網的樣子。
如果你只是訓練一個大型語言模型來生成這樣的內容,它就沒那麼有用了。那麼需要哪些步驟呢?首先,從 HTML 中提取文本。這是我剛剛試圖通過查看正確的文本來做的事情。這其中有很多挑戰,例如,提取數學內容實際上非常複雜,但對於訓練大型語言模型來說非常重要。還有樣板內容,很多論壇都會有相同類型的頁眉、頁腳,你不想在數據中重複所有這些。
接下來,你需要過濾掉不受歡迎的內容,比如不安全的工作、有害內容、個人身份信息(PII)。通常每家公司都有一個不想用來訓練模型的網站黑名單,這個黑名單很長。你基本上會說,如果數據來自這些網站,我們就不會用它來訓練。還有其他方法可以做到這一點,比如訓練一個小模型來對 PII 進行分類,然後刪除這些內容。這是一個艱鉅的任務。
然後是重複數據刪除。正如我所說,你可能在論壇中看到諸如頁眉和頁腳之類的內容,它們總是相同的。你需要刪除它們。你可能還會看到很多不同的 URL,但實際上顯示的是同一個網站。在處理數據時,你可能會遇到許多來自普通書籍的段落,這些段落在互聯網上已經被刪除了無數次。因此,你必須刪除重複數據。這項任務非常具有挑戰性,因爲需要大規模地刪除重複內容。
一旦刪除了重複數據,你需要進行一些啓發式過濾,嘗試刪除低質量的文檔。這種過濾是基於規則的。例如,如果你發現某些網站的標記分佈與通常的標記分佈非常不同,那麼它很可能是異常值。如果某個網站上的單詞長度非常長,說明這個網站上可能有奇怪的事情發生。如果某個網站只有三個單詞,可能不值得對其進行訓練;而如果它有大約一千萬個單詞,那麼這個頁面上可能也存在一些錯誤。因此,有很多這樣的規則需要遵循。
爲什麼我們不直接從數據集中過濾掉不良內容,而是將其作爲監督損失?我們能不能說這是仇恨言論網站,並積極嘗試懲罰它們的內容?
我們會這樣做,但不是在這一步。這就是後訓練的來源。預訓練的想法是模擬人類說話的方式,刪除所有如頁眉、頁腳和菜單等無關內容。你剛纔的想法非常好,這正是我們稍後要做的。
下一步是基於模型的過濾。一旦你過濾了大量的數據,你需要做的是一個非常巧妙的技巧。你會把整個維基百科都拿出來,然後查看通過維基百科頁面鏈接的所有鏈接。因爲如果維基百科引用了某些內容,那麼它很可能是高質量的網站。你會訓練一個分類器來預測某個文檔是否來自維基百科的這些參考資料之一,或者它是否來自隨機網絡。你會試着獲取更多來自維基百科參考資料的內容。
接下來,你將嘗試將數據分類到不同的域中。你會說,這是娛樂,這是書籍,這是代碼,這是其他類型的域。然後你會嘗試增加或減少某些域的權重。例如,你可能會發現,如果你在代碼上訓練得更多,那麼你的模型在推理方面實際上會變得更好。因此,人們通常會用非常不着邊際的方式說,如果你在代碼上訓練你的模型,實際上它有助於推理。爲了增加編碼分佈的權重,這有助於提升一般的語言建模技能。書籍通常也是人們增加權重的另一個方面,而娛樂內容則通常會降低權重。
當然,你希望這樣做,所以人們過去可能會有一些啓發式的方法來實現這一點。現在我們將討論如何更自動地完成這些流程。
在訓練結束時,通常在我們看到的所有數據上進行訓練後,尤其是在訓練大型語言模型結束時,會在非常高質量的數據上進行訓練,並降低學習率。這基本上意味着你的模型在非常高質量的數據上過度擬合。通常你會在維基百科這樣的數據上過度擬合,也會在收集到的人類數據上過度擬合。
其他事情,比如持續的預訓練以獲得更長的上下文,我將跳過這些細節。但只是爲了讓你瞭解,當人們說要在互聯網上訓練時,這有多難。這是很多工作,我們還沒有完全弄清楚。
因此,收集全球數據是實用大型語言模型的重要組成部分,有些人甚至認爲這是關鍵。
關於數據的基本問題是,當你從 TB 級數據開始,經過所有步驟後,通常剩下的數據量是多少?完成所有數據處理步驟通常需要多大的團隊?速度有多慢?比如說,你需要多少人才能做到這一點?
對於從事這項工作的人數,這是一個好問題。我實際上不太確定,但我會說,可能比從事模型預訓練調整的人數還要多。所以數據處理比建模方面需要更多人力。
在 Llama 的團隊中,大概有70人,其中大約15人在處理數據。你不需要那麼多人,但你還需要很多計算資源,因爲對於數據處理,你需要很多CPU。
正如我剛纔提到的,我們實際上還沒有解決預訓練的數據問題,因此還有很多研究要做。首先,如何高效地處理這些事情?其次,如何平衡所有這些不同的領域?你能生成合成數據嗎?這實際上是現在的一個大問題。因爲我們沒有足夠的數據,我們稍後會討論這個問題。你能使用多模態數據而不是文本數據嗎?這如何改善你的文本性能?
有很多秘密,因爲這確實是大多數預訓練大型語言模型的關鍵。因此,對於競爭動態,這些公司通常不會談論他們如何進行數據收集。此外,還有一個版權責任問題。他們肯定不想告訴你他們已經用書進行過訓練,即使他們確實這樣做了,因爲如果沒有,你可以起訴他們。
常見的學術基準可以回答你的問題。它開始時數據量較小,名稱並不重要,但它始於大約1500億個Token,大約有800GB的數據。現在大約有15萬億個Token,這也是模型的大小,目前最好的模型可能就是用這個數據量進行訓練的。所以15萬億個Token,我猜可能比這個大兩個數量級。所以是80E3千兆字節。如果我沒記錯的話,這大約是普通爬蟲的100到1000倍的過濾。
一個非常著名的學術基準是PAL。我們可以看看他們擁有的數據分佈。它包括Archive、PubMed Central,都是生物學的內容,還有維基百科、Stack Exchange、一些GitHub和一些書籍等。同樣,這個數據集比較小。如果我們看看這裡,這是280B。所以實際上,它要大100倍。因此,你不可能有那麼多的GitHub和Wikipedia數據。
就閉源模型而言,給你一個概念,Llama 2是在2萬億個Token上進行訓練的。Llama 3,15萬億個Token,這是我們目前所知的最好的模型,它經過了多少次訓練,與最好的學術或最大的學術基準相同,即15萬億個Token。GPT-4,我們真的不知道,但它可能在同一個數量級,或者實際上可能在那個左右。如果泄漏屬實,它可能在13左右。
接下來我們討論縮放損失。
我們的想法是,從2020年左右開始,或者至少在很長一段時間內,人們已經能夠從理論上證明,或者從2020年開始從經驗上證明,訓練模型的數據越多,模型越大,性能就越好。這與您在本課中看到的內容非常不同。在本課中,我們將教您有關過度擬合的知識。大型語言模型不會發生過度擬合。模型越大,性能越好。對於參加此類課程的社區來說,認識到這一點確實花了很長時間。但對於考試來說,過度擬合是存在的。
縮放損失的想法是,如果您知道更多數據和更大的模型始終會提供更好的性能,那麼我們能否預測增加數據量和模型大小後,性能會提高多少?令人驚訝的是,這個方法有效。
這裡有來自OpenAI的一篇非常著名的論文的三張圖。在x軸上顯示的是計算量,即你在訓練上花費了多少計算。這裡顯示的是測試損失,這本質上不是困惑度,而是驗證損失,即困惑度的對數。如果你把這兩者放在對數刻度上,你會發現性能就像縮放定律一樣,是線性的。這意味着,如果你將計算量增加一定量,你可以預測測試損失會減少多少。數據和參數也是一樣。如果增加數據集大小,損失會減少一個可以預測的量。如果增加參數數量,損失也會減少一個可以預測的量。這真的很神奇,非常令人驚訝。
當你看這些類型的圖時,它看起來無害,但實際上很瘋狂,因爲這意味着你可以預測我們在兩三年內的表現如何,這取決於我們將增加多少計算量。假設這些規律成立。
這沒有什麼理論依據。
他們在這裡使用的損失是什麼?這是困惑度嗎?困惑度就像損失的平方。當你增加參數的數量和總數據集的大小時,這難道不會自然而然地增加你的計算量嗎?所有這些都有效嗎?
是的。這是一個很好的問題。
這裡的計算實際上涉及兩個因素:數據和參數。我在這裡展示的是,你可以增加參數的數量,但同時也需要增加數據的數量。這樣,你實際上不會多次使用同一個數據集。沒有人會大規模地進行迭代,至少現在還沒有,因爲我們還沒有足夠的數據。
是的,這都是相同的趨勢,即增加計算量以減少損失。
我們看到了過去兩年的數據嗎?還是它仍然保持不變?
它仍然保持不變。我沒有具體的數字可以展示,但令人驚訝的是,這個趨勢仍然保持着。
有沒有經驗證據表明你可以達到穩定狀態?
目前沒有經驗證據表明它會很快穩定下來。我們不知道。可能會發生,但它不需要,因爲它實際上是對數尺度的。所以它並不是必須下降或穩定下來,就像數學上那樣,它可以繼續下降。大多數人認爲它可能會在某個時候穩定下來,但我們不知道具體時間。
現在,我將更多地討論縮放損失。爲什麼縮放損失真的很重要?想象一下,我給你 10,000 個 GPU,你會訓練什麼模型?你如何回答這個問題?這是一個假設,但這正是這些公司面臨的實際問題。
舊的流程是你在大模型上調整高參數。假設我有 30 天時間,我將訓練 30 個模型,每個模型一天,然後選出最好的一個作爲最終的生產模型。這意味着我實際使用的模型只訓練了一天。
新的流程是,你首先要找到一個擴展配方。例如,一個常見的情況是,如果你增加模型的大小,你應該降低學習率。你找到了一個縮放配方,這樣你就知道,如果增加模型的大小,應該如何調整高參數。然後,你在不同大小的較小模型上調整高參數。假設我在 30 天中的三天時間裡訓練許多不同的模型,並對這些不同大小的小模型進行高參數調整。然後,我將擬合縮放定律,並嘗試從這些較小的模型中推斷出,如果我訓練更長時間,哪一個會是最好的。對不起,如果我爲更大的模型訓練它,那麼我將用27天而不是一天來訓練最終的大型模型。因此,新的流程不是在你將在實踐中使用的模型的實際規模上訓練或進行高參數調整,而是在不同規模的較小模型上進行操作,嘗試預測它們在變大後的性能。
我現在給你一個非常具體的例子。假設你在選擇使用Transformer還是LSTM模型,並且你有10,000個GPU,但不確定應該使用哪一個。你可以訓練不同規模的Transformer模型,在x軸上表示不同參數,y軸上表示測試結果。然後,你再訓練不同規模的LSTM模型。一旦有了這些數據點,你會發現它們符合縮放定律。通過符合縮放定律,你可以預測如果有10倍以上的計算能力,LSTM的表現會如何。實際上,LSTM的線性程度略低,但你可以嘗試預測最終結果。從圖中可以清楚地看出,Transformer表現更好。
閱讀此類縮放定律時要注意兩件事:一個是縮放率,即縮放定律的斜率;另一個是截距。比如,一開始可能表現更差,但隨着時間的推移會變得更好。LSTM在這兩方面都表現較差。但我可以向你展示另一個例子,預測在一定規模之後,使用這種類型的模型比其他模型更好。這就是縮放定律非常有用的原因。
這些對架構中的細微差異有多敏感?一個Transformer架構與另一個Transformer架構。
你基本上必須擬合自己的曲線,並說縮放定律告訴我應該有一些對數函數。通常,例如,如果你是一名學者,現在至少這是相當新的,你想提出一個新的激活函數,這正是你要做的。你會擬合一個縮放定律,並用標準展示另一個縮放定律,比如Gelu,你會說它更好。
事實上,一旦你開始用縮放定律來思考,你會真正意識到,我們可以做出的所有架構差異,比如微小的差異,可能只是稍微改變截距,但實際上這並不重要,因爲只需再訓練10個小時或等待下一個GPU,這些事情都是次要的。這正是我最初告訴你人們在架構和損失上花費太多時間的原因。實際上,這些事情並不那麼重要。但是,如果你使用好的數據,你將擁有比使用壞數據更好的縮放定律。所以這真的很重要。
你可以用縮放定律做的另一件非常酷的事情是,問自己如何最佳地分配訓練資源。我應該訓練更大的模型嗎?因爲我們發現訓練更大的模型效果更好,但我們也發現使用更多數據效果更好。那麼我應該選擇哪一個呢?我應該只訓練更多數據、更小的模型,還是應該用更少的數據訓練更大的模型?
Chinchilla 是一篇非常著名的論文,它首次展示了這一點。他們這樣做的方式,我想讓你稍微瞭解一下這些圖是什麼。在這裡你再次看到了訓練損失。在 x 軸上,你可以看到參數的數量,也就是模型的大小。這裡所有這些曲線都是我們所說的 isoflops,也就是說,這條曲線上的所有模型都用相同的計算量進行訓練。
你這樣做的方式是改變訓練的 token 數量和模型的大小,但你以這樣一種方式變化,即總計算量是恆定的。因此,您所看到的所有這些具有不同顏色的曲線都代表了不同數量的經過訓練的計算。然後,你從每條曲線中選取最好的一個。一旦你從每條曲線中選取最好的一個,你就可以問,你可以繪製出有多少次 flops,你在哪條曲線上,以及你實際使用了多少參數來訓練該特定點。你再次將其放在對數-對數刻度上,現在你再次擬合縮放定律。
所以現在我有一些東西告訴我,如果我想訓練一個 10 的 23 次方次 flops 的模型,這就是我應該使用的參數的確切數量,100B。你可以對 flops 和 token 做同樣的事情。所以現在你可以預測,如果我告訴你我有一個月的計算時間,我應該訓練多大的模型?擬合你的縮放定律,我告訴你。
當然,這一切看起來都很漂亮。實際上,有很多小事情,你應該計算嵌入參數嗎?雖然有很多複雜性,但如果你做得好,這些事情實際上就會成立。所以 Chinchilla 團隊發現的最佳參數數量是每個訓練參數使用 20 個標記。因此,如果您添加一個參數,則應該在另外 20 個標記上訓練您的模型。
因此,這裡的一個警告是,這是最佳的訓練資源。所以這告訴我,如果你有 10 的 23 次方次 flops 的計算資源,假設我有 500 萬美元來訓練我的最佳模型,以獲得最低的損失。
在訓練模型時,推理成本是一個需要考慮的重要因素。如果你使用一個較小的模型,隨着時間的推移,花費會減少。因此,考慮推理成本時,有其他論文試圖證明這一點。每個參數大約對應150個token,因爲較小的模型在推理上花費更少。
目前,150比1大約是最好的模型的訓練成本,至少在實踐和生產中使用的模型是這樣的。
在實踐中,訓練這些模型的推理成本非常高。以ChatGPT爲例,目前大約有6億人使用它,這使得推理成本非常昂貴。不過,推理可以進行大量優化,但這是另一個完整的講座內容,這次我將跳過它。
正如我所說,縮放定律可以回答很多問題。你使用什麼數據?數據混合和加權如何?使用什麼架構?模型應該更寬還是更深?是爲更多GPU付費還是收集更多數據?這些問題都可以通過縮放定律來回答。
Richard Sutton在2019年的著名博客文章中提到,一旦你瞭解縮放定律,你就會知道擁有更多計算資源會得到更好的模型。根據摩爾定律或其變體,你將始終擁有更好的計算能力。因此,唯一重要的事情是擁有可以利用計算的架構。
因此,重要的基本上是系統和數據,而不是架構上的細微差異。這也是爲什麼大多數研究集中在一些對行業不太重要的事情上的原因之一。在我的職業生涯中,我大部分時間都是這樣的研究人員。不要把時間花在過度複雜化上。做簡單的事情,做好,封存起來。這實際上是OpenAI通過ChatGPT和之前的所有GPT教給我們的。
我想給你一些簡單的計算。我可能在這裡偏離了一些因素,但我只是想讓你瞭解訓練這些模型的成本有多高。我舉個例子,Lama3-400B,這是目前你能得到的最好的開源模型。它是在15.6個token上訓練的,有4050億個參數。現在你知道每個參數的最佳token數量大約是40個。這比Chinchilla多一點,但比這個推理最優模型要少,所以他們追求訓練最優性。
計算Flops的一個簡單方法是將參數數量乘以6,再乘以訓練數據的數量。如果你在這裡進行簡單的計算,結果是3.8E25 Flops。這一點之所以重要,是因爲如果你關注一些新聞,就會發現拜登有一項行政命令,基本上就是說,一旦你有1E26次Flops,那麼你的模型就會受到特別審查。所以他們把這個數字減少了2倍,降到了這個數字以下,這樣就不會受到特別審查。所以3.8E25 Flops,雖然我可能有點偏離,但肯定低於1E26。
參數p是參數數量,n是數據,token數量。這只是一個近似值。
我們知道他們在16,000臺H100上進行了訓練,也知道吞吐量。他們也這麼說過。如果你進行計算,大約需要70天或2600萬個GPU小時。至少這是我粗略的計算,他們實際上說他們使用了3000萬個而不是2600萬個GPU小時,所以也許他們遇到了一些挑戰,我真的不知道。但如果你按照簡單的計算,大約需要70天。
成本很難估算,但我只能說這有點像租金。比如,如果我要租用那麼多臺H100,租用那麼多天,會怎麼樣?我要付多少錢?租用H100的最低成本是每小時2美元左右。因此,如果將其乘以2600萬小時,則得到5200萬美元。他們支付的費用可能低於這個數字,但實際上不會少很多,因爲所有這些實際租用GPU的服務都賺不到那麼多錢。因此,可能稍微少一點,但不會少很多。
現在,談談工資。我說的是50名員工,每年50萬美元。是的,這可能是正確的估計,總計2500萬美元。因此,如果將這些費用全部加在一起,訓練這個Llama模型大約需要7500萬美元。我可能錯了1000萬,但這是一個正確的估計。
接下來是碳排放量。很多人可能會問,成本不是唯一重要的事情。所以我做了計算,大約是4000噸二氧化碳當量。這實際上相當於從肯尼迪機場到倫敦的2000張往返機票。所以現在,碳排放實際上並不是巨大的,但它還沒有那麼有意義。我認爲在GPT-6、GPT-7中,一旦你把它乘以100,這可能會成爲一個真正的問題。現在,從宏觀角度來看,這仍然不是一個問題。
下一個模型,你應該這樣思考這些模型,每一代,Flops的數量基本上都會增加10倍。至少他們是這麼做的,如果他們有足夠的能量,如果他們能買得起足夠的GPU。
現在我們討論了預訓練。我也想聊聊系統,因爲現在我們知道計算非常重要。那麼有一個問題是如何優化你的計算?我將把它留到最後,因爲我不確定我們有多少時間。我認爲這很重要,但希望我以後能談論它。這與我們現在談論的內容略有不同。所以我現在將轉到訓練後。
正如我之前所說,後訓練的任務,我們需要進行後訓練的原因是爲了製作人工智能助手。語言建模並不是你擁有人工智能助手時真正想要的東西。例如,如果你問GPT-3,這是一個純粹的語言模型,而不是對齊的模型,如果你問一個問題,比如,向六歲的孩子解釋登月,你得到的結論是,向六歲的孩子解釋萬有引力理論。因爲它學到的是,在互聯網上,如果你有一個問題,你通常會有另一個類似問題的要點。你通常不會先問一個問題,然後再回答。這不是你想要的人工智能助手。那麼我們如何進行這種對齊,即後訓練並使這些模型成爲助手?
這種對齊的目標基本上是讓大型語言模型(LLM)遵循用戶給出的指示,也許是一些設計師的願望。因此要考慮適度。你不希望模型,比如,OpenAI絕對不希望他們的模型說出非常有害的東西。
在這裡,你可以看到,當你問一個問題時,它實際上提供了一個真正的答案。這與LLM之前的情況不同。而在另一種情況下,如果你要求寫一條推文描述某一部分人羣是如何邪惡的,它會說它不能這樣做。這就是這種一致性。
背景是,基本上你想要訓練這些模型的數據就像我們知道我們想要什麼一樣,也就是問人類,這是一個問題,這是你想要的答案。但問題是收集這些數據非常昂貴,而且很難在網上找到它。相比之下,預訓練數據不是你想要的,但有很多。
因此,我們的主要思想是簡單地採用預先訓練的大型語言模型,在整個互聯網上進行預先訓練,然後進行微調。您只需對您實際想要的數據類型稍微改變一下權重即可。希望有了它,您已經對所有互聯網進行了預訓練。它基本上學習或知道如何用英語說話,並且知道標準語言語法。然後,您可以用很少的數據對其進行微調。
監督微調(SFT)實際上就是我剛纔所說的,即根據從人類那裡收集到的期望答案對大型語言模型進行微調的想法。爲什麼它被稱爲監督微調?因爲您基本上想對真實答案進行語言建模。語言建模就像下一個單詞預測。這就是微調的部分。然後您想根據人類給出的期望答案進行微調。這就是我們稱之爲監督的原因。
那麼我們如何收集這些數據?你只需讓人類告訴你這是問題所在,這是您希望從這些模型中得到的答案。舉個例子,我不能很好地在電腦上閱讀,但我的孩子需要做一門科學。讓我們讀一下這個:你能寫一個關於買方壟斷一詞的相關性的簡短介紹嗎?然後它說買方壟斷是指市場結構,等等等等。這是人類寫的。
實際上,這是Open Assistant,它是一種人類在線收集數據的方式。所以這種監督微調或對齊確實是ChatGPT的關鍵。這就是從GPT-3(主要是人工智能研究人員所知道的東西)到ChatGPT(基本上每個人都知道)的巨大飛躍。人類數據的問題在於收集速度非常慢且成本高昂。一個可能的解決方案是使用大型語言模型(LLM)來擴展數據收集。這正是我們一年前對Alpaca所做的。
我們的做法是向人類提問,或者使用人類問答數據集。我們有175個問答,並要求當時最好的模型TextEventUser03生成更多類似的問題和答案。我們收集了52,000個由LLM生成的問題和答案。
接下來,我們採用了Llama7B,這是當時最好的預訓練模型,並對其進行了監督微調。這就是我們得到Alpaca7B模型的方式。這是我們收集的數據類型。
算法是用於解決問題或實現目標的一步一步的指令集。數據實際上相當不錯,因爲它是由基本上兩代之前的LLM生成的。這真的開始了,至少對我們來說,有點像ChatGPT的學術複製。
現在,確實存在一個很大的領域,研究如何使用LLM來加快LLM的開發速度,主要是通過減少所需的人工時間和數據量。我們討論了數據的類型以及如何收集它。監督微調(SFT)令人驚訝的一點是,你不需要那麼多數據。
一篇名爲Lima的論文表明,如果你將監督微調中使用的數據量從2000擴展到32000,這並沒有多大幫助。在這裡,數據量的增加並沒有帶來顯著的提升。直覺上,你學到的只是如何格式化你想要的答案。
換句話說,預訓練模型本質上模擬了互聯網上每個用戶的分佈。一個用戶可能會寫出要點,另一個用戶可能會用答案回答問題。你告訴模型的只是,應該針對某種類型的用戶進行更多優化,而不是其他類型的用戶。因此,你實際上並沒有通過SFT教模型新的知識,只是讓它針對已經在預訓練數據集中看到的一種用戶類型進行優化。
我知道合成數據的一個大問題是,如果你繼續從相同的分佈生成數據,最終你不會學習新的分佈。你基本上是在玩它並引導它。你不能永遠擴大規模,也不能繼續從相同的分佈生成並希望學到新的東西。這是一個活躍的研究領域。
您對人們如何思考這個問題以及更好的引導方式有什麼想法?或者是否應該放棄這個想法,並意識到圖表顯示您不需要那麼多數據,只需讓人類生成2,000個非常好的例子?
這是一個非常好的問題。至於數據,我想說的是,它對SFT(監督微調)來說並不那麼重要,但我們接下來會討論另一件事,即數據確實很重要。
我的直覺是,即使沒有那麼多經驗結果,你仍然可以獲得一些進展。即使你使用LLM(大型語言模型)生成的純文本,並且對三、四代LLM都這樣做,我同意你可能不會有太大的進步。但對我來說,重要的是你如何在LLM中使用像人類一樣的循環。
不是純粹的LLM,也不是純粹的人類,但也許你可以讓模型生成一些新文本,然後人類進行編輯。編輯比編寫整個文本要快得多。我認爲,如果你有這種類型的協作,那麼從某種信息理論的角度來看,你仍然可以獲得額外的信息,但你仍然比使用人類要快得多。
作爲一個領域,我們可能會朝着這些方向發展,即找到重要的例子並向人類提問。這是一種主動學習,只是在需要獲取輸入時詢問人類。
這就是爲什麼在這裡,我可能沒有強調得足夠多。這只是語言建模。根據所需答案對帶有語言模型的LLM進行微調。所以這實際上是相同的損失。兩秒鐘後會有所不同,但SFT的第一步實際上是相同的損失,你只需說,好吧,我想真正專注於那種類型的數據。
所以甚至有一個問題,比如,什麼是預訓練?什麼是後訓練?因爲實際上,它就像你使用的不同數據。我們通常稱之爲後訓練的原因是我們收集數據的方式非常不同。
但爲什麼這2,000個例子會有如此過重的影響力呢?這就是爲什麼我們稱之爲後訓練的另一個原因是我們使用不同類型的超參數。
在預訓練結束時,你的學習率基本上是零。在這裡,你要把學習率提高到1e-5。所以,你給它們的權重實際上是不同的。好的,後訓練的第二步或第二部分是我們所說的從人類反饋中進行強化學習(RLHF)。
你們中的一些人可能聽說過這個概念。SFT(監督微調)存在一個問題,即它進行的是行爲克隆,這意味着你只是試圖模仿人類會說的話。這有很多問題。
首先,你受到人類能力的束縛。就像人類一樣,人類不會總是產生他們認爲最好的東西。如果你讓我寫一本書,我可能會喜歡你的書,但我絕對不會寫出我想讀的書。因此,你將受到人類生成事物能力的限制,即使人類可能更善於區分事物。這是一個問題。
第二個問題是幻覺現象。如果你聽說過這個詞,它指的是模型可能會產生虛假信息。幻覺可能來自監督微調,即使你對正確的數據進行監督微調。原因是,SFT 基本上是使用很少的數據,而它使用的數據並不足以讓模型學到任何新東西。那麼,如果人類給出了模型不知道是正確的答案怎麼辦?從模型的角度來看,人類基本上是在告訴模型生成看似合理的東西,但實際上模型不知道它是否真實。
舉一個具體的例子,如果我們回到買方壟斷的例子,你能寫一些關於買方壟斷的內容嗎?想象一下,一個人寫了一本關於這種書的參考書目,那本書可能存在,也可能是一個正確的參考書目。但如果 LLM(大型語言模型)在預訓練期間從未見過這個參考書目怎麼辦?那麼它就不知道這是一個正確的參考書目。所以你真正告訴模型的是生成或編造一些聽起來合理的參考書目,而不是真正告訴它在預訓練期間看到的真實參考書目。因此,幻覺可能是由 SFT 引起的。這是第二個問題。
第三個問題是生成理想答案的成本非常高。這又回到了你的問題,像人類一樣寫出整個答案實際上非常昂貴。這就是 RLHF 的作用所在。我們的想法是,我們不會克隆人類的行爲,而是要最大化人類的偏好。
我們這樣做的方式是,對於每條指令,你都會要求模型生成兩個答案,通常使用一個相當不錯的模型。所以通常你在這裡不使用 LLM,而是使用一個已經通過 SFT 微調過的 LLM 來給出相當不錯的答案。首先,您需要詢問標註者這兩個答案中哪一個更好,然後選擇首選的那個。接下來,使用不同類型的算法進行討論。您只需微調模型,使其生成更多綠色而不是紅色的內容,從而產生更多優質的結果。
現在的問題是如何實現這一點?我們將討論兩種主要在社區中使用的方法。第一種方法是使用強化學習的概念。希望大家都瞭解強化學習。當考慮使用強化學習時,一個重要的問題是我們正在優化的獎勵是什麼。在這種情況下,我能想到兩個選項。
第一個選項是比較基線生成的輸出和模型生成的輸出,然後讓人類評判哪一個更好,並將此作爲獎勵。如果模型的輸出比基線好,則加一分,否則減一分。這種二元獎勵的問題在於信息非常稀疏,無法提供足夠的反饋。也許答案稍微好一點,也許好很多,但你無法確切知道它有多好。
第二個選項是訓練一個所謂的獎勵模型,它實際上是一個分類器。使用機器學習來分類兩個輸出,從人類偏好的角度評估哪個更好。雖然這有點抽象,但基本上你需要做的是訓練一個獎勵模型 R,它是一個大型分類器。你將輸入和實際輸出提供給這個獎勵模型,並對其進行指數運算,這就是大家熟悉的 softmax 損失。然後你將指數獎勵除以第一個輸出和第二個輸出的指數值。
訓練這個獎勵模型的目的是能夠分類一個輸出比另一個輸出好多少。換句話說,你的獎勵模型將輸出一些獎勵,這些獎勵將用作 softmax 的對數。如果 softmax 中的對數值較高,這意味着該輸出更好。這就是我們所說的 Bradley-Terry 模型。
這個模型會一次性獲取所有輸入和輸出,並給出一個數字。通過訓練這個獎勵模型來適應人類對綠色和紅色的偏好,你可以判斷人類更喜歡紅色還是綠色,但不是使用二進制獎勵,而是使用 softmax 的 logits。Logits 的特點是它們是連續的。因此,如果你的獎勵模型顯示它有很高的 logits,那麼在某種程度上,人類會更喜歡這個答案而不是其他答案。正如我剛纔所說,連續信息更好。這就是人們在實踐中使用的,或者至少曾經在實踐中使用過的。
稍後我會介紹另一種算法。基本上,你最後要做的就是嘗試只使用你所瞭解的強化學習。現在我們知道我們有了獎勵,你採樣的是從你的大型語言模型中生成的,然後只需使用一些正則化項。我們做這個正則化項的原因是爲了避免過度優化。因此,這種獎勵模型可能並不真正具有代表性,可能無法完美地模擬人類的偏好。因此,你不想將這個東西最大化到無窮大。
你可以使用 PPO(近端策略優化)來實現,這是一種常見的強化學習算法。這裡有一點需要注意,因爲這對以後很重要,那就是當我們使用最大似然時,大型語言模型實際上是強化學習的策略。它不再最大化最大似然,這意味着你不再對任何分佈進行建模。這很重要的原因是,經過這種 PPO 的模型實際上不會爲你提供有意義的文本可能性,因爲你優化它們所做的基本上只是優化以生成最可能的東西,而不是優化建模,比如人類可能說的所有答案。換句話說,這裡沒有任何東西可以激勵模型不給出一個可能的生成。這裡沒有任何東西表明如果你有一個帶有某種熵的分佈,那它就是好的。
PPO 正是 ChatGPT 最初所做的。在他們的博客文章中,他們有第一步,進行監督微調,現在你們都知道了。第二步,根據人類偏好訓練獎勵模型。第三步,執行 PPO 多個步驟,這就是你看到這個藍色箭頭的地方。你繼續用 PPO 訓練模型一次,收集新數據,繼續。這正是 ChatGPT 所做的,也是 GPT-3 和 ChatGPT 之間的重大突破。
需要注意的一點是,PPO 面臨許多挑戰。強化學習在理論上非常好,但在實踐中,任何曾經使用過強化學習的人都知道它很複雜。有很多事情,比如推出、外循環、剪輯等,導致過程非常複雜。這是用於語言模型(LM)設置的理想化近端策略優化(PPO)。這比我們之前預期的要複雜得多。實際上,它要複雜得多。我們必須實現它,但我不會詳細介紹。基本上,當你實現這種類型的PPO算法時,你必須考慮很多因素。到處都有剪輯,複雜性很高,而且文檔記錄不完善。
所有這些都表明,我們需要一種新的方法。大約一年前,斯坦福大學提出了一種新方法,叫做直接偏好優化(DPO),本質上是PPO的簡化。他們的思路是,不使用強化學習,而是最大化生成你喜歡的東西的概率,並最小化你不喜歡的東西的概率。
如果你考慮人類的偏好,紅色和綠色會最大化綠色,最小化紅色。所以損失實際上是模型在給定輸入情況下生成人類喜歡的東西的可能性。你試圖做的基本上是最大化生成你喜歡的東西的可能性,最小化你不喜歡的東西的可能性。其他所有術語在這裡都不太重要,理解起來並不複雜。但在高層次上,它實際上只是最大化你喜歡的東西,最小化其他的東西。
有一點需要注意,實際上所有其餘的選擇在某些假設下,PPO的全局最小值和DPO的全局最小值基本上是等價的。所以從數學上來說,這是正確的做法。我不會進行推導,但這是正確的做法。
PPO的情況完全不同。使用PPO,你需要收集人類偏好,然後訓練具有最大似然的獎勵模型,再使用強化學習。現在你所做的基本上就是最大似然,簡單多了。
他們爲什麼從這個獎勵模型開始?是什麼促使他們這樣做?
我認爲這是一個很好的問題。我真的不知道。我可以告訴你的是,在OpenAI,最初做ChatGPT的人是真正編寫PPO的人。我認爲他們就像很多強化學習的人一樣,對他們來說這是非常直觀的。
還有一些額外的潛在好處。例如,如果你使用獎勵模型,強化學習的妙處在於,你可以將未標記的數據與獎勵模型一起使用。在這裡,你只能使用標記數據來執行DPO。
對於PPO,首先需要訓練獎勵模型,然後可以使用未標記的數據,獎勵模型會標記這些未標記的數據。因此,還有額外的潛力,可能會有潛在的改進。然而,實際上並沒有。
我認爲,這個團隊中有很多強化學習專家,包括PPO的主要作者喬治·霍爾曼。PPO比DPO簡單得多,而且表現也很好。所以現在這是人們使用的標準,至少在開源社區中是這樣。我相信這實際上也是行業標準。這被稱爲DPO。
收益方面,左邊的都是這些文件。這是一項總結任務。我想向你展示的是,預先訓練的模型還不錯,而且它們會隨着規模的擴大而改進。如果進行監督微調,會有更多的改進。如果使用帶有人工反饋的RLHF進行PPO或類似操作,會得到比人類更好的性能,這取決於基準。這是人類的參考總結。
同樣,這是我們在Alpaca Farm的一篇論文中看到的,評估並不是太重要,但基本上你看到預先訓練的模型,然後跳轉到SFG,再跳轉到PPO-DPO,PPO-DPO具有完全相同的性能。所以基本上,RLHF有幫助。這就是結論,DPO很簡單。
關於數據的收集方式,第一個想法就是使用人類,正如我們已經討論過的。對於人類應該標記什麼的指導方針非常複雜,而且真的不是那麼容易。實際上,如果你做過一些標記,你會發現它非常複雜。
比如,如果我放大這個問題,告訴我關於自動駕駛汽車的事情。你讀到過,自動駕駛汽車是能夠檢測周圍環境的車輛,等等。自動駕駛汽車是配備傳感器的汽車,等等,無需駕駛員即可導航。兩者似乎都還不錯。比如,哪一個更好?乍一看,這實際上很難說。
結果,人類的問題是,你會開始優化很多高級功能。例如,第二個更長。我可以向你保證,大多數人會選擇第二個。儘管也許第一個更好,我不知道,我還沒有仔細讀過。所以人類面臨的挑戰是,首先,速度慢,成本高。其次,正如我剛纔提到的,很難專注於重要的事情,比如正確性。人們通常會關注一些不太重要的東西,比如形式、長度。因此,我在這裡展示的是,當你進行RLHF(強化學習與人類反饋)時,RLHF的次數越多,模型的輸出就越長。如果你曾經對ChatGPT回答的超長句子感到惱火,這是因爲RLHF的影響。
註釋者的分佈轉變是一個重要因素。你使用的註釋者的分佈非常重要。你必須思考,我們希望在這些模型中代表的人類是什麼樣的?另一個問題是衆包道德。通常,很多標籤工作報酬不高,執行這些任務的人必須經歷大量有毒數據,因爲你希望模型避免輸出有毒數據。衆包道德也是一個重要問題。
人類數據面臨諸多挑戰。去年我們做了與Alpaca類似的工作,認爲人類面臨挑戰,也許我們可以用LLM(大型語言模型)來代替他們。我們所做的只是簡單地替換人類的偏好爲LLM的偏好。
在這個圖中,X軸表示我們爲收集人類數據所付出的代價。收集1000個示例大約需要300美元,這是在Mechanical Turkers上進行的,通常比其他一些公司便宜。Y軸表示與其他人類的協議一致性。實際上,標記確實非常複雜。在二元任務中,人類只有大約66%的時間與自己意見一致。這並不是說人類表現不好,因爲我們是這篇論文的五位主要作者,我們嘗試自己標記這些數據,但準確率只有67%或68%,儘管我們花了三個小時討論如何標記。這真的很複雜,不是一件容易的事。
我展示了許多不同的模型。基本上你會發現模型要便宜得多,而且它們實際上可以比人類本身與人類模式的一致性更高。原因是人類有很多變體,而模型沒有變體,所以它們可能有點偏見,但變體較少,因此效果出奇地好。現在這已經成爲開源社區的標準。我認爲即使在工業界,很多人也會同時使用人類和LLM來改進所有HF數據的收集。
這是去年的論文,但老實說,現在更像是LLM圍繞這個協議,而這個成本大約比人類便宜50倍,而且與人類達成的協議比人類本身更好。因此,這讓我們開始評估訓練後的效果。這又回到了你在講座開始時提出的問題:你如何評估像ChatGPT這樣的模型?
ChatGPT可以給出的答案基本上是無限的,而且並不是說它只有一個正確答案。有很多答案同樣好,所以存在很多挑戰。首先,你不能使用驗證損失,因爲一種方法可能使用PPO,另一種方法可能使用DPO,驗證損失是不可比的。其次,你不能使用困惑度。這是我之前告訴你的,這些模型沒有經過校準,它們沒有給出分佈,它們只是針對一件事進行優化。因此,一旦對齊,你就不能使用困惑度來實際評估這些類型的模型。
第三,人類可能會向這些模型提出各種各樣的問題,包括生成、開放式問答、一些問答、一些總結等等。所以你必須涵蓋很多內容。這些任務真的是開放式的,所以很難實現自動化。這就是你之前提到的。所以我們的想法是,我們不是試圖想出真正容易實現自動化的基準,而是要問用戶在實踐中實際向這些模型提出的問題。我們只是要讓註釋者說出這兩個模型中哪一個更好,比如哪個輸出更好。所以你基本上和所有HF的數據做同樣的事情,但現在你用它來進行評估。
我不確定我是否理解你的意思,比如,你不能使用困惑度而不校準它,比如,LLM仍在進行下一個標記預測,但是,爲什麼不能使用困惑度?
想想,進行PPO之後的最佳解決方案基本上是一個模型,它給你一個增量,基本上是說只有一個句子可以針對該問題生成。所以現在如果你將它用在語義上稍微不同的東西上,它實際上會給出該答案的可能性爲零。實際上,情況並沒有那麼極端,因爲正如你所說,它仍然是一種分佈,但它只是向你展示了困惑度存在一個根本問題。一旦這些模型不再是LLM,它們就不會再被訓練,至少對於PPO來說,它們就不會再被訓練去做最大似然法了,它們被訓練成策略。
所以可能最常見的或者最受信任的基準是我們所說的聊天機器人競技場,基本上是上網,讓互聯網上的隨機用戶盲目地與兩個聊天機器人交談,只需問很多問題,看看兩個答案,然後評價哪一個更好。你要對數十萬用戶進行這樣的測試,然後你就會得到實際的偏好,然後得到模型的排名。您現在可以進入聊天機器人領域,與這些模型進行實際互動。
需要強調的是,雖然想要做這些事情的人通常更像是技術驅動的,或者對技術比較通曉,所以你會問很多技術方面的問題,討論軟件錯誤、AI工具的使用等。
另一個問題是成本和速度。如果你真的想在開發過程中使用這樣的工具,那將非常昂貴,因爲你基本上需要付錢給很多人來做這件事。所以一個簡單的想法是,只使用語言模型(LM)而不是人類。
每條指令的步驟都會根據一些基線和你想要評估的模型生成輸出。想象一下我正在比較 ChatGPT 和 Mistral 的答案。我只是問一個模型,再問另一個模型,哪一個更好,然後取平均值。是的,我問過 GPT-4 哪一個更好。我對整個分佈、基準或數據集取平均值,這給了我一個勝率,即一個模型與另一個模型相比的勝率,現在你可以對模型進行排名了。這是 Alpaca 評估,排行榜。
這樣做的好處是,我們展示了與 ChatBot Arena 的相關性爲 98%,與人類的相關性非常高。與其他基準的相關性比較,運行時間不到三分鐘,成本不到10美元,非常便宜。
不過也有缺點。其中之一是虛假相關。正如我們之前看到的,語言模型更喜歡較長的輸出。實際上,人類也喜歡較長的輸出,但問題在於,一旦使用語言模型,一旦存在偏見,你就會繼續優化它。人類在某個時候會拒絕過長的答案,但如果語言模型有這種偏見,並且它們爲此接受過訓練,它們將繼續喜歡較長的輸出。所以,在這裡我們看到,偏好只是表明人類和模型更喜歡較長的輸出。
這是初始Llama評估數據集基準的另一個視圖。當我們對 GPT-4 進行排名時,如果我們比較標準 GPT-4,它會得到 50% 的定義,因爲我們正在比較 GPT-4 與 GPT-4。但是,如果我們要求 GPT-4 稍微詳細一些,只需在提示中說在答案中要詳細一些,那麼它的響鈴率爲 64.4%。差異確實很大。
如果我們要求模型簡潔,它的表現可能只有20%。因此,根據您要求的簡潔或詳細程度,結果會有很大差異。這非常令人煩惱。
一個可能的解決方案是使用迴歸分析。雖然我不會詳細介紹,但基本上是使用因果推理工具來控制文本長度。現在,實際上長度並不那麼重要。如果您要求詳細,仍然會有一些收益,但收益會少得多。
這就是關於訓練後的全部內容。接下來的八分鐘裡,我可能會談論系統或回答問題。
回到訓練後,我們如何使用少量微調數據調整參數並對模型產生如此大的影響?您之前提到過,有一組不同的超參數。我們是隻改變部分權重、後續權重,還是所有權重?實際情況如何?
是的,我粗略地瀏覽了所有這些。你需要改變所有的權重。實際上,行業會改變所有的權重。在開源領域,你可能聽說過LoRa,它基本上只會改變一些權重,或者更具體地說,它會給每一層的輸出添加一些差異。但在行業中,你需要微調所有的權重。
關於數據的其他方面,實際上在最後一步,allHF,你通常會收集比SFT多得多的數據。如果SFT是5,000、10,000,也許50,000,allHF的數據量可能接近100萬,數量級上更大,但仍然比預訓練少得多。預訓練涉及15萬億個token,這甚至不算什麼。
然而,你對權重的影響很大。因爲你這樣做——你必須認爲你這樣做的方式是使用不同的學習率。但同時,你只能這樣做。想象一下,如果我訓練——即使我只訓練一個句子,但一遍又一遍,在某個時候,我的模型只會生成那個句子,即使它只是一個句子而不是15萬億個標記。所以如果你使用足夠大的學習率,並且持續足夠長的時間,你基本上會過度擬合那個句子。
關鍵是,數據不是id——它不像你混合了一些訓練後數據和一些訓練前數據。你進行預訓練,然後你只需開始微調——僅在訓練後。所以另一種方式——也許另一種觀點是,預訓練只是你的模型的初始化。一旦你這樣看待它,就會發現這只是權重的初始化,所以沒有什麼特別的。比如,你不需要記住你之前已經對大量數據進行過訓練。唯一重要的是,您進行了初始化,現在我實際上訓練了一個模型。
在某種程度上,有一個屬性標記。你有你的權重,這是我的初始化。現在我正在訓練那個。這能回答你的問題嗎?
但是你剛纔說了一些東西,它幾乎相當於多次重新運行微調數據。這是否真的是爲了提供更多的偏好而實際發生的事情?
嗯,我現在實際上不知道他們在行業中是如何做的。當我們做Llama時,我們必須做三個時代。所以你確實對它運行了三次。但是,即使你運行它的次數,實際上也不重要。唯一重要的是有效學習率,這纔是最重要的。
我想我有五分鐘。我可能會嘗試給出一個高層次的概述,至少從系統技巧之一開始。正如我們所說,對於每個人來說,系統瓶頸都是很抱歉的,計算是一個巨大的瓶頸。你可能會問的一個問題是,爲什麼不買更多的GPU?
GPU很貴,但也很稀缺。即使你現在有1000萬美元,你也買不到最好的GPU。還有一些物理限制。當你有多個GPU時,你必須在它們之間進行通信,這需要時間。所以,僅僅購買更多的GPU並不是那麼容易。因此,考慮如何分配資源以及如何優化你的管道真的很重要。
系統方面,GPU 101。對不起,我講得快一點。我希望你們中的一些人至少能跟上。GPU基本上是針對吞吐量進行優化的,CPU是針對延遲進行優化的。因此,對於GPU,你必須這樣思考:一個命令可以同時在多個內核上運行,處理不同類型的數據。這就是你看到的GPU,有很多不同的核心。我們稱它們爲流式多處理器,這與通常的CPU架構非常不同。所以,想想GPU的高吞吐量、並行化。GPU針對快速矩陣乘法進行了優化。每次在 GPU 上進行操作時,如果能使用矩陣乘法,速度會比其他方法快 10 倍。這有點令人煩惱,因爲這意味着我們在矩陣乘法方面遇到了瓶頸。
需要注意的是,GPU 的計算速度改進比內存和通信速度更快。因此,現在 GPU 通常很難保持同步,發送給 GPU 的數據實際上很難跟上進程。如果只是運行普通代碼而不優化,大多數 GPU 實際上會處於空閒狀態。這種通信瓶頸會隨着時間的推移而持續存在。
另一個需要了解的是,GPU 存在內存層次結構。這與 CPU 類似,離核心越近,內存越少但速度越快;離核心越遠,內存越多但速度越慢。
人們通常關注的指標是模型的浮點數利用率。GPU 可以運行的理論最大值是多少,每秒可以使用的浮點數是多少,觀察到的吞吐量除以這個理論最大值。一般來說,如果達到 50%,就已經很不錯了。例如,Facebook 的 Lima 項目浮點數利用率大約是 45%。這意味着數據傳輸速度不夠快,即使對於大公司也是如此。
一個簡單的技巧是使用低精度。將浮點數置於低精度,發送到 GPU 的位數就會減少,通信速度更快,內存消耗更低,一切都會變得更快。對於深度學習來說,小數精度並不那麼重要。例如,在進行矩陣乘法或 SGD 時,已經存在太多噪音,更新 0.01 或 0.015 並不會有太大影響。
因此,不再使用每個浮點數 32 位或 64 位,而是使用 16 位進行矩陣乘法。對於訓練,可以使用一種稱爲自動混合精度的方法,即某些內容使用 32 位,其他內容使用 16 位。一般來說,模型的權重以 32 位存儲,但在計算之前,將所有內容轉換爲 16 位,這樣可以非常快速地進行計算,最後以 32 位更新權重。你之所以使用32位進行所有更新,是因爲你認爲即使學習率非常小,你仍然希望能夠對權重產生影響。因此,所有計算都是用16位完成的,但權重實際上存儲在32位中。這是人們做事的標準方式。
接下來,我將談論運算符融合,因爲我認爲這非常酷。正如我剛纔所說,通信非常慢。實際上,每次使用PyTorch時,它基本上都會將變量移動到GPU的全局內存中。
當你有這樣的內容時,比如x點餘弦等於x1,然後你執行x1點餘弦,後臺發生的事情是,你獲取x,即數據,將其發送到GPU的實際處理器,應用餘弦,然後將其發送回GPU的主內存。然後你看到下一行,你把它送回GPU處理器,應用另一個餘弦,然後再把它送回來。
另一種看待這個問題的方式是,你從DRAM(GPU中的全局內存)出發,然後把它送到計算中,每行都把它送回來。這是一種幼稚的做法,似乎非常浪費。因此,運算符融合的簡單想法就是進行所有計算,然後只進行一次通信,把結果送回來。這正是融合內核的本質。
如果你想讓在PyTorch中的計算速度更快,只需在你的模型上應用torch.compile。這將使你的模型速度提高大約兩倍。它所做的只是重寫你的代碼,比如你的PyTorch代碼,基本上在CUDA中使用C++,只進行一次通信,然後執行所有操作,再把結果送回來。
我沒有時間詳細談論平鋪。平鋪很重要,並行化也很重要,專家的混合也很重要。展望未來,還有很多事情我們還沒有談到。我們還沒有談到架構,也沒有談到推理。LLM還有許多其他重要的事情。
可以說,ChatGPT最大的創新之處在於它有一個簡單的UI來使用它。多模態,你可能遇到的所有誤用是什麼。事實上,互聯網上可能沒有足夠的數據來訓練所有這些模型。數據收集的合法性也是一個問題。