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

轉自:https://mp.weixin.qq.com/s/eMrv15yOO0oYQ-o-wiuSyw
導讀:ChatGPT出現后驚喜或驚醒了很多人。驚喜是因為沒想到大型語言模型(LLM,Large Language Model)效果能好成這樣;驚醒是頓悟到我們對LLM的認知及發展理念,距離世界最先進的想法,差得有點遠。我屬于既驚喜又驚醒的那一批,也是典型的中國人,中國人善于自我反思,于是開始反思,而這篇文章正是反思的結果。

實話實說,國內在LLM模型相關技術方面,此刻,距離最先進技術的差距進一步加大了。技術領先或技術差距這事情,我覺得要動態地以發展的眼光來看。在Bert出現之后的一到兩年間,其實國內在這塊的技術追趕速度還是很快的,也提出了一些很好的改進模型,差距拉開的分水嶺應該是在 GPT 3.0出來之后,也就是2020年年中左右。在當時,其實只有很少的人覺察到:GPT 3.0它不僅僅是一項具體的技術,其實體現的是LLM應該往何處去的一個發展理念。自此之后,差距拉得越來越遠,ChatGPT只是這種發展理念差異的一個自然結果。所以,我個人認為,拋開是否有財力做超大型LLM這個因素,如果單從技術角度看,差距主要來自于對LLM的認知以及未來應往何處去的發展理念的不同。
國內被國外技術甩得越來越遠,這個是事實,不承認也不行。前陣子網上很多人擔憂說國內AI現在處于“危急存亡之秋”,我覺得倒也不至于這么嚴重。君不見,這個世界上,具備這么超前眼光的只有OpenAI一家嗎?包括Google在內,其實對于LLM發展理念的理解,明顯都落后OpenAI一個身位。現實是OpenAI表現過于優秀,把所有人都甩開了,不僅僅是國內。
我覺得,OpenAI對LLM在理念及相關技術方面,領先國外的Google、DeepMind大約半年到一年的時間,領先國內大概兩年左右的時間。在LLM這個事情上,感覺梯隊很明顯,Google應該是排在第二位,最能體現Google技術眼光的是PaLM和Pathways,推出時間大概在22年2月到4月間,同一時期,OpenAI推出的卻是InstructGPT,從這里就可以看出Google和OpenAI的差距了,至于為何這么說,你看了我后面的正文后大概能理解。DeepMind之前的重心一直在強化學習攻克游戲和AI for science這些方面,切入LLM其實很晚,應該是21年才開始重視這個方向,目前也處于追趕狀態。Meta就更不用說了,重心一直不在LLM上,目前感覺也發力開始追趕。這還是目前做得最好的一批機構,尚且如此,更何況國內呢?我覺得情有可原。至于OpenAI關于LLM的理念是什么,我在本文的最后一部分,會談談我的認知。
本文梳理自GPT 3.0出現之后的主流LLM技術,在此之前的主流技術可以參考:《乘風破浪的PTM:兩年來預訓練模型的技術進展》

