ChatGPT技术原理解析:从RL之PPO算法、RLHF到GPT4、instructGPT
寫在最前面,23年2.27日起,我個(gè)人和十來位博士朋友精讀100篇ChatGPT相關(guān)技術(shù)的論文(每天一篇,100天讀完100篇,這100篇的論文清單見此文),過程中幾乎每天都會(huì)不斷優(yōu)化本文,優(yōu)化記錄見本文文末的“后記”中..
前言
自從我那篇Transformer通俗筆記一經(jīng)發(fā)布,然后就不斷改、不斷找人尋求反饋、不斷改,其中一位朋友倪老師(之前我司NLP高級班學(xué)員現(xiàn)課程助教老師之一)在謬贊Transformer筆記無懈可擊的同時(shí),給我建議到,“后面估計(jì)可以嘗試嘗試在BERT的基礎(chǔ)上,講一講prompt學(xué)習(xí)了”
再然后,當(dāng)我還在各種改Transformer筆記的時(shí)候,12月初突然出來了一個(gè)ChatGPT刷爆朋友圈,即便很多之前不接觸AI的朋友也在問ChatGPT這種類似聊天機(jī)器人卻遠(yuǎn)勝一般聊天機(jī)器人各種問題(上一次出現(xiàn)這種盛況的還是16年的AlphaGo)。
據(jù)我觀察,大家問ChatGPT的問題千奇百怪
- 有的讓他算經(jīng)典的雞兔同籠問題(一個(gè)籠子里裝有雞和兔子,數(shù)頭的話一共35個(gè)頭,數(shù)腳的話一共94只腳,問籠中分別有多少只雞和兔子),且也能在和人類自然而流暢的互動(dòng)中舉一反三
- 有的讓其根據(jù)要求排查代碼bug,要知道此前debug想尋求幫助
要么問人(問熟人用社交軟件,問陌生人則類似那種問答網(wǎng)站,持續(xù)問一般得付費(fèi),畢竟沒人樂意持續(xù)免費(fèi)答疑大量技術(shù)難題)
要么Google搜有沒人遇到類似的問題(但別人遇到的問題很難與你的百分百一致)
要么用Codex這類代碼軟件,但在和人類的互動(dòng)交互上,還不是那么善解人意
所以ChatGPT就相當(dāng)于你寫代碼或各類問題的私人顧問,而這個(gè)私人顧問能瞬間、精準(zhǔn)理解你的意圖,不會(huì)讓你像用以前那種聊天機(jī)器人經(jīng)常覺得智障甚至對牛彈琴,加之其背后依托的是人類級百科全書式的資料庫,所以有人驚呼:ChatGPT會(huì)不會(huì)替代Google這類搜索引擎。
雖然大部分技術(shù)者對待ChatGPT還是比較冷靜的,畢竟它給的答案不像權(quán)威技術(shù)專家那樣具備足夠的公信力,也不像Google給出來源從而不能比較好的驗(yàn)證其正確程度,但最近遇到的幾件事改變了我的一些看法
總之中文資料里,可能因?yàn)閕nstructGPT/ChatGPT剛出來不久的緣故,兼顧可讀性和細(xì)節(jié)性的文章少的可憐
考慮到ChatGPT非一蹴而就,而是經(jīng)過了各個(gè)前置技術(shù)的發(fā)展、迭代、結(jié)合而成,故逐一闡述
- 2017年之前早已有之的一些數(shù)學(xué)/AI/RL等基礎(chǔ)技術(shù),比如微積分、概率統(tǒng)計(jì)、最優(yōu)化、策略梯度、TRPO算法(2015年提出)
- 2017年6月OpenAI聯(lián)合DeepMind首次正式提出的:Deep Reinforcement Learning from Human Preferences,簡稱RLHF
- 2017年7月的OpenAI團(tuán)隊(duì)提出的對TRPO算法的改進(jìn):PPO算法
| 關(guān)于RL所需的微積分/概率統(tǒng)計(jì)基礎(chǔ)修訂在了《概率統(tǒng)計(jì)極簡入門:通俗理解微積分/期望方差/正態(tài)分布前世今生(23修訂版)》 |
| 關(guān)于RL所需的最優(yōu)化基礎(chǔ)修訂在了《一文通透優(yōu)化算法:從梯度下降、SGD到牛頓法、共軛梯度(23修訂版)》 |
| 關(guān)于RL、策略梯度、TRPO、PPO則寫在了此文《強(qiáng)化學(xué)習(xí)極簡入門:通俗理解MDP、DP MC TC和值函數(shù)、策略梯度、PPO》 |
- 2017年6月的Transformer/Self-Attention
關(guān)于transformer/self-attention,除了本文,更可以看下上篇《Transformer通俗筆記:從Word2Vec、Seq2Seq逐步理解到GPT、BERT》
? - 2018年6月的GPT(Generative Pre-trained Transformer),其關(guān)鍵構(gòu)成是基于Transformer-Decoder的Masked Self-Attention
- 2019年2月的融合prompt learning的GPT2,prompt learning的意義在于不用微調(diào)也能做任務(wù)
- 2020年5月的GPT3,參數(shù)規(guī)模到了1750億,終于真正做到預(yù)訓(xùn)練之后不用再微調(diào)模式,通過In-context learning(簡稱ICL)開啟prompt新范式,且你可能沒想到的是,這一年的9月份OpenAI已經(jīng)開始研究GPT3與RLHF的結(jié)合了,且此時(shí)用的策略優(yōu)化方法為PPO
? - 2021年7月的Codex,通過對GPT3進(jìn)行大量的代碼訓(xùn)練迭代而出Codex,從而具備代碼/推理能力
- 2021年9月Google提出的FLAN大模型:基于指令微調(diào)技術(shù)Instruction Fine-Tuning (IFT)
- 2022年1月的Google研究者提出的思維鏈技術(shù)(Chain of Thought,簡稱CoT)
? - 2022年3月的OpenAI正式發(fā)布instructGPT:GPT3 + instruction tuning + RLHF + PPO,其中,instruction tuning和prompt learning的核心區(qū)別在于instruction tuning會(huì)提供更多的指令引導(dǎo)模型輸出更符合預(yù)期的結(jié)果,例如
提示學(xué)習(xí):給女朋友買了這個(gè)項(xiàng)鏈,她很喜歡,這個(gè)項(xiàng)鏈太____了
指令微調(diào):判斷這句話的情感:給女朋友買了這個(gè)項(xiàng)鏈,她很喜歡。選項(xiàng):A=好;B=一般;C=差
你也可以暫簡單理解instruction tuning為帶人類指令的prompting - 2021年第4季度逐步發(fā)展而來的GPT3.5,并于22年不斷融合Codex、InstructGPT的技術(shù)能力
- 2022年11月的ChatGPT:語言模型層面的核心架構(gòu)是GPT3.5(基于Transformer-Decoder的Masked Self-Attention且融合了Codex的代碼/推理能力、instruction tuning等技術(shù)) + RLHF + PPO3
? - 2023年3月中旬,OpenAI正式對外發(fā)布GPT-4,增加了多模態(tài)(支持圖片的輸入形式),且ChatGPT底層的語言模型直接從GPT3.5升級到了GPT4
如你所見,自從1.6日開始寫ChatGPT筆記,1.15日發(fā)布本文,但為把ChatGPT背后所涉及的關(guān)鍵技術(shù)闡述細(xì)致、透徹,故本文越寫越長,長到最后成了一個(gè)系列,有的內(nèi)容抽離出去獨(dú)立成文,有的還在不斷完善
第一部分 從RL、策略梯度到TRPO、PPO算法、RLHF
再次強(qiáng)調(diào)說明下,本第一部分在23年2.10日有個(gè)重要修改
- 2.10日之前,考慮到本文的主旨核心ChatGPT用到了RLHF和PPO,所以本文的第一部分從強(qiáng)化學(xué)習(xí)講到PPO算法,畢竟雖然只是想重點(diǎn)介紹下PPO,但寫到最后還是把PPO所有相關(guān)的前置知識(shí)都細(xì)致介紹了個(gè)遍,不然,總感覺有細(xì)節(jié)沒交待而不夠透徹
- 2.10日之后,又考慮到有些朋友可能對RL細(xì)節(jié)有所了解,或者更多希望整體了解ChatGPT整體架構(gòu)而暫不細(xì)究其所用的策略迭代算法PPO的前置技術(shù)、RL細(xì)節(jié)
綜上,為兼顧兩者,且加之為避免本文篇幅過長而影響完讀率,故把下面原先第一部分的大部分內(nèi)容抽取出來放到了新一篇RL筆記里進(jìn)一步細(xì)致闡述:強(qiáng)化學(xué)習(xí)極簡入門:通俗理解MDP、DP MC TC和Q學(xué)習(xí)、策略梯度、PPO
第一部分 RL基礎(chǔ):什么是RL與MRP、MDP
1.1 入門強(qiáng)化學(xué)習(xí)所需掌握的基本概念
- 1.1.1?什么是強(qiáng)化學(xué)習(xí):依據(jù)策略執(zhí)行動(dòng)作-感知狀態(tài)-得到獎(jiǎng)勵(lì)
- 1.1.2 RL與監(jiān)督學(xué)習(xí)的區(qū)別和RL方法的分類
1.2 什么是馬爾科夫決策過程
- 1.2.1 MDP的前置知識(shí):隨機(jī)過程、馬爾可夫過程、馬爾可夫獎(jiǎng)勵(lì)
- 1.2.2 馬爾可夫決策過程(MDP):馬爾可夫獎(jiǎng)勵(lì)(MRP) + 智能體動(dòng)作因素
第二部分 RL進(jìn)階之三大表格求解法:DP、MC、TD
2.1 動(dòng)態(tài)規(guī)劃法
- 2.1.1 什么是動(dòng)態(tài)規(guī)劃
- 2.1.2 通過動(dòng)態(tài)規(guī)劃法求解最優(yōu)策略
2.2 蒙特卡洛法
2.3 時(shí)序差分法及與DP、MC的區(qū)別
第三部分 價(jià)值學(xué)習(xí):從n步Sarsa算法到Q-learning、DQN
3.1 TD(0)控制/Sarsa(0)算法與TD(n)控制/n步Sarsa算法
3.2 Q-learning
- 3.2.1 重要性采樣:讓同策略完成到異策略的轉(zhuǎn)變
- 3.2.2?Sarsa算法與Q-learning更新規(guī)則的對比
3.3 DQN
第四部分 策略學(xué)習(xí):從策略梯度、Actor-Criti到TRPO、PPO算法
4.1 策略梯度與其突出問題:采樣效率低下
- 4.1.1 什么是策略梯度和梯度計(jì)算/更新的流程
- 4.1.2 避免采樣的數(shù)據(jù)僅能用一次:重要性采樣(為采樣q解決p從而增加重要性權(quán)重)
4.2 優(yōu)勢演員-評論家算法(Advantage Actor-Criti):為避免獎(jiǎng)勵(lì)總為正增加基線
4.3 基于信任區(qū)域的TRPO:加進(jìn)KL散度解決兩個(gè)分布相差大或步長難以確定的問題
1.4 近端策略優(yōu)化PPO:解決TRPO的計(jì)算量大的問題
如上所述,PPO算法是針對TRPO計(jì)算量的大的問題提出來的,正因?yàn)镻PO基于TRPO的基礎(chǔ)上改進(jìn),故PPO也解決了策略梯度不好確定學(xué)習(xí)率Learning?rate?(或步長Step?size)?的問題
畢竟通過上文,我們已經(jīng)得知
具體做法是,PPO算法有兩個(gè)主要的變種:近端策略優(yōu)化懲罰(PPO-penalty)和近端策略優(yōu)化裁剪(PPO-clip),其中PPO-penalty和TRPO一樣也用上了KL散度約束。
近端策略優(yōu)化懲罰PPO-penalty的流程如下
首先,明確目標(biāo)函數(shù),咱們需要優(yōu)化,讓其最大化
『注:如果你想仔細(xì)摳接下來各種公式但一上來就被上面這個(gè)弄迷糊了,說明還是需要先看下上文說過的這篇RL極簡入門,而一旦踏入RL,便得做好兩萬五千里的準(zhǔn)備,當(dāng)然,如果只是想了解ChatGPT背后大概的技術(shù)原理,可以不用細(xì)摳PPO的公式怎么來的,不影響你對ChatGPT整體架構(gòu)的理解,且下文會(huì)講其在ChatGPT中是如何運(yùn)用的』
接下來,先初始化一個(gè)策略的參數(shù),在每一個(gè)迭代里面,我們用前一個(gè)訓(xùn)練的迭代得到的actor的參數(shù)與環(huán)境交互,采樣到大量狀態(tài)-動(dòng)作對,?根據(jù)交互的結(jié)果,估測
所以需要最后使用 PPO 的優(yōu)化公式:
當(dāng)然,也可以把上述那兩個(gè)公式合二為一『如此可以更直觀的看出,PPO-penalty把KL散度約束作為懲罰項(xiàng)放在了目標(biāo)函數(shù)中(可用梯度上升的方法去最大化它),此舉相對TRPO減少了計(jì)算量』
上述流程有一個(gè)細(xì)節(jié)并沒有講到,即是怎么取值的呢,事實(shí)上,是可以動(dòng)態(tài)調(diào)整的,故稱之為自適應(yīng)KL懲罰(adaptive KL penalty),具體而言
- 先設(shè)一個(gè)可以接受的 KL 散度的最大值
假設(shè)優(yōu)化完以后,KL 散度值太大導(dǎo)致,意味著?與差距過大(即學(xué)習(xí)率/步長過大),也就代表后面懲罰的項(xiàng)懲罰效果太弱而沒有發(fā)揮作用,故增大懲罰把增大 - 再設(shè)一個(gè) KL 散度的最小值
如果優(yōu)化完以后,KL散度值比最小值還要小導(dǎo)致,意味著?與??差距過小,也就代表后面這一項(xiàng)的懲罰效果太強(qiáng)了,我們怕它只優(yōu)化后一項(xiàng),使與??一樣,這不是我們想要的,所以減小懲罰即減小
總之,近端策略優(yōu)化懲罰可表示為
當(dāng)然,如果覺得計(jì)算 KL散度很復(fù)雜,則還有一個(gè)PPO2算法,即近端策略優(yōu)化裁剪PPO-clip,詳見RL極簡入門一文
1.5?模仿學(xué)習(xí)(逆強(qiáng)化學(xué)習(xí))思路下的RLHF:從人類反饋中學(xué)習(xí)
1.5.1 什么是模仿學(xué)習(xí)(逆強(qiáng)化學(xué)習(xí))
雖然RL理論上雖不需要大量標(biāo)注數(shù)據(jù),但實(shí)際上它所需求的reward會(huì)存在缺陷:
比如游戲AI中,reward的制定非常困難,可能要制定成百上千條游戲規(guī)則,這并不比標(biāo)注大量數(shù)據(jù)來得容易,又比如自動(dòng)駕駛的多步?jīng)Q策(sequential decision)場景中,學(xué)習(xí)器很難頻繁地獲得reward,容易累計(jì)誤差導(dǎo)致一些嚴(yán)重的事故
再比如聊天機(jī)器人方面,不好定義什么是好的對話、什么是不好的對話,當(dāng)然,對此可以收集很多人類的對話當(dāng)做范例,如此,模仿學(xué)習(xí)思路下的從人來反饋中學(xué)習(xí)(對應(yīng)論文為:Deep Reinforcement Learning from Human Preferences 2017,簡稱RLHF)應(yīng)運(yùn)而生
RLHF試圖解決的問題是,在獎(jiǎng)勵(lì)函數(shù)不夠明確的情況下,通過基于人類對事物比較的偏好而非絕對獎(jiǎng)勵(lì)值訓(xùn)練獎(jiǎng)勵(lì)函數(shù)
模仿學(xué)習(xí)的思路是不讓模型在人類制定的規(guī)則下自己學(xué)習(xí),而是讓模型模仿人類的行為。而逆強(qiáng)化學(xué)習(xí)就是模仿學(xué)習(xí)的其中一種,何謂逆強(qiáng)化學(xué)習(xí)呢?
- 原來的強(qiáng)化學(xué)習(xí)里,有Environment和Reward Model(由獎(jiǎng)勵(lì)函數(shù)推出什么樣的策略/動(dòng)作是最好的),但逆強(qiáng)化學(xué)習(xí)沒有獎(jiǎng)勵(lì)函數(shù),只有一些人類/專家的示范,怎么辦呢
- 可以通過人類標(biāo)注數(shù)據(jù)訓(xùn)練得到Reward Model(相當(dāng)于有了人類標(biāo)注數(shù)據(jù),則相信它是不錯(cuò)的,然后反推人類因?yàn)槭裁礃拥莫?jiǎng)勵(lì)函數(shù)才會(huì)采取這些行為)
- 有了獎(jiǎng)勵(lì)函數(shù)之后,就可以使用一般的強(qiáng)化學(xué)習(xí)的方法去找出最優(yōu)策略/動(dòng)作
1.5.2?RLHF:從人類反饋中學(xué)習(xí)
實(shí)際上,RLHF(Reinforcement Learning with Human Feedback)這一概念最早是在2008年《TAMER:Training an Agent Manually via Evaluative Reinforcement》一文中被提及的
在2017年前后,深度強(qiáng)化學(xué)習(xí)(Deep Reinforcement Learning)逐漸發(fā)展并流行起來,如你所見,2017年6月由OpenAI聯(lián)合Google DeepMind一塊推出《Deep Reinforcement Learning from Human Preferences》,也簡稱RLHF
當(dāng)讓一個(gè)強(qiáng)化學(xué)習(xí)智能體探索環(huán)境并與之交互(比如Atari游戲),RLHF的核心步驟如下圖所示:
再之后,OpenAI團(tuán)隊(duì)通過下述兩篇論文進(jìn)一步闡述了RLHF
- Fine-Tuning Language Models from Human Preferences?(Zieglar et al. 2019)
在Reward model的訓(xùn)練中,我們需要人的參與,human labelers給policy模型生成的文本打分,這個(gè)分?jǐn)?shù)作為reward model學(xué)習(xí)的標(biāo)簽 Reward mode訓(xùn)練好后,那么在訓(xùn)練policy model時(shí),Reward model便可以完全取代human labeler打分,分?jǐn)?shù)作為信號(hào)傳給policy model,再利用OpenAI默認(rèn)的策略優(yōu)化算法PPO來訓(xùn)練 - Learning to summarize with human feedback?(Stiennon et al., 2020)
如你所見,OpenAI團(tuán)隊(duì)在2020年9月的這篇論文里就已經(jīng)提出了類似instructGPT/ChatGPT的訓(xùn)練模式: 1 根據(jù)人工標(biāo)注數(shù)據(jù)微調(diào)監(jiān)督模型
所謂微調(diào),即指當(dāng)我們預(yù)訓(xùn)練出一個(gè)語言模型后,為了更好的讓它完成咱們手頭上的任務(wù),會(huì)通過一定的樣例/樣本對該模型的參數(shù)做一定的調(diào)整或適配
2 訓(xùn)練一個(gè)獎(jiǎng)勵(lì)函數(shù)(下文會(huì)詳述reward的這個(gè)損失函數(shù),這里暫且做個(gè)粗略理解,即相當(dāng)于reward不再是人直接給了,而是用高質(zhì)量標(biāo)注訓(xùn)練一個(gè)好的reward模型) 3 有了reward,接下來便可以通過PPO優(yōu)化原始監(jiān)督模型的策略(下文也會(huì)詳細(xì)闡述這個(gè)公式)
第二部分 從GPT/GPT2/GPT3到GPT3.5/GPT4:微調(diào)到prompt學(xué)習(xí)的過渡
2.1 GPT:基于Transformer Decoder預(yù)訓(xùn)練 + 微調(diào)/Finetune
NLP自發(fā)展以來,先后經(jīng)歷了4種任務(wù)處理范式
具體而言,即手工設(shè)計(jì)一系列特征模板,來輸入模型。模型對任務(wù)的處理結(jié)果高度依賴于特征模板的設(shè)計(jì),同時(shí)也高度依賴領(lǐng)域?qū)<业闹R(shí)。舉個(gè)例子,比如對于條件隨機(jī)場CRF模型,業(yè)界甚至有一個(gè)專門的庫CRF++幫助自動(dòng)生成大量的隨機(jī)模板然后輸入模型進(jìn)行訓(xùn)練,從而避免對領(lǐng)域?qū)<业倪^度依賴
神經(jīng)網(wǎng)絡(luò)學(xué)派開始流行以后,處理范式基本基本是預(yù)訓(xùn)練后的詞嵌入表征 + 模型架構(gòu)的調(diào)整,在這個(gè)時(shí)期,一方面的工作在詞嵌入上,比如NNLM/CBOW/SKIP/GRAM/GLOVE/ELMO等,另一方面的工作則在模型架構(gòu)上,比如BI-LSTM/SEQ2SEQ架構(gòu)在神經(jīng)機(jī)器翻譯領(lǐng)域NMT的應(yīng)用等
相比于第二范式而言,第三范式的優(yōu)點(diǎn)在于更進(jìn)一步減少了人工的參與,不再需要對于每個(gè)任務(wù)采取不同的模型架構(gòu),而是在超大的文本數(shù)據(jù)集上預(yù)訓(xùn)練一個(gè)具備泛化能力的通用的模型,然后再根據(jù)下游任務(wù)本身的特點(diǎn)對模型進(jìn)行針對性的微調(diào)即可,使得一個(gè)模型解決多種任務(wù)成為可能,比如GPT1模型
在這個(gè)過程我們往往不對預(yù)訓(xùn)練語言模型改動(dòng)太多,我們希望是通過對合適prompt的利用將下游任務(wù)建模的方式重新定義,這則是GPT2、GPT3的特點(diǎn)
2.1.1 GPT = Multi-Head Attention層 + Feed forward層 + 求和與歸一化的前置LN層 + 殘差
GPT由openAI在2018年通過此論文“Improving Language Understanding by Generative Pre-Training”提出,在GPT 被提出之前
故如何利用容易獲取的大規(guī)模無標(biāo)注數(shù)據(jù)來為模型的訓(xùn)練提供指導(dǎo)成為亟待解決的第一個(gè)問題
因此如何將從大規(guī)模無標(biāo)注數(shù)據(jù)上學(xué)習(xí)到的表征應(yīng)用到不同的下游任務(wù)成為亟待解決的第二個(gè)問題
在上一篇Transformer筆記中,我們已經(jīng)了解到:GPT是“Generative Pre-Training Transformer”的簡稱,從名字看其含義是指的生成式的預(yù)訓(xùn)練,它和BERT都是(無監(jiān)督)預(yù)訓(xùn)練-(監(jiān)督)微調(diào)模式的典型代表
- 第一階段,在未標(biāo)記數(shù)據(jù)上使用語言建模目標(biāo)來學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)模型的初始參數(shù)
- 第二階段,針對目標(biāo)任務(wù)使用相應(yīng)的標(biāo)記數(shù)據(jù)對這些參數(shù)進(jìn)行微調(diào)
之所以叫微調(diào)是因?yàn)樵谶@個(gè)階段用的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)小于第一階段,并且基本沒有更改模型架構(gòu)和引入過多新的參數(shù)
由于Decoder具備文本生成能力,故作為側(cè)重生成式任務(wù)的GPT選擇了Transformer Decoder部分作為核心架構(gòu)
不過,與原始的Transformer Decoder相比,GPT所用的結(jié)構(gòu)刪除了Encoder-Decoder Attention,只保留了多頭注意力層Multi-Head Attention層和前饋神經(jīng)網(wǎng)絡(luò)Feed forward層,最后再加上求和與歸一化的前置LN層 + 殘差
通過這樣的結(jié)構(gòu),GPT便可以利用無標(biāo)注的自然語言數(shù)據(jù)進(jìn)行訓(xùn)練:根據(jù)給定的前個(gè)token,預(yù)測第??個(gè)token,訓(xùn)練過程中使用的是基于最大似然估計(jì)的損失函數(shù),即讓模型預(yù)測的概率分布盡可能接近實(shí)際下一個(gè)單詞的分布
其中的關(guān)鍵便是這個(gè)Masked Self-Attention,模型通過自注意力機(jī)制可以學(xué)習(xí)序列中不同位置之間的依賴關(guān)系,即在處理每個(gè)位置的信息時(shí),模型會(huì)考慮序列中和該位置的信息有關(guān)聯(lián)的其他所有位置上的信息,這種機(jī)制使得模型能夠有效地處理長距離依賴關(guān)系
2.1.2 什么是Self-Attention與Masked Self-Attention
所謂自注意力,即指當(dāng)我們需要用到自注意力編碼單詞的時(shí)候,會(huì)按下面幾個(gè)步驟依次處理(配圖來自此文)
之后對每個(gè)token都進(jìn)行上述同樣的三步操作,最終會(huì)得到每個(gè)token新的表示向量,新向量中包含該token的上下文信息,之后再將這些數(shù)據(jù)傳給Transformer組件的下一個(gè)子層:前饋神經(jīng)網(wǎng)絡(luò)
至于所謂Masked Self-Attention就是在處理當(dāng)前詞的時(shí)候看不到后面的詞。舉個(gè)例子,處理“it”的時(shí)候,注意力機(jī)制看不到“it”后面的詞,但會(huì)關(guān)注到“it”前面詞中的“a robot”,繼而注意力會(huì)計(jì)算三個(gè)詞“it”、“a”、“robot”的向量及其attention分?jǐn)?shù)的加權(quán)和
更多細(xì)節(jié)可以看下上篇BERT筆記(特別是此前還不了解Transformer的),或此文:圖解注意力機(jī)制
2.2 GPT2承1啟3:基于prompt嘗試舍棄微調(diào) 直接Zero-shot?Learning
雖然GPT1的預(yù)訓(xùn)練加微調(diào)的范式僅需要少量的微調(diào)和些許的架構(gòu)改動(dòng),但能不能有一種模型完全不需要對下游任務(wù)進(jìn)行適配就可以表現(xiàn)優(yōu)異?GPT2便是在往這個(gè)方向努力:不微調(diào)但給模型一定的參考樣例以幫助模型推斷如何根據(jù)任務(wù)輸入生成相應(yīng)的任務(wù)輸出
最終,針對小樣本/零樣本的N-shot Learning應(yīng)運(yùn)而生,分為如下三種
- Zero-shot?Learning?(零樣本學(xué)習(xí)),是指在沒有任何樣本/示例情況下,讓預(yù)訓(xùn)練語言模型完成特定任務(wù)
相當(dāng)于不再使用二階段訓(xùn)練模式(預(yù)訓(xùn)練+微調(diào)),而是徹底放棄了微調(diào)階段,僅通過大規(guī)模多領(lǐng)域的數(shù)據(jù)預(yù)訓(xùn)練,讓模型在Zero-shot?Learming的設(shè)置下自己學(xué)會(huì)解決多任務(wù)的問題,而且效果還不錯(cuò)(雖然GPT2通過Zero-shot?Learming在有些任務(wù)的表現(xiàn)上尚且還不如SOTA模型,但基本超越了一些簡單模型,說明潛力巨大),你說神不神奇?
這就好比以前我們剛開始學(xué)解題時(shí),聽老師講了一系列知識(shí)和方法之后,老師為了讓我們更好的解題,在正式答題考試之前,會(huì)先通過幾個(gè)樣題讓我們找找感覺,方便在樣題中微調(diào)或修正自己對所學(xué)知識(shí)/方法的理解
Zero-shot?Learming則相當(dāng)于沒有練手/預(yù)熱、沒有參考樣例/演示/范本,學(xué)完知識(shí)/方法之后直接答題! - One?shot?Learning?(單樣本學(xué)習(xí)),顧名思義,是指在只有一個(gè)樣本/示例的情況下,預(yù)訓(xùn)練語言模型完成特定任務(wù)
- Few-shot?Learning?(少樣本或小樣本學(xué)習(xí)),類似的,是指在只有少量樣本/示例的情況下,預(yù)訓(xùn)練語言模型完成特定任務(wù)
此外,只需將自然語言的任務(wù)示例和提示信息作為上下文輸入給GPT-2,它就可以在小樣本的情況下執(zhí)行任何NLP任務(wù),包括所謂的完形填空任務(wù),比如
假如我要判斷“我喜歡這個(gè)電影" 這句話的情感(“正面" 或者 "負(fù)面"),原有的任務(wù)形式是把他看成一個(gè)分類問題
輸入:我喜歡這個(gè)電影
輸出:“正面" 或者 "負(fù)面"
而如果用GPT2去解決的話,任務(wù)可以變成“完形填空",
輸入:我喜歡這個(gè)電影,整體上來看,這是一個(gè) __ 的電影
輸出:“有趣的" 或者 "無聊的"
加的這句提示“整體上來看,這是一個(gè) __ 的電影”對于讓模型輸出人類期望的輸出有很大的幫助。
這個(gè)所謂的提示用NLP的術(shù)語表達(dá)就是prompt,即給預(yù)訓(xùn)練語言模型的一個(gè)線索/提示,幫助它可以更好的理解人類的問題
例如有人忘記了某篇古詩,我們給予特定的提示,他就可以想起來,例如當(dāng)有人說:
大家自然而然地會(huì)想起來下一句詩:黃河入海流
亦或者,搜索引擎,可以根據(jù)我們的輸入,進(jìn)行輸出的提示:
2.3 GPT3:In-context learning正式開啟prompt新范式(小樣本學(xué)習(xí))
2.3.1 GPT3在0樣本、單樣本、小樣本下的突出能力
GPT3簡單來說,就是規(guī)模大、有錢多金、效果出奇好,具體而言,它的參數(shù)規(guī)模達(dá)到了1750億,并且使用45TB數(shù)據(jù)進(jìn)行訓(xùn)練,其預(yù)訓(xùn)練任務(wù)就是“句子接龍”,給定前文持續(xù)預(yù)測下一個(gè)字,而且更為關(guān)鍵的是,在小樣本的情況下,其性能表現(xiàn)一度超越SOTA模型
為形象描述,舉一個(gè)GPT3在0樣本、單樣本、少量樣本下的機(jī)器翻譯使用范例,如下圖
- 圖中右側(cè)是普通模型微調(diào)的過程,模型通過大量訓(xùn)練預(yù)料進(jìn)行訓(xùn)練,然后基于特定的任務(wù)數(shù)據(jù)進(jìn)行梯度迭代更新(gradient update),訓(xùn)練至收斂后的模型才具備良好的翻譯能力
- 圖中左側(cè)是GPT3分別在0樣本(只給出任務(wù)描述)、單樣本(只給出任務(wù)描述+一個(gè)翻譯樣本)、小樣本(給出任務(wù)描述+少量樣本)的情況下所展示出的能力
一方面,單樣本也好 小樣本也好,更多只是作為例子去提示模型,模型不利用樣本做訓(xùn)練,即不做模型參數(shù)的任何更新
二方面,人們一度驚訝于其在0樣本下如此強(qiáng)大的學(xué)習(xí)能力,使得很多人去研究背后的n Context Learning
畢竟,我們知道普通模型微調(diào)的原理:拿一些例子當(dāng)作微調(diào)階段的訓(xùn)練數(shù)據(jù),利用反向傳播去修正LLM的模型參數(shù),而修正模型參數(shù)這個(gè)動(dòng)作,確實(shí)體現(xiàn)了LLM從這些例子學(xué)習(xí)的過程
但是,In Context Learning只是拿出例子讓LLM看了一眼,并沒有根據(jù)例子,用反向傳播去修正LLM模型參數(shù)的動(dòng)作,就要求它去預(yù)測新例子
此舉意味著什么呢?
1?既然沒有修正模型參數(shù),這意味著LLM并未經(jīng)歷一個(gè)修正過程,相當(dāng)于所有的舉一反三和推理/推斷的能力在上一階段預(yù)訓(xùn)練中便已具備(或許此舉也導(dǎo)致參數(shù)規(guī)模越來越大),才使得模型在面對下游任務(wù)時(shí) 不用微調(diào)、不做梯度更新或參數(shù)更新,且換個(gè)角度講,如此巨大規(guī)模的模型想微調(diào)參數(shù)其門檻也太高了
2 預(yù)訓(xùn)練中 好的預(yù)訓(xùn)練數(shù)據(jù)非常重要,就好比讓模型在0樣本下翻譯英語到法語,那預(yù)訓(xùn)練數(shù)據(jù)中 必然有大量英語、法語的文本數(shù)據(jù)
3 抓什么樣的數(shù)據(jù) 多大規(guī)模 怎么喂給模型等等一系列工程細(xì)節(jié),這塊是導(dǎo)致很多模型效果有差距的重要原因之一
2.3.2?In Context Learning(ICL)背后的玄機(jī):隱性微調(diào)?
零樣本下 模型沒法通過樣本去學(xué)習(xí)/修正,但即便是少樣本下,也有工作試圖證明In Context Learning并沒有從樣本中學(xué)習(xí),比如“Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?”,它發(fā)現(xiàn)了:
比如下圖中,無論是分類任務(wù)(圖中上部分),還是多項(xiàng)選擇任務(wù)(圖中下部分),隨機(jī)標(biāo)注設(shè)置下(紅)模型表現(xiàn)均和正確標(biāo)注(黃)表現(xiàn)相當(dāng),且明顯超過沒有in-context樣本的zero-shot設(shè)置(藍(lán)) 這起碼說明了一點(diǎn):In Context Learning并沒有提供給LLM那個(gè)從映射到 的映射函數(shù)信息:,否則的話你亂換正確標(biāo)簽,肯定會(huì)擾亂這個(gè) 映射函數(shù),也就是說,In Context Learning并未學(xué)習(xí)這個(gè)輸入空間到輸出空間的映射過程
總之,這個(gè)工作證明了In Context Learning并未學(xué)習(xí)映射函數(shù),但是輸入和輸出的分布很重要,這兩個(gè)不能亂改
有些工作認(rèn)為LLM還是從給出的示例學(xué)習(xí)了這個(gè)映射函數(shù),不過是種隱式地學(xué)習(xí)
- 比如“What learning algorithm is in-context learning? Investigations with linear models”認(rèn)為Transformer能夠隱式地從示例中學(xué)習(xí) 到 的映射過程,它的激活函數(shù)中包含了一些簡單映射函數(shù),而LLM通過示例能夠激發(fā)對應(yīng)的那一個(gè)
- 而“Why Can GPT Learn In-Context? Language Models Secretly Perform Gradient Descent as Meta-Optimizers”這篇文章則將ICL看作是一種隱式的Fine-tuning
2.4 Prompt技術(shù)的升級與創(chuàng)新:指令微調(diào)技術(shù)(IFT)與思維鏈技術(shù)(CoT)
2.4.2 Google提出FLAN大模型:基于指令微調(diào)技術(shù)Instruction Fine-Tuning (IFT)
OpenAI的GPT3雖然不再微調(diào)模型(pre-training + prompt),但Google依然堅(jiān)持預(yù)訓(xùn)練 + 微調(diào)的模式
2021年9月,谷歌的研究者們在此篇論文中《Finetuned Language Models Are Zero-Shot Learners》提出了基于Instruction Fine-Tuning(指令微調(diào),簡稱IFT)的FLAN大模型,極大地提升了大語言模型的理解能力與多任務(wù)能力,且其在很多任務(wù)上的零樣本學(xué)習(xí)能力超過GPT3(畢竟指令微調(diào)的目標(biāo)之一即是致力于improving zero-shot generalization to tasks that were not seen in training),最終達(dá)到的效果就是:遵循人類指令,舉一反三地完成任務(wù)
有兩點(diǎn)值得注意的是
We take a pretrained language model of 137B parameters and perform instruction tuning—finetuning the model on a mixture of more than 60 NLP datasets expressed via natural language instructions.
We refer to this resulting model as FLAN, for Finetuned Language Net
至于IFT的數(shù)據(jù)通常是由人工手寫指令和語言模型引導(dǎo)的指令實(shí)例的集合,這些指令數(shù)據(jù)由三個(gè)主要組成部分組成:指令、輸入和輸出,對于給定的指令,可以有多個(gè)輸入和輸出實(shí)例
相比于GPT-3,且區(qū)別在于Finetune,FLAN的核心思想是,當(dāng)面對給定的任務(wù)A時(shí),首先將模型在大量的其他不同類型的任務(wù)比如B、C、D...上進(jìn)行微調(diào),微調(diào)的方式是將任務(wù)的指令與數(shù)據(jù)進(jìn)行拼接(可以理解為一種Prompt),隨后給出任務(wù)A的指令,直接進(jìn)行推斷,如下圖所示
例如,我們的最終目標(biāo)是推理任務(wù)
在面對翻譯任務(wù)時(shí)可以給出指令“請把這句話翻譯成西班牙語”
在面對常識(shí)推理任務(wù)時(shí)可以給出指令“請預(yù)測下面可能發(fā)生的情況”
相當(dāng)于通過指令微調(diào)之后,模型可以更好的做之前預(yù)訓(xùn)練時(shí)沒見過的新任務(wù)且降低了對prompt的敏感度(某些場景下不一定非得設(shè)計(jì)特定prompt才能激發(fā)模型更好的回答),這或許也啟發(fā)了OpenAI重新注意到了微調(diào)這一模式,從而在InstructGPT中針對GPT3做Supervised fine-tuning(簡稱SFT,某種意義上可以認(rèn)為是做指令微調(diào))
2.4.1 基于思維鏈(Chain-of-thought)技術(shù)下的prompt
為讓大語言模型進(jìn)一步具備解決數(shù)學(xué)推理問題的能力,22年1月,谷歌大腦團(tuán)隊(duì)的Jason Wei、Xuezhi Wang等人提出了最新的Prompting機(jī)制——Chain of Thought(簡稱CoT),簡言之就是給模型推理步驟的prompt,讓其學(xué)習(xí)人類如何一步步思考/推理,從而讓模型具備基本的推理能力,最終可以求解一些簡單甚至相對復(fù)雜的數(shù)學(xué)推理能力
以下是一個(gè)示例(下圖左側(cè)為standard prompting,下圖右側(cè)為基于Cot的prompt,高亮部分為chain-of-thought),模型在引入基于Cot技術(shù)的prompt的引導(dǎo)下,一步一步算出了正確答案,有沒有一種眼前一亮的感覺?相當(dāng)于模型具備了邏輯推理能力
那效果如何呢,作者對比了標(biāo)準(zhǔn)prompting、基于Cot技術(shù)的prompting分別在這三個(gè)大語言模型LaMDA、GPT、PaLM(除了GPT由openAI發(fā)布,另外兩個(gè)均由Google發(fā)布)上的測試結(jié)果,測試發(fā)現(xiàn):具有540B參數(shù)的PaLM模型可以在一個(gè)代表小學(xué)水平的數(shù)學(xué)推理問題集GSM8K(GSM8K最初由OpenAI于2021年10月提出)上的準(zhǔn)確率達(dá)到了60.1%左右
很快,這項(xiàng)技術(shù)引起了很多人的關(guān)注,比如不論是few-shot還是zero-shot,在加入Cot技術(shù)之后,都能回答此前不能回答的某些數(shù)學(xué)推理問題,甚至出現(xiàn)了風(fēng)靡一時(shí)的“l(fā)et's think step by step”的梗(通過該條語句可以激發(fā)模型的推理能力)
2.5 GPT3到GPT3.5:從instructGPT到ChatGPT的迭代過程
據(jù)OpenAI官網(wǎng)對GPT3.5的介紹,GPT3.5從2021年第四季度開始就混合使用文本和代碼進(jìn)行訓(xùn)練,我們來看下GPT3.5的各個(gè)系列模型及其各自的發(fā)展演變脈絡(luò)圖
基于GPT3的發(fā)展路線:一條是側(cè)重代碼/推理的Codex,一條側(cè)重理解人類的instructGPT
- 第一條線:為了具備代碼/推理能力:GPT3 + 代碼訓(xùn)練 = Codex
2020 年5-6月,OpenAI先后發(fā)布了
GPT3的論文《Language Models are Few-Shot Learners》
GPT-3的最大規(guī)模的版本——175B(1750億參數(shù))大小的API?Davinci(有著2048個(gè)詞的上下文窗口),此時(shí)的GPT3還只能寫一些簡單的代碼和做一些簡單的數(shù)學(xué)題
2021 年7月,OpenAI發(fā)布Codex的論文《Evaluating Large Language Models Trained on Code》,其中初始的Codex是根據(jù)120億參數(shù)的GPT-3變體進(jìn)行微調(diào)的,且通過對159GB的Python代碼進(jìn)行代碼訓(xùn)練
后來這個(gè)120 億參數(shù)的模型演變成OpenAI API中的code-cushman-001,且大眾意外的發(fā)現(xiàn),它具備較強(qiáng)的代碼/推理能力
代碼能力好理解,通過大量的代碼訓(xùn)練,但其推理能力是如何獲取到的呢,其中關(guān)鍵在于很多代碼是為了解決數(shù)學(xué)推理問題,訓(xùn)練中可以用『類似后續(xù)22年年初Google一些研究者定義的CoT技術(shù)』獲取推理能力,當(dāng)然,此時(shí)文本上的能力尚且偏弱 - 第二條線:為了更好理解人類:GPT3 + 指令學(xué)習(xí) + RLHF = instructGPT
上文第一部分已經(jīng)提到過,根據(jù)OpenAI的這篇論文《Learning to summarize with human feedback (Stiennon et al., 2020)》可知,2020年openAI便再研究GPT3與RLHF的結(jié)合了,但此時(shí)還是會(huì)經(jīng)常一本正經(jīng)的胡說八道,且很容易輸出負(fù)面甚至帶有危害的內(nèi)容(畢竟人類言論中存在不少不友好的言論)
在OpenAI于2021年徹底加強(qiáng)Codex之后,終于有時(shí)間解決模型與人類對話的問題了,于是在2022年3月,OpenAI發(fā)布遵循人類指令學(xué)習(xí)的論文(指令學(xué)習(xí)可以認(rèn)為就是指令微調(diào)instruct tuning):Training language models to follow instructions with human feedback,這就是instructGPT,且把RLHF用得更好了
其核心API就是instruct-davinci-beta和text-davinci-001(當(dāng)然,文本上的能力不錯(cuò)但代碼/推理上的能力偏弱)
基于GPT3.5的發(fā)展路線:增強(qiáng)代碼/推理能力且更懂人類終于迭代出ChatGPT
- 首先,融合代碼/推理與理解人類的能力,且基于code-cushman-002迭代出text-davinci-002
2022年4月至7月,OpenAI開始對code-davinci-002(有著8192個(gè)token的上下文窗口)模型進(jìn)行Beta測試,也稱其為Codex(當(dāng)配備完善的思維鏈時(shí),其在GSM8K等數(shù)學(xué)測試數(shù)據(jù)上的表現(xiàn)十分優(yōu)異)
2022 年5-6月發(fā)布的text-davinci-002是一個(gè)基于code-davinci-002的有監(jiān)督指令微調(diào)(即在code-davinci-002基礎(chǔ)上加入supervised instruction tuning) 模型
在text-davinci-002上面進(jìn)行指令微調(diào)很可能降低了模型的上下文學(xué)習(xí)能力,但是增強(qiáng)了模型的零樣本能力(更懂人類) - 其次,為了進(jìn)一步理解人類:text-davinci-002 + RLHF =?text-davinci-003/ChatGPT
text-davinci-003、ChatGPT都是基于text-davinci-002基礎(chǔ)上改進(jìn)的基于人類反饋的強(qiáng)化學(xué)習(xí)的指令微調(diào)模型 (instruction tuning with reinforcement learning from human feedback)
text-davinci-003恢復(fù)了一些在text-davinci-002中丟失的部分上下文學(xué)習(xí)能力(比如在微調(diào)的時(shí)候混入了語言建模) 并進(jìn)一步改進(jìn)了零樣本能力(得益于RLHF,生成更加符合人類期待的反饋或者說模型與人類對齊)
至于ChatGPT則更不用說了,其對應(yīng)的API為gpt-3.5-turbo(由23年3.2日OpenAI最新發(fā)布)
??代碼/推理能力強(qiáng)大,考慮到Codex學(xué)習(xí)了大量的開源代碼,由此是不也能理解為何ChatGPT具備那么強(qiáng)大的編碼及debug能力了,且訓(xùn)練代碼中包含不少解決數(shù)學(xué)問題的代碼,加上對代碼注釋的學(xué)習(xí)(基于一些代碼和代碼描述的樣式/范例使用類似CoT這樣的技術(shù)學(xué)習(xí)),是不是也就能學(xué)會(huì)代碼背后的推理能力呢
? 而且理解人類的能力前所未有
2.6 ChatGPT初版與InstructGPT的差別:基于GPT3還是GPT3.5微調(diào)
通過OpenAI公布的ChatGPT訓(xùn)練圖可知,ChatGPT的訓(xùn)練流程與InstructGPT是一致的,差異只在于
- InstructGPT(有1.3B 6B 175B參數(shù)的版本),是在GPT-3(原始的GPT3有1.3B 2.7B 6.7B 13B 175B等8個(gè)參數(shù)大小的版本)上做Fine-Tune
- 22年11月份的初版ChatGPT是在GPT-3.5上做Fine-Tune
2.7 ChatGPT改進(jìn)版:底層語言模型從GPT3.5升級到GPT4
23年3月14日(國內(nèi)3.15凌晨),OpenAI正式對外發(fā)布GPT4,之前訂閱ChatGPT plus版的可以直接體驗(yàn)GPT4
根據(jù)OpenAI官網(wǎng)發(fā)布的《GPT-4 Technical Report》可知?
“GPT-4 is a Transformer-style model pre-trained to predict the next token in a document, using both publicly available data (such as internet data) and data licensed from third-party providers. The model was then fine-tuned using Reinforcement Learning from Human Feedback (RLHF)”
RLHF的作用在于
對于某些特定任務(wù),The GPT-4 base model is only slightly better at this task than GPT-3.5; however, after RLHF post-training we observe large improvements over GPT-3.5
RBRMs相當(dāng)于是零樣本下GPT-4的決策依據(jù)或者分類器
這些分類器在RLHF微調(diào)期間為GPT-4策略模型提供了額外的獎(jiǎng)勵(lì)信號(hào),以生成正確回答為目標(biāo),從而拒絕生成有害內(nèi)容
第三部分 InstructGPT/ChatGPT訓(xùn)練三階段及多輪對話能力
3.1?InstructGPT訓(xùn)練三階段
3.1.1 ChatGPT的前身之InstructGPT:基于RLHF手段微調(diào)的GPT
根據(jù)InstructGPT的原始論文可知,InstructGPT的訓(xùn)練分為三個(gè)階段(總體上結(jié)合了無監(jiān)督預(yù)訓(xùn)練、有監(jiān)督微調(diào)、強(qiáng)化學(xué)習(xí)(RLHF),先是有監(jiān)督微調(diào)“經(jīng)過無監(jiān)督預(yù)訓(xùn)練好的GPT”,然后基于人類偏好訓(xùn)練一個(gè)獎(jiǎng)勵(lì)函數(shù),最終在最大化獎(jiǎng)勵(lì)函數(shù)的目標(biāo)下通過PPO算法來更新微調(diào)過的GPT3的參數(shù)):
階段1:利用人類的問答數(shù)據(jù)去對GPT3進(jìn)行有監(jiān)督訓(xùn)練出SFT模型(作為baseline)
首先,OpenAI是先設(shè)計(jì)了一個(gè)prompt dataset,里面有大量的提示樣本,給出了各種各樣的任務(wù)描述,其次,找了一個(gè)團(tuán)隊(duì)對這個(gè)prompt dataset進(jìn)行標(biāo)注(本質(zhì)就是人工回答問題)
最后,用這個(gè)13k大小的標(biāo)注好的數(shù)據(jù)集(問題-答案對)比如微調(diào)GPT3,這個(gè)微調(diào)好的GPT3我們稱之為SFT模型(監(jiān)督微調(diào),全稱Supervised fine-tuning,簡稱SFT),它作為baseline具備了最基本的預(yù)測能力
? 說白了,讓人類就一些問題寫出人工答案,再把這些問題和答案丟給模型學(xué)習(xí),這便是有監(jiān)督訓(xùn)練,但人類不可能針對所有問題都寫出答案給到模型(如果人類能把所有問題都標(biāo)注/回答了,那還要模型干嘛,^_^)
? 所以我們需要讓模型學(xué)到人類的喜愛偏好(訓(xùn)練出一個(gè)RM模型代替人類當(dāng)裁判,避免讓實(shí)驗(yàn)人員守在電腦前對模型吐出來的結(jié)果不停地打分)
? 繼而在遵循這種喜愛偏好下生成人類期待的答案,想達(dá)到這個(gè)效果就是得讓模型明確什么是更好的輸出,怎么明確?通過獎(jiǎng)懲!
階段2:通過RLHF的思路訓(xùn)練一個(gè)獎(jiǎng)勵(lì)模型RM
首先通過『移除了最后一層unembedding layer的上一階段的SFT模型』初始化出我們的RM模型,且最后大小縮減到6B
然后回答一個(gè)規(guī)模大小為33k的數(shù)據(jù)集的一些問題比如,接著針對每個(gè)問題收集4個(gè)不同的輸出從而獲取4個(gè)回答
可能有的讀者會(huì)疑問為何有多個(gè)輸出,原因在于模型每次預(yù)測一個(gè)詞都有對應(yīng)的概率,根據(jù)不同的概率大小可以采樣出很多答案,比如通過beam search保留k個(gè)當(dāng)前最優(yōu)的答案(beam search相當(dāng)于貪心算法的加強(qiáng)版,除了最好的答案外,還會(huì)保留多個(gè)比較好的答案供選擇)
接著人工對這4個(gè)回答的好壞進(jìn)行標(biāo)注且排序,排序的結(jié)果用來訓(xùn)練一個(gè)獎(jiǎng)勵(lì)模型RM,具體做法就是學(xué)習(xí)排序結(jié)果從而理解人類的偏好
但通過人來標(biāo)注/排序的結(jié)果訓(xùn)練出獎(jiǎng)勵(lì)模型之后怎么用呢,這就是訓(xùn)練階段3要做的事情
階段3:通過訓(xùn)練好的RM模型預(yù)測結(jié)果且通過PPO算法優(yōu)化模型策略
首先讓第一階段微調(diào)好的SFT模型初始化出一個(gè)PPO模型(可理解為帶著RL且初始版本為SFT的模型,后續(xù)通過PPO算法迭代策略。若不了解什么是RL的務(wù)必先看下本文第一部分強(qiáng)調(diào)過的:RL極簡入門)
然后去回答規(guī)模大小為31k且不帶人類任何標(biāo)注的一些問題比如
此時(shí)不再讓人工評估好壞,而是讓階段2訓(xùn)練好的獎(jiǎng)勵(lì)模型RM去給PPO模型的預(yù)測結(jié)果比如進(jìn)行打分進(jìn)而排序(看是否優(yōu)質(zhì),比如是否迎合人類偏好)
之后通過不斷更大化獎(jiǎng)勵(lì)而優(yōu)化PPO模型的生成策略(策略更好 回答更好),策略優(yōu)化的過程中使用PPO算法
最后,根據(jù)優(yōu)化后的策略再次生成??RM再評估 模型再優(yōu)化后再生成,如此循環(huán)進(jìn)行,直到策略最優(yōu)為止,更多細(xì)節(jié)下文詳述
值得一提的是,上文反反復(fù)復(fù)提到策略,那怎么理解這個(gè)經(jīng)常在RL中出現(xiàn)的“策略”呢,舉幾個(gè)例子
- 類似于一個(gè)人做事如果有好的策略或方法論,他便能有更好的行為或效率,從而把事情做更好
- 再比如一家公司如果有好的經(jīng)營策略,這家公司便能有更好的經(jīng)營結(jié)果,從而取得更好的業(yè)績
- 對于模型也是一樣的,如果它有更好的生成策略,它便能給人類提供更好的回答
此外,可能有讀者疑問,InstructGPT之所以使用RLHF的思路,只是為了訓(xùn)練獎(jiǎng)勵(lì)函數(shù)么?事實(shí)上,還有額外多方面的用途
以往的GPT訓(xùn)練,都是基于大量無標(biāo)注的語料,這些語料通常收集自充斥大量“行話”、“黑話”的互聯(lián)網(wǎng)中,這樣訓(xùn)練出來的語言模型,它可能會(huì)有虛假的、惡意的或者有負(fù)面情緒等問題的輸出
因此,通過人工干預(yù)微調(diào)GPT,使其輸出對用戶友好(避免亂說話),且更好的和人類對話,所以,對InstructGPT的簡單理解,可以是基于人類反饋的強(qiáng)化學(xué)習(xí)(RLHF)手段微調(diào)的GPT。
接下來,我們分別具體闡述上面的階段2、階段3。
3.1.2 instructGPT訓(xùn)練階段2:如何對多個(gè)輸出排序及如何訓(xùn)練RM模型
可能又有讀者有疑問了,即instructGPT中,人類對模型的多個(gè)輸出做個(gè)排序,為什么就能夠提供監(jiān)督信號(hào),或者說在訓(xùn)練RM時(shí)如何怎么做到loss的梯度回傳?
訓(xùn)練RM的核心是由人類對SFT生成的多個(gè)輸出(基于同一個(gè)輸入)進(jìn)行排序,再用來訓(xùn)練RM。按照模仿學(xué)習(xí)的定義,直觀上的理解可以是,RM在模仿人類對語句的排序思路,說白了,就是上文提到過的RLHF。
那么到底是如何模仿的呢,或者說如何實(shí)現(xiàn)梯度回傳?
這里我們代入一個(gè)場景,假設(shè)你向一個(gè)六歲小孩解釋什么是登陸月球或什么是RL,如下圖
針對這個(gè)損失函數(shù)需要逐一說明的是
有一點(diǎn)要提下的是,RLHF中的rank就好比監(jiān)督學(xué)習(xí)中的弱標(biāo)注——它并不提供直接的監(jiān)督信號(hào)。但通過學(xué)習(xí)簡單的排序,RM可以學(xué)到人類的偏好
為何是排序,而非直接打分呢,道理很簡單,排序相比打分更容易接近客觀事實(shí),即不同的標(biāo)注員,打分的偏好會(huì)有很大的差異(比如同樣一段精彩的文本,有人認(rèn)為可以打1.0,但有人認(rèn)為只能打0.8),而這種差異就會(huì)導(dǎo)致出現(xiàn)大量的噪聲樣本,若改成排序,則不同標(biāo)注員的排序一致性相比打分一致性就大大提升了
如此,通過這種形式的梯度回傳,RM逐漸學(xué)會(huì)了給D這類語句以高排名甚至打出一個(gè)高分,給A、B以低排名甚至打出一個(gè)低分,從而模仿到了人類偏好。到了這一步,不妨可以這么簡單理解RLHF:所謂的基于人類反饋的強(qiáng)化學(xué)習(xí),某種意義上來說,就是由人類的偏好來充當(dāng)reward
3.1.3 instructGPT訓(xùn)練階段3:如何通過PPO算法進(jìn)一步優(yōu)化模型的策略
簡而言之,階段3可以用下圖形象化表示
具體而言,instructGPT原始論文中的目標(biāo)函數(shù)如下所示
InstructGPT這篇論文吧,對大家實(shí)在是太友好了,友好到全篇論文就只給了兩個(gè)公式(獎(jiǎng)勵(lì)函數(shù)的損失函數(shù)以及上面這個(gè)目標(biāo)函數(shù)),關(guān)鍵這兩個(gè)公式都還只是簡寫,針對這個(gè)目標(biāo)函數(shù)在和交大張老師及七月在線趙、倪等老師核對之后,發(fā)現(xiàn)實(shí)際中真正要算的時(shí)候,需要如下展開下
為何呢?考慮到大部分文章在分析上面的目標(biāo)函數(shù)時(shí)基本都是人云亦云、一帶而過,故再逐一拆接下這個(gè)目標(biāo)函數(shù),分為三個(gè)部分
怎么避免它兩相差太多呢?這就是PPO要做的事情(通過KL散度衡量兩個(gè)策略的概率分布之間的差距,從而使得咱們在優(yōu)化策略時(shí)限制參數(shù)更新的范圍) 其中,?KL獎(jiǎng)勵(lì)系數(shù)控制 KL 懲罰
好,接下來,重點(diǎn)來了,簡言之,/與PPO算法表達(dá)式中的一一對應(yīng),比如與環(huán)境交互的等同于原始策略,具體而言,有以下4點(diǎn)
①?已經(jīng)掌握人類偏好的RM模型一旦判定現(xiàn)有回答的不夠好,便得更新,但如果一旦變化,會(huì)導(dǎo)致后續(xù)計(jì)算一系列問答評分時(shí)中的發(fā)生變化(策略一變軌跡必變),進(jìn)而已采樣的問答數(shù)據(jù) 便沒法繼續(xù)使用,而只能不斷采樣一批批新的問答數(shù)據(jù)(更新后,得采樣新一批數(shù)據(jù);再更新后,再采樣新一批數(shù)據(jù)..)
②?為避免一更新便只能重復(fù)采樣一批批新問答數(shù)據(jù),說白了,保護(hù)(數(shù)據(jù))現(xiàn)場,我們改讓去和環(huán)境交互『始終固定住不變,且基于重要性采樣的原則,增加重要性權(quán)重』
然后為了最大化獎(jiǎng)勵(lì)而不斷迭代(相當(dāng)于在策略下模型回答的好不好始終由RM模型評判),迭代過程中可重復(fù)用已有數(shù)據(jù)反復(fù)驗(yàn)證
③?迭代中我們追求整個(gè)目標(biāo)函數(shù)最大化,等同于要求最小(畢竟KL散度越小代表兩個(gè)策略之間的差距越小)
至于如果忘了KL散度公式的具體表達(dá)或者忘了怎么推導(dǎo)而來的,可以看下RL極簡入門關(guān)于TRPO的部分 ④?直到迭代出最優(yōu)策略(是否最優(yōu)裁判RM模型說了算)
之所以加最后的這個(gè)偏置項(xiàng),是防止ChatGPT在RL的訓(xùn)練過程中過度優(yōu)化,從而避免過于放飛自我,通過某種刁鉆的方式取悅?cè)祟?#xff0c;而不是老老實(shí)實(shí)地根據(jù)人類的問題給出正確答案
3.2 InstructGPT如何更好的構(gòu)建多輪對話能力
這里我們先從自然語言任務(wù)中最基本的語言模型簡單說起。一個(gè)語言模型大概是說,當(dāng)你給定前面的若干個(gè)詞后,它會(huì)給你下一個(gè)詞;而當(dāng)你有了下一個(gè)詞后,它會(huì)再給你接一個(gè)詞,以此遞推
這就好比我們使用手機(jī)輸入法,你打出一些詞句后,輸入法會(huì)提供若干個(gè)候選詞——這里的手機(jī)輸入法其實(shí)就是一個(gè)語言模型。那么如何利用這個(gè)最基本的語言模型來建模多輪對話問題呢?
在強(qiáng)化學(xué)習(xí)中,我們有智能體/模型和環(huán)境交互這樣的范式。但是在ChatGPT所使用的訓(xùn)練方式中,環(huán)境從某種意義上說被直接被獎(jiǎng)勵(lì)模型RM取代了,如下圖
這里我們明白了在語言模型場景下強(qiáng)化學(xué)習(xí)的狀態(tài)和動(dòng)作對應(yīng)什么,那么獎(jiǎng)勵(lì)Reward呢?由于上文已經(jīng)分析過instructGPT的目標(biāo)函數(shù)了,這里就不再贅述,直接上圖:
至此,還有一個(gè)細(xì)節(jié)問題,即獎(jiǎng)勵(lì)函數(shù)是對整個(gè)輸入語句和整個(gè)輸出語句而言的,而我們又在之前討論過,智能體是根據(jù)一個(gè)一個(gè)詞來去拼湊出整個(gè)回答的。圖中的獎(jiǎng)賞函數(shù)只能給出完整回答的獎(jiǎng)賞,那么在智能體生成回答的過程中,每個(gè)動(dòng)作action給出的詞對應(yīng)的獎(jiǎng)賞是什么呢?
這個(gè)細(xì)節(jié)在InstructGPT的論文中并沒有給出。幸運(yùn)的是,上文提到過的這篇論文《Learning from summarize from Human feedback》中的一個(gè)引腳標(biāo)注給出了這個(gè)疑問的答案
論文里說,獎(jiǎng)賞模型只在最終生成回答之后才給出獎(jiǎng)賞,在中間的過程中是不給出獎(jiǎng)賞的。在這里論文里沒有使用回答一詞,而是使用總結(jié)一詞,因?yàn)樗娜蝿?wù)是將一篇長文章進(jìn)行歸納總結(jié)
換言之,只有在ChatGPT輸出了EOS token的時(shí)候,整個(gè)軌跡才結(jié)束(EOS token是NLP中用來表示一段話結(jié)束的標(biāo)志)
總結(jié)上文,可得
考慮到多輪對話場景里,存在某一輪對話中的代詞指向上一輪對話中的某個(gè)人或物的可能,為此,ChatGPT多輪對話的核心關(guān)鍵是
在回答用戶問題的過程中,每段對話都是一個(gè)個(gè)序列
把之前的部分對話內(nèi)容(對歷史對話數(shù)據(jù)的規(guī)模做個(gè)限制,比如限制在8K大小)都保存下來,和當(dāng)前的輸入一起作為輸入給模型,這些信息被編碼成一個(gè)向量作為模型的輸入
且得益于Transformer的自注意力機(jī)制,使得模型能夠理解不同對話歷史之間的依賴關(guān)系,并在生成回答時(shí)考慮到之前的對話歷史
此外,模型還使用位置編碼來區(qū)分每個(gè)對話歷史的位置,確保模型可以正確地捕捉到對話歷史的順序信息
3.3 低成本實(shí)現(xiàn)ChatGPT迷你版訓(xùn)練過程的開源項(xiàng)目
雖說GPT3在2020年就出來了,但OpenAI并未開源,所以直到一年半后以后才有國內(nèi)外各個(gè)團(tuán)隊(duì)比如DeepMind等陸續(xù)復(fù)現(xiàn)出來,這些大廠的復(fù)現(xiàn)代碼我們自然無法窺知一二,畢竟人家也未開源出來
但GitHub上有一個(gè)基于Colossal-AI低成本實(shí)現(xiàn)ChatGPT迷你版訓(xùn)練過程的開源項(xiàng)目(基于GPT3 + RLHF + PPO)則可以看下,雖只是類似GPT3與RLHF的結(jié)合(如本文開頭所說,OpenAI早在2020年便已經(jīng)對外宣布GPT3與RLHF的研究了),但可以增進(jìn)我們對ChatGPT的理解
畢竟ChatGPT現(xiàn)在沒論文、沒開源,連所基于的GPT3.5的參數(shù)規(guī)模尚無準(zhǔn)確定論,所以只能通過GPT3 + RLHF來推測或研究ChatGPT之其中一二,但該項(xiàng)目有幾個(gè)不錯(cuò)的特點(diǎn)
但如果想訓(xùn)練OpenAI原生的1750億參數(shù)版本的GPT3,就不只是有GPU就完事了,而是得用64張AI 100(即便經(jīng)過一系列內(nèi)存開銷上的優(yōu)化,也得至少32張AI 100,單張AI 100售價(jià)10萬以上,且現(xiàn)在還經(jīng)常沒貨),這樣的硬件要求是大部分個(gè)人是無法具備的,所以該開源項(xiàng)目提供了單GPU、獨(dú)立4/8-GPUs 的ChatGPT迷你版
此外,據(jù)鐘博士在我所維護(hù)的『Machine Learning讀書會(huì)群』里所說,Colossal-AI的并行效率確實(shí)不錯(cuò),是新加坡的一個(gè)初創(chuàng)團(tuán)隊(duì)推出的,但目前尚沒有團(tuán)隊(duì)采用Colossal-AI框架來做主訓(xùn)練框架訓(xùn)練175b級別的超大模型,可以再了解下Meta家訓(xùn)練OPT用的Metaseq
后記(含修改/優(yōu)化/完善記錄)
事實(shí)上,可能很多朋友也已經(jīng)意識(shí)到,本文的前大部分內(nèi)容里,GPT-N理解起來相對輕松(包括Transformer通過理解上篇BERT筆記不算特別復(fù)雜),而instructGPT/ChatGPT的整體架構(gòu)思想也不算復(fù)雜,但其中涉及到的RL部分則讓想深挖細(xì)節(jié)的初學(xué)者變得立馬吃力起來(除非你已“入一定門”,或者你有課程/老師可以不斷問),比如一個(gè)PPO算法,要真正把這個(gè)概念講清楚、講透徹且從零推到尾則沒那么容易了。
以下是本文的部分修改/優(yōu)化/完善記錄
1.22日,優(yōu)化關(guān)于“instructGPT:如何基于RLHF運(yùn)用到多輪對話場景”中的部分描述
且為避免篇幅過長而影響完讀率,權(quán)衡之下把擴(kuò)展閱讀下的SeqGAN相關(guān)內(nèi)容刪除
2.25日,新增關(guān)于"GPT3到GPT3.5:從instructGPT到ChatGPT的迭代過程"的部分
相比前幾天有了質(zhì)的提升
?之前哪怕修改十幾次也都是1.x版本,今天的這個(gè)版本可以稱之為2.0版本了,還會(huì)不斷完善
且修正為:SFT就是基線模型 最后不用去更新它的策略,更新的是論文中命名為PPO模型的策略
且在本文最后附上了“ChatGPT相關(guān)技術(shù)的100篇論文必讀榜”
且刪除關(guān)于“近端策略優(yōu)化裁剪PPO-clip”的介紹,畢竟詳細(xì)的可以查看另一篇RL極簡入門
故為方便大家一目了然,已把該目標(biāo)函數(shù)展開了下
3.8日,通過再次回顧GPT3的論文,補(bǔ)充關(guān)于為何GPT3不需要微調(diào)的原因,且修正個(gè)別不太精準(zhǔn)的描述
為了寫本筆記,過去兩個(gè)月翻了大量中英文資料/paper(中間一度花了大量時(shí)間去深入RL),大部分時(shí)間讀的更多是中文資料,2月最后幾天讀的更多是英文paper,正是2月底這最后幾天對ChatGPT背后技術(shù)原理的研究才真正進(jìn)入狀態(tài)(后還組建了一個(gè)“ChatGPT之100篇論文閱讀組”,我和10來位博士、業(yè)界大佬從23年2.27日起100天讀完ChatGPT相關(guān)技術(shù)的100篇論文,榜單見此文),當(dāng)然 還在不斷深入,由此而感慨:?
- 讀的論文越多,你會(huì)發(fā)現(xiàn)大部分人對ChatGPT的技術(shù)解讀都是不夠準(zhǔn)確或全面的,畢竟很多人沒有那個(gè)工作需要或研究需要,去深入了解各種細(xì)節(jié)
- 因?yàn)?00天100篇這個(gè)任務(wù),讓自己有史以來一篇一篇一行一行讀100篇,?之前看的比較散 不系統(tǒng) 摳的也不細(xì)
比如回顧“Attention is all you need”這篇后,對優(yōu)化上一篇Transformer筆記便有了很多心得
總之,讀的論文越多,博客內(nèi)相關(guān)筆記的質(zhì)量將飛速提升 自己的技術(shù)研究能力也能有巨大飛躍
參考文獻(xiàn)與推薦閱讀
?此外,寫過圖解Word2vec、圖解transformer的Jay Alammar也寫過:圖解GPT2(其翻譯版)、圖解GPT3(其翻譯版)
GPT系列論文閱讀筆記,另 300行代碼實(shí)現(xiàn)GPT:GitHub - karpathy/minGPT: A minimal PyTorch re-implementation of the OpenAI GPT (Generative Pretrained Transformer) training
此外,FLAN-T5原始論文:Scaling Instruction-Finetuned Language Models,這是對T5的解讀之一
總結(jié)
以上是生活随笔為你收集整理的ChatGPT技术原理解析:从RL之PPO算法、RLHF到GPT4、instructGPT的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP/IP详解 第七章 防火墙和网
- 下一篇: 如何给宝宝起个好名?三点原则!起名有道,