張俊林:由ChatGPT反思大語言模型(LLM)的技術(shù)精要(2)
從目前研究結(jié)果看,Transformer是足夠強大的特征抽取器,尚不需要做特別的改進。那么通過預(yù)訓(xùn)練過程,Transformer學(xué)到了什么?知識是如何存取的?我們又如何修正錯誤知識?本節(jié)講述這方面的研究進展。
LLM從海量自由文本中學(xué)習(xí)了大量知識,如果把這些知識做粗略分類的話,可以分為語言類知識和世界知識兩大類。
語言類知識指的是詞法、詞性、句法、語義等有助于人類或機器理解自然語言的知識。關(guān)于LLM能否捕獲語言知識有較長研究歷史,自從Bert出現(xiàn)以來就不斷有相關(guān)研究,很早就有結(jié)論,各種實驗充分證明LLM可以學(xué)習(xí)各種層次類型的語言學(xué)知識,這也是為何使用預(yù)訓(xùn)練模型后,各種語言理解類自然語言任務(wù)獲得大幅效果提升的最重要原因之一。另外,各種研究也證明了淺層語言知識比如詞法、詞性、句法等知識存儲在Transformer的低層和中層,而抽象的語言知識比如語義類知識,廣泛分布在Transformer的中層和高層結(jié)構(gòu)中。
世界知識指的是在這個世界上發(fā)生的一些真實事件(事實型知識,F(xiàn)actual Knowledge),以及一些常識性知識(Common Sense Knowledge)。比如“拜登是現(xiàn)任美國總統(tǒng)”、“拜登是美國人”、“烏克蘭總統(tǒng)澤連斯基與美國總統(tǒng)拜登舉行會晤”,這些都是和拜登相關(guān)的事實類知識;而“人有兩只眼睛”、“太陽從東方升起”這些屬于常識性知識。關(guān)于LLM模型能否學(xué)習(xí)世界知識的研究也有很多,結(jié)論也比較一致:LLM確實從訓(xùn)練數(shù)據(jù)中吸收了大量世界知識,而這類知識主要分布在Transformer的中層和高層,尤其聚集在中層。而且,隨著Transformer模型層深增加,能夠?qū)W習(xí)到的知識數(shù)量逐漸以指數(shù)級增加(可參考:BERTnesia: Investigating the capture and forgetting of knowledge in BERT)。其實,你把LLM看作是一種以模型參數(shù)體現(xiàn)的隱式知識圖譜,如果這么理解,我認(rèn)為是一點問題也沒有的。
“When Do You Need Billions of Words of Pre-training Data?”這篇文章研究了預(yù)訓(xùn)練模型學(xué)習(xí)到的知識量與訓(xùn)練數(shù)據(jù)量的關(guān)系,它的結(jié)論是:對于Bert類型的語言模型來說,只用1000萬到1億單詞的語料,就能學(xué)好句法語義等語言學(xué)知識,但是要學(xué)習(xí)事實類知識,則要更多的訓(xùn)練數(shù)據(jù)。這個結(jié)論其實也是在意料中的,畢竟語言學(xué)知識相對有限且靜態(tài),而事實類知識則數(shù)量巨大,且處于不斷變化過程中。而目前研究證明了隨著增加訓(xùn)練數(shù)據(jù)量,預(yù)訓(xùn)練模型在各種下游任務(wù)中效果越好,這說明了從增量的訓(xùn)練數(shù)據(jù)中學(xué)到的更主要是世界知識。
由上可知,LLM確實從數(shù)據(jù)中學(xué)到了很多語言類及世界知識。那么,對于某條具體的知識,LLM把它存儲到了哪里?又是如何提取出來的?這也是一個有意思的問題。
顯然,知識一定存儲在Transformer的模型參數(shù)里。從Transformer的結(jié)構(gòu)看,模型參數(shù)由兩部分構(gòu)成:多頭注意力(MHA)部分占了大約參數(shù)總體的三分之一,三分之二的參數(shù)集中在FFN結(jié)構(gòu)中。MHA主要用于計算單詞或知識間的相關(guān)強度,并對全局信息進行集成,更可能是在建立知識之間的聯(lián)系,大概率不會存儲具體知識點,那么很容易推論出LLM模型的知識主體是存儲在Transformer的FFN結(jié)構(gòu)里。
但這樣的定位,粒度還是太粗,無法很好回答具體某條知識是如何存儲與提取的,比如 “中國的首都是北京”這條知識,以三元組表達(dá)就是<北京,is-capital-of,中國>,其中“is-capital-of”代表實體間關(guān)系。這條知識它存儲在LLM的哪里呢?
“Transformer Feed-Forward Layers Are Key-Value Memories”給出了一個比較新穎的觀察視角,它把Transformer的FFN看成存儲大量具體知識的Key-Value存儲器。如上圖所示(圖左是原始論文圖,其實不太好理解,可以看做了注釋的圖右,更好理解些),F(xiàn)FN的第一層是個MLP寬隱層,這是Key層;第二層是MLP窄隱層,是Value層。FFN的輸入層其實是某個單詞對應(yīng)的MHA的輸出結(jié)果Embedding,也就是通過Self Attention,將整個句子有關(guān)的輸入上下文集成到一起的Embedding,代表了整個輸入句子的整體信息。
Key層的每個神經(jīng)元節(jié)點,記載了一對<Key,Value>信息。比如對于上圖中FFN第一個隱層的第 個節(jié)點 ,也許就是它記載了<北京,is-capital-of,中國>這條知識。 節(jié)點對應(yīng)的key向量,其實指的是節(jié)點 和輸入層每個節(jié)點的權(quán)重向量;而對應(yīng)的Value向量,指的是節(jié)點 和FFN第二層的Value層每個節(jié)點形成連接的權(quán)重向量。每個神經(jīng)元的Key向量,用于識別輸入中的某種語言或者知識模式,是一種模式探測器。如果輸入中包含它要檢測的某種模式,那么輸入向量和 節(jié)點的key權(quán)重進行向量內(nèi)積計算,加上Relu,形成 的大數(shù)值響應(yīng),意味著 檢測到了這個模式,于是再把這個響應(yīng)值,通過 節(jié)點的Value權(quán)重向量向FFN第二層傳播。這等價于將Value向量的值,用響應(yīng)值加權(quán),然后傳遞并體現(xiàn)到第二層Value層每個節(jié)點的輸出上。如此這般,F(xiàn)FN的正向傳播計算過程,看起來就像是通過Key檢測到某種知識模式,然后取出對應(yīng)的Value,并把Value體現(xiàn)在FFN的第二層輸出上。當(dāng)然,F(xiàn)FN第二層每個節(jié)點,會收集FFN的Key層所有節(jié)點信息,所以是一種混合響應(yīng),而Value層所有節(jié)點的混合響應(yīng),可以解讀為代表輸出單詞的概率分布信息。
聽著可能還是比較復(fù)雜,我們用個極端的例子來說明。我們假設(shè)上圖的節(jié)點 就是記載<北京,is-capital-of,中國>這條知識的Key-Value存儲器,它的Key向量,用于檢測”中國的首都是…”這個知識模式,它的Value向量,基本存儲了與單詞“北京”的Embedding比較接近的向量。當(dāng)Transformer的輸入是“中國的首都是[Mask]”的時候, 節(jié)點從輸入層探測到這個知識模式,所以產(chǎn)生較大的響應(yīng)輸出。我們假設(shè)Key層其它神經(jīng)元對這個輸入都沒有任何響應(yīng),那么對應(yīng)的Value層的節(jié)點,其實只會接收到“北京”這個Value對應(yīng)的單詞embedding,并通過 的大響應(yīng)值,進行了進一步的數(shù)值放大。于是,Mask位置對應(yīng)的輸出,就自然會輸出“北京”這個單詞?;揪褪沁@么個過程,看著很復(fù)雜,其實很簡單。
而且這篇文章還指出,Transformer低層對句子的表層模式作出反應(yīng),高層對語義模式作出反應(yīng),就是說低層FFN存儲詞法、句法等表層知識,中層和高層存儲語義及事實概念知識,這和其它研究結(jié)論是一致的。
要我猜,把FFN看成Key-Value存儲器這種思路,很可能不是最終的正確答案,但是距離最終正確答案的距離,估計也不太遠(yuǎn)。
既然我們已知具體的某條世界知識存儲在某個或者某些FFN節(jié)點的參數(shù)里,自然會引發(fā)另外一個問題:我們能否修正LLM模型里存儲的錯誤或者過時的知識呢?比如對于問題:“英國的現(xiàn)任首相是誰?”鑒于近年來英國首相頻繁更迭,你猜LLM更傾向輸出“鮑里斯”還是更青睞“蘇納克”?很明顯訓(xùn)練數(shù)據(jù)中包含“鮑里斯”的數(shù)據(jù)會更多,這種情況很大可能LLM會給出錯誤回答,于是我們就有修正LLM里存儲的過時知識的必要性。
如果歸納下,目前有三類不同方法來修正LLM里蘊含的知識:
第一類方法從訓(xùn)練數(shù)據(jù)的源頭來修正知識?!癟owards Tracing Factual Knowledge in Language Models Back to the Training Data”這篇文章的研究目標(biāo)是:對于指定的某條知識,我們是否可以定位到是哪些訓(xùn)練數(shù)據(jù)導(dǎo)致LLM學(xué)會了這條知識?答案是肯定的,這意味著我們可以逆向追蹤到某條知識對應(yīng)的訓(xùn)練數(shù)據(jù)源頭。如果利用這項技術(shù),假設(shè)我們想要刪除某條知識,則可首先定位到其對應(yīng)的數(shù)據(jù)源頭,刪除數(shù)據(jù)源,然后重新預(yù)訓(xùn)練整個LLM模型,這樣即可達(dá)成刪除LLM中相關(guān)知識的目的。但是這里有個問題,如果修正一小部分知識,我們就需要重新做一次模型預(yù)訓(xùn)練,這樣做明顯成本太高。所以這種方法不會太有發(fā)展前景,可能比較適合那種對于某個特定類別數(shù)據(jù)的一次性大規(guī)模刪除場合,不適合少量多次的常規(guī)知識修正場景,比如可能比較適合用來做去除偏見等去toxic內(nèi)容的處理。
第二類方法是對LLM模型做一次fine-tuning來修正知識。一個直觀能想到的方法是:我們可以根據(jù)要修正成的新知識來構(gòu)建訓(xùn)練數(shù)據(jù),然后讓LLM模型在這個訓(xùn)練數(shù)據(jù)上做fine-tuning,這樣指導(dǎo)LLM記住新的知識,遺忘舊的知識。這個方法簡單直觀,但是也有一些問題,首先它會帶來災(zāi)難遺忘問題,就是說除了忘掉該忘的知識,還忘掉了不該忘的知識,導(dǎo)致這么做了之后有些下游任務(wù)效果下降。另外,因為目前的LLM模型規(guī)模非常大,即使是做fine-tuning,如果次數(shù)頻繁,其實成本也相當(dāng)高。對這種方法感興趣的可以參考“Modifying Memories in Transformer Models”。
另外一類方法直接修改LLM里某些知識對應(yīng)的模型參數(shù)來修正知識。假設(shè)我們想要把舊知識<英國,現(xiàn)任首相,鮑里斯>,修正到<英國,現(xiàn)任首相,蘇納克>。首先我們想辦法在LLM模型參數(shù)中,定位到存儲舊知識的FFN節(jié)點,然后可以強行調(diào)整更改FFN中對應(yīng)的模型參數(shù),將舊知識替換成新的知識??梢钥闯觯@種方法涉及到兩項關(guān)鍵技術(shù):首先是如何在LLM參數(shù)空間中定位某條知識的具體存儲位置;其次是如何修正模型參數(shù),來實現(xiàn)舊知識到新知識的修正。關(guān)于這類技術(shù)的細(xì)節(jié),可以參考“Locating and Editing Factual Associations in GPT”和“Mass-Editing Memory in a Transformer”。理解這個修正LLM知識的過程,其實對于更深入理解LLM的內(nèi)部運作機制是很有幫助的。
我們知道,近年來,LLM模型規(guī)模在快速增長,目前效果最好的LLM模型,其參數(shù)規(guī)模大都超過了千億(100B)參數(shù)規(guī)模。比如,OpenAI的GPT 3的規(guī)模為175B,Google的LaMDA規(guī)模為137B,PaLM的規(guī)模為540B,DeepMind的Gogher規(guī)模為280B等,不一而足。國內(nèi)也有中文巨型模型,比如智源GLM規(guī)模130B,華為“盤古”規(guī)模200B,百度“文心”規(guī)模260B,浪潮“源1.0”規(guī)模245B。那么,一個很自然的問題就是:隨著LLM模型規(guī)模不斷增長,會發(fā)生些什么呢?
預(yù)訓(xùn)練模型的應(yīng)用往往是兩階段的:預(yù)訓(xùn)練階段,及具體場景應(yīng)用階段。在預(yù)訓(xùn)練階段,其優(yōu)化目標(biāo)是交叉熵,對GPT這種自回歸語言模型來說,也就是看LLM是否正確預(yù)測到了下一個單詞;而場景應(yīng)用階段,一般要看具體場景的評價指標(biāo)。一般我們的直覺是:如果LLM模型在預(yù)訓(xùn)練階段的指標(biāo)越好,自然它解決下游任務(wù)的能力就越強。然而,事實并非完全如此。現(xiàn)有研究已證明,預(yù)訓(xùn)練階段的優(yōu)化指標(biāo)確實和下游任務(wù)表現(xiàn)出正相關(guān)關(guān)系,但是并非完全正相關(guān)。也就是說,只看預(yù)訓(xùn)練階段的指標(biāo),來判斷一個LLM模型是否夠好,這是不夠的?;诖?,我們分頭來看在這兩個不同階段,隨著LLM模型增大,有什么影響。
首先,我們先看在預(yù)訓(xùn)練階段,隨著模型規(guī)模逐步增大,會發(fā)生什么。OpenAI在“Scaling Laws for Neural Language Models”中專門研究了這個問題,并提出LLM模型所遵循的“伸縮法則”(scaling law)。如上圖所示,這個研究證明:當(dāng)我們獨立增加訓(xùn)練數(shù)據(jù)量、模型參數(shù)規(guī)模或者延長模型訓(xùn)練時間(比如從1個Epoch到2個Epoch),預(yù)訓(xùn)練模型在測試集上的Loss都會單調(diào)降低,也就是說模型效果越來越好。
既然三個因素都重要,那么我們在實際做預(yù)訓(xùn)練的時候,就有一個算力如何分配的決策問題:假設(shè)用于訓(xùn)練LLM的算力總預(yù)算(比如多少GPU小時或者GPU天)給定,那么是應(yīng)該多增加數(shù)據(jù)量、減少模型參數(shù)呢?還是說數(shù)據(jù)量和模型規(guī)模同時增加,減少訓(xùn)練步數(shù)呢?此消彼長,某個要素規(guī)模增長,就要降低其它因素的規(guī)模,以維持總算力不變,所以這里有各種可能的算力分配方案。最終OpenAI選擇了同時增加訓(xùn)練數(shù)據(jù)量和模型參數(shù),但是采用早停策略(early stopping)來減少訓(xùn)練步數(shù)的方案。因為它證明了:對于訓(xùn)練數(shù)據(jù)量和模型參數(shù)這兩個要素,如果只單獨增加其中某一個,這不是最好的選擇,最好能按照一定比例同時增加兩者,它的結(jié)論是優(yōu)先增加模型參數(shù),然后才是訓(xùn)練數(shù)據(jù)量。假設(shè)用于訓(xùn)練LLM的算力總預(yù)算增加了10倍,那么應(yīng)該增加5.5倍的模型參數(shù)量,1.8倍的訓(xùn)練數(shù)據(jù)量,此時模型效果最佳。
DeepMind的一項研究(參考:Training Compute-Optimal Large Language Models)更深入地探究了這個問題,其基本結(jié)論和OpenAI的結(jié)論差不多,比如確實需要同時增加訓(xùn)練數(shù)據(jù)量和模型參數(shù),模型效果才會更好。而很多大模型在做預(yù)訓(xùn)練的時候,并沒有考慮這一點,很多LLM大模型只是單調(diào)增加模型參數(shù),而固定住了訓(xùn)練數(shù)據(jù)量,這個做法其實是不對的,限制了LLM模型的潛力。但是它修正了兩者的比例關(guān)系,認(rèn)為訓(xùn)練數(shù)據(jù)量和模型參數(shù)是同等重要的,也就是說,假設(shè)用于訓(xùn)練LLM的算力總預(yù)算增加了10倍,那么應(yīng)該增加3.3倍的模型參數(shù)量,3.3倍的訓(xùn)練數(shù)據(jù)量,這樣模型效果才最好。
這意味著:增加訓(xùn)練數(shù)據(jù)量的重要性,比我們之前所認(rèn)為的,還要重要?;谶@個認(rèn)知,DeepMind在設(shè)計Chinchilla模型時,在算力分配上選擇了另外一種配置:對標(biāo)數(shù)據(jù)量300B、模型參數(shù)量280B的Gopher模型,Chinchilla選擇增加4倍的訓(xùn)練數(shù)據(jù),但是將模型參數(shù)降低為Gopher的四分之一,大約為70B。但是無論預(yù)訓(xùn)練指標(biāo),還是很多下游任務(wù)指標(biāo),Chinchilla效果都要優(yōu)于規(guī)模更大的Gopher。
這帶給我們?nèi)缦聠⑹荆何覀兛梢赃x擇放大訓(xùn)練數(shù)據(jù),并同比例地減少LLM模型參數(shù),以達(dá)到在不降低模型效果的前提下,極大縮小模型規(guī)模的目的??s小模型規(guī)模有很多好處,比如在應(yīng)用的時候,推理速度會快很多等,無疑這是一個很有前途的LLM發(fā)展路線。
以上是從預(yù)訓(xùn)練階段來看模型規(guī)模的影響,如果從LLM解決下游具體任務(wù)效果的角度來看,隨著模型規(guī)模增大,不同類型的任務(wù)有不同的表現(xiàn),具體而言,有以下三類情況。
第一類任務(wù)完美體現(xiàn)了LLM模型的scaling law,就是說隨著模型規(guī)模逐步放大,任務(wù)的表現(xiàn)越來越好,如上圖里的(a)圖所示。這類任務(wù)通常符合如下共性:它們往往都是知識密集型任務(wù),也就是說如果LLM模型包含的知識量越多,這類任務(wù)表現(xiàn)越好。而很多研究已經(jīng)證明越大的LLM模型學(xué)習(xí)效率越高,也就是說相同訓(xùn)練數(shù)據(jù)量,模型越大任務(wù)效果越好,說明面對的即使是同樣的一批訓(xùn)練數(shù)據(jù),更大的LLM模型相對規(guī)模小一些的模型,從中學(xué)到了更多的知識。更何況一般情況下,在增大LLM模型參數(shù)的時候,往往會同步增加訓(xùn)練數(shù)據(jù)量,這意味著大模型可以從更多數(shù)據(jù)中學(xué)習(xí)更多的知識點。這些研究可以很好地解釋上圖,為何隨著模型規(guī)模增大,這些知識密集型的任務(wù)效果越來越好。大多數(shù)傳統(tǒng)的自然語言理解類任務(wù),其實都屬于這種知識密集型任務(wù),而很多任務(wù)在近兩年獲得了極大的效果提升,甚至超過了人類表現(xiàn)。很明顯,這大概率是LLM模型的規(guī)模增長帶來的,而非歸功于某項具體的技術(shù)改進。
第二類任務(wù)展現(xiàn)出LLM具備某種“涌現(xiàn)能力(Emergent Ability)”,如上圖(b)所示。所謂“涌現(xiàn)能力”,指的是當(dāng)模型參數(shù)規(guī)模未能達(dá)到某個閥值時,模型基本不具備解決此類任務(wù)的任何能力,體現(xiàn)為其性能和隨機選擇答案效果相當(dāng),但是當(dāng)模型規(guī)??邕^閥值,LLM模型對此類任務(wù)的效果就出現(xiàn)突然的性能增長。也就是說,模型規(guī)模是解鎖(unlock)LLM新能力的關(guān)鍵,隨著模型規(guī)模越來越大,會逐漸解鎖LLM越來越多的新能力。這是個很神奇的現(xiàn)象,因為它意味著如下讓人對未來可報樂觀預(yù)期的可能:或許很多任務(wù),目前LLM還不能很好地解決,甚至站在現(xiàn)在這個時刻的我們看起來,LLM完全沒有能力解決這類任務(wù),但因LLM具備“涌現(xiàn)能力”,所以如果我們繼續(xù)推大模型,也許某一天它的這項能力就被突然解鎖了。LLM模型的規(guī)模增長會給我們帶來意想不到的精彩禮物。
“Beyond the Imitation Game: Quantifying and extrapolating the capabilities of language models”這篇文章指出,這類體現(xiàn)出“涌現(xiàn)能力”的任務(wù)也有一些共性:這些任務(wù)一般由多步驟構(gòu)成,要解決這些任務(wù),往往需要先解決多個中間步驟,而邏輯推理能力在最終解決這類任務(wù)中發(fā)揮重要作用。思維鏈(Chain of Thought)Prompting是典型的增強LLM推理能力的技術(shù),能大幅提升此類任務(wù)的效果,關(guān)于CoT技術(shù),在隨后小節(jié)內(nèi)容會做解釋,此處暫不展開。
問題是,為何LLM會出現(xiàn)這種“涌現(xiàn)能力”現(xiàn)象呢?上述文章以及“Emergent Abilities of Large Language Models”給出了幾個可能的解釋:
一種可能解釋是有些任務(wù)的評價指標(biāo)不夠平滑。比如說有些生成任務(wù)的判斷標(biāo)準(zhǔn),它要求模型輸出的字符串,要和標(biāo)準(zhǔn)答案完全匹配才算對,否則就是0分。所以,即使隨著模型增大,其效果在逐步變好,體現(xiàn)為輸出了更多的正確字符片段,但是因為沒有完全對,只要有任何小錯誤都給0分,只有當(dāng)模型足夠大,輸出片段全部正確才能得分。也就是說,因為指標(biāo)不夠平滑,所以不能體現(xiàn)LLM其實正在逐步改善任務(wù)效果這一現(xiàn)實,看起來就是“涌現(xiàn)能力”這種外在表現(xiàn)。
另外一種可能的解釋是:有些任務(wù)由若干中間步驟構(gòu)成,隨著模型規(guī)模增大,解決每個步驟的能力也在逐步增強,但是只要有一個中間步驟是錯的,最終答案就是錯的,于是也會導(dǎo)致這種表面的“涌現(xiàn)能力”現(xiàn)象。
當(dāng)然,上面的解釋目前還都是猜想,至于為何LLM會出現(xiàn)這種現(xiàn)象,還需要進一步更深入的研究。
還有少部分任務(wù),隨著模型規(guī)模增長,任務(wù)的效果曲線展現(xiàn)出U形特性:隨著模型規(guī)模逐漸變大,任務(wù)效果逐漸變差,但是當(dāng)模型規(guī)模進一步增長,則效果開始越來越好,呈現(xiàn)出U形增長趨勢,如上圖所示的粉紅色PaLM模型在兩個任務(wù)上的指標(biāo)****。為何這些任務(wù)表現(xiàn)得如此特殊呢?“Inverse scaling can become U-shaped”這篇文章給出了一種解釋:這些任務(wù),內(nèi)部其實隱含了兩種不同類型的子任務(wù),一種是真正的任務(wù),另外一種是“干擾任務(wù)(distractor task)”。當(dāng)模型規(guī)模小的時候,無法識別任意一種子任務(wù),所以模型的表現(xiàn)跟隨機選擇答案差不多,當(dāng)模型增長到中等規(guī)模的時候,主要執(zhí)行的是干擾任務(wù),所以對真正的任務(wù)效果有負(fù)面影響,體現(xiàn)為真正任務(wù)效果的下降,而當(dāng)進一步增加模型規(guī)模,則LLM可以忽略干擾任務(wù),執(zhí)行真正的任務(wù),體現(xiàn)為效果開始增長。
對于那些隨著模型規(guī)模增大,效果一直下降的任務(wù),如果采用思維鏈(CoT)Prompting,則部分任務(wù)的表現(xiàn)轉(zhuǎn)換為遵循Scaling law,即模型規(guī)模越大效果越好,而其它任務(wù)則轉(zhuǎn)換為U性增長曲線。這其實側(cè)面說明了:此類任務(wù)應(yīng)屬于推理類型的任務(wù),所以加入CoT后任務(wù)表現(xiàn)會發(fā)生質(zhì)的變化。
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。