博客專欄

        EEPW首頁 > 博客 > 張俊林:由ChatGPT反思大語言模型(LLM)的技術精要(3)

        張俊林:由ChatGPT反思大語言模型(LLM)的技術精要(3)

        發布人:AI科技大本營 時間:2023-02-21 來源:工程師 發布文章
        04 人機接口:從In Context Learning到Instruct理解


        一般我們經常提到的人和LLM的接口技術包括:zero shot prompting、few shot prompting、In Context Learning,以及Instruct。這些其實都是表達某個具體任務的描述方式。不過如果你看文獻,會發現叫法比較亂。


        其中Instruct 是ChatGPT的接口方式,就是說人以自然語言給出任務的描述,比如“把這個句子從中文翻譯成英文”,類似這種。zero shot prompting我理解其實就是現在的Instruct的早期叫法,以前大家習慣叫zero shot,現在很多改成叫Instruct。盡管是一個內涵,但是具體做法是兩種做法。早期大家做zero shot prompting,實際上就是不知道怎么表達一個任務才好,于是就換不同的單詞或者句子,反復在嘗試好的任務表達方式,這種做法目前已經被證明是在擬合訓練數據的分布,其實沒啥意思。目前Instruct的做法則是給定命令表述語句,試圖讓LLM理解它。所以盡管表面都是任務的表述,但是思路是不同的。


        而In Context Learning和few shot prompting意思類似,就是給LLM幾個示例作為范本,然后讓LLM解決新問題。我個人認為In Context Learning也可以理解為某項任務的描述,只是Instruct是一種抽象的描述方式,In Context Learning是一種例子示范的例子說明法。當然,鑒于目前這幾個叫法用的有點亂,所以上述理解僅代表個人看法。


        所以我們此處只對In Context Learning和Instruct進行介紹,不再提zero shot和few shot了。


        1. 神秘的In Context Learning


        如果你細想,會發現In Context Learning是個很神奇的技術。它神奇在哪里呢?神奇在你提供給LLM幾個樣本示例  ,然后給它  ,LLM竟然能夠成功預測對應的  。聽到這你會反問:這有什么神奇的呢?Fine-tuning不就是這樣工作的嗎?你要這么問的話,說明你對這個問題想得還不夠深入。


        如果你細想,會發現In Context Learning是個很神奇的技術。它神奇在哪里呢?神奇在你提供給LLM幾個樣本示例$,....x_{n+1},LLMy_{n+1}$ 。聽到這你會反問:這有什么神奇的呢?Fine-tuning不就是這樣工作的嗎?你要這么問的話,說明你對這個問題想得還不夠深入。


        圖片


        Fine-tuning和In Context Learning表面看似都提供了一些例子給LLM,但兩者有質的不同(參考上圖示意):Fine-tuning拿這些例子當作訓練數據,利用反向傳播去修正LLM的模型參數,而修正模型參數這個動作,確實體現了LLM從這些例子學習的過程。但是,In Context Learning只是拿出例子讓LLM看了一眼,并沒有根據例子,用反向傳播去修正LLM模型參數的動作,就要求它去預測新例子。既然沒有修正模型參數,這意味著貌似LLM并未經歷一個學習過程,如果沒有經歷學習過程,那它為何能夠做到僅看一眼,就能預測對新例子呢?這正是In Context Learning的神奇之處。這是否讓你想起了一句歌詞:“只是因為在人群中多看了你一眼 再也沒能忘掉你容顏”,而這首歌名叫“傳奇”。你說傳奇不傳奇?


        看似In Context Learning沒從例子里學習知識,實際上,難道LLM通過一種奇怪的方式去學習?還是說,它確實也沒學啥?關于這個問題的答案,目前仍是未解之謎。現有一些研究各有各的說法,五花八門,很難判斷哪個講述的是事實的真相,甚至有些研究結論還相互矛盾。這里提供幾個目前的說法,至于誰對誰錯,只能你自己把握了。當然,我認為追求這個神奇現象背后的真相,是一個好的研究課題。


        試圖證明In Context Learning沒有從例子中學習的工作是“Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?”。它發現了:在提供給LLM的樣本示例$中,y_i是否x_i對應的正確答案,其實并不重要,如果我們把正確答案y_i替換成隨機的另外一個答案y_ix映射到y的映射函數信息y=f(x),否則的話你亂換正確標簽,肯定會擾亂這個y=f(x)$映射函數。也就是說,In Context Learning并未學習這個輸入空間到輸出空間的映射過程。


        真正對In Context Learning影響比較大的是:x 和 y 的分布,也就是輸入文本 x 的分布和候選答案 y 有哪些,如果你改變這兩個分布,比如把 y 替換成候選答案之外的內容,則In Context Learning效果急劇下降。


        總之,這個工作證明了In Context Learning并未學習映射函數,但是輸入和輸出的分布很重要,這兩個不能亂改。


        有些工作認為LLM還是從給出的示例學習了這個映射函數 y=f(x) ,不過是種隱式地學習。比如“What learning algorithm is in-context learning? Investigations with linear models”認為Transformer能夠隱式地從示例中學習 x 到 y 的映射過程,它的激活函數中包含了一些簡單映射函數,而LLM通過示例能夠激發對應的那一個。而“Why Can GPT Learn In-Context? Language Models Secretly Perform Gradient Descent as Meta-Optimizers”這篇文章則將ICL看作是一種隱式的Fine-tuning。


        總而言之,目前這還是一個未解之謎。


        神奇的Instruct理解


        我們可以把Instruct當作一種方便人類理解的任務表述,在這個前提下,目前關于Instruct的研究可以分成兩種:偏學術研究的Instruct,以及關于人類真實需求描述的Instruct。


        圖片


        我們先來看第一種:偏學術研究的Instruct。它的核心研究主題是多任務場景下,LLM模型對Instruct理解的泛化能力。如上圖中FLAN模型所示,就是說有很多NLP任務,對于每個任務,研究人員構造一個或者多個Prompt模版作為任務的Instruct,然后用訓練例子對LLM模型進行微調,讓LLM以同時學習多個任務。訓練好模型后,給LLM模型一個它沒見過的全新任務的Instruct,然后讓LLM 解決zero shot任務,從任務解決得是否足夠好,來判斷LLM模型是否有對Instruct理解的泛化能力。


        如果歸納下目前的研究結論(可參考“Scaling Instruction-Fine-tuned Language Models”/“Super-NaturalInstructions: Generalization via Declarative Instructions on 1600+ NLP Tasks”),能夠有效增加LLM模型Instruct泛化能力的因素包括:增加多任務的任務數量、增加LLM模型大小、提供CoT Prompting, 以及增加任務的多樣性。如果采取任意一項措施,都可以增加LLM模型的Instruct理解能力。

        第二種是人類真實需求下的Instruct,這類研究以InstructGPT和ChatGPT為代表。這類工作也是基于多任務的,但是和偏向學術研究類工作最大的不同,在于它是面向人類用戶真實需求的。為什么這么說呢?因為它們用于LLM多任務訓練的任務描述Prompt,是從大量用戶提交的真實請求中抽樣而來的,而不是固定好研究任務的范圍,然后讓研究人員來寫任務描述prompt。這里所謂的“真實需求”,體現在兩個方面:首先,因為是從用戶提交的任務描述里隨機抽取的,所以涵蓋的任務類型更多樣化,也更符合用戶的真實需求;其次,某個任務的prompt描述,是用戶提交的,體現了一般用戶在表達任務需求時會怎么說,而不是你認為用戶會怎么說。很明顯,這類工作改出來的LLM模型,用戶體驗會更好。


        InstructGPT論文里,也拿這種方法和FLAN那種Instruct based方法做了比較。首先在GPT3上用FLAN提到的任務、數據以及Prompt模版進行微調,來在GPT 3上復現FLAN方法,然后和InstructGPT進行比較,因為InstructGPT的基礎模型也是GPT3,所以只有數據和方法的差別,兩者可比,結果發現FLAN方法的效果,距離InstructGPT有很大的差距。那么背后的原因是什么呢?論文分析數據后認為,FLAN方法涉及到的任務領域相對少,是InstructGPT涉及領域的子集,所以效果不好。也就是說,FLAN論文里涉及到的任務和用戶真實需求是不符的,而這導致在真實場景下效果不夠好。而這對我們的啟示是:從用戶數據中收集真實需求,這事情是很重要的。


        In Context Learning和Instruct的聯系


        如果我們假設In Context Learning是用一些例子來具象地表達任務命令,Instruct是一種更符合人類習慣的抽象任務描述。那么,一個很自然的問題是:它們之間有什么聯系嗎?比如,我們是否能夠提供給LLM完成某個任務的若干具體示例,讓LLM找出其對應的自然語言描述的Instruct命令?


        圖片


        目前有零星的工作在探索這個問題,我認為這個方向是很有研究價值的。先說答案,答案是:Yes,LLM Can。“Large Language Models Are Human-Level Prompt Engineers”是做這個方向很有趣的工作,如上圖所示,對于某項任務,給LLM一些示例,讓LLM自動生成能夠描述這項任務的自然語言命令,然后它再用LLM生成的任務描述去測試任務效果。它使用的基礎模型是GPT 3和InstructGPT,經過這項技術加持后,LLM生成的Instruct的效果相比未采用這項技術的GPT 3 以及InstuctGPT來說,指標有極大地提升,而且在一些任務上超過人類的表現。


        這說明了:具象的任務示例和任務的自然語言描述之間,有種神秘的內在聯系。至于這種聯系到底是什么?我們目前對此還一無所知。


        05 智慧之光:如何增強LLM的推理能力


        目前很多研究已證明LLM對于知識具有強大的記憶能力,但是,一般我們不會因為一個人記憶能力強,就說這人很聰明,是否具有強大的推理能力,往往是我們判斷一個人是否聰明的重要標準。類似的,如果LLM的效果想讓人覺得很驚艷,強大的推理能力是必備的。推理能力本質上是綜合運用很多相關知識點,去推導出新知識或新結論。關于LLM的推理能力,是最近一年來LLM里最重要和熱門的研究領域之一。于是,我們關心的問題就是:LLM具備推理能力嗎?如果具備,那么它的推理能力夠強嗎?


        這兩個問題目前的答案似乎應該是:當模型規模足夠大的時候,LLM本身是具備推理能力的,在簡單推理問題上,LLM已經達到了很好的能力,但是復雜推理問題上,還需要更多深入的研究。


        如果梳理現有LLM推理相關工作的話,我把它們歸到兩大類,體現出挖掘或促進LLM推理能力不同的技術思路:第一類研究比較多,可以統稱為基于Prompt的方法,核心思想是通過合適的提示語或提示樣本,更好地激發出LLM本身就具備的推理能力,Google在這個方向做了大量很有成效的工作。第二類做法是在預訓練過程中引入程序代碼,和文本一起參與預訓練,以此進一步增強LLM的推理能力,這應該是OpenAI實踐出的思路。比如ChatGPT肯定具備很強的推理能力,但它并不要求用戶必須提供一些推理示例,所以ChatGPT強大的推理能力,大概率來源于使用代碼參與GPT 3.5的預訓練。


        這兩種思路其實大方向是迥異的:利用代碼增強LLM推理能力,這體現出一種通過增加多樣性的訓練數據,來直接增強LLM推理能力的思路;而基于Prompt的方法,它并不會促進LLM本身的推理能力,只是讓LLM在解決問題過程中更好地展示出這種能力的技術方法。可以看出,前者(代碼方法)治本,后者治標。當然,兩者其實也是互補的,但從長遠看,治本的方法更重要。


        1. 基于Prompt的方法


        這方面工作非常多,如果歸納一下的話,大致可以分為三條技術路線。


        圖片


        第一種思路是直接在問題上追加輔助推理Prompt。這種方法簡單直接,但在眾多領域都很有效。這個做法是由“Large language models are zero-shot reasoners”提出的,也被稱為zero-shot CoT。具體而言,分為兩個階段(如上圖所示),第一階段在提問的問題上追加“Let’s think step by step”這句提示語,LLM會輸出具體的推理過程;第二階段,在第一階段的問題后,拼接LLM輸出的具體推理過程,并再追加Prompt=“Therefore, the answer (arabic numerals) is”,此時LLM會給出答案。如此簡單的操作,卻可以大幅增加LLM在各項推理任務中的效果,比如在數學推理測試集GSM8K上,加上提示語后,推理準確率直接從原先的10.4%提升到了40.4%,可謂神奇。


        為什么LLM會具備給一句“Let’s think step by step”提示語,就能列出詳細的推理步驟并算出答案呢?其原因目前尚無定論,我的猜測是:很可能因為預訓練數據里面存在大量的此種數據,就是以“Let’s think step by step”開頭,然后后面是詳細的推理步驟,最后給出答案,而LLM在預訓練的時候記住了這些模式。而當我們輸入這個提示語的時候,激發LLM模糊得“回憶”起某些例子的推導步驟,于是即可模仿這些例子進行步驟推理并給出答案。當然這只是我的無依據推論,若事實真的如此,如果你看過后面介紹的標準CoT做法,會發現Zero-shot CoT 本質上和標準CoT很可能沒什么區別,只是標準CoT由人工來寫推理步驟的示例,而Zero-shot CoT大概率是通過提示語,激活了記憶中的某些包含推理步驟的示例,很可能是如此區別。而標準CoT效果比Zero-Shot CoT效果好也完全可以理解,因為畢竟靠LLM回憶示例,精準性估計不會太高,而人工給出的示例,準確性是有保障的,所以自然標準CoT效果會更好。


        這側面說明了一個道理,就是LLM本身是具備推理能力的,只是我們沒有辦法把它的這種能力激發出來而已,通過合適的提示語來進行兩步提示,就在一定程度上可以釋放出它的這種潛力。另外,對于中文,很可能存在另外一個黃金提示語,比如“詳細解題思路如下”,類似這種,因為中文語料在講解推理步驟的時候,經常用的引導句和“讓我們一步一步來思考”應該是不同的,這是明顯的西方說法,而探索出這個中文黃金提示語,其實也是很有必要的。


        第二種思路一般被稱為基于示例的思維鏈(few-shot CoT,Chain of Thought)Prompting。這個方向目前是LLM推理研究的主方向,很多工作都是在這個思路上做的,我們簡單介紹幾個效果顯著的代表性工作,基本能代表CoT的技術發展方向。


        圖片


        CoT的主體思想其實很直白;為了教會LLM模型學會推理,給出一些人工寫好的推理示例,示例里把得到最終答案前,一步步的具體推理步驟說清楚,而這些人工寫的詳細推理過程,就是思維鏈Prompting,具體例子可參照上圖中藍色文字部分。CoT的意思是讓LLM模型明白一個道理;就是在推理過程中,步子不要邁得太大,否則很容易出錯,改變思維模式,化大問題為小問題,步步為營,積小勝為大勝。最早明確提出CoT這個概念的文章是“Chain of thought prompting elicits reasoning in large language models”,論文發布于22年1月份,雖然做法很簡單,但是應用CoT后LLM模型的推理能力得到了巨大提升,GSM8K數學推理測試集準確率提高到60.1%左右。當然,這種給出詳細推理步驟和中間過程的思想,并非CoT最早提出的,更早一些的“scratchpad”技術(可參考:Show Your Work: Scratchpads for Intermediate Computation with Language Models)首先采用了類似的思路。


        CoT提出不久,很快在22年3月份,一項被稱為“Self-Consistency”的改進技術就將GSM8K測試集準確率提高到74.4%,提出這項改進的論文是“Self-Consistency Improves Chain of Thought Reasoning in Language Models”。“Self-Consistency”的思路也很直觀(參考上圖):首先可以利用CoT給出幾個寫了推理過程的示例,然后要求LLM對給定的問題進行推理,如果是CoT,直接輸出一個推理過程和答案,整個過程就結束了。“Self-Consistency”則不然,它要求LLM輸出多個不同的推理過程和答案,然后采用投****的方式選出最佳答案,思路非常簡單直接,但是效果也確實好。“Self-Consistency”其實是教導LLM學會這么一個道理:孔乙己說過茴香豆的“茴”字有四種寫法,類似的,一個數學題的正確解法也可以有很多種,每個不同的推導過程都指向最終的答案。條條大路通羅馬,雖說也有個別迷路走到北京的,但是迷路的畢竟是少數,看看大多數人走到哪里,哪里就是正確答案。簡單的方法往往蘊含著深刻的哲學含義,是不是這道理?


        再往后,“On the Advance of Making Language Models Better Reasoners”這個工作在“Self-Consistency”基礎上,進一步集成了“從一個Prompt問題拓展到多個Prompt問題、檢查推理中間步驟的正確性以及對多個輸出的回答加權投****”這三個改進點,將GSM8K測試集準確率提高到83%左右。


        圖片


        第三種思路體現了一種分治算法的思想。當然這個所謂“分治”是我歸納的,別人沒這么說。這種思路的核心思想是:對于一個復雜的推理問題,我們把它分解成若干容易解決的子問題,一一解決掉子問題后,我們再從子問題的答案推導復雜問題的答案。你看這確實比較類似分治算法的思想吧。我個人覺得,這種思路可能才是揭示問題本質、最終解決LLM復雜推理問題正宗的道路。我們以“Least-to-most prompting”技術為例來說明這種思路的一種具體實現方式,如上圖所示:它分為兩個階段,第一個階段,從原始問題我們可以得知最終要問的問題是什么,我們假設最終問題是Final Q,然后從原始問題填充Prompt模版:“如果要解決Final Q問題,那么我需要先解決”,然后把原始問題和這個Prompt交給LLM,讓LLM模型給出答案,等于讓LLM給出最終問題的前置子問題Sub Q;接下來我們進入第二個階段,讓LLM先回答剛才拿到的子問題Sub Q,并拿到對應的答案,然后原始問題拼接子問題Sub Q及對應答案,再去問LLM最終那個問題Final Q,此時LLM會給出最后的答案。如此這般,體現出拆解子問題,并從子問題的答案逐步找出最終答案的思路。


        2. 代碼預訓練增強LLM推理能力


        以上是目前利用Prompt激發LLM模型推理能力的三種主流做法,而關于LLM的推理能力,目前還觀察到一個有趣且費解的現象:除了文本外,如果能夠加入程序代碼一起參與模型預訓練,則能大幅提升LLM模型的推理能力。這個結論從不少論文的實驗部分都可以得出(可以參考:AUTOMATIC CHAIN OF THOUGHT PROMPTING IN LARGE LANGUAGE MODELS/Challenging BIG-Bench tasks and whether chain-of-thought can solve them等論文的實驗部分)。


        圖片


        上圖給出了一份實驗數據,來自于論文“On the Advance of Making Language Models Better Reasoners”,其中GPT3 davinci就是標準的GPT 3模型,基于純文本訓練;code-davinci-002(OpenAI內部稱為Codex)是同時在Code和NLP數據上訓練的模型。如果比較兩者效果,可以看出,不論采用具體哪種推理方法,僅僅是從純文本預訓練模型切換到文本和Code混合預訓練模型,在幾乎所有測試數據集合上,模型推理能力都得到了巨大的效果提升,比如我們以“Self Consistency”方法為例,在大多數據集合上的性能提升,都直接超過了20到50個百分點,這是很恐怖的性能提升,而其實在具體推理模型層面,我們什么也沒做,僅僅是預訓練的時候除了文本,額外加入了程序代碼而已。


        除了這個現象,從上圖數據中,我們還可以得出其它一些結論,比如GPT 3這種純文本預訓練模型,其實是具備相當程度的推理能力的,除了在GSM8K這種數學推理上效果比較差外,其它推理數據數據集合表現也還可以,前提你需要采用合適的方法,來激發出它本身就具備的這種能力;再比如,text-davinci-002,也就是在code-davinci-002基礎上加入instruct fine-tuning后的模型(就是加入InstructGPT或ChatGPT模型的第一步),其推理能力要弱于Codex,但是有其它研究表明它在自然語言處理任務又要強于Codex。而這貌似說明了,加入instruct fine-tuning,會損害LLM模型的推理能力,但是會在一定程度上提升自然語言理解能力。而這些結論其實都是很有意思的,也能啟發后續進一步的思考和探索。


        那么,一個自然的疑問是:為何預訓練模型可以從代碼的預訓練中獲得額外的推理能力?確切原因目前未知,值得深入探索。我猜測可能是因為原始版本的Codex(只使用代碼訓練,可參考文獻:Evaluating Large Language Models Trained on Code)的代碼訓練是從文本生成代碼,而且代碼中往往包含很多文本注釋,本質上這類似于預訓練模型做了<文本,Code>兩種數據的多模態對齊工作。而數據中必然包含相當比例的數學或邏輯問題的代碼、描述和注釋,很明顯這些數學類或邏輯推理類的數據,對于解決下游數學推理問題是有幫助的,我猜大概率原因在此。


        3. 關于LLM推理能力的思考


        上面介紹了LLM推理的主流技術思路和現有的一些結論,接下來談談我對LLM模型推理技術的思考,以下內容純個人推斷,沒有太多證據,還請謹慎參考。我的判斷是:雖然最近一年來,關于激發LLM的推理能力,這方面的技術進展很快,也取得了很大的技術進步,但是總體感覺是,我們可能走在正確的方向上,但是距離接觸到真正的問題本質還有一段距離,對此要有更深入的思考和探索。


        首先,我比較贊同上述分治算法的主體思路,對于復雜的推理問題,我們應該把它拆解成若干簡單的子問題,因為子問題對于LLM來說回答正確的概率就大很多,讓LLM一一回答子問題后,再逐步推導出最終答案。受到“Least-to-most prompting”技術的啟發,如果進一步思考,我覺得LLM推理本質上很可能會是如下兩種可能的其中之一:不斷和LLM進行交互的圖上推理問題,抑或是不斷和LLM進行交互的程序流程圖執行問題。


        圖片


        先說圖上推理問題,如上圖所示,假設我們有辦法能夠把復雜問題拆解成由子問題或者子步驟構成的圖結構,圖中的節點是子問題或者子步驟,圖中的邊代表了子問題之間的依賴關系,就是說只有回答好子問題A,才能回答子問題B,而且圖中大概率存在循環結構,就是反復做某幾個子步驟。假設我們能夠得到上述的子問題拆解圖,那么可以根據依賴關系,引導LLM一步一步按照圖結構,回答必須首先回答的子問題,直到推導出最終答案。


        圖片


        再說程序流程圖問題,參考上圖,假設我們有辦法把復雜問題拆解成子問題或子步驟,并產生一個由子步驟構成的類似程序流程圖的結構,在這個結構里,有些步驟會反復執行多次(循環結構),有些步驟的執行需要進行條件判斷(條件分支)。總而言之,在執行每個子步驟的時候和LLM進行交互,得到子步驟的答案,然后按照流程不斷執行,直到輸出最終答案。類似這種模式。假設這個思路大致正確的話,也許可以從這個角度來解釋為何加入代碼會增強預訓練模型的推理能力:大概率因為<文本,代碼>的多模態預訓練模型,在模型內部是通過類似這種隱含的程序流程圖作為兩個模態的橋梁,將兩者聯系起來的,即由文本描述到隱含的流程圖,再映射到由流程圖產生具體的代碼。也就是說,這種多模態預訓練,可以增強LLM模型從文本構建出隱含的流程圖并按照流程圖執行的能力,也就是加強了它的推理能力。


        當然,上述思路最大的問題是,我們如何根據文本描述的問題,能夠靠LLM模型,或者其它模型,得到圖結構或者流程圖結構?這個可能是其中的難點。一種可能的思路就類似繼續增強文本和更高質量的代碼預訓練,走隱式學習內部隱含結構的方法。而目前的CoT技術,如果套到上述思路來思考的話,可以這么理解:標準CoT,其實就是靠自然語言文本來描述圖結構或者程序流程圖的;而“Least-to-most prompting”技術,則是試圖根據最后一個圖節點,靠倒推來試圖推導出其中的圖結構,但是很明顯,目前的方法限制了它倒推的深度,也就是說它只能推導出非常簡單的圖結構,這正是限制它能力的所在。



        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 高碑店市| 茌平县| 瑞安市| 马鞍山市| 新乡县| 澄江县| 新丰县| 玛沁县| 大石桥市| 南溪县| 遵义县| 民乐县| 英吉沙县| 永济市| 高邑县| 新和县| 陕西省| 大荔县| 禹州市| 锡林浩特市| 和硕县| 寿光市| 河东区| 阳春市| 额尔古纳市| 武乡县| 凌云县| 张家川| 邹平县| 安多县| 读书| 桓台县| 新田县| 高台县| 寿阳县| 大同市| 抚顺县| 昌黎县| 成安县| 西安市| 山丹县|