(https://zhuanlan.zhihu.com/p/254821426)

我相信看完這兩篇文章,能夠讓您對LLM領域的技術脈絡,LLM技術發展過程中出現過的不同發展理念,乃至未來可能的發展趨勢,有比較清晰的認知。當然,很多地方講的內容是我個人看法,有很大的主觀性,錯漏難免,所以還請謹慎參考。
本文試圖回答下面一些問題:ChatGPT是否帶來了NLP乃至AI領域的研究范式轉換?如果是,那會帶來怎樣的影響?LLM從海量數據中學到了什么知識?LLM又是如何存取這些知識的?隨著LLM規模逐步增大,會帶來什么影響?什么是In Context Learning?為什么它是一項很神秘的技術?它和Instruct又是什么關系?LLM具備推理能力嗎?思維鏈CoT又是怎么做的?等等,相信看完,能讓您對這些問題有一個答案。
首先,在談LLM技術現狀前,先宏觀地談下我心目中的研究范式轉換問題。這樣,我們才能“先見森林,再見樹木”,對具體技術為何會是如此變化有個更清晰的認知。

01.潮流之巔:NLP研究范式的轉換

如果我們把時間線往前拉得更長一些,回到NLP領域的深度學習時代,在更長時間窗口內觀察技術變遷及其影響,可能會更容易看清其中的一些關鍵節點。我個人認為,在最近10年來NLP領域的技術發展過程中,可能存在兩次大的研究范型轉換。

1. 范式轉換1.0:從深度學習到兩階段預訓練模型

這個范式轉換所涵蓋的時間范圍,大致在深度學習引入NLP領域(2013年左右),到GPT 3.0出現之前(2020年5月左右)。
在Bert和GPT模型出現之前,NLP領域流行的技術是深度學習模型,而NLP領域的深度學習,主要依托于以下幾項關鍵技術:以大量的改進LSTM模型及少量的改進CNN模型作為典型的特征抽取器;以Sequence to Sequence(或叫encoder-decoder亦可)+Attention作為各種具體任務典型的總體技術框架。
在這些核心技術加持下,NLP領域深度學習的主要研究目標,如果歸納一下,是如何有效增加模型層深或模型參數容量。就是說,怎么才能往encoder和decoder里不斷疊加更深的LSTM或CNN層,來達成增加層深和模型容量的目標。這種努力,盡管確實不斷增加了模型層深,但是從解決具體任務的效果角度看,總體而言,不算很成功,或者說和非深度學習方法相對,帶來的優勢不算大。
深度學習之所以不夠成功,我認為主要原因來自于兩個方面:一方面是某個具體任務有限的訓練數據總量。隨著模型容量的增加,需要靠更大量的訓練數據來支撐,否則即使你能把深度做起來,任務效果也做不上去。而在預訓練模型出現之前,很明顯這是NLP研究領域一個嚴重問題;另外一個方面是LSTM/CNN特征抽取器,表達能力不夠強。意思是就算給你再多的數據也沒用,因為你不能有效地吸收數據里蘊含的知識。主要應該是這兩個原因,阻礙了深度學習在NLP領域的成功突圍。
Bert/GPT這兩個預訓練模型的出現,無論在學術研究角度看,還是工業應用角度來看,都代表了NLP領域的一個技術飛躍,并帶來了整個領域研究范式的轉換。這種范式轉換帶來的影響,體現在兩個方面:首先,是部分NLP研究子領域的衰退乃至逐步消亡;其次,NLP不同子領域的技術方法和技術框架日趨統一,在Bert出現后一年左右,技術棧基本收斂到兩種技術模式中。關于這兩點,我們分頭來談。

影響一:中間任務的消亡

NLP是一個宏觀研究領域的統稱,里面有五花八門具體的子領域與子方向,如果仔細分析,從任務的性質角度,可以把這些任務分成兩大類:一類可以叫做“中間任務”,一類可以稱為“最終任務”。
典型的中間任務包括:中文分詞、詞性標注、NER、句法分析、指代消解、語義Parser等,這類任務一般并不解決應用中的實際需求,大多數是作為那些解決實際需求任務的中間階段或者輔助階段存在的,比如幾乎沒有需求說,我要一個句法Parser,把這個句子的句法分析樹給用戶看看,用戶不需要看到這些NLP的中間階段處理結果,他只關心某個具體任務你有沒有干好。“最終任務”包括比如文本分類、文本相似性計算、機器翻譯、文本摘要等等,有很多。這類任務的特點是每個子領域都解決某個實際需求,任務結果基本能直接呈現給用戶,比如用戶確實存在給你一句英文,告訴他中文是什么的需求。
按理說,“中間任務”就不應該出現,而之所以會存在,這是NLP技術發展水平不夠高的一種體現。在技術發展早期階段,因為當時的技術相對落后,很難一步做好有難度的最終任務。比如機器翻譯,早期技術要做好機器翻譯是很困難的,于是科研人員就把難題分而治之,分解成分詞、詞性標注、句法分析等各種中間階段,先把每個中間階段做好,然后再拼起來完成最終任務,這也是沒辦法的事情。
但是自從Bert/GPT出現之后,其實就沒有必要做這些中間任務了,因為通過大量數據的預訓練,Bert/GPT已經把這些中間任務作為語言學特征,吸收到了Transformer的參數里,此時我們完全可以端到端地直接解決那些最終任務,而無須對這種中間過程專門建模。這里可能爭議最大的是中文分詞,其實道理也是一樣的,哪些字應該組成一個詞,這個其實你不用管,讓LLM自己當特征去學就行了,只要對于解決任務有幫助,它自然會去學該學的合理分詞方式,也未必一定要和我們人類理解的分詞規則相同。
基于以上認知,其實在Bert/GPT一出現,你就應該得出這類NLP的中間階段的任務,會逐步退出歷史舞臺這個結論。

影響二:不同研究方向技術路線的統一

在說明具體影響前,我們先討論下另外一種NLP任務劃分方式,這對于理解后面內容有幫助。如果對“最終任務”進一步進行分類,又大致可以分為兩大不同類型的任務:自然語言理解類任務和自然語言生成類任務。如果排除掉“中間任務”的話,典型的自然語言理解類任務包括文本分類、句子關系判斷、情感傾向判斷等,這種任務本質上都是分類任務,就是說輸入一個句子(文章),或者兩個句子,模型參考所有輸入內容,最后給出屬于哪個類別的判斷。自然語言生成也包含很多NLP研究子方向,比如聊天機器人、機器翻譯、文本摘要、問答系統等。生成類任務的特點是給定輸入文本,對應地,模型要生成一串輸出文本。這兩者的差異主要體現在輸入輸出形式上
自從Bert/GPT模型誕生后,出現了明顯的技術統一趨向。首先,NLP中不同的子領域,其特征抽取器都逐漸從LSTM/CNN統一到Transformer上。其實,自Bert公開后不久,就應該意識到,這必然會成為技術趨勢。至于其原因,在幾年前我寫的這篇:
《放棄幻想,全面擁抱Transformer:自然語言處理三大特征抽取器(CNN/RNN/TF)比較》(https://zhuanlan.zhihu.com/p/54743941)
中做了說明和分析,感興趣的同學可參考。而且,目前Transformer不僅統一了NLP諸多領域,也正在逐步地替換圖像處理各種任務中被廣泛使用的CNN等其它模型的進程之中,類似的,多模態模型目前也基本都采用了Transformer模型。這種Transformer從NLP出發,攻城略地逐步統一AI越來越多領域的趨勢,起始于2020年底出現的Vision Transformer (ViT) ,之后蓬勃發展,到目前已大獲成功,且其繼續向更多領域拓展的勢頭會越來越迅猛。
其次,大多數NLP子領域的研發模式切換到了兩階段模式:模型預訓練階段+應用微調(Fine-tuning)或應用Zero/Few Shot Prompt模式。更準確地說,NLP各種任務其實收斂到了兩個不同的預訓練模型框架里:對于自然語言理解類任務,其技術體系統一到了以Bert為代表的“雙向語言模型預訓練+應用Fine-tuning”模式;而對于自然語言生成類任務,其技術體系則統一到了以GPT 2.0為代表的“自回歸語言模型(即從左到右單向語言模型)+Zero /Few Shot Prompt”模式。至于為何會分化成兩條技術路線,有其必然性,關于這點我們放在后面解釋。
這兩種模式,看似比較相像,但其背后蘊含了迥異的發展思路,也會導向不同的未來發展方向。不過遺憾的是,我們中的絕大多數人,在當時都低估了GPT 這條發展路線的潛力,而把視覺中心聚焦到了Bert這種模式上。

2. 范式轉換2.0: 從預訓練模型走向通用人工智能 (AGI,Artificial General Intelligence)

這個范式轉換所涵蓋的時間范圍,大致在GPT3.0出現之后(20年6月左右),一直到目前為止,我們應該正處于這個范式轉換過程中。
ChatGPT是觸發這次范型轉換的關鍵節點,但是在InstructGPT出現之前,其實LLM處于這次范式轉換前的一個過渡期。
過渡期:以GPT 3.0為代表的“自回歸語言模型+Prompting”模式占據統治地位
前面說過,在預訓練模型發展的早期,技術框架收斂到了Bert模式和GPT模式這兩種不同的技術范型,而且人們普遍更看好Bert模式一些,相當多數的后續技術改進,都是沿著Bert那條路走的。但是,隨著技術的繼續發展,你會發現,目前規模最大的LLM模型,幾乎清一色都是類似GPT 3.0這種“自回歸語言模型+Prompting”模式的,比如GPT 3、PaLM、GLaM、Gopher、Chinchilla、MT-NLG、LaMDA等,沒有例外。為什么會這樣呢?背后一定有其必然性,我認為可能主要源于兩個原因。
在這里插入圖片描述

首先,Google的T5模型,在形式上統一了自然語言理解和自然語言生成任務的外在表現形式。如上圖所示,標為紅色的是個文本分類問題,黃色的是判斷句子相似性的回歸或分類問題,這都是典型的自然語言理解問題。在T5模型里,這些自然語言理解問題在輸入輸出形式上和生成問題保持了一致,也就是說,可以把分類問題轉換成讓LLM模型生成對應類別的字符串,這樣理解和生成任務在表現形式就實現了完全的統一。
這說明自然語言生成任務,在表現形式上可以兼容自然語言理解任務,若反過來,則很難做到這一點。這樣的好處是:同一個LLM生成模型,可以解決幾乎所有NLP問題。而如果仍然采取Bert模式,則這個LLM模型無法很好處理生成任務。既然這樣,我們當然傾向于使用生成模型,這是一個原因。
第二個原因,如果想要以零示例提示語(zero shot prompting)或少數示例提示語(few shot prompting)的方式做好任務,則必須要采取GPT模式。現在已有研究(參考:On the Role of Bidirectionality in Language Model Pre-Training)證明:如果是以fine-tuning方式解決下游任務,Bert模式的效果優于GPT模式;若是以zero shot/few shot prompting這種模式解決下游任務,則GPT模式效果要優于Bert模式。這說明了,生成模型更容易做好zero shot/few shot prompting方式的任務,而Bert模式以這種方式做任務,是天然有劣勢的。這是第二個原因。
但是問題來了:為什么我們要追求zero shot/few shot prompting這種方式來做任務呢?要解釋清楚這個問題,我們首先需要搞清楚另外一個問題:什么樣的LLM模型,對我們是最理想的?
在這里插入圖片描述

上圖展示了一個理想的LLM該有的樣子。首先,LLM應該具備強大的自主學習能力。假設我們把世界上能獲得的所有文本或者圖片等不同類型的數據喂給它,它應該能夠自動從中學習到里面包含的所有知識點,學習過程不需要人的介入,并且能靈活應用所學知識,來解決實際問題。因為數據是海量的,要吸收所有知識,就要非常多的模型參數來存儲知識,所以這個模型必然會是一個巨無霸模型。
其次,LLM應該能解決NLP任何子領域的問題,而不僅支持有限領域,甚至它應該可以響應NLP之外其它領域的問題,最好是任意領域的問題都能得到很好地回答。
再者,當我們使用LLM解決某個具體領域問題的時候,應該用我們人類習慣的表達方式,就是說LLM應該理解人類的命令。這體現出讓LLM適配人,而不是反過來,讓人去適配LLM模型。人適配LLM的典型例子,比如絞盡腦汁去嘗試各種不同的prompt,以試圖找到好的提示語,才能很好地解決手頭問題。關于這點,上圖在人類和LLM交互的接口層,舉了幾個例子,說明什么是好的人使用LLM模型的接口形式。
看完這個理想中的LLM,我們再回頭解釋上面遺留的問題:為什么我們要追求zero shot/few shot prompting這種方式來做任務呢?有兩個原因。
第一,這個LLM模型規模必然非常巨大,有能力作出這個模型,或改動這個模型參數的機構必然很少。而任務需求方是千千萬萬的中小機構甚至是個人,就算你把模型開源出來,他們也無力部署這個模型,更不用說再用Fine-tuning這種模式去修改模型參數了。所以,我們應該追求不修正模型參數,就能讓任務需求方完成任務的方式,也就是應該采取prompt模式完成任務,而非Fine-tuning模式(由此可看出,soft prompting技術方向是違背這個發展趨勢的)。模型制作方則將LLM作成公用服務,以LLM as Service的模式運行。作為服務支持方,考慮到千變萬化的用戶需求,所以LLM模型制作方更要追求讓LLM能完成盡可能多類型的任務,這是附帶的影響,也是為何超級大模型一定會追求走向AGI的現實因素。
第二,zero shot prompting也好,few shot prompting也好,甚至促進LLM推理能力的思維鏈(CoT,Chain of Thought)Prompting也好,就是上圖中接口層中的現有技術。具體而言,zero shot prompting的初衷,其實就是人類和LLM的理想接口,直接用人類所習慣的任務表述方式讓LLM做事情,但是發現LLM并不能很好地理解,效果也不好。經過繼續研究,轉而發現:對于某項任務,如果給LLM幾個示例,用這些示例來代表任務描述,效果會比zero shot prompting好,于是大家都去研究更好的few shot prompting技術。可以理解為,本來我們希望LLM能夠用人類常用的命令方式來執行某個任務,但是目前技術還做不到,所以退而求其次,用這些替代技術來表達人類的任務需求。
如果理解了上述邏輯,很容易得出如下結論:few shot prompting(也被稱為In Context Learning)只是一種過渡時期的技術。如果我們能夠更自然地去描述一個任務,而且LLM可以理解,那么,我們肯定會毫不猶豫地拋棄這些過渡期的技術,原因很明顯,用這些方法來描述任務需求,并不符合人類的使用習慣。
這也是為何我將GPT 3.0+Prompting列為過渡期技術的原因,ChatGPT的出現,改變了這個現狀,用Instruct取代了Prompting,由此帶來新的技術范式轉換,并產生若干后續影響。

影響一:讓LLM適配人的新型交互接口

在理想LLM的背景下,我們再來看ChatGPT,能更好理解它的技術貢獻。ChatGPT應該是目前所有的現有技術里,最接近理想LLM的技術方法。如果歸納下ChatGPT最突出特點的話,我會用下面八個字:“能力強大,善解人意”。
“能力強大”這一點,我相信應該主要歸功于ChatGPT所依托的基礎LLM GPT3.5。因為ChatGPT 盡管加入了人工標注數據,但是量級只有數萬,這個規模的數據量,和訓練GPT 3.5模型使用的幾千億token級別的數據量相比,包含的世界知識(數據中包含的事實與常識)可謂滄海一粟,幾可忽略,基本不會對增強GPT 3.5的基礎能力發揮什么作用。所以它的強大功能,應該主要來自于隱藏在背后的GPT 3.5。GPT 3.5對標理想LLM模型中的那個巨無霸模型。
那么,ChatGPT向GPT 3.5模型注入新知識了嗎?應該是注入了,這些知識就包含在幾萬人工標注數據里,不過注入的不是世界知識,而是人類偏好知識。所謂“人類偏好”,包含幾方面的含義:首先,是人類表達一個任務的習慣說法。比如,人習慣說:“把下面句子從中文翻譯成英文”,以此表達一個“機器翻譯”的需求,但是LLM又不是人,它怎么會理解這句話到底是什么意思呢?你得想辦法讓LLM理解這句命令的含義,并正確執行。所以,ChatGPT通過人工標注數據,向GPT 3.5注入了這類知識,方便LLM理解人的命令,這是它“善解人意”的關鍵。其次,對于什么是好的回答,什么是不好的回答,人類有自己的標準,例如比較詳細的回答是好的,帶有歧視內容的回答是不好的,諸如此類。這是人類自身對回答質量好壞的偏好。人通過Reward Model反饋給LLM的數據里,包含這類信息。總體而言,ChatGPT把人類偏好知識注入GPT 3.5,以此來獲得一個聽得懂人話、也比較禮貌的LLM。
可以看出,ChatGPT的最大貢獻在于:基本實現了理想LLM的接口層,讓LLM適配人的習慣命令表達方式,而不是反過來讓人去適配LLM,絞盡腦汁地想出一個能Work的命令(這就是instruct技術出來之前,prompt技術在做的事情),而這增加了LLM的易用性和用戶體驗。是InstructGPT/ChatGPT首先意識到這個問題,并給出了很好的解決方案,這也是它最大的技術貢獻。相對之前的few shot prompting,它是一種更符合人類表達習慣的人和LLM進行交互的人機接口技術。
而這必將啟發后續的LLM模型,繼續在易用人機接口方面做進一步的工作,讓LLM更聽話。

影響二:很多NLP子領域不再具備獨立研究價值

就NLP領域而言,這次范式轉換,意味著很多目前獨立存在的NLP研究領域,將被納入LLM的技術體系,進而不再獨立存在,逐步消失。經過第一次范式轉換,盡管NLP中很多“中間任務”,繼續作為獨立研究領域存在不再必要,但是大多數“最終任務”,仍然是以獨立研究領域存在的,只是切換成在“預訓練+fine-tuning”框架下,面對領域獨有問題,陸續提出新的改進方案。
目前研究表明,很多NLP任務,隨著LLM模型規模增長,效果會大幅提升。據此,我覺得可得到如下推論:大多數某領域所謂“獨有”的問題,大概率只是缺乏領域知識導致的一種外在表象,只要領域知識足夠多,這個所謂領域獨有的問題,就可以被很好地解決掉,其實并不需要專門針對某個具體領域問題,冥思苦想去提出專用解決方案。也許AGI的真相超乎意料地簡單:你只要把這個領域更多的數據交給LLM,讓它自己學習更多知識即可。
在這個背景下,同時,ChatGPT證明了我們現在是可以直接去追求理想LLM模型的,那么,未來的技術發展趨勢應該是:追求規模越來越大的LLM模型,通過增加預訓練數據的多樣性,來涵蓋越來越多的領域,LLM自主從領域數據中通過預訓練過程學習領域知識,隨著模型規模不斷增大,很多問題隨之得到解決。研究重心會投入到如何構建這個理想LLM模型,而非去解決某個領域的具體問題。這樣,越來越多NLP的子領域會被納入LLM的技術體系,進而逐步消失。
我認為,判斷某個具體領域是否該立即停止獨立研究,其判斷標準可采取以下兩種方法,占其一即可:第一,判斷某個任務,是否LLM的研究效果超過人類表現,對于那些LLM效果超過人類的研究領域,已無獨立研究的必要。舉個例子,GLUE與SuperGLUE測試集合里的很多任務,目前LLM效果已超過人類表現,與這個數據集合密切相關的研究領域,其實就沒有繼續獨立存在的必要。第二,對比兩種模式的任務效果,第一種模式是用較大的領域專用數據進行Fine-tuning,第二種是few-shot prompting或instruct-based方法。如果第二種方法效果達到或超過第一種方法,則意味著這個領域沒有繼續獨立存在的必要性。如果用這個標準來看,其實很多研究領域,目前fine-tuning效果還是占優的(因為這種模式領域訓練數據量大),看似還可獨立存在。但是考慮到很多任務隨著模型規模增大,few shot prompting效果持續增長,隨著更大模型的出現,這個拐點很可能短期就會達到。
如果上述猜測成立,將意味著如下殘酷事實:對于很多NLP領域的研究人員,將面臨往何處去的選擇,是繼續做領域獨有問題呢?還是放棄這種看似前途不大的方式,轉而去建設更好的LLM?如果選擇轉向去建設LLM,又有哪些機構有能力、有條件去做這個事情呢?你對這個問題的回答會是什么呢?

影響三:更多NLP之外的研究領域將被納入LLM技術體系

如果站在AGI的視角,參照之前描述的理想LLM模型,它所能完成的任務,不應局限于NLP領域,或某一兩個學科領域,理想中的LLM應該是領域無關的通用人工智能模型,它現在在某一兩個領域做得好,不代表只能做這些任務。ChatGPT的出現,證明了現在這個時期,我們去追求AGI是有可行性的,而現在是拋開“領域學科”這個思維束縛的時候了。
ChatGPT除了展示出以流暢的對話形式解決各種NLP任務外,也具備強大的代碼能力。很自然的,之后越來越多其它的研究領域,也會被逐步納入LLM體系中,成為通用人工智能的一部分。
在這里插入圖片描述

LLM從NLP向外進行領域拓展,一個自然的選擇就是圖像處理及多模態相關任務。目前已經有些工作在嘗試把多模態融入,讓LLM成為一個支持多模態輸入輸出的通用人機接口,典型的例子包括DeepMind的Flamingo和微軟的“Language Models are General-Purpose Interfaces”,上圖展示了這種方式的概念結構。
我的判斷是無論是圖像還是多模態,未來被融入LLM成為好用的功能,可能比我們想象的進度要慢。主要原因在于:盡管圖像領域最近兩年也一直在模仿Bert預訓練的路子,嘗試引入自監督學習,釋放模型自主從圖像數據中學習知識的能力,典型技術就是“對比學習”和MAE,這是兩條不同的技術路線。然而,從目前效果來看,盡管取得了很大的技術進步,但貌似這條路尚未走通,這體現在圖像領域預訓練模型應用到下游任務,帶來的效果收益,遠不如Bert或GPT應用在NLP下游任務那樣顯著。所以,圖像預處理模型仍需深入探索,以釋放圖像數據的潛力,而這會遲滯它們被統一到LLM大模型的時間。當然,如果哪天這條路被趟通,大概率會復現NLP領域目前的局面,就是圖像處理各個研究子領域可能會逐步消失,被融入到大型LLM中來,直接完成終端任務。
除了圖像與多模態,很明顯,其它領域也會逐漸被納入到理想LLM中來,這個方向方興未艾,是具備高價值的研究主題。
以上是我對范式轉換的個人思考,接下來,我們來梳理下GPT 3.0之后LLM模型的主流技術進展。如理想LLM模型所示,相關的技術其實可以分為兩大類;一類是關于LLM模型如何從數據中吸收知識,也包括模型規模增長對LLM吸收知識能力帶來的影響;第二類是關于人如何使用LLM內在能力來解決任務的人機接口,包括In Context Learning和Instruct兩種模式。思維鏈(CoT)prompting這種LLM推理技術,本質上也屬于In Context Learning,因為比較重要,我就把它們單獨拎出來講一下。

02.學習者:從無盡數據到海量知識

從目前研究結果看,Transformer是足夠強大的特征抽取器,尚不需要做特別的改進。那么通過預訓練過程,Transformer學到了什么?知識是如何存取的?我們又如何修正錯誤知識?本節講述這方面的研究進展。

1. 求知之路:LLM學到了什么知識

LLM從海量自由文本中學習了大量知識,如果把這些知識做粗略分類的話,可以分為語言類知識和世界知識兩大類。
語言類知識指的是詞法、詞性、句法、語義等有助于人類或機器理解自然語言的知識。關于LLM能否捕獲語言知識有較長研究歷史,自從Bert出現以來就不斷有相關研究,很早就有結論,各種實驗充分證明LLM可以學習各種層次類型的語言學知識,這也是為何使用預訓練模型后,各種語言理解類自然語言任務獲得大幅效果提升的最重要原因之一。另外,各種研究也證明了淺層語言知識比如詞法、詞性、句法等知識存儲在Transformer的低層和中層,而抽象的語言知識比如語義類知識,廣泛分布在Transformer的中層和高層結構中。
世界知識指的是在這個世界上發生的一些真實事件(事實型知識,Factual Knowledge),以及一些常識性知識(Common Sense Knowledge)。比如“拜登是現任美國總統”、“拜登是美國人”、“烏克蘭總統澤連斯基與美國總統拜登舉行會晤”,這些都是和拜登相關的事實類知識;而“人有兩只眼睛”、“太陽從東方升起”這些屬于常識性知識。關于LLM模型能否學習世界知識的研究也有很多,結論也比較一致:LLM確實從訓練數據中吸收了大量世界知識,而這類知識主要分布在Transformer的中層和高層,尤其聚集在中層。而且,隨著Transformer模型層深增加,能夠學習到的知識數量逐漸以指數級增加(可參考:BERTnesia: Investigating the capture and forgetting of knowledge in BERT)。其實,你把LLM看作是一種以模型參數體現的隱式知識圖譜,如果這么理解,我認為是一點問題也沒有的。
“When Do You Need Billions of Words of Pre-training Data?”這篇文章研究了預訓練模型學習到的知識量與訓練數據量的關系,它的結論是:對于Bert類型的語言模型來說,只用1000萬到1億單詞的語料,就能學好句法語義等語言學知識,但是要學習事實類知識,則要更多的訓練數據。這個結論其實也是在意料中的,畢竟語言學知識相對有限且靜態,而事實類知識則數量巨大,且處于不斷變化過程中。而目前研究證明了隨著增加訓練數據量,預訓練模型在各種下游任務中效果越好,這說明了從增量的訓練數據中學到的更主要是世界知識。

2. 記憶之地:LLM如何存取知識

由上可知,LLM確實從數據中學到了很多語言類及世界知識。那么,對于某條具體的知識,LLM把它存儲到了哪里?又是如何提取出來的?這也是一個有意思的問題。
顯然,知識一定存儲在Transformer的模型參數里。從Transformer的結構看,模型參數由兩部分構成:多頭注意力(MHA)部分占了大約參數總體的三分之一,三分之二的參數集中在FFN結構中。MHA主要用于計算單詞或知識間的相關強度,并對全局信息進行集成,更可能是在建立知識之間的聯系,大概率不會存儲具體知識點,那么很容易推論出LLM模型的知識主體是存儲在Transformer的FFN結構里。
在這里插入圖片描述

但這樣的定位,粒度還是太粗,無法很好回答具體某條知識是如何存儲與提取的,比如 “中國的首都是北京”這條知識,以三元組表達就是<北京,is-capital-of,中國>,其中“is-capital-of”代表實體間關系。這條知識它存儲在LLM的哪里呢?
“Transformer Feed-Forward Layers Are Key-Value Memories”給出了一個比較新穎的觀察視角,它把Transformer的FFN看成存儲大量具體知識的Key-Value存儲器。如上圖所示(圖左是原始論文圖,其實不太好理解,可以看做了注釋的圖右,更好理解些),FFN的第一層是個MLP寬隱層,這是Key層;第二層是MLP窄隱層,是Value層。FFN的輸入層其實是某個單詞對應的MHA的輸出結果Embedding,也就是通過Self Attention,將整個句子有關的輸入上下文集成到一起的Embedding,代表了整個輸入句子的整體信息。
Key層的每個神經元節點,記載了一對<Key,Value>信息。比如對于上圖中FFN第一個隱層的第 個節點 ,也許就是它記載了<北京,is-capital-of,中國>這條知識。 節點對應的key向量,其實指的是節點 和輸入層每個節點的權重向量;而對應的Value向量,指的是節點 和FFN第二層的Value層每個節點形成連接的權重向量。每個神經元的Key向量,用于識別輸入中的某種語言或者知識模式,是一種模式探測器。如果輸入中包含它要檢測的某種模式,那么輸入向量和 節點的key權重進行向量內積計算,加上Relu,形成 的大數值響應,意味著 檢測到了這個模式,于是再把這個響應值,通過 節點的Value權重向量向FFN第二層傳播。這等價于將Value向量的值,用響應值加權,然后傳遞并體現到第二層Value層每個節點的輸出上。如此這般,FFN的正向傳播計算過程,看起來就像是通過Key檢測到某種知識模式,然后取出對應的Value,并把Value體現在FFN的第二層輸出上。當然,FFN第二層每個節點,會收集FFN的Key層所有節點信息,所以是一種混合響應,而Value層所有節點的混合響應,可以解讀為代表輸出單詞的概率分布信息。
聽著可能還是比較復雜,我們用個極端的例子來說明。我們假設上圖的節點 就是記載<北京,is-capital-of,中國>這條知識的Key-Value存儲器,它的Key向量,用于檢測”中國的首都是…”這個知識模式,它的Value向量,基本存儲了與單詞“北京”的Embedding比較接近的向量。當Transformer的輸入是“中國的首都是[Mask]”的時候, 節點從輸入層探測到這個知識模式,所以產生較大的響應輸出。我們假設Key層其它神經元對這個輸入都沒有任何響應,那么對應的Value層的節點,其實只會接收到“北京”這個Value對應的單詞embedding,并通過 的大響應值,進行了進一步的數值放大。于是,Mask位置對應的輸出,就自然會輸出“北京”這個單詞。基本就是這么個過程,看著很復雜,其實很簡單。
而且這篇文章還指出,Transformer低層對句子的表層模式作出反應,高層對語義模式作出反應,就是說低層FFN存儲詞法、句法等表層知識,中層和高層存儲語義及事實概念知識,這和其它研究結論是一致的。
要我猜,把FFN看成Key-Value存儲器這種思路,很可能不是最終的正確答案,但是距離最終正確答案的距離,估計也不太遠。

3. 知識涂改液:如何修正LLM里存儲的知識

既然我們已知具體的某條世界知識存儲在某個或者某些FFN節點的參數里,自然會引發另外一個問題:我們能否修正LLM模型里存儲的錯誤或者過時的知識呢?比如對于問題:“英國的現任首相是誰?”鑒于近年來英國首相頻繁更迭,你猜LLM更傾向輸出“鮑里斯”還是更青睞“蘇納克”?很明顯訓練數據中包含“鮑里斯”的數據會更多,這種情況很大可能LLM會給出錯誤回答,于是我們就有修正LLM里存儲的過時知識的必要性。
如果歸納下,目前有三類不同方法來修正LLM里蘊含的知識:
第一類方法從訓練數據的源頭來修正知識。“Towards Tracing Factual Knowledge in Language Models Back to the Training Data”這篇文章的研究目標是:對于指定的某條知識,我們是否可以定位到是哪些訓練數據導致LLM學會了這條知識?答案是肯定的,這意味著我們可以逆向追蹤到某條知識對應的訓練數據源頭。如果利用這項技術,假設我們想要刪除某條知識,則可首先定位到其對應的數據源頭,刪除數據源,然后重新預訓練整個LLM模型,這樣即可達成刪除LLM中相關知識的目的。但是這里有個問題,如果修正一小部分知識,我們就需要重新做一次模型預訓練,這樣做明顯成本太高。所以這種方法不會太有發展前景,可能比較適合那種對于某個特定類別數據的一次性大規模刪除場合,不適合少量多次的常規知識修正場景,比如可能比較適合用來做去除偏見等去toxic內容的處理。
第二類方法是對LLM模型做一次fine-tuning來修正知識。一個直觀能想到的方法是:我們可以根據要修正成的新知識來構建訓練數據,然后讓LLM模型在這個訓練數據上做fine-tuning,這樣指導LLM記住新的知識,遺忘舊的知識。這個方法簡單直觀,但是也有一些問題,首先它會帶來災難遺忘問題,就是說除了忘掉該忘的知識,還忘掉了不該忘的知識,導致這么做了之后有些下游任務效果下降。另外,因為目前的LLM模型規模非常大,即使是做fine-tuning,如果次數頻繁,其實成本也相當高。對這種方法感興趣的可以參考“Modifying Memories in Transformer Models”。
另外一類方法直接修改LLM里某些知識對應的模型參數來修正知識。假設我們想要把舊知識<英國,現任首相,鮑里斯>,修正到<英國,現任首相,蘇納克>。首先我們想辦法在LLM模型參數中,定位到存儲舊知識的FFN節點,然后可以強行調整更改FFN中對應的模型參數,將舊知識替換成新的知識。可以看出,這種方法涉及到兩項關鍵技術:首先是如何在LLM參數空間中定位某條知識的具體存儲位置;其次是如何修正模型參數,來實現舊知識到新知識的修正。關于這類技術的細節,可以參考“Locating and Editing Factual Associations in GPT”和“Mass-Editing Memory in a Transformer”。理解這個修正LLM知識的過程,其實對于更深入理解LLM的內部運作機制是很有幫助的。

03.規模效應:當LLM越來越大時會發生什么

我們知道,近年來,LLM模型規模在快速增長,目前效果最好的LLM模型,其參數規模大都超過了千億(100B)參數規模。比如,OpenAI的GPT 3的規模為175B,Google的LaMDA規模為137B,PaLM的規模為540B,DeepMind的Gogher規模為280B等,不一而足。國內也有中文巨型模型,比如智源GLM規模130B,華為“盤古”規模200B,百度“文心”規模260B,浪潮“源1.0”規模245B。那么,一個很自然的問題就是:隨著LLM模型規模不斷增長,會發生些什么呢?
預訓練模型的應用往往是兩階段的:預訓練階段,及具體場景應用階段。在預訓練階段,其優化目標是交叉熵,對GPT這種自回歸語言模型來說,也就是看LLM是否正確預測到了下一個單詞;而場景應用階段,一般要看具體場景的評價指標。一般我們的直覺是:如果LLM模型在預訓練階段的指標越好,自然它解決下游任務的能力就越強。然而,事實并非完全如此。現有研究已證明,預訓練階段的優化指標確實和下游任務表現出正相關關系,但是并非完全正相關。也就是說,只看預訓練階段的指標,來判斷一個LLM模型是否夠好,這是不夠的。基于此,我們分頭來看在這兩個不同階段,隨著LLM模型增大,有什么影響。
在這里插入圖片描述

首先,我們先看在預訓練階段,隨著模型規模逐步增大,會發生什么。OpenAI在“Scaling Laws for Neural Language Models”中專門研究了這個問題,并提出LLM模型所遵循的“伸縮法則”(scaling law)。如上圖所示,這個研究證明:當我們獨立增加訓練數據量、模型參數規模或者延長模型訓練時間(比如從1個Epoch到2個Epoch),預訓練模型在測試集上的Loss都會單調降低,也就是說模型效果越來越好。
既然三個因素都重要,那么我們在實際做預訓練的時候,就有一個算力如何分配的決策問題:假設用于訓練LLM的算力總預算(比如多少GPU小時或者GPU天)給定,那么是應該多增加數據量、減少模型參數呢?還是說數據量和模型規模同時增加,減少訓練步數呢?此消彼長,某個要素規模增長,就要降低其它因素的規模,以維持總算力不變,所以這里有各種可能的算力分配方案。最終OpenAI選擇了同時增加訓練數據量和模型參數,但是采用早停策略(early stopping)來減少訓練步數的方案。因為它證明了:對于訓練數據量和模型參數這兩個要素,如果只單獨增加其中某一個,這不是最好的選擇,最好能按照一定比例同時增加兩者,它的結論是優先增加模型參數,然后才是訓練數據量。假設用于訓練LLM的算力總預算增加了10倍,那么應該增加5.5倍的模型參數量,1.8倍的訓練數據量,此時模型效果最佳。
DeepMind的一項研究(參考:Training Compute-Optimal Large Language Models)更深入地探究了這個問題,其基本結論和OpenAI的結論差不多,比如確實需要同時增加訓練數據量和模型參數,模型效果才會更好。而很多大模型在做預訓練的時候,并沒有考慮這一點,很多LLM大模型只是單調增加模型參數,而固定住了訓練數據量,這個做法其實是不對的,限制了LLM模型的潛力。但是它修正了兩者的比例關系,認為訓練數據量和模型參數是同等重要的,也就是說,假設用于訓練LLM的算力總預算增加了10倍,那么應該增加3.3倍的模型參數量,3.3倍的訓練數據量,這樣模型效果才最好。
這意味著:增加訓練數據量的重要性,比我們之前所認為的,還要重要。基于這個認知,DeepMind在設計Chinchilla模型時,在算力分配上選擇了另外一種配置:對標數據量300B、模型參數量280B的Gopher模型,Chinchilla選擇增加4倍的訓練數據,但是將模型參數降低為Gopher的四分之一,大約為70B。但是無論預訓練指標,還是很多下游任務指標,Chinchilla效果都要優于規模更大的Gopher。
這帶給我們如下啟示:我們可以選擇放大訓練數據,并同比例地減少LLM模型參數,以達到在不降低模型效果的前提下,極大縮小模型規模的目的。縮小模型規模有很多好處,比如在應用的時候,推理速度會快很多等,無疑這是一個很有前途的LLM發展路線。
以上是從預訓練階段來看模型規模的影響,如果從LLM解決下游具體任務效果的角度來看,隨著模型規模增大,不同類型的任務有不同的表現,具體而言,有以下三類情況。
在這里插入圖片描述

第一類任務完美體現了LLM模型的scaling law,就是說隨著模型規模逐步放大,任務的表現越來越好,如上圖里的(a)圖所示。這類任務通常符合如下共性:它們往往都是知識密集型任務,也就是說如果LLM模型包含的知識量越多,這類任務表現越好。而很多研究已經證明越大的LLM模型學習效率越高,也就是說相同訓練數據量,模型越大任務效果越好,說明面對的即使是同樣的一批訓練數據,更大的LLM模型相對規模小一些的模型,從中學到了更多的知識。更何況一般情況下,在增大LLM模型參數的時候,往往會同步增加訓練數據量,這意味著大模型可以從更多數據中學習更多的知識點。這些研究可以很好地解釋上圖,為何隨著模型規模增大,這些知識密集型的任務效果越來越好。大多數傳統的自然語言理解類任務,其實都屬于這種知識密集型任務,而很多任務在近兩年獲得了極大的效果提升,甚至超過了人類表現。很明顯,這大概率是LLM模型的規模增長帶來的,而非歸功于某項具體的技術改進。
第二類任務展現出LLM具備某種“涌現能力(Emergent Ability)”,如上圖(b)所示。所謂“涌現能力”,指的是當模型參數規模未能達到某個閥值時,模型基本不具備解決此類任務的任何能力,體現為其性能和隨機選擇答案效果相當,但是當模型規模跨過閥值,LLM模型對此類任務的效果就出現突然的性能增長。也就是說,模型規模是解鎖(unlock)LLM新能力的關鍵,隨著模型規模越來越大,會逐漸解鎖LLM越來越多的新能力。這是個很神奇的現象,因為它意味著如下讓人對未來可報樂觀預期的可能:或許很多任務,目前LLM還不能很好地解決,甚至站在現在這個時刻的我們看起來,LLM完全沒有能力解決這類任務,但因LLM具備“涌現能力”,所以如果我們繼續推大模型,也許某一天它的這項能力就被突然解鎖了。LLM模型的規模增長會給我們帶來意想不到的精彩禮物。
“Beyond the Imitation Game: Quantifying and extrapolating the capabilities of language models”這篇文章指出,這類體現出“涌現能力”的任務也有一些共性:這些任務一般由多步驟構成,要解決這些任務,往往需要先解決多個中間步驟,而邏輯推理能力在最終解決這類任務中發揮重要作用。思維鏈(Chain of Thought)Prompting是典型的增強LLM推理能力的技術,能大幅提升此類任務的效果,關于CoT技術,在隨后小節內容會做解釋,此處暫不展開。
問題是,為何LLM會出現這種“涌現能力”現象呢?上述文章以及“Emergent Abilities of Large Language Models”給出了幾個可能的解釋:
一種可能解釋是有些任務的評價指標不夠平滑。比如說有些生成任務的判斷標準,它要求模型輸出的字符串,要和標準答案完全匹配才算對,否則就是0分。所以,即使隨著模型增大,其效果在逐步變好,體現為輸出了更多的正確字符片段,但是因為沒有完全對,只要有任何小錯誤都給0分,只有當模型足夠大,輸出片段全部正確才能得分。也就是說,因為指標不夠平滑,所以不能體現LLM其實正在逐步改善任務效果這一現實,看起來就是“涌現能力”這種外在表現。
另外一種可能的解釋是:有些任務由若干中間步驟構成,隨著模型規模增大,解決每個步驟的能力也在逐步增強,但是只要有一個中間步驟是錯的,最終答案就是錯的,于是也會導致這種表面的“涌現能力”現象。
當然,上面的解釋目前還都是猜想,至于為何LLM會出現這種現象,還需要進一步更深入的研究。
在這里插入圖片描述

還有少部分任務,隨著模型規模增長,任務的效果曲線展現出U形特性:隨著模型規模逐漸變大,任務效果逐漸變差,但是當模型規模進一步增長,則效果開始越來越好,呈現出U形增長趨勢,如上圖所示的粉紅色PaLM模型在兩個任務上的指標走勢。為何這些任務表現得如此特殊呢?“Inverse scaling can become U-shaped”這篇文章給出了一種解釋:這些任務,內部其實隱含了兩種不同類型的子任務,一種是真正的任務,另外一種是“干擾任務(distractor task)”。當模型規模小的時候,無法識別任意一種子任務,所以模型的表現跟隨機選擇答案差不多,當模型增長到中等規模的時候,主要執行的是干擾任務,所以對真正的任務效果有負面影響,體現為真正任務效果的下降,而當進一步增加模型規模,則LLM可以忽略干擾任務,執行真正的任務,體現為效果開始增長。
對于那些隨著模型規模增大,效果一直下降的任務,如果采用思維鏈(CoT)Prompting,則部分任務的表現轉換為遵循Scaling law,即模型規模越大效果越好,而其它任務則轉換為U性增長曲線。這其實側面說明了:此類任務應屬于推理類型的任務,所以加入CoT后任務表現會發生質的變化。

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幾個樣本示例 ,然后給它 ,LLM竟然能夠成功預測對應的 。聽到這你會反問:這有什么神奇的呢?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的樣本示例 中, 是否 對應的正確答案,其實并不重要,如果我們把正確答案 替換成隨機的另外一個答案 ,這并不影響In Context Learning的效果。這起碼說明了一點:In Context Learning并沒有提供給LLM那個從 映射到 的映射函數信息:,否則的話你亂換正確標簽,肯定會擾亂這個 映射函數。也就是說,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”技術,則是試圖根據最后一個圖節點,靠倒推來試圖推導出其中的圖結構,但是很明顯,目前的方法限制了它倒推的深度,也就是說它只能推導出非常簡單的圖結構,這正是限制它能力的所在。

06.未來之路:LLM研究趨勢及值得研究的重點方向

這里列出一些我個人認為比較重要的LLM研究領域,或值得深入探索的研究方向。

1. 探索LLM模型的規模天花板

盡管繼續推大LLM模型的規模,這事看似沒有技術含量,但是其實這個事情異常重要。我個人判斷,自從Bert出現以來,到GPT 3,再到ChatGPT,大概率這些給人印象深刻的關鍵技術突破,核心貢獻都來自于LLM模型規模的增長,而非某項具體技術。說不定,揭開AGI真正的鑰匙就是:超大規模及足夠多樣性的數據、超大規模的模型,以及充分的訓練過程。再者,做超大規模的LLM模型,對技術團隊的工程實現能力要求是非常高的,也不能認為這事情缺乏技術含量。
那么繼續推大LLM模型規模,有什么研究意義呢?我覺得有兩方面的價值。首先,如上所述,我們已知,對于知識密集型的任務,隨著模型規模越大,各種任務的效果會越來越好;而對很多推理類型的有難度的任務,加上CoT Prompting后,其效果也呈現出遵循Scaling law的趨向。那么,很自然的一個問題就是:對于這些任務,LLM的規模效應,能將這些任務解決到何種程度?這是包括我在內,很多人關心的問題。其次,考慮到LLM具備的神奇的“涌現能力”,如果我們繼續增加模型規模,它會解鎖哪些讓我們意想不到的新能力呢?這也是很有意思的問題。考慮到以上兩點,我們仍然需要不斷增大模型規模,看看模型規模對解決各類任務的天花板在哪里。
當然,這種事情也就只能說說,對99.99%的從業者來說,是沒有機會和能力做這個事情的。要做這個事情,對研究機構的財力及投入意愿、工程能力、技術熱情,都有極高的要求,缺一不可。能做這事情的機構,粗估下來,國外不超過5家,國內不超過3家。當然,考慮到成本問題,未來也許會出現“股份制大模型”,就是有能力的幾家機構合作,群策群力,一起來共建超級大模型的現象。

2. 增強LLM的復雜推理能力

正如之前對LLM推理能力的敘述,盡管LLM在最近一年推理能力得到了很大的提升,但是很多研究(參考:Limitations of Language Models in Arithmetic and Symbolic Induction/Large Language Models Still Can’t Plan)表明,目前LLM能夠解決得比較好的推理問題,往往都相對簡單,LLM的復雜推理能力仍然薄弱,比如即使是簡單的字符拷貝推理或者加減乘除運算,當字符串或者數字非常長的時候,LLM推理能力會極速下降,再比如行為規劃能力等復雜推理能力很弱。總而言之,加強LLM的復雜推理能力,應該是LLM未來研究中最重要的環節之一。
前文有述,加入代碼加入預訓練,這是一種直接增強LLM推理能力的方向。這個方向目前研究尚顯不足,更像是實踐經驗的總結,探索背后的原理,并進而引入更多類型除代碼外的新型數據來增強LLM的推理能力,這可能是更本質提升推理能力的方向。

3. LLM納入NLP之外更多其它研究領域

目前的ChatGPT擅長NLP和Code任務,作為通向AGI的重要種子選手,將圖像、視頻、音頻等圖像與多模態集成進入LLM,乃至AI for Science、機器人控制等更多、差異化更明顯的其它領域逐步納入LLM,是LLM通往AGI的必經之路。而這個方向才剛剛開始,因此具備很高的研究價值。

4. 更易用的人和LLM的交互接口

如前所述,ChatGPT的最大技術貢獻即在此。但是很明顯,目前的技術并不完美,肯定還有很多命令LLM理解不了。所以,沿著這個方向,尋找更好的技術,來讓人類使用自己習慣的命令表達方式,而LLM又能聽懂,這是個新的,且非常有前景的技術方向。

5. 建設高難度的綜合任務評測數據集

好的評測數據集,是引導技術不斷進步的基石。隨著LLM模型逐步增大,任務效果快速提升,導致很多標準測試集快速過時。也就是說,這些數據集合相對現有技術來說,太容易了,在沒有難度的測試集合下,我們不知道目前技術的缺陷和盲點在哪里。所以構建高難度的測試集合,是促進LLM技術進步的關鍵所在。
目前行業應出現了一些新的測試集,有代表性的包括BIGBench、OPT-IML等。這些測試集合體現出一些特性,比如相對LLM現有技術具備一定的難度、綜合了各種各樣多種類型的任務等。
受到ChatGPT的啟發,我覺得除此外應納入另一考慮因素:體現真實用戶需求。就是說,這些任務的表述由用戶真實發起,這種方式構建出來的LLM模型,才能解決用戶實際需求。
除此外,相信LLM會快速將能力溢出到NLP之外的領域,而如何融入更多其它領域的評測數據,也是需要提前去考慮。

6. 高質量數據工程

對于預訓練模型來說,數據是其根本,預訓練過程可以理解為從數據中吸取其中所包含知識的過程。因此,我們需要進一步加強對高質量數據的挖掘、收集及清洗等工作。
關于數據,需要考慮兩個方面:數據的質量和數量。而根據T5的對比實驗,我們可以得出結論:在數量和質量兩個因素里,質量優先,正確的道路應該是在保證數據質量的前提下,再去增大數據規模。
數據質量,包括數據的信息含量以及數據的多樣性等多個衡量標準,比如Wiki明顯就屬于世界知識密度極高的高質量數據,這是從信息含量來說的;而增加數據類型的多樣性,無疑是激發LLM各種新能力的根本,比如加入問答網站的數據,對于LLM的QA能力提升是有直接幫助的。多樣化的數據賦予了LLM更好解決更多不同類型任務的能力,所以,這可能是數據質量里最關鍵的標準。
關于數據數量,原則上互聯網上公開發布的數據都可以納入LLM模型的預訓練過程。那么,它的極限在哪里?“Will we run out of data? An analysis of the limits of scaling datasets in Machine Learning” 對此進行了估算,結論是到2026年左右,高質量的NLP數據將會用光,低質量NLP數據會在2030到2050年用光,而低質量圖像數據會在2030到2060年用光。而這意味著:要么到時我們有新類型的數據源,要么我們必須增加LLM模型對數據的利用效率。否則,目前這種數據驅動的模型優化方式將會停止進步,或者收益減少。

7. 超大LLM模型Transformer的稀疏化

目前規模最大的LLM中,有相當比例的模型采取了稀疏(Sparse)結構,比如GPT 3、PaLM、GLaM等,GPT 4大概率也會走稀疏模型路線。之所以采用Sparse 化的模型,主要好處是它可以極大減少LLM的訓練時間和在線推理時間。Switch Transformer論文里指出:在相同算力預算的前提下,使用稀疏化Transformer,相對Dense Transformer,LLM模型的訓練速度可以提升4倍到7倍。為何Sparse模型可以加快訓練和推理時間呢?這是因為盡管模型參數巨大,但是對于某個訓練實例,Sparse模型通過路由機制,只使用整個參數中的一小部分,參與訓練和推理的活躍參數量比較少,所以速度快。
我認為未來超大的LLM模型大概率會收斂到稀疏模型。主要有兩個原因:一方面,現有研究表明(參考:Large Models are Parsimonious Learners: Activation Sparsity in Trained Transformers),標準的Dense Transformer在訓練和推理時,它本身也是稀疏激活的,就是說只有部分參數會被激活,大部分參數沒有參與訓練和推理過程。既然這樣,我們不如直接遷移到稀疏模型;另外,毫無疑問LLM模型的規模會繼續推大,而高昂的訓練成本是妨礙其進一步擴大模型的重要阻力,使用稀疏模型可以極大降低超大模型的訓練成本,所以隨著模型規模越大,稀疏模型帶來的收益越明顯。考慮到這兩個方面,大概率未來更大的LLM模型會采用稀疏模型方案。
那為何目前其它大規模模型不走稀疏模型的路線呢?因為Sparse模型存在訓練不穩定、容易過擬合等問題,不太容易訓練好。所以,如何修正稀疏模型面臨的問題,設計出更容易訓練的稀疏模型,是很重要的未來研究方向。

07.取經之路:復刻ChatGPT時要注意些什么

如果希望能復刻類似ChatGPT這種效果令人驚艷的LLM模型,綜合目前的各種研究結論,在做技術選型時需要重點權衡如下問題:
首先,在預訓練模式上,我們有三種選擇:GPT這種自回歸語言模型,Bert這種雙向語言模型,以及T5這種混合模式(Encoder-Decoder架構,在Encoder采取雙向語言模型,Decoder采取自回歸語言模型,所以是一種混合結構,但其本質仍屬于Bert模式)。我們應選擇GPT這種自回歸語言模型,其原因在本文范式轉換部分有做分析。目前看,國內LLM在做這方面技術選型的時候,貌似很多都走了Bert雙向語言模型或T5混合語言模型的技術路線,很可能方向走偏了。
第二,強大的推理能力是讓用戶認可LLM的重要心理基礎,而如果希望LLM能夠具備強大的推理能力,根據目前經驗,最好在做預訓練的時候,要引入大量代碼和文本一起進行LLM訓練。至于其中的道理,在本文前面相關部分有對應分析。
第三,如果希望模型參數規模不要那么巨大,但又希望效果仍然足夠好,此時有兩個技術選項可做配置:要么增強高質量數據收集、挖掘、清理等方面的工作,意思是我模型參數可以是ChatGPT/GPT 4的一半,但是要想達到類似的效果,那么高質量訓練數據的數量就需要是ChatGPT/GPT 4模型的一倍(Chinchilla的路子);另外一個可以有效減小模型規模的路線是采取文本檢索(Retrieval based)模型+LLM的路線,這樣也可以在效果相當的前提下,極大減少LLM模型的參數規模。這兩個技術選型不互斥,反而是互補的,也即是說,可以同時采取這兩個技術,在模型規模相對比較小的前提下,達到超級大模型類似的效果。
第四,超級大模型因為模型規模大,所以訓練成本過高,導致很少有機構有能力去做這件事。而且由上文分析可見,繼續不斷推大LLM模型規模是肯定會發生、也應該去做的事情。于是,如何通過技術手段降低LLM的訓練成本就很重要。LLM的特征抽取器Sparse化是有效降低模型訓練及推理成本的技術選擇。由此可見,隨著模型越來越大,LLM模型Sparse化是一個應該考慮的選項。
第五,ChatGPT是目前最接近理想LLM的技術方案,而理想中的LLM應該是以一個幾乎無所不能的基礎通用大模型作為依托,來支持各種各樣的上層任務類型。目前看,支持越來越多的任務類型,主要是通過增加LLM預訓練數據的多樣性來達成的,數據多樣性越好,LLM能夠支持的任務類型就越豐富。所以,應該重視通過增加數據多樣性來增加LLM新能力的思路。
第六,易用的人機操作接口。人類用他們自己習慣的表達方式來描述任務,而LLM要能夠理解這些Instruct的真實含義。另外,也要注意這些Instruct是符合人類真實需求的,就是說,要從最終用戶那里收集任務表述方式,而不能靠研發人員自己的臆想或猜測。ChatGPT給我最大的啟發其實是這一點,至于是否用增強學習我倒覺得不重要,其它替代技術應該也能做類似的事情。

8.ChatGPT:為什么是OpenAI

為什么是OpenAI作出了ChatGPT,而不是其它機構呢?我們在這里可以做個簡單分析。
在本文開頭,我們提到了OpenAI看待LLM的理念。OpenAI是怎么看待LLM的呢?回顧它不斷推出的技術,可以看出,它其實從GPT 1.0開始,基本就堅定地把LLM看做是通往AGI的一條必由之路。具體而言,在OpenAI眼中,未來的AGI應該長這個樣子:有一個任務無關的超大型LLM,用來從海量數據中學習各種知識,這個LLM以生成一切的方式,來解決各種各樣的實際問題,而且它應該能聽懂人類的命令,以便于人類使用。其實對LLM發展理念的理解,在前半部分,就是“構建一個任務無關的超大型LLM,讓它從海量數據中學習各種知識”,這一點幾乎是大家的共識,能體現出OpenAI眼光的其實是后半部分。
OpenAI的理念比較超前,對自我定位從一開始就定得比較高,始終堅定不移地探索上述方式是否可以實現AGI。OpenAI之所以能作出ChatGPT,勝在一個是定位比較高,另一個是不受外界干擾,態度上堅定不移。
我們可以回顧下它走的一些關鍵路程:GPT 1.0走的是生成模式的自回歸語言模型路線,比Bert出來的還早些。Bert證明了:雙向語言模型對于很多NLP理解類任務,效果比自回歸這種單向語言模型效果更好。盡管如此,GPT 2.0并沒有因此切換到雙向語言模型這條路上,仍然走文本生成的路,而且開始嘗試零示例(zero shot)prompt和少量示例(few shot)prompt。其實這時候, OpenAI心目中的AGI已經開始浮出水面,逐漸顯示出輪廓了。只是因為zero shot/few shot效果比Bert+fine-tuning差的比較遠,所以大家都沒太當回事,甚至不理解它為什么要始終堅持走單向語言模型的路線。這個時候,我估計即使是OpenAI自己,也不一定能確保這條路肯定能走通。
但是,這不妨礙它繼續在這條路上往后走。GPT 3.0已經展示出了比較強大的zero shot/few shot prompt能力,這時候OpenAI心目中的AGI已經完全漏出水面,輪廓清晰,而且它的效果也證明了這條路,是有較大可能走得通的。GPT 3.0是一個決定LLM發展方向的叉路口和分水嶺,與之對應的另外一條路是“Bert+fine-tuning”模式。在這個岔路口,不同的從業者選擇走上了不同的道路,后面的技術差距也是從這里開始拉開的。很遺憾地是,國內很多從業者選擇繼續在“Bert+fine-tuning”這條路上往后走,這也是造成今天落后局面的一個關鍵時間節點。再往后,就是InstructGPT和ChatGPT了,OpenAI通過ChatGPT證明了一點;雖然我們距離真正的AGI,可能還有很長的路要走,但是通過超大LLM走向AGI這條路,目前看是可行的。
今天的分享就到這里,謝謝大家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38885.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38885.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Elisp之獲取PC電池狀態(二十八)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Linux學習筆記

grep -r "root" /var/log/messages #查找一個目錄下所有包含特定字符竄的文件 grep -r "root" /var/log/messages |wc -l #如何計算一個文本文件中某個單詞出現的次數&#xff1f; du -sh /var/log #如何統計一個目錄下所有文件和子目錄的總大小&#xff1…

博客摘錄「 佛祖保佑,永無bug——springboot啟動圖案的修改方法」2023年6月8日

挺有意思的。佛祖保佑永無BUG 神獸護體 代碼注釋(各種版本)_風流 少年的博客-CSDN博客

ArcGIS Pro 基礎安裝與配置介紹

ArcGIS Pro ArcGIS Pro作為ESRI面向新時代的GIS產品&#xff0c;它在原有的ArcGIS平臺上繼承了傳統桌面軟件&#xff08;ArcMap&#xff09;的強大的數據管理、制圖、空間分析等能力&#xff0c;還具有其獨有的特色功能&#xff0c;例如二三維融合、大數據、矢量切片制作及發布…

django中實現事務/django實現悲觀鎖樂觀鎖案例

django中實現事務的幾種方式 # 1 全局開啟事務---> 全局開啟事務&#xff0c;綁定的是http請求響應整個過程DATABASES {default: {#全局開啟事務&#xff0c;綁定的是http請求響應整個過程ATOMIC_REQUESTS: True, }}from django.db import transaction# 局部禁用事務trans…

Unity 鼠標控制 UI 放大、縮小、拖拽

文章目錄 1. 代碼2. 測試場景 1. 代碼 using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;public class UIDragZoom : MonoBehaviour, IDragHandler, IScrollHandler {private Vector2 originalSize;private Vector2 originalPosition;private RectTr…

css3 瀑布流布局遇見截斷下一列展示后半截現象

css3 瀑布流布局遇見截斷下一列展示后半截現象 注&#xff1a;css3實現瀑布流布局簡直不要太香&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e; 場景-在uniapp項目中 當瀑布流布局column-grap:10px 相鄰兩列之間的間隙為10px&#xff0c;column-count:2,2列展…

面試之快速學習C++11-完美轉發,nullptr, shared_ptr,unique_ptr,weak_ptr,shared_from_this

完美轉發及其實現 函數模版可以將自己的參數完美地轉發給內部調用的其他函數。所謂完美&#xff0c;即不僅能準確地轉發參數的值&#xff0c;還能保證被轉發參數的左右值屬性不變引用折疊&#xff1a;如果任一引用為左值引用&#xff0c;則結果為左值引用&#xff0c;否則為右…

在阿里云服務器上安裝Microsoft SharePoint 2016流程

本教程阿里云百科分享如何在阿里云ECS上搭建Microsoft SharePoint 2016。Microsoft SharePoint是Microsoft SharePoint Portal Server的簡稱。SharePoint Portal Server是一個門戶站點&#xff0c;使得企業能夠開發出智能的門戶站點。 目錄 背景信息 步驟一&#xff1a;添加…

【Leetcode 30天Pandas挑戰】學習記錄 下

題目列表&#xff1a; 數據統計:2082. The Number of Rich Customers1173. Immediate Food Delivery I1907. Count Salary Categories 數據分組1741. Find Total Time Spent by Each Employee511. Game Play Analysis I2356. Number of Unique Subjects Taught by Each Teacher…

無涯教程-Perl - setgrent函數

描述 此功能將枚舉設置(或重置)到組條目集的開頭。該函數應在第一次調用getgrent之前調用。 語法 以下是此函數的簡單語法- setgrent返回值 此函數不返回任何值。 例 以下是顯示其基本用法的示例代碼- #!/usr/bin/perl -wwhile( ($name,$passwd,$gid,$members)getgrent…

ide internal errors【bug】

ide internal errors【bug】 前言版權ide internal errors錯誤產生相關資源解決1解決2 設置虛擬內存最后 前言 2023-8-15 12:36:59 以下內容源自《【bug】》 僅供學習交流使用 版權 禁止其他平臺發布時刪除以下此話 本文首次發布于CSDN平臺 作者是CSDN日星月云 博客主頁是h…

C++模板的分離編譯問題

本文主要是了解一下為什么模板的定義和聲明不能分開&#xff0c;需要簡單了解一下編譯的四個階段。 一、理解編譯大致流程 整個編譯流程分為&#xff1a;預處理、編譯、匯編、鏈接&#xff0c;這里以源文件main.cpp文件為例。 預處理&#xff1a;對源文件進行宏替換、去注釋、…

CentOS8防火墻基礎操作應用

查看防火墻某個端口是否開放 firewall-cmd --query-port80/tcp 開放防火墻端口80 firewall-cmd --zonepublic --add-port80/tcp --permanent 關閉80端口 firewall-cmd --zonepublic --remove-port80/tcp --permanent 配置立即生效firewall-cmd --reload 查看防火墻狀態 s…

代碼隨想錄算法訓練營第58天|動態規劃part15|392.判斷子序列、115.不同的子序列

代碼隨想錄算法訓練營第58天&#xff5c;動態規劃part15&#xff5c;392.判斷子序列、115.不同的子序列 392.判斷子序列 392.判斷子序列 思路&#xff1a; &#xff08;這道題也可以用雙指針的思路來實現&#xff0c;時間復雜度也是O(n)&#xff09; 這道題應該算是編輯距…

[Android 11]使用Android Studio調試系統應用之Settings移植(七):演示用AS編譯錯誤問題

文章目錄 1. 篇頭語2. 系列文章3. AS IDE的配置3.1 AS版本3.2 Gradle JDK 版本4. JDK的下載5. AS演示工程地址6.其他版本JDK導致的錯誤1. 篇頭語 距離2021年開始,系列文章發表已經有近兩年了,依舊有網友反饋一些gitee上演示源碼編譯的一些問題,這里就記錄一下。 2. 系列文章…

uniApp引入vant2

uniApp引入vant2 1、cnpm 下載&#xff1a;cnpm i vantlatest-v2 -S2、main.js文件引入 import Vant from ./node_modules/vant/lib/vant;Vue.use(Vant);3.app.vue中引入vant 樣式文件 import /node_modules/vant/lib/index.css;

tomcat服務七層搭建動態頁面查看

一個服務器多實例復制完成 配置tomcat多實例的環境變量 vim /etc/profile.d/tomcat.sh配置tomcat1和tomcat2的環境變量 進入tomcat1修改配置 測試通信端口是否正常 連接正常 toncat 2 配置修改 修改這三個 端口配置修改完成 修改tomcat1 shudown 分別把啟動文件指向tomcat1…

數據結構--最短路徑 Dijkstra算法

數據結構–最短路徑 Dijkstra算法 Dijkstra算法 計算 b e g i n 點到各個點的最短路 \color{red}計算\ begin\ 點到各個點的最短路 計算 begin 點到各個點的最短路 如果是無向圖&#xff0c;可以先把無向圖轉化成有向圖 我們需要2個數組 final[] &#xff08;標記各頂點是否已…

【ARM 嵌入式 編譯系列 10.1 -- GCC 編譯縮減可執行文件 elf 文件大小】

文章目錄 上篇文章&#xff1a;ARM 嵌入式 編譯系列 10 – GCC 編譯縮減可執行文件 elf 文件大小 接著上篇文章 ARM 嵌入式 編譯系列 10 – GCC 編譯縮減可執行文件 elf 文件大小 的介紹&#xff0c;我們看下如何進一步縮小可執行文件test的大小。上篇文章通過 strip --strip-…