跳至主要内容

🏋️‍♀️ ChatGPT是怎麼被訓練出來的

引言

在一個多月前的Microsoft Build 微軟開發者大會上,OpenAI的科學家Andrej Karpathy做了個關於LLM(大型語言模型)是怎麼訓練的,有什麼特點,以及如何從中獲得更好結果的演講"State of GPT"。

我之前已經分享過了Andrej在這個演講中提到的重要觀點 2.6 LLM不想成功,但你可以要求成功

他前20多分鐘關於ChatGPT如何被訓練出來的內容非常硬核,很多人表示難理解,但是我覺得這部分內容對於我們不是在做底層技術的普通人來說,可以不鑽入細節,但是如果大致知曉是怎麼訓練的,對於我們理解模型的特點(優勢和缺陷)還是有很大幫助的,也能給我們的使用過程帶來啟發,所以我今天常識結合Andrej這次的演講和我基於其他學習材料獲得的理解給大家做一次介紹,希望對你有啟發。

當然,你也可以直接去看Andrej演講的內容:影片點這裡

ChatGPT的訓練四階段

階段一:預訓練(Pretraining),這是大型語言模型(LLM)訓練的最主要階段,大概會佔用模型95%以上的訓練時間,花費數百萬美元。該階段模型會有上千億的從網路爬取的語料(低質量,高數量)進行訓練,模型訓練的目標是預測下一個單詞,訓練完成後會得到一個基礎模型(Base model),像GPT-3,LLaMA,PaLM都是這樣的基礎模型。

階段二:監督微調(Supervised Finetuning),這個過程會使用專門的由人類外包商生成的結構化的包含提示詞和理想結果的語料(高質量,低數量)進行訓練,通常只需要幾天的時間,這個階段模型訓練的目標依然是預測下一個單詞,完成後會得到一個監督微調模型(SFT Model),除ChatGPT和Claude外,大多數和使用者對話的模型都是這種型別的模型,如Vicuna-13B。

階段三:獎勵建模(Reward Modeling),在上一個階段訓練得到的監督微調模型已經可以生成輸出了,到了這個階段,會由人類外包商對SFT model在同一個prompt下生成的結果進行評價比較,在這個階段,模型訓練的目標是預測一個回答可能得到的人類評分,這是個用於訓練的過程模型,不是給使用者使用的,通常會花費幾天的訓練時間。

階段四:強化學習(Reinforcement Learning),在這個階段,訓練的語料是人類外包商提供的提示詞(prompt),而模型訓練的目標是根據這些提示詞生成內容,目標是獲得最大化的Reward Model提供的獎勵,通常也是花費幾天的訓練時間就能完成,最終得到的強化學習模型(RL Model),像ChatGPT和Claude就是這樣的模型。

階段一:預訓練(Pretraining)

在預訓練階段,首先是語料選擇的問題,訓練語料的數量和質量都很重要,GPT-3大概用了3000億token的語料,他們未公佈具體的語料構成,但是可以拿Meta訓練LLaMA用的語料資料作為參照,其中:

67.0%的Common Crawl,也就是常規網路爬取的資料集,這部分資料集的特點是內容涵蓋的型別很豐富,但是因為內容可能是任何人寫的,質量可能偏低,也會包含大量的噪聲和不相關內容,例如廣告、導航選單、版權宣告等。

15.0%是C4資料(Colossal Clean Crawled Corpus,"龐大的清潔爬取語料庫"),這個資料集包含了大量的網頁文字,這些文字已經過清理,移除了廣告、重複內容、非英語文字、和其他不適合訓練的元素。這個資料集的目標是提供一個大規模、高質量、多樣性強的英語文字資料集,以支援各種自然語言處理任務。儘管C4已經過清理,但仍然包含了來自網際網路的各種文字,因此可能包含一些質量低下或有誤導性的資訊。

剩餘18%的訓練語料資料質量相對高些,主要是來自Github、維基百科、書籍、Arxiv論文、股票交易所的材料等。

注:結合訓練語料的資料量級和來源構成看,我們需要理解的是,像ChatGPT等LLM幾乎學習過了人類在網際網路上發表過的所有學科和領域的知識,所以他“常識”很豐富;但同時,因為訓練語料中“平庸”的知識佔比太高了,而模型的主要目標又是預測下一個單詞,所以你很可能得到的是平庸普通被平均過的內容,你需要一定的prompt技巧才能把更高階更優質的輸出給逼出來。

重新回到訓練過程,在獲得大規模的訓練語料後,OpenAI也不是直接對語料進行訓練,而是先將文字內容分解成了更細小的子詞單元(subword units),也就是我們常聽到的token進行訓練,你可能會像我一樣困惑為什麼要費這種勁,直接拿完整的單詞訓練不好麼,為什麼要分詞,其中的邏輯是這樣的:

處理未知單詞:在訓練過程中,可能會遇到一些模型從未見過的單詞,如果以單詞為單位進行tokenization,那麼模型將無法處理這些未知單詞。而如果以子詞或字元為單位進行tokenization,即使遇到未見過的單詞,模型也可以將其分解為已知的子詞或字元,從而能夠處理未知單詞。

縮小詞彙表大小:如果以單詞為單位進行tokenization,那麼詞彙表的大小將會非常大,這會增加模型的複雜性和計算負擔。以子詞或字元為單位進行tokenization,可以顯著減小詞彙表的大小。

