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,深度解讀預訓練模型的進展」。
我相信看完這兩篇文章,能夠讓您對LLM 領域的技術脈絡,LLM 技術發展過程中出現過的不同發展理念,乃至未來可能的發展趨勢,有比較清晰的認知。當然,很多地方講的內容是我個人看法,有很大的主觀性,錯漏難免,所以也請謹慎參考。
本文試圖回答以下一些問題:ChatGPT 是否帶來了 NLP 或 AI 領域的研究範式轉換?如果是,那會帶來怎樣的影響? LLM 從海量資料中學到了什麼? LLM 又是如何存取這些知識的?隨著 LLM 規模逐步增大,會帶來什麼影響?什麼是 In Context Learning? 為什麼它是一項很神秘的技術?它和 Instruct 又是什麼關係? LLM 具備推理能力嗎?思維鏈 CoT 又是怎麼做的? 等等,相信看完,能讓您對這些問題有答案。
首先,在談 LLM 技術現況前,先宏觀談談我心目中的研究範式轉換問題。這樣,我們才能 “先見森林,再見樹木”,對具體技術為何會是如此變化有個更清晰的認知。
如果我們把時間線往前拉得更長一些,回到NLP 領域的深度學習時代,在更長時間窗口內觀察技術變遷及其影響,可能更容易看清其中的一些關鍵節點。我個人認為,在最近 10 年來 NLP 領域的技術發展過程中,可能有兩次大型的研究典範轉移。
範式轉換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.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,因为比较重要,我就把它们单独拎出来讲一下。
从目前研究结果看,Transformer 是足够强大的特征抽取器,尚不需要做特别的改进。那么通过预训练过程,Transformer 学到了什么?知识是如何存取的?我们又如何修正错误知识?本节讲述这方面的研究进展。
求知之路: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 億單字的語料,就能學好句法語義等語言學知識,但是要學習事實類知識,則要更多的訓練資料。這個結論其實也是在意料中的,畢竟語言學知識相對有限且靜態,而事實類知識則數量龐大,且處於不斷變化過程中。而目前研究證明了隨著增加訓練資料量,預訓練模型在各種下游任務中效果越好,這說明了從增量的訓練資料中學到的更主要是世界知識。
記憶之地:LLM 如何存取知識
#由上可知,LLM 確實從資料中學到了很多語言類及世界知識。 那麼,對於某條具體的知識,LLM 把它儲存到了哪裡?又是如何提取出來的?這也是一個有趣的問題。
顯然,知識一定儲存在 Transformer 的模型參數裡。從 Transformer 的結構來看,模型參數由兩部分組成:多頭注意力(MHA)部分佔了約參數總體的三分之一,三分之二的參數集中在 FFN 結構中。 MHA 主要用於計算單字或知識間的相關強度,並對全局資訊進行集成,更可能是在建立知識之間的聯繫,大概率不會儲存具體知識點,那麼很容易推論LLM 模型的知識主體是儲存在Transformer 的FFN 結構裡。
但這樣的定位,粒度還是太粗,無法很好回答具體某條知識是如何儲存與提取的,例如「中國的首都是北京」 這條知識,以三元組表達就是,其中「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 層的每個神經元節點,記載了一對 資訊。例如對於上圖中 FFN 第一個隱層的第個節點,也許就是它記載了 這條知識。 節點對應的key 向量,其實指的是節點和輸入層每個節點的權重向量;而對應的Value 向量,指的是節點和FFN 第二層的Value 層每個節點形成連接的權重向量。每個神經元的 Key 向量,用於識別輸入中的某種語言或知識模式,是一種模式探測器。如果輸入中包含它要檢測的某種模式,那麼輸入向量和節點的key 權重進行向量內積計算,加上Relu,形成的大數值響應,意味著檢測到了這個模式,於是再把這個響應值,透過節點的Value 權重向量向FFN 第二層傳播。這等價於將 Value 向量的值,以響應值加權,然後傳遞並反映在第二層 Value 層每個節點的輸出。如此這般,FFN 的正向傳播計算過程,看起來就像是透過 Key 偵測到某種知識模式,然後取出對應的 Value,並將 Value 體現在 FFN 的第二層輸出上。當然,FFN 第二層每個節點,會收集 FFN 的 Key 層所有節點訊息,所以是一種混合響應,而 Value 層所有節點的混合響應,可以解讀為代表輸出單字的機率分佈資訊。
聽著可能還是比較複雜,我們用個極端的例子來說明。我們假設上圖的節點就是記載 這條知識的Key-Value 記憶體,它的Key 向量,用來偵測」 中國的首都是…」 這個知識模式,它的Value 向量,基本上儲存了與單字「北京」 的Embedding 比較接近的向量。當 Transformer 的輸入是 “中國的首都是 [Mask]” 的時候,節點從輸入層探測到這個知識模式,所以產生較大的響應輸出。我們假設Key 層其它神經元對這個輸入都沒有任何反應,那麼對應的Value 層的節點,其實只會接收到「北京」 這個Value 對應的單字embedding,並透過的大反應值,進行了進一步的數值放大。於是,Mask 位置對應的輸出,就自然會輸出 「北京」 這個字。基本上就是這麼個過程,看起來很複雜,其實很簡單。
而且這篇文章還指出,Transformer 低層對句子的表層模式作出反應,高層對語義模式作出反應,就是說低層FFN 存儲詞法、句法等表層知識,中層和高層儲存語意及事實概念知識,這和其它研究結論是一致的。
要我猜,把 FFN 看成 Key-Value 記憶體這種思路,很可能不是最終的正確答案,但是距離最終正確答案的距離,估計也不太遠。
知識塗改液:如何修正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 的內部運作機制是很有幫助的。
我們知道,近年來,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 後任務表現會發生質的變化。
一般我們常提到的人和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 了。
神秘的In Context Learning
#如果你細想,會發現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 影響比較大的是:和的分佈,也就是輸入文字的分佈和候選答案有哪些,如果你改變這兩個分佈,例如把替換成候選答案之外的內容,則In Context Learning 效果急劇下降。
總之,這個工作證明了 In Context Learning 並未學習映射函數,但是輸入和輸出的分佈很重要,這兩個不能亂改。
有些工作認為 LLM 還是從給定的範例學習了這個映射函數,不過是種隱式地學習。例如「What learning algorithm is in-context learning? Investigations with linear models」 認為Transformer 能夠隱式地從範例中學習到的映射過程,它的激活函數中包含了一些簡單映射函數,而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 來說,指標有極大提升,而且在一些任務上超過人類的表現。
這說明了:具象的任務範例和任務的自然語言描述之間,有種神秘的內在連結。至於這種聯繫到底是什麼?我們目前對此還一無所知。
目前很多研究已證明LLM 對於知識具有強大的記憶能力,但是,一般我們不會因為一個人記憶能力強,就說這人很聰明,是否有強大的推理能力,往往是我們判斷一個人是否聰明的重要標準。類似的,如果 LLM 的效果想讓人覺得很驚艷,強大的推理能力是必備的。推理能力本質上是綜合運用許多相關知識點,去推導出新知識或新結論。關於 LLM 的推理能力,是最近一年來 LLM 裡最重要和熱門的研究領域之一。於是,我們關心的問題就是:LLM 具備推理能力嗎?如果具備,那麼它的推理能力夠強嗎?
這兩個問題目前的答案似乎應該是:當模型規模夠大的時候,LLM 本身是具備推理能力的,在簡單推理問題上,LLM 已經達到了很好的能力,但是複雜推理問題上,還需要更多深入的研究。
如果梳理現有LLM 推理相關工作的話,我把它們歸到兩大類,體現出挖掘或促進LLM 推理能力不同的技術思路:第一類研究比較多,可以統稱為基於Prompt 的方法,核心思想是透過合適的提示語或提示樣本,更好地激發出LLM 本身就具備的推理能力,Google 在這個方向做了大量很有成效的工作。第二類做法是在預訓練過程中引入程式碼,和文字一起參與預訓練,以此進一步增強 LLM 的推理能力,這應該是 OpenAI 實踐出的思路。例如 ChatGPT 肯定具備很強的推理能力,但它並不要求使用者必須提供一些推理範例,所以 ChatGPT 強大的推理能力,大機率來自於使用程式碼參與 GPT 3.5 的預訓練。
這兩種思路其實大方向是迥異的:利用程式碼增強LLM 推理能力,這體現出一種透過增加多樣性的訓練數據,來直接增強LLM 推理能力的思路;而基於Prompt 的方法,它並不會促進LLM 本身的推理能力,只是讓LLM 在解決問題過程中更好地展示出這種能力的技術方法。可以看出,前者(代碼方法)治本,後者治標。當然,兩者其實也是互補的,但從長遠看,治本的方法更重要。
基於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 會給出最後的答案。如此這般,體現出拆解子問題,並從子問題的答案逐步找出最終答案的想法。
程式碼預訓練增強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)的代碼訓練是從文本生成代碼,而且代碼中往往包含很多文本註釋,本質上這類似於預訓練模型做了 兩種資料的多模態對齊工作。而數據中必然包含相當比例的數學或邏輯問題的代碼、描述和註釋,很明顯這些數學類或邏輯推理類的數據,對於解決下游數學推理問題是有幫助的,我猜大概率原因在此。
關於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” 技術,則是試圖根據最後一個圖節點,靠倒推來試圖推導出其中的圖結構,但是很明顯,目前的方法限制了它倒推的深度,也就是說它只能推導出非常簡單的圖結構,這正是限制它能力的所在。
#這裡列出一些我個人認為比較重要的LLM 研究領域,或值得深入探索的研究方向。
探索LLM 模型的規模天花板
儘管繼續推大LLM 模型的規模,這事看似沒有技術含量,但其實這個事情異常重要。我個人判斷,自從 Bert 出現以來,到 GPT 3,再到 ChatGPT,大概率這些給人印象深刻的關鍵技術突破,核心貢獻都來自於 LLM 模型規模的增長,而非某項具體技術。說不定,揭開 AGI 真正的鑰匙是:超大規模及足夠多樣性的資料、超大規模的模型,以及充分的訓練過程。再者,做超大規模的 LLM 模型,對技術團隊的工程實現能力要求是非常高的,也不能認為這事情缺乏技術含量。
那麼繼續推大 LLM 模型規模,有什麼研究意義呢?我覺得有兩方面的價值。首先,如上所述,我們已知,對於知識密集的任務,隨著模型規模越大,各種任務的效果會越來越好;而對很多推理類型的有難度的任務,加上CoT Prompting後,其效果也呈現出遵循Scaling law 的趨向。那麼,很自然的一個問題就是:對於這些任務,LLM 的規模效應,能解決這些任務到何種程度?這是包括我在內,很多人關心的問題。其次,考慮到 LLM 具備的神奇的 “湧現能力”,如果我們繼續增加模型規模,它會解鎖哪些讓我們意想不到的新能力呢?這也是很有意思的問題。考慮到以上兩點,我們仍需要不斷增大模型規模,看看模型規模對解決各類任務的天花板在哪裡。
當然,這種事情也只能說說,對 99.99% 的從業人員來說,是沒有機會和能力做這個事情的。要做這個事情,對研究機構的財力及投入意願、工程能力、技術熱情,都有極高的要求,缺一不可。能做這事的機構,粗估下來,國外不超過 5 家,國內不超過 3 家。當然,考慮到成本問題,未來也許會出現 “股份制大模型”,就是有能力的幾家機構合作,群策群力,一起來共建超級大模型的現象。
增強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 的推理能力,這可能是更本質提升推理能力的方向。
LLM 納入NLP 之外更多其它研究領域
目前的ChatGPT 擅長NLP 和Code 任務,作為通往AGI 的重要種子選手,將影像、視訊、音訊等影像與多模態整合進入LLM,乃至AI for Science、機器人控制等更多、差異化更明顯的其它領域逐步納入LLM,是LLM 通往AGI 的必經之路。而這個方向才剛開始,因此具備很高的研究價值。
更易用的人和LLM 的互動介面
#如前所述,ChatGPT 的最大技術貢獻即在此。但很明顯,目前的技術並不完美,肯定還有很多指令 LLM 理解不了。所以,沿著這個方向,尋找更好的技術,來讓人類使用自己習慣的命令表達方式,而 LLM 又能聽懂,這是個新的,且非常有前景的技術方向。
建立高難度的綜合任務評測資料集
#好的評測資料集,是引導技術不斷進步的基石。隨著 LLM 模型逐步增大,任務效果快速提升,導致許多標準測試集快速過時。也就是說,這些資料集合相對現有技術來說,太容易了,在沒有難度的測試集合下,我們不知道目前技術的缺陷和盲點在哪裡。所以建構高難度的測試集合,是促進 LLM 技術進步的關鍵。
目前業界應該會出現了一些新的測試集,有代表性的包括 BIGBench、OPT-IML 等。這些測驗集合體現出一些特性,例如相對 LLM 現有技術具備一定的難度、綜合了各種多種類型的任務等。
受到 ChatGPT 的啟發,我覺得除此外應納入另一個考慮因素:體現真實用戶需求。就是說,這些任務的表述是由使用者真實發起,這種方式建構出來的 LLM 模型,才能解決使用者實際需求。
除此之外,相信 LLM 會快速將能力溢出到 NLP 之外的領域,而如何融入更多其它領域的評測數據,也是需要提前去考慮。
高品質資料工程
#對於預訓練模型來說,資料是其根本,預訓練過程可以理解為從數據中吸取所包含知識的過程。因此,我們需要進一步加強對高品質資料的挖掘、收集及清洗等工作。
關於數據,需要考慮兩個面向:數據的品質和數量##。而根據 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 模型對資料的利用效率。否則,目前這種數據驅動的模型最佳化方式將會停止進步,或效益減少。
超大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 模型有訓練不穩定、容易過度擬合等問題,不太容易訓練好。所以,如何修正稀疏模型面臨的問題,設計出更容易訓練的稀疏模型,是很重要的未來研究方向。
如果希望能復刻類似ChatGPT 這種效果令人驚豔的LLM 模型,綜合目前的各種研究結論,在做技術選型時需要重點權衡如下問題:
首先,在預訓練模式上,我們有三種選擇:GPT 這個自迴歸語言模型, Bert 這種雙向語言模型,以及T5 這個混合模式 (Encoder-Decoder 架構,在Encoder 採取雙向語言模型,Decoder 採取自回歸語言模型,所以是一種混合結構,但其本質仍屬於Bert 模式)。我們應選擇 GPT 這種自迴歸語言模型,其原因在本文範式轉換部分有進行分析。目前看,國內 LLM 在做這方面技術選型的時候,似乎很多都走了 Bert 雙向語言模型或 T5 混合語言模型的技術路線,很可能方向走偏了。
第二,強大的推理能力是讓使用者認同LLM 的重要心理基
##M ,而如果希望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 要能夠理解這些 Instruct 的真實意義。另外,也要注意這些 Instruct 是符合人類真實需求的,就是說,要從最終用戶那裡收集任務表述方式,而不能靠研發人員自己的臆想或猜測。 ######ChatGPT 給我最大的啟發其實是這一點,至於是否用增強學習我倒覺得不重要,其它替代技術應該也能做類似的事情######。 #########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 這條路,目前看是可行的。
以上是探索後GPT 3.0時代的大模型技術,邁向實現AGI的未來的詳細內容。更多資訊請關注PHP中文網其他相關文章!