博客專欄

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

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

        發布人:AI科技大本營 時間:2023-02-21 來源:工程師 發布文章
        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后任務表現會發生質的變化。


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



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 泽库县| 东丰县| 临颍县| 奇台县| 新安县| 兴化市| 高安市| 清河县| 烟台市| 新邵县| 万全县| 玛沁县| 奉贤区| 扎兰屯市| 襄樊市| 安庆市| 盱眙县| 城市| 开江县| 子长县| 津市市| 邓州市| 元朗区| 诏安县| 唐海县| 鹤山市| 明星| 长岛县| 四川省| 图木舒克市| 阳信县| 高台县| 盐山县| 调兵山市| 广安市| 江永县| 湛江市| 开鲁县| 全南县| 平阳县| 博野县|