捕捉詞根和詞綴資訊:許多英語單詞都是由詞根和詞綴(字首和字尾)構成的。透過子詞單元進行tokenization,可以幫助模型捕捉到這些詞根和詞綴資訊,對理解和生成文字有所幫助。

所以,GPT選擇了子詞單元作為token進行訓練,這樣既能夠處理未知單詞,也能夠縮小詞彙表的大小,並且能夠捕捉到一些語言的內在規則。大多數模型在訓練時都會這麼做,但是他們採用的分詞規則可能會不太相同,比如GPT-3在訓練前分出了50257個子詞,而LLaMA用了32000個子詞。

在獲得了語料和對語料進行分詞後便進入了實際的預訓練過程,預訓練實際就是不斷遮住模型的眼睛,讓模型猜測下一個單詞是什麼的過程。訓練的目標是不斷迭代,使得模型猜出來的下一個詞和實際文字內容的下一個詞一樣,這時候涉及一個指標叫訓練損失(Training Loss),這是機器學習模型在訓練資料上的預測錯誤的度量。簡單來說,損失函式是一種衡量模型預測和實際目標之間差距的方法。在訓練過程中,模型的目標是最小化這個損失。

在這個階段訓練得到的是Base Model,像是前面提到的,這個模型的目標是預測下一個單詞,而不是充當一個聊天機器人或者助理的角色,舉個例子,如果你向這個模型輸入prompt:

北京的常駐人口有多少?

得到的結果可能會是:

上海的常駐人口有多少?

廣州的常駐人口有多少?

深圳的常駐人口有多少?

因為在GPT的訓練語料裡,這些問題可能常常更緊密地放在了一起,不過到了GPT-2的時候,就有很多人發現了其實可以透過prompt的技巧去讓模型扮演助手的角色或者回答問題,實現的方式是類似於寫以下的prompt:

Q:北京的面積有多大?

A:1.6萬平方公里

Q:北京有多少個行政區?

A:16個

Q:北京的常駐人口有多少?

A:

這時你得到的結果可能就是:

2184萬

這一過程的本質是把你的問題,或者你需要base model幫你做的事偽裝成一個文件中連續內容的一個缺口,讓模型去自動進行嘗試補全。但是這一過程存在很多的不穩定和不確定性,得到的結果常常不令人滿意,對使用者也有較高的要求,所以現在這類模型通常不是一個提供給普通使用者使用的模型,而是讓開發者應用,需要涉及到一定的開發能力和prompt技巧。

階段二:監督微調(Supervised Finetuning)

為了解決上面的base model只是預測下一個單詞,不理解人類輸出指令的問題,模型訓練的過程中就加入了這一監督微調的過程。本質上來說,就是給模型提供一系列的示例,讓模型看到“prompt”和“respone”,讓模型去理解“指令”,去理解人類的輸入是什麼意思。

經過這一層的處理,已經相當於讓模型理解prompt指令和它該生成的內容之間的關係了,你也可以理解這是把少示例提示(few-shot)這一prompt技術透過finetuning直接包裝進了模型內部,經過這一層的包裝,模型已經從簡單的預測下一個單詞變成了一個助手的角色。

階段三:獎勵建模(Reward Modeling)和 階段四:強化學習(Reinforcement Learning)

我直接把這兩個階段放在了一起,因為本質上階段三是為階段四提供服務的,是一個獨立存在並無意義的過程。大多數的模型都只訓練到了階段一和階段二,後兩個階段可能是OpenAI用了些獨門秘籍,目前英文世界也只有ChatGPT以及從OpenAI出去的人創立的Claude從有這一訓練過程。GPT-3是2020年訓練出來的,API也很快就開放使用了,但是在當時並沒有引起太普遍的反響,是GPT-3基礎上微調出來的GPT-3.5-turbo,也就是ChatGPT在2022年底釋出後才引發了大規模的關注和公眾認知的,也大致能說明這後兩個階段的訓練過程有多困難以及影響有多大。

在獎勵建模(Reward Modeling)階段,OpenAI會讓前一階段訓練得到的SFT Model去針對數十萬個prompt生成內容,然後讓人類外包商對同一個prompt下的多個結果進行選擇及評分,依賴於這一階段得到的資料,OpenAI會訓練模型去預測一個回答可能會獲得的人類評分。

在強化學習(Reinforcement Learning)階段,由於前面三個階段的模型積累,模型已經既能對prompt生成回答,也能自己預測所生成的回答大概能得到什麼樣的評分了,所以模型需要做的只是不斷迭代,生成儘可能獲得更高得分的回答。

所以你其實可以認為,這兩個階段的本質是,讓模型更符合人類偏好,生成更可能被人類打高分的回答,具體來說,是被那些在獎勵建模階段的人類外包商打高分的回答。本質上來說,如果那些參與訓練過程的人水平是中庸的,是有偏見的,那麼得到的模型也將會有對應的特徵。

👆目前模型評分排名前三的全部都是基於人類反饋進行強化學習的模型(RLHF Model)

本期關於ChatGPT如何被訓練出來的介紹就先到這,下期會詳細介紹基於這樣的模型特點,我們應該採取哪些Prompt策略去最大化模型的優勢,同時減小模型的缺陷和偏見。