陳煥森,中山大學,Datawhile陳煥森,中山大學,曾就職于香港中文大學(深圳)醫(yī)療大數(shù)據(jù)實驗室,在那里積累了寶貴的工作經(jīng)驗和技能。目前,正于Datawhale工作,對數(shù)據(jù)科學和軟件工程領域都有濃厚興趣。
(InstructGPT) Training language models to follow instructions with human feedback
https://export.arxiv.org/pdf/2203.02155.pdf
今年2月份的時候,ChatGPT突然間一下子爆火,當時我就很關心它背后的技術是什么樣的,所以我在當時參考了一些資料,包括B站的李沐的視頻,以及 huggingface的博客,然后對ChatGPT 背后的技術做了一個總結(jié)。
首先我們來回顧GPT系列的技術是怎么來的?最早2017年由Google的團隊做出來的Transformer,當時只是去解決序列翻譯的問題。然后由OpenAI,最早把這個 Transformer 這個模型用來去做大規(guī)模的預訓練,叫做GPT,然后緊接著還是 Google,他們內(nèi)部在 Transformer 上做了也是大規(guī)模的預訓練,即Bert。
GPT 跟 Bert 之間的差別在于, GPT 它是致力于解決生成式任務,而 Bert是去做有點像文本填充的任務,從任務的難度來說的話,還是GPT 系列的任務會更難一點,所以也是李沐老師講的,可能正是因為這類任務本身的難度決定了 GPT 系列的生成式模型會有更強的性能。也正是 OpenAI這個團隊致力于不斷地在這條技術路線上面不斷地砸錢砸資源,才會有今年ChatGPT 的爆火。由于openAI 想要把ChatGPT商業(yè)化,所以并沒有放出來它的模型跟論文。
在此之前OpenAI團隊放出來一篇InstructGPT的論文,用的是跟ChatGPT幾乎一樣的方法,所以ChatGPT的講述會參考這篇InstructGPT。
InstructGPT 是如何工作的呢?它的方法可以分為三個步驟。首先,在 GPT 的大規(guī)模預訓練模型的基礎上進行模型微調(diào),這個微調(diào)是通過有監(jiān)督學習實現(xiàn)的。第二步是收集對比數(shù)據(jù),然后用這些數(shù)據(jù)來訓練獎勵模型。第三步是利用獎勵模型和強化學習策略來優(yōu)化第一步中經(jīng)過微調(diào)的 GPT 3.5 模型。整個過程可以分為兩個部分。第一部分是利用大量有監(jiān)督數(shù)據(jù)來訓練微調(diào)模型。第二部分也是一種微調(diào),但使用了一些強化學習技巧。許多人認為,如果模型的數(shù)據(jù)足夠豐富,可以省略第二步和第三步,直接使用第一步微調(diào)的方法來訓練一個類似 ChatGPT 的模型。
那么ChatGPT中為什么第二步和第三步是必要的呢?必要性可能在于采用了一種更經(jīng)濟高效的方法來進一步微調(diào)。讓我們先看一下 InstructGPT論文中的想法,為什么提出了 RL 和 HF?因為語言模型的訓練目標與人類指定的目標不一致,從本質(zhì)上來說,它仍然是一個微調(diào)。那么為什么要訓練獎勵模型以及如何訓練獎勵模型呢?因為獎勵模型具有更低的標注成本,我們可以用獎勵模型代替人類提供獎勵信號,如圖是在 Hugging Face 的官方博客中展示的。
首先采集的 Prompt 數(shù)據(jù)集,這些數(shù)據(jù)集它是沒有標注的,然后讓GPT微調(diào),根據(jù)Prompt生成一些答案,然后人類對這些答案進行一個打分,打分之后由這些答案和這個分數(shù)作為一個數(shù)據(jù)集來共同訓練一個 reward model。它的訓練指標是一個label ranking,這是一個 paywise ranking loss,loss 就是每做一次,隨機抽取兩個sample,然后由分數(shù)更高的一個 sample 來減去分數(shù)更低的sample,然后希望能學習到人類對這個更好的生成的答案的偏好,這就是人類反饋的偏好的說法的來源。
之后第二步訓練好一個 reward model,它結(jié)合了強化學習的手段。還是采集一批無標注的Prompt的數(shù)據(jù)集,Prompt數(shù)據(jù)集分別喂到一個初始化的模型和一個微調(diào)過的模型中,然后讓它們分別生成一個答案做對比,其中微調(diào)過的模型需要進一步的去利用reward model 來進行打分。
PPO-ptx即利用強化學習的手段,它利用KL 散度來對比微調(diào)過的模型和原來語言模型的距離。
整個訓練具體目標函數(shù)是KL 散度的期望,由獎賞模型給出的r減去所訓練模型和初始的模型的 KL 散度,并計算出一個期望,然后再加上GPT 的損失函數(shù)的期望,這樣既保證強化模型的更新能基于 SFT (supervise fine tuning)的模型,又保證不會偏離原來的預訓練模型太遠。這樣每一次都在一個可控的范圍內(nèi)進行迭代。在李沐老師的這篇論文進度里面也提到了,ChatGPT 相比這個InstructGPT最大的改進可能是 reward model 會有計劃的更新,即在線強化學習。
所謂的在線強化學習就是 InstructGPT 里面的 reward model,它只更新過一次,或者有限次,但是這個ChatGPT的 reward model 會周期性地去更新,來保證這個 reward model 的能力能跟得上我們所訓練的語言模型。
接下來我們回顧一下這幾個月,類GPT模型的一些進展是怎么樣的。
首先GPT4,它相比 GPT 3. 5,它最大的提升是一個圖片文本的多模態(tài)。我在搜索過程中發(fā)現(xiàn)就是在 GPT 4 的前后,已經(jīng)有微軟團隊以及谷歌團隊做了一些圖文多模態(tài)模型,分別是 BLIP-2和LLaVA, LLaVA是基于Meta 開源出來LLaMA的模型,進一步訓練生成的圖文多模態(tài)模型。
與ChatGPT系列結(jié)合更緊密的技術是上下文的長度,更長的上下文,會讓ChatGPT使用體驗會更好。像 GPT 3. 5 原本它只能支持4K的 TOKEN, GPT4支持32K 的長度,最近的GPT 3. 5 它的放出來的 API已經(jīng)能夠支持到16K,這也是一個不小的進步。絕大多數(shù)的大語言大模型還是4K 左右。
增加上下文長度的訓練難度是,Attention是一個0(n2) 的復雜度,無論是時間還是空間,它都是0(n2)的推理和訓練時間。也許我們能接受訓練0(n2)難度,但是我們在使用時候要能要保證它的推理速度,至少要解決它0(n2)的時間復雜度。
并且,我們在訓練的時候,這個文本絕大多數(shù)還是一個比較短的上下文,我們很難去收集很多很長的那種超長的上下文數(shù)據(jù)來做模型的訓練。同時包括我們在訓練的時候希望能夠去對這個模型的性能進行外推,也就是說們用一些比較短的上下文的數(shù)據(jù)來做訓練,然后能夠希望它能夠外推到更長的上下文的這個推理的這個場景,那么他在外推的時候,他就會肯定會不可避免地去產(chǎn)生一個推理性能下降的這么一個問題。那么也就是說一個是速度,一個是性能,這兩個問題決定了你更長的上下文是很難做的。而 Antropic它的做法用到了圖中所示的兩類技術,這些技術也是類似的大語言模型,它們要解決這個更長下文的時候,都會選擇一些比較通用的技術。
現(xiàn)在的思路大概是兩類,一類是 attention 的工程化,也就是我可能使用的還是一些比較原始的attention,但是我會把這個 attention 的計算結(jié)合我們這個硬件來做一些適配,這是一個比較工程性的一個概念。然后第二種就是各種 attention 的變體。
一個目前來說做得比較好以及接受度比較廣的Attention變體就是GAU,它是有一個Gate的這么一個概念,這個 attention 變體的宗旨,就是既能夠結(jié)合局部的注意力,又不要放過一個全局的注意力?;旧洗蠖鄶?shù)的 attention 變體都在局部和全局這兩個方向做結(jié)合。
而 attention 工程化中, flush attention目前可以說是把工程化做到極致的方法,如果結(jié)合 GPU來說,比如A100 的話,它有 40GB 的一個內(nèi)存,但是它的這個它的核心計算顯存,可能只有 20 MB。如果你不能夠很好地利用好這個 20 MB 的計算顯存的話,你可能會有大量的時間花在調(diào)度上面。
所以他們就利用了這個 SIM 和 HBM 這兩個模塊的顯存的大小的之間差異,然后去把這個 attention 的計算分塊來執(zhí)行原本的attention,避免了頻繁地去調(diào)度,每次只存一次和取一次,它相比原來提升了八九倍的性能,這是我了解到的一個更長上下文的一個技術。
還有一個GPT 4重點去做的事情是安全可靠性,今年3 月份微軟開放的bing,有些人把它的對話調(diào)教得特別的奇怪,各種各樣奇怪的輸出都會有,那么其實這就是安全可靠性需要關注的一個問題。
GPT 4 它的技術報告里面提到,它額外添加了一個基于規(guī)則的獎勵模型,但是它又沒有對這個東西說做一個詳細的說明。圖中所示的是DeepMind 團隊做出來語言大模型,他們也提到了基于規(guī)則的一個獎勵模型,就是他在這個模型去做微調(diào)的時候,不僅利用剛才我們提到的人類反饋強化學習的加強模型,同時還做了一些定制化的一些規(guī)則。具體的一個技術細節(jié)大家可以去看一下 sparrow model。然后還有一個紅藍對抗,紅藍對抗就是專門有一個團隊去不斷地去攻擊這個模型。
最后還有就是,數(shù)據(jù)集怎么保證更高質(zhì)量?前陣子有一個做 textbooks is all you need,就是吳恩達老師一直在提的就是小規(guī)模,但是質(zhì)量高的數(shù)據(jù)集可能對模型更有用。至少在這篇論文的場景下,這個小規(guī)模高質(zhì)量的數(shù)據(jù)集所訓練的小模型能夠很好地打敗,數(shù)據(jù)規(guī)模很大,但是質(zhì)量相對不高的大訓練模型。、
另外把模型做大其實是一件很困難的事情。一個可行的路徑可能是 MOE 架構(gòu)。MOE 架它的一個全稱是 mixture of experts,一個專家混合或者專家集成的模型。他跟我們機器學習里面理解的集成學習可能不太一樣,他的moe架構(gòu)有不同的一個傾向,不同的expert會負責不同的功能。然后我每一次去做推理,或者說每次做訓練的時候,我是去激活對應對應場景下的一個expert。假如說 GPT 4用了這個技術,現(xiàn)在我是輸入,給他一個程序的一個prompt,那他可能會激活第二個expert,然后我給它一個生成小說或者是文本理解的 prompt,它可能就會去激活另一個export,所以它其實就是做了一個功能分區(qū)以及稀疏激活的這么一件事情。
接下來進入分享的第二個階段, Prompt 的使用,以及怎么去利用 Prompt 做一些應用。
首先是 prompt 使用,這 prompt 使用就是希望在對話的過程中來解決我們無論是工作還是生活上的一些問題。然后我這邊是參考了兩個鏈接,參考了這個 open AI 官方的一個 Cookbook 的一個一些教程,我所有的案例都是從它上面找來的。然后這邊也稍微推薦一下我們這個 datawhale的一個 prompt 使用指南。這里跟之前的open AI Coolbook 不同的是,我們在是在上面沉淀了很多案例,都是由我們的學習者沉淀下來。
那么為什么要有prompt?原因是現(xiàn)有的語言模型它對外界的輸入是比較敏感的,你的訓練集跟測試集可能不太匹配,所以為了更好地利用這個語言模型的這能力,我們?nèi)ピ俑莻€類 ChatGPT 模型去做對話的時候,需要掌握一定的溝通技巧。
prompt 最早也是最出名的一個案例,Let's think step by step。上圖的場景是一個推理題,如果是直接提問會得到一個錯誤的答案,但是不用去做太多修改,只需要在prompt 里面讓他一步一步去做思考。ChatGPT 就能夠得到一個正確的答案。
至于它很有效的原因是,在訓練數(shù)據(jù)集里,Let's think step by step可能才是真正貼合模型訓練數(shù)據(jù)集的一個分布,這是一個不一定正確,但是比較好理解的解釋。
案例中,根據(jù)提問提供了a、b、 c 三個選項,在沒有去對復雜任務做拆分的時候,模型得到一個錯誤的答案。
這個場景的宗旨就是先總結(jié)clue 的信息,再讓它去做回答。把它做一個拆分之后,就能夠得到我們理想的有效答案。同時拆分之后,我們的子任務也能夠去更好地聚焦。一個復雜任務,你對它提了很多若干個子任務的時候,它可能會丟失掉對于某一個任務的注意力。你把它拆分之后,轉(zhuǎn)化成若干個 prompt,然后每個 prompt 回答一個問題,他就能夠很好地聚焦你的子任務,這是復雜任務拆分的好處。
思維鏈就是我們在做 prompt的時候需要一直秉持的一個觀念,想讓這個模型能夠像偵探一樣,一步一步地來思考,當你能夠這樣去做的時候,他往往能給出一些不錯的答案。
最后是ChatGPT的prompt應用化,即把我們的需求轉(zhuǎn)化成特定的prompt,讓ChatGPT 給出一個答案的一個應用。這里同樣是參考了 OpenAI 的一個 Cookbook 以及 Langchain 的Python 庫,它致力于解決prompt 應用化這個場景,圖中鏈接是langchain文檔的中文版。
這邊我同樣推薦一下我們Datawhile 4月AIGC活動,活動中Datawhale不僅教大家怎么使用prompt,同時也有一些團隊或者一些學習者去產(chǎn)出一些很好的應用,有些應用已經(jīng)做得很成熟了。
這是langchain庫的應用開發(fā)的思路,如上圖所示。
首先它把某個特定的 prompt 發(fā)給這個agent,然后代理把這個 prompt 拆解成不同的任務,它拆解的過程中本身就使用了ChatGPT,然后把這個prompt拆解的思路其實跟之前復雜任務做拆分是一樣的思路,希望能夠得到更好的答案。然后不同的任務由ChatGPT 來制定不同的工具生成一個答案。最后再把這個把不同工具生成的答案做一個總結(jié)集合,發(fā)給用戶。
相信我們大家對讀論文,或者是讀一些比較長的書的時候,我們希望能夠快速地提取里面的一些關鍵字??梢宰屵@個模型快速地把這些文本去做一些總結(jié),甚至我們能夠讓模型先讀一遍我們再去對他做一個提問,針對這個模型,針對這個文本去做一個回答。
怎么對超長文本進行總結(jié),目前主流的做法就是把document 進行分割,然后每一個分割片段去做一次總結(jié),之后把這個若干個總結(jié)合并起來,這種方式可能會丟失文本,因為每個 document它是有上下文背景的。
另一種方法是,每一次總結(jié)完之后,把這個總結(jié)插入到document 2,然后不斷地把總結(jié)插入到下一個分割文本,最后可能得到更好的總結(jié)。
這是上下文有限制的情況下工程化的解決方案。我們當然希望這個模型能夠有非常,甚至趨于無限的上下文。但現(xiàn)實中這種分割的方法可能也是一個不錯的一個手段。
之后我們不僅希望它能夠去做總結(jié),還希望它能針對某一個文本或者是某一堆數(shù)據(jù),他能夠成為所針對文本或數(shù)據(jù)的專家,我們對他提問的時候,能針對文本做回答。這其實就是本地知識庫問答機器人的概念。
這是 Lang chain中文倉庫里面的一個案例,只是簡短的一個代碼,就已經(jīng)完成了對 data 目錄下所有文本的學習,它把文本去加載,然后做一個切割,之后再創(chuàng)建問答,讓 ChatGPT 對里面的文本去做總結(jié)。既然是一個本地庫知識庫,它就需要有一個記憶的概念,這里面用到了向量數(shù)據(jù)庫來承擔記憶這個功能。只用了十多行代碼,就構(gòu)建了一個問答機器人,答案的效果也不錯。
我們不僅希望能夠做本地的問答,我們更希望能夠做在線問答。這個案例是 open AI Coolbook 中的一張圖。首先我們把用戶的prompt 去針對搜索引擎做一個search,然后得到的一系列答案利用chatgpt進行一個重排序,最后再從中抽取整合最佳答案返回給用戶。
新 氦 類 腦 智 能 介 紹
新氦類腦智能由博康控股、楊浦創(chuàng)投、復旦資管共同出資成立,是上海市類腦芯片與片上智能系統(tǒng)研發(fā)與轉(zhuǎn)化功能型平臺的承載主體,致力于打造基于類腦智能與人工智能芯片的產(chǎn)業(yè)發(fā)展引擎,構(gòu)建集人才、技術、數(shù)據(jù)、產(chǎn)品及行業(yè)應用場景于一體的產(chǎn)業(yè)生態(tài)。在技術研發(fā)、市場轉(zhuǎn)化與業(yè)務拓展提供全方位服務,由專業(yè)的芯片及人工智能行業(yè)研發(fā)人員領銜進行基礎研究,致力于開發(fā)行業(yè)共性技術、前沿性及探索性創(chuàng)新技術。
長 按 二 維 碼 關 注 新 氦 公 眾 號



滬公網(wǎng)安備 31011002003093號