前言
GPT系列是OpenAI的一系列預訓練文章,GPT的全稱是Generative Pre-Trained Transformer,顧名思義,GPT的目的就是通過Transformer為基礎模型,使用預訓練技術得到通用的文本模型。目前已經公布論文的有文本預訓練GPT-1,GPT-2,GPT-3,以及圖像預訓練iGPT。據傳還未發布的GPT-4是一個多模態模型。最近非常火的ChatGPT和今年年初公布的 是一對姐妹模型,是在GPT-4之前發布的預熱模型,有時候也被叫作GPT3.5。ChatGPT和InstructGPT在模型結構,訓練方式上都完全一致,即都使用了指示學習(Instruction Learning)和人工反饋的強化學習(Reinforcement Learning from Human Feedback,RLHF)來指導模型的訓練,它們不同的僅僅是采集數據的方式上有所差異。所以要搞懂ChatGPT,我們必須要先讀懂InstructGPT。
1. 背景知識
在介紹ChatGPT/InstructGPT之前,我們先介紹它們依賴的基礎算法。
1.1 GPT系列
基于文本預訓練的GPT-1 ,GPT-2 ,GPT-3 三代模型都是采用的以Transformer為核心結構的模型(圖1),不同的是模型的層數和詞向量長度等超參,它們具體的內容如表1。
圖1:GPT系列的模型結構(其中Trm是一個Transformer結構)
?表1:歷代GPT的發布時間,參數量以及訓練量
GPT-1比BERT誕生略早幾個月。它們都是采用了Transformer為核心結構,不同的是GPT-1通過自左向右生成式的構建預訓練任務,然后得到一個通用的預訓練模型,這個模型和BERT一樣都可用來做下游任務的微調。GPT-1當時在9個NLP任務上取得了SOTA的效果,但GPT-1使用的模型規模和數據量都比較小,這也就促使了GPT-2的誕生。
對比GPT-1,GPT-2并未在模型結構上大作文章,只是使用了更多參數的模型和更多的訓練數據(表1)。GPT-2最重要的思想是提出了“所有的有監督學習都是無監督語言模型的一個子集”的思想,這個思想也是提示學習(Prompt Learning)的前身。GPT-2在誕生之初也引發了不少的轟動,它生成的新聞足以欺騙大多數人類,達到以假亂真的效果。甚至當時被稱為“AI界最危險的武器”,很多門戶網站也命令禁止使用GPT-2生成的新聞。
GPT-3被提出時,除了它遠超GPT-2的效果外,引起更多討論的是它1750億的參數量。GPT-3除了能完成常見的NLP任務外,研究者意外的發現GPT-3在寫SQL,JAVAScript等語言的代碼,進行簡單的數學運算上也有不錯的表現效果。GPT-3的訓練使用了情境學習(In-context Learning),它是元學習(Meta-learning)的一種,元學習的核心思想在于通過少量的數據尋找一個合適的初始化范圍,使得模型能夠在有限的數據集上快速擬合,并獲得不錯的效果。
通過上面的分析我們可以看出從性能角度上講,GPT有兩個目標:
1. 提升模型在常見NLP任務上的表現效果;
2. 提升模型在其他非典型NLP任務(例如代碼編寫,數學運算)上的泛化能力。
另外,預訓練模型自誕生之始,一個備受詬病的問題就是預訓練模型的偏見性。因為預訓練模型都是通過海量數據在超大參數量級的模型上訓練出來的,對比完全由人工規則控制的專家系統來說,預訓練模型就像一個黑盒子。沒有人能夠保證預訓練模型不會生成一些包含種族歧視,性別歧視等危險內容,因為它的幾十GB甚至幾十TB的訓練數據里幾乎肯定包含類似的訓練樣本。這也就是InstructGPT和ChatGPT的提出動機,論文中用3H概括了它們的優化目標:
* 有用的(Helpful);
* 可信的(Honest);
* 無害的(Harmless)。
OpenAI的GPT系列模型并沒有開源,但是它們提供了模型的試用網站,有條件的同學可以自行試用。
1.2 指示學習(Instruct Learning)和提示(Prompt Learning)學習
指示學習是谷歌Deepmind的Quoc V.Le團隊在2021年的一篇名為《F.NETuned Language Models Are Zero-Shot Learners》 文章中提出的思想。指示學習和提示學習的目的都是去挖掘語言模型本身具備的知識。不同的是Prompt是激發語言模型的補全能力,例如根據上半句生成下半句,或是完形填空等。Instruct是激發語言模型的理解能力,它通過給出更明顯的指令,讓模型去做出正確的行動。我們可以通過下面的例子來理解這兩個不同的學習方式:
提示學習:給女朋友買了這個項鏈,她很喜歡,這個項鏈太____了。
指示學習:判斷這句話的情感:給女朋友買了這個項鏈,她很喜歡。選項:A=好;B=一般;C=差。
指示學習的優點是它經過多任務的微調后,也能夠在其他任務上做zero-shot,而提示學習都是針對一個任務的。泛化能力不如指示學習。我們可以通過圖2來理解微調,提示學習和指示學習。
圖2:模型微調,提示學習,指示學習三者的異同
1.3 人工反饋的強化學習
因為訓練得到的模型并不是非常可控的,模型可以看做對訓練集分布的一個擬合。那么反饋到生成模型中,訓練數據的分布便是影響生成內容的質量最重要的一個因素。有時候我們希望模型并不僅僅只受訓練數據的影響,而是人為可控的,從而保證生成數據的有用性,真實性和無害性。論文中多次提到了對齊(Alignment)問題,我們可以理解為模型的輸出內容和人類喜歡的輸出內容的對齊,人類喜歡的不止包括生成內容的流暢性和語法的正確性,還包括生成內容的有用性、真實性和無害性。
我們知道強化學習通過獎勵(Reward)機制來指導模型訓練,獎勵機制可以看做傳統模訓練機制的損失函數。獎勵的計算要比損失函數更靈活和多樣(AlphaGO的獎勵是對局的勝負),這帶來的代價是獎勵的計算是不可導的,因此不能直接拿來做反向傳播。強化學習的思路是通過對獎勵的大量采樣來擬合損失函數,從而實現模型的訓練。同樣人類反饋也是不可導的,那么我們也可以將人工反饋作為強化學習的獎勵,基于人工反饋的強化學習便應運而生。
RLHF最早可以追溯到google在2017年發表的《Deep Reinforcement Learning from Human Preferences》 ,它通過人工標注作為反饋,提升了強化學習在模擬機器人以及雅達利游戲上的表現效果。
圖3:人工反饋的強化學習的基本原理
?InstructGPT/ChatGPT中還用到了強化學習中一個經典的算法:OpenAI提出的最近策略優化(Proximal Policy Optimization,PPO) 。PPO算法是一種新型的Policy Gradient算法,Policy Gradient算法對步長十分敏感,但是又難以選擇合適的步長,在訓練過程中新舊策略的的變化差異如果過大則不利于學習。PPO提出了新的目標函數可以在多個訓練步驟實現小批量的更新,解決了Policy Gradient算法中步長難以確定的問題。其實TRPO也是為了解決這個思想但是相比于TRPO算法PPO算法更容易求解。
2. InstructGPT/ChatGPT原理解讀
有了上面這些基礎知識,我們再去了解InstructGPT和ChatGPT就會簡單很多。簡單來說,InstructGPT/ChatGPT都是采用了GPT-3的網絡結構,通過指示學習構建訓練樣本來訓練一個反應預測內容效果的獎勵模型(RM),最后通過這個獎勵模型的打分來指導強化學習模型的訓練。InstructGPT/ChatGPT的訓練流程如圖4所示。
圖4:InstructGPT的計算流程:(1)有監督微調(SFT);(2)獎勵模型(RM)訓練;(3)通過PPO根據獎勵模型進行強化學習。
從圖4中我們可以看出,InstructGPT/ChatGPT的訓練可以分成3步,其中第2步和第3步是的獎勵模型和強化學習的SFT模型可以反復迭代優化。
1. 根據采集的SFT數據集對GPT-3進行有監督的微調(Supervised FineTune,SFT);
2. 收集人工標注的對比數據,訓練獎勵模型(Reword Model,RM);
3. 使用RM作為強化學習的優化目標,利用PPO算法微調SFT模型。
根據圖4,我們將分別介紹InstructGPT/ChatGPT的數據集采集和模型訓練兩個方面的內容。
2.1 數據集采集
如圖4所示,InstructGPT/ChatGPT的訓練分成3步,每一步需要的數據也有些許差異,下面我們分別介紹它們。
2.1.1 SFT數據集
SFT數據集是用來訓練第1步有監督的模型,即使用采集的新數據,按照GPT-3的訓練方式對GPT-3進行微調。因為GPT-3是一個基于提示學習的生成模型,因此SFT數據集也是由提示-答復對組成的樣本。SFT數據一部分來自使用OpenAI的PlayGround的用戶,另一部分來自OpenAI雇傭的40名標注工(labeler)。并且他們對labeler進行了培訓。在這個數據集中,標注工的工作是根據內容自己編寫指示,并且要求編寫的指示滿足下面三點:
* 簡單任務:labeler給出任意一個簡單的任務,同時要確保任務的多樣性;
* Few-shot任務:labeler給出一個指示,以及該指示的多個查詢-相應對;
* 用戶相關的:從接口中獲取用例,然后讓labeler根據這些用例編寫指示。
2.1.2 RM數據集
RM數據集用來訓練第2步的獎勵模型,我們也需要為InstructGPT/ChatGPT的訓練設置一個獎勵目標。這個獎勵目標不必可導,但是一定要盡可能全面且真實的對齊我們需要模型生成的內容。很自然的,我們可以通過人工標注的方式來提供這個獎勵,通過人工對可以給那些涉及偏見的生成內容更低的分從而鼓勵模型不去生成這些人類不喜歡的內容。InstructGPT/ChatGPT的做法是先讓模型生成一批候選文本,讓后通過labeler根據生成數據的質量對這些生成內容進行排序。
2.1.3 PPO數據集
InstructGPT的PPO數據沒有進行標注,它均來自GPT-3的API的用戶。既又不同用戶提供的不同種類的生成任務,其中占比最高的包括生成任務(45.6%),QA(12.4%),頭腦風暴(11.2%),對話(8.4%)等。
2.1.4 數據分析
因為InstructGPT/ChatGPT是在GPT-3基礎上做的微調,而且因為涉及了人工標注,它們數據總量并不大,表2展示了三份數據的來源及其數據量。
表2:InstructGPT的數據分布
論文的附錄A對數據的分布進行了更詳細的討論,這里我列出幾個可能影響模型效果的幾項:
* 數據中96%以上是英文,其它20個語種例如中文,法語,西班牙語等加起來不到4%,這可能導致InstructGPT/ChatGPT能進行其它語種的生成,但效果應該遠不如英文;
* 提示種類共有9種,而且絕大多數是生成類任務,可能會導致模型有覆蓋不到的任務類型;
* 40名外包員工來自美國和東南亞,分布比較集中且人數較少, InstructGPT/ChatGPT的目標是訓練一個價值觀正確的預訓練模型,它的價值觀是由這40個外包員工的價值觀組合而成。而這個比較窄的分布可能會生成一些其他地區比較在意的歧視,偏見問題。
此外,ChatGPT的博客中講到ChatGPT和InstructGPT的訓練方式相同,不同點僅僅是它們采集數據上有所不同,但是并沒有更多的資料來講數據采集上有哪些細節上的不同。考慮到ChatGPT僅僅被用在對話領域,這里我猜測ChatGPT在數據采集上有兩個不同:1. 提高了對話類任務的占比;2. 將提示的方式轉換Q&A的方式。當然這里也僅僅是猜測,更準確的描述要等到ChatGPT的論文、源碼等更詳細的資料公布我們才能知道。
2.2 訓練任務
我們剛介紹到InstructGPT/ChatGPT有三步訓練方式。這三步訓練會涉及三個模型:SFT,RM以及PPO,下面我們詳細介紹它們。
2.2.1 有監督微調(SFT)
這一步的訓練和GPT-3一致,而且作者發現讓模型適當過擬合有助于后面兩步的訓練。
2.2.2 獎勵模型(RM)
因為訓練RM的數據是一個labeler根據生成結果排序的形式,所以它可以看做一個回歸模型。RM結構是將SFT訓練后的模型的最后的嵌入層去掉后的模型。它的輸入是prompt和Reponse,輸出是獎勵值。具體的講,對弈每個prompt,InstructGPT/ChatGPT會隨機生成K個輸出( 4≤K≤9 ),然后它們向每個labeler成對的展示輸出結果,也就是每個prompt共展示C(K,2)個結果,然后用戶從中選擇效果更好的輸出。在訓練時,InstructGPT/ChatGPT將每個prompt的C(K,2)個響應對作為一個batch,這種按prompt為batch的訓練方式要比傳統的按樣本為batch的方式更不容易過擬合,因為這種方式每個prompt會且僅會輸入到模型中一次。
獎勵模型的損失函數表示為式(1)。這個損失函數的目標是最大化labeler更喜歡的響應和不喜歡的響應之間的差值。
其中 rθ(x,y)是提示x和響應y在參數為θ的獎勵模型下的獎勵值, yw是labeler更喜歡的響應結果, yl是labeler不喜歡的響應結果。 D是整個訓練數據集。
2.2.3 強化學習模型(PPO)
強化學習和預訓練模型是最近兩年最為火熱的AI方向之二,之前不少科研工作者說強化學習并不是一個非常適合應用到預訓練模型中,因為很難通過模型的輸出內容建立獎勵機制。而InstructGPT/ChatGPT反直覺的做到了這點,它通過結合人工標注,將強化學習引入到預訓練語言模型是這個算法最大的創新點。
如表2所示,PPO的訓練集完全來自API。它通過第2步得到的獎勵模型來指導SFT模型的繼續訓練。很多時候強化學習是非常難訓練的,InstructGPT/ChatGPT在訓練過程中就遇到了兩個問題:
問題1:隨著模型的更新,強化學習模型產生的數據和訓練獎勵模型的數據的差異會越來越大。作者的解決方案是在損失函數中加入KL懲罰項來確保PPO模型的輸出和SFT的輸出差距不會很大,即式(2)的上半部分。
問題2:只用PPO模型進行訓練的話,會導致模型在通用NLP任務上性能的大幅下降,作者的解決方案是在訓練目標中加入了通用的語言模型目標,這個變量在論文中被叫做PPO-ptx,即式(2)的下半部分。
綜上,PPO的訓練目標為式(2)。
3. InstructGPT/ChatGPT的性能分析
不可否認的是,InstructGPT/ChatGPT的效果是非常棒的,尤其是引入了人工標注之后,讓模型的“價值觀”和的正確程度和人類行為模式的“真實性”上都大幅的提升。那么,僅僅根據InstructGPT/ChatGPT的技術方案和訓練方式,我們就可以分析出它可以帶來哪些效果提升呢?
3.1 優點
InstructGPT/ChatGPT的效果比GPT-3更加真實:這個很好理解,因為GPT-3本身就具有非常強的泛化能力和生成能力,再加上InstructGPT/ChatGPT引入了不同的labeler進行提示編寫和生成結果排序,而且還是在GPT-3之上進行的微調,這使得我們在訓練獎勵模型時對更加真實的數據會有更高的獎勵。作者也在TruthfulQA數據集上對比了它們和GPT-3的效果,實驗結果表明甚至13億小尺寸的PPO-ptx的效果也要比GPT-3要好。
InstructGPT/ChatGPT在模型的無害性上比GPT-3效果要有些許提升:原理同上。但是作者發現InstructGPT在歧視、偏見等數據集上并沒有明顯的提升。這是因為GPT-3本身就是一個效果非常好的模型,它生成帶有有害、歧視、偏見等情況的有問題樣本的概率本身就會很低。僅僅通過40個labeler采集和標注的數據很可能無法對模型在這些方面進行充分的優化,所以會帶來模型效果的提升很少或者無法察覺。
InstructGPT/ChatGPT具有很強的Coding能力:首先GPT-3就具有很強的Coding能力,基于GPT-3制作的API也積累了大量的Coding代碼。而且也有部分OpenAI的內部員工參與了數據采集工作。通過Coding相關的大量數據以及人工標注,訓練出來的InstructGPT/ChatGPT具有非常強的Coding能力也就不意外了。
3.2 缺點
InstructGPT/ChatGPT會降低模型在通用NLP任務上的效果:我們在PPO的訓練的時候討論了這點,雖然修改損失函數可以緩和,但這個問題并沒有得到徹底解決。
有時候InstructGPT/ChatGPT會給出一些荒謬的輸出:雖然InstructGPT/ChatGPT使用了人類反饋,但限于人力資源有限。影響模型效果最大的還是有監督的語言模型任務,人類只是起到了糾正作用。所以很有可能受限于糾正數據的有限,或是有監督任務的誤導(只考慮模型的輸出,沒考慮人類想要什么),導致它生成內容的不真實。就像一個學生,雖然有老師對他指導,但也不能確定學生可以學會所有知識點。
模型對指示非常敏感:這個也可以歸結為labeler標注的數據量不夠,因為指示是模型產生輸出的唯一線索,如果指示的數量和種類訓練的不充分的話,就可能會讓模型存在這個問題。
模型對簡單概念的過分解讀:這可能是因為labeler在進行生成內容的比較時,傾向于給給長的輸出內容更高的獎勵。
對有害的指示可能會輸出有害的答復:例如InstructGPT/ChatGPT也會對用戶提出的“AI毀滅人類計劃書”給出行動方案(圖5)。這個是因為InstructGPT/ChatGPT假設labeler編寫的指示是合理且價值觀正確的,并沒有對用戶給出的指示做更詳細的判斷,從而會導致模型會對任意輸入都給出答復。雖然后面的獎勵模型可能會給這類輸出較低的獎勵值,但模型在生成文本時,不僅要考慮模型的價值觀,也要考慮生成內容和指示的匹配度,有時候生成一些價值觀有問題的輸出也是可能的。
圖5:ChatGPT編寫的毀滅人類計劃書。
3.3 未來工作
我們已經分析了InstrcutGPT/ChatGPT的技術方案和它的問題,那么我們也可以看出InstrcutGPT/ChatGPT的優化角度有哪些了。
人工標注的降本增效:InstrcutGPT/ChatGPT雇傭了40人的標注團隊,但從模型的表現效果來看,這40人的團隊是不夠的。如何讓人類能夠提供更有效的反饋方式,將人類表現和模型表現有機和巧妙的結合起來是非常重要的。
模型對指示的泛化/糾錯等能力:指示作為模型產生輸出的唯一線索,模型對他的依賴是非常嚴重的,如何提升模型對指示的泛化能力以及對錯誤指示示的糾錯能力是提升模型體驗的一個非常重要的工作。這不僅可以讓模型能夠擁有更廣泛的應用場景,還可以讓模型變得更“智能”。
避免通用任務性能下降:這里可能需要設計一個更合理的人類反饋的使用方式,或是更前沿的模型結構。因為我們討論了InstrcutGPT/ChatGPT的很多問題可以通過提供更多labeler標注的數據來解決,但這會導致通用NLP任務更嚴重的性能下降,所以需要方案來讓生成結果的3H和通用NLP任務的性能達到平衡。
3.4 InstrcutGPT/ChatGPT的熱點話題解答
ChatGPT的出現會不會導致底層程序員失業?從ChatGPT的原理和網上漏出的生成內容來看,ChatGPT生成的代碼很多可以正確運行。但程序員的工作不止是寫代碼,更重要的是找到問題的解決方案。所以ChatGPT并不會取代程序員,尤其是高階程序員。相反它會向現在很多的代碼生成工具一樣,成為程序員寫代碼非常有用的工具。
Stack Overflow 宣布臨時規則:禁止 ChatGPT。ChatGPT本質上還是一個文本生成模型,對比生成代碼,它更擅長生成以假亂真的文本。而且文本生成模型生成的代碼或者解決方案并不能保證是可運行而且是可以解決問題的,但它以假亂真的文本又會迷惑很多查詢這個問題的人。Stack Overflow為了維持論壇的質量,封禁ChatGPT也是情理之中。
聊天機器人 ChatGPT 在誘導下寫出「毀滅人類計劃書」,并給出代碼,AI 發展有哪些問題需關注?ChatGPT的「毀滅人類計劃書」是它在不可遇見的指示下根據海量數據強行擬合出來的生成內容。雖然這些內容看起來很真實,表達也很流暢,這說明的只是ChatGPT具有非常強的生成效果,并不表示ChatGPT具備毀滅人類的思想。因為他僅僅是一個文本生成模型,并不是一個決策模型。
4. 總結
就像很多人們算法剛誕生時一樣,ChatGPT憑借有用性,真實性,無害性的效果,引起了業內廣泛的關注和人類對AI的思考。但是當我們看完它的算法原理之后,發現它并沒有業內宣傳的那么恐怖。反而我們可以從它的技術方案中學到很多有價值的東西。InstrcutGPT/ChatGPT在AI界最重要的貢獻是將強化學習和預訓練模型巧妙的結合起來。而且通過人工反饋提升了模型的有用性,真實性和無害性。ChatGPT也進一步提升大模型的成本,之前還只是比拼數據量和模型規模,現在甚至也引入了雇傭的外包這一支出,讓個體工作者更加望而卻步。