OpenAI科學家最新大語言模型演講火了,洞見LLM成功的關鍵


從湧現和擴展律到指令微調和RLHF,OpenAI 科學家帶你進入LLM 的世界。

圖片來源:由無界AI生成

近日,OpenAI 研究科學家Hyung Won Chung 在首爾國立大學做了題為「Large Language Models (in 2023)」的演講。他在自己的YouTube 頻道上寫到:「這是一次雄心勃勃的嘗試,旨在總結我們這個爆炸性的領域。」

影片網址:https://www.youtube.com/watch?v=dbo3kNKPaUA

在這次演講中,他談到了大型語言模型的湧現現像以及大模型的訓練和學習過程,其中包括預訓練和後訓練階段,最後他還展望了一下未來,認為下一次範式轉變是實現可學習的損失函數。

在深入這次演講的具體內容之前,我們先簡單認識這位演講者。

Hyung Won Chung 是一位專攻大型語言模型的研究者,博士畢業於麻省理工學院,之後曾在谷歌大腦工作過三年多時間,於今年二月份加入OpenAI。

他曾參與一些重要計畫的研究工作,例如5,400 億參數的大型語言模型PaLM 和1,760 億參數的開放式多語言語言模型BLOOM(arXiv:2211.05100)。機器之心也曾介紹他為一作的論文《Scaling Instruction-Finetuned Language Models》。

下面進入演講內容。

演講開篇,Chung 便指出,現在所謂的大型語言模型(LLM)在幾年後就會被認為是小模型。隨著人們對模型規模(scale)的認知的變化,目前有關LLM 的許多見解、觀察和結論都會變得過時甚至可能被證明是錯誤的。

但他也指出,幸運的是,那些基於第一原理(First Principle)的見解卻會有相對更長的生命力,因為它們比那些看似絢麗多彩的先進思想更為基礎。

Chung 的這次演講聚焦的正是這些更基礎的思想,他希望這些內容在未來幾年內依然具有參考價值。

大模型的湧現現象

大型語言模型有一個有趣的現象:只有當模型達到某個規模時,某些能力才會顯現。

如下圖所示,許多模型在規模達到一定程度時,在準確度等某些性能指標上會出現急劇的變化,甚至模型會突然有能力解決在規模較小時完全無法解決的問題。這種現象稱為湧現(emergence)。

這個有趣現象為AI 研究帶來了許多重要的新視野。

Chung 首先提到的視角是「yet」,也就是說就算某個想法或能力目前無法實現,但隨著規模擴展,也許後面會突然能夠實現。

這一視角轉變可能看似簡單,卻涉及到我們對語言模型的根本看法。一項對目前模型無用的技術也許三五年後就能變得有用,因此我們不應對當前的各種事物抱持永恆不變的觀念。

他指出,「yet」視角之所以並不是顯而易見的,是因為我們習慣了在基礎公理不變的環境中工作。就像在進行自然科學實驗時,如果你已經透過實驗發現某個科學思想不對,那麼你必定相信如果三年後再實驗一次,這個思想還是不可能變正確;而且就算再過三十年,結果依然如此。

那麼語言模型領域是否也存在類似這類公理的概念呢?

Chung 認為可以把一定時段內最強大的模型視為這種「公理」,因為在這段時間裡,許多研究實驗都是基於這個模型進行的。但有趣的地方在於:最強大的模型會改變。

舉個例子,在GPT-4 誕生時,它是最強大的,研究者基於其進行了大量實驗,並得到了許多研究結果和見解。但當新的更強大模型出現時,先前發現的一些見解和想法就過時了,甚至出現了許多新舊實驗結果相矛盾的情況。

這就需要我們持續刷新已知的知識和觀念,Chung 使用了「unlearn」一詞,也就是說要刻意地去忘記已經不可行的思路。

Chung 表示目前還很少人這樣實踐。而在競爭激烈的AI 領域,許多只有一兩年經驗的新人卻能提出有重大意義的思想,Chung 認為其中一部分原因就是這些新人會去嘗試之前有經驗的人嘗試過的無效想法—— 但這些想法卻能有效地用於當前的模型。

因此,Chung 呼籲研究者要走在規模擴展曲線之前。

他分享說自己在進行文件實驗時發現有些實驗會因為模型「智力不足」而失敗,也就是說模型沒有足夠的推理能力來解決一些困難的數學或程式設計問題。他會將這些失敗實驗記錄下來,但並不會斷言這些實驗就徹底失敗了,而是會進行一些處理,使得未來能輕鬆地重新運行這些實驗。每當有更好的新模型出現時,他就會重新運行這些實驗,觀察其中哪些實驗會成功,哪些會繼續失敗。透過這種方式,他可以unlearn 一些東西,不斷更新自己的認知和理解,讓自己適應模型隨規模擴展的湧現現象。

接下來,Chung 以簡單直觀的方式對湧現現象進行了說明。

如左圖所示,能力1 是GPT-4 尚不具備但卻非常接近獲得的能力,稍強一點的模型可能就能獲得這一能力,實現突然的能力躍升。對於中圖的能力2,即使強大的GPT-4 也遙不可及,在短期內可能無論如何也不可能觸及。至於右圖的能力3,GPT-3 就已經具備,之後改進只會為這項能力帶來增量式的提升。

但在現實中,研究者可能很難確定自己正在解決的問題是屬於哪一類。而Chung 認為,只要有前面所說的思考框架── 不斷更新自己的認知和理解,就能更輕鬆地辨識自己正在解決的問題。

規模擴展何以有效?

Chung 說:「總結起來,我們所做的一切都與規模相關,採用規模優先(scale first)的視角是至關重要的。」但規模擴展何以有效呢?

首先我們要從Transformer 談起。

目前所有的LLM 都使用了Transformer 架構。但這裡不關心其架構細節,而是著眼於其基本思想。

下面我們就從功能的角度來看Transformer。

概括地看,Transformer 就是使用了大量矩陣乘法的序列到序列的映射,之後再進行一些數組變換。

其輸入是一個由 [batch, d_model, length] 構成的數組,其中d_bacth 差不多就是該Transformer 的寬度,length 是序列長度。

在訓練階段,輸出是一個與輸入大小相同的陣列。當然,在推理階段的情況不一樣,不過由於規模擴展發生在預訓練階段,所以輸出和輸入的長度一樣。

這就是Transformer 的核心思想,非常簡單的序列到序列映射。

下面將從功能角度描述從輸入到輸出的過程。

通常一開始有一個句子,例如「Many words don’t map to one token: indivisible.」這是一個字串,其形狀為 []。

首先,將這個句子token 化。 token 化通常是透過一個外部模型來完成的,例如BPE 或SentencePiece,其目標是盡可能地壓縮文字。這裡經過token 化後得到了一個整數列表,其形狀就為 [length]。

然後,將這些整數嵌入到一個隱藏空間中,這通常被稱為詞嵌入(word embedding)。現在,每個token 都被表示成了一個寬為d_model 的向量,其長度為length,那麼其形狀就為d_model×length。

接下來就是計算量最大的地方──n 層Transformer。簡單來說,這個過程就是一個序列到序列的映射。這裡的目標是讓每個序列token 與該序列中的其它token 互動。這裡我們不對其互動細節做任何假設,只是讓它們互動。在Transformer 中,讓它們互動的方式就是讓它們可以執行點積運算。模型要學習的就是如何執行這個點積運算。

之所以主要的計算量都在這裡,是因為這裡的計算涉及高維數組,需要執行大量矩陣乘法和數組運算。

經過n 層Transformer 後,可以得到一個序列,之後再使用一個損失函數運算一番,基於預測的下一token 得到一個最大似然。最後得到一個數值。

之後,使用結果執行反向傳播,更新所有參數。

在實際操作中,這個訓練過程是大量進行的,這需要在資料結構的維度中增添一個batch 維度。在這些資料批之間,唯一的依賴關係就是在最後計算損失時是計算它們的平均損失。

當我們談論擴展Transformer 時,我們通常說的就是擴展其中計算量最大的部分。

依照第一原理,擴展Transformer 就意味著要使用大量計算機有效率地執行上面的矩陣乘法運算。

這個過程需要將Transformer 層中涉及的所有矩陣(陣列)分配到各台電腦中。這個分配過程至關重要,必須在盡可能降低機器之間通訊量的同時來實現它。這是從非常底層的視角來理解規模擴展。

矩陣乘法

為了更好地理解這一點,我們首先需要了解矩陣乘法,尤其是在多台機器上執行矩陣乘法。如下圖所示,現在假設我們有8 台機器—— 它們可能是CUP 或GPU。

現在我們要執行一個16×16 大小的矩陣乘法:A×B=C。

首先我們以一種抽象的方式來思考硬體:定義一個2×4 的mesh 網格。注意這個佈局是虛擬的,與這些機器的實際實體位置無關。

然後為此網格定義x 和y 軸(硬體軸),之後每個參與計算的陣列都會依照這個座標軸進行對應- 將每個陣列軸對應到硬體軸。我們可以從下圖的顏色對應看到這種映射。

現在我們來看輸出矩陣C。我們希望在矩陣乘法運算完成之後,C 矩陣左上角的1​​ 部分能位於機器1 中。

這時候機器1 要做的就是對矩陣A 的第1 行和矩陣B 的第1 列執行all-gather 操作(這是MPI 的操作之一),之後再執行計算得到C 的1 部分。

以矩陣A 的第1 行為例,all-gather 需要四台機器之間進行通訊。機器1 在與2、3、4 通訊之後會取得其本機資料的副本;機器2、3、4 也會執行類似的操作。故而該操作有all-gather(全收集)之名。

all-gather 之後,機器1 就有了計算所需的所有資料副本。

這個過程的關鍵之處在於其可以在全部8 台機器上並行地執行。因此這個過程可以透過並行的方式來加速,而其一大成本來源就是機器之間的通訊。因此,在速度和通訊成本存在一個權衡。

einsum

現在可以將矩陣乘法泛化成愛因斯坦求和方法(einsum),這是一種更高層次的看待數組計算的視角。

它的有兩個規則:1. 如果一個字母在兩個輸入中都出現了,那麼就執行逐分量的乘法;2. 如果輸出中不包含一個字母,則在該維度上執行求和。

對於規則1,以上圖中的第一行運算為例,np.einsum (“i,i->i”,a,b) 中的兩個輸入中都有i(見引號內部),這就意味著要直接執行逐分量乘法來得到i;這在Numpy 中就等價於a*b。

對於規則2,則可見第二行運算,其中有“i,i→”,這時候就需要先執行逐分量乘法,然後求和。

而在第三行中,則有“ij,j->i”,這時候就需要在j 上執行點積,這也可被視為矩陣向量乘法。

當然,上面只給出了一兩維的範例,einsum 也可以支援更多維度。

從einsum 的角度來看,矩陣乘法可以寫成如下形式:

現在回到前面在8 台機器上的矩陣乘法。

現在我們已經為數組軸定義了m、n、p 這樣的標籤,就可以將它們映射到硬體軸,例如將m 映射到y,將n 映射到x。現在我們希望透過一個神奇的裝飾器函數parallelize 來做到這一點(後面會更具體說明),它所做的就是在這兩個維度上以並行方式執行all-gather。

現在我們了解了矩陣乘法,接下來看Transformer。

在Transformer 中,最複雜的運算操作是自註意力層,其中除了softmax 之外的一切都可以使用einsum 表示。

然後將其對應到先前設定的8 台機器,這時候我們不再使用x 和y 來標記硬體軸,而是使用研究者更習慣的“model”和“data”,分別對應於模型並行維度和資料並行維度。

現在稍微修改一下上面的程式碼,加入並行化,將b 對應到data,n 是序列長度(Transformer 不對序列長度做並行化處理),h 是注意力頭的數量(代表模型)- 對注意力機制的並行化就是透過多頭來實現。

如此,接下來只需使用相同的程式碼,就能實現並行化;以下是使用8 台機器的範例,但這框架在任何機器數量下都適用。

一個TPU v4 pod 有3072 塊TPU chip。 Chung 表示在訓練PaLM 模型時,他們使用了2 個pod,也就是6144 塊TPU chip,其中每一塊都與最高階的GPU 一樣強大。

現在有了這麼多機器,可以和之前一樣定義一個網格:模型並行維度為48、資料並行維度為64。

最後還有一個細節:資料中心網路(DCN)資料並行維度。這是因為這兩個pod 並不是直接連接在一起的,而是透過資料中心網路連接的,其速度大概是25 Gbps。這比pod 內部的通訊慢多了。因此不應在這個層面上執行模型並行化。實際上,他們的做法是在梯度計算之後在這個資料中心網路上對梯度求和。這只需要做一次,耗時很短。 (在訓練5,400 億參數的PaLM 模型時,每個訓練步驟耗時大概17 秒,因此這點耗時對整體影響不大。)

平行化裝飾器

前面我們是假設並行化裝飾器有效,但它究竟是如何運作的呢?一種方法是GSPMD(arXiv:2105.04663)。

GSPMD 是一種基於編譯器的方法。使用這個方法,你在寫神經網路時可以假設你的機器擁有無限記憶體而不考慮並行化。然後將神經網路的核心部分錶示成計算圖,再將該圖的輸入和輸出映射到硬體軸。最後將該圖交給XLA;它會自動插入必要的通訊操作(如all-gather),從而充分利用機器的全部能力。

Chung 表示這個過程很神奇,就像是魔法,但該方法並不總是有效,有些人在使用時會遇到困難。但整體來說還是有用的,畢竟T5、PaLM、Switch Transformer 等來自谷歌的大模型的後端都使用了GSPMD。

當然,也存在著其它一些方法,但它們都涉及將數組軸映射到硬體。

對大多數研究者來說,GSPMD 可能很複雜,但JAX 提供了一個前端pjit,其使用方法如下:

大模型的規模擴展問題

對於大模型來說,預訓練的成本很高。下圖是Llama-2 模型預訓練過程的困惑度變化情況,可以看到最後每個模型都處理了2 兆個token這可需要不少的時間。

但在實踐中,我們不會等到訓練完成才觀察結果,也許一開始我們會訓練500 億個token,然後得到這樣的K線走勢圖:

這時候我們就能斷言其中的70B 模型表現最好嗎?並不能,因為它們的表現還很接近。這時候要考慮如何投入資源是很困難的。

這就牽涉到了預訓練的一大根本課題:擴展律(scaling laws)。

如圖所示的擴展律來自《GPT-4 技術報告》(其中x 軸是以GPT-4 為標準歸一化之後的訓練計算成本),其中的規律是根據較小的模型得出的,但其能準確預測GPT-4 的最終損失。

現在進行規模擴展是比幾年前容易多了,但整體依然很困難,並不是說改一些參數就能實現。

舉個例子,在PaLM 的訓練過程中,出現了損失突刺(loss spike)現象(例如損失從2 突然變成了6),這讓許多人感到不安。

他們使用同樣的資料訓練了三個不同規模的模型,但只有最大的一個出現了損失突刺現象。這讓研究者很難進行調試,因為無法在更小的模型上復現出來。而且這也不是由數據品質不佳導致的。而當這種情況,讓人無法決定該怎麼辦時,都只得讓大量機器閒置下來,造成巨大浪費。這些面向都有需要攻克的難題。

儘管現在已經有Llama-2 等一些模型讓人可以更輕鬆地訓練給定大小的模型,但是進一步擴展就困難重重了。

後訓練也很重要

所以,擴大規模並非萬能方法,還需要開發出許多工程方法,其中許多都可以歸類為後訓練(post-training)。

為什麼我們需要後訓練?

首先,我們無法直接與預訓練模型對話,因為其訓練目標只是預測下一個token。下面給了一個例子:對於左側的輸入,預訓練後的PaLM 540B 只會不斷預測下一個字;但我們預期是類似右邊的答案。

當然,我們可以透過一個技巧來解決這個問題,也就是將問題建構成某種形式,使得下一個token 就是答案本身。下圖給了一個例子:

如果模型還是不回答問題,那麼我們就可以在前面提供一些範例,示範模型該如何給出下一個token。這種方法稱為few-shot prompting。這種方法很強大,但並不普遍適用。

預訓練模型還有另一個問題:總是產生prompt 的自然延續,即便prompt 本身是惡意和有害的。預訓練模型不知道如何拒絕回應惡意prompt。而這些能力可透過後訓練方法來獲得;人們通常將這樣的過程稱為對齊人類價值。

對於目前的LLM,後訓練是指下圖預訓練之後的階段。

指令微調

概括來說,指令微調是將所有任務都表述成自然語言指令到自然語言回應的映射。

以文字分類任務為例,就是文字到標籤的對應。但2018 年的BERT 在這個過程中必需要有針對這個特定任務的線性層,以將句子投影到分類空間。這樣一來,用於本文分類任務的模型就很難用於其它任務了。

一年後誕生的T5 模型就不需要這樣的線性層了。它所做的是文本到文本的映射,能廣泛地適用於各種不同的文本任務。

但這也會有個問題:T5 支援多種不同任務,但它怎麼知道目前任務是什麼任務呢?研究者的做法是在輸入中加入元數據,例如cola 和stsb。

但這種做法不自然,不符合人類的表達習慣。接下來的發展就是讓模型能夠理解以自然語言表達的任務。例如現在我們不再使用cola 來指示模型執行GLUE 中的CoLA 任務,而是問:「下面的句子是否是可接受的?」

為什麼T5 模型誕生的時候沒有採用這種方法呢? Chung 表示是因為當時認為語言模型無法理解自然語言指令,反而覺得使用元資料的方式比較自然。

當更大的模型出現後,理解自然語言的能力就湧現了,然後我們就能使用豐富的自然語言將各種任務統一起來。之後,當模型遇到未曾見過的任務時,模型只需回應自然語言指令即可。這也是一種泛化。

這就引出了一個問題:如果訓練中心化有更多指令,能不能得到更好的模型,而實現更好的泛化呢?

Chung 等人透過一個大規模實驗檢驗了這個假設。為此,他們收集了1836 個學術任務,然後將它們混合起來用於訓練。

如下圖所示,y 軸是在評估集上的平均分數。他們選擇了80 億參數的PaLM 模型難以應對的6 個訓練期間未曾見過的任務來進行測試,發現隨著模型增大以及訓練任務增多,模型的表現越來越好。但可以看出來,任務數量增至一定程度時,模型的效能增幅也會降低。這是因為任務的數量沒有任務的多樣性重要。

機器之心曾經報導過這項研究,參閱《30 億跑贏GPT-3 的1750 億,谷歌新模型引熱議,然而卻把Hinton 年齡搞錯了》。

於是Chung 得出了結論:指令微調的效果很好,但卻有固有的限制。這現象的根本原因是什麼呢?

首先我們確定指令微調的學習目標:不管是使用交叉熵損失還是最大似然,目標都是對於給定輸入都能給出單一正確回答,而其它答案都是錯的。在強化學習文獻中,這稱為行為克隆(behavior cloning)。

我們希望如果能有足夠多的這些答案的變體,模型就能泛化用於不同的任務類型。為此,就需要形式化模型在給定輸入下的正確行為,以便模型複製。

過去,這種操作執行起來很簡單,但現在難度卻在增加。

下面將透過一些範例來說明。

首先是一個思想實驗,假設有一個問題,它只有唯一正確的答案,例如「2+3=?」有唯一正確答案「5」。這沒有異議。

而對於翻譯任務,我們也可以大致提供一個唯一正確答案,當然,一個句子翻譯成另一種語言時可能會有多種變體。

但以下任務呢:以聖誕老人的口吻寫一封信給一位五歲孩童,解釋聖誕老人不是真的,要求語氣溫柔,不要讓這個孩子傷心。

Chung 表示自己沒信心為這個任務給出一個好答案。

對於這樣的任務,Chung 認為不適合使用最大似然作為大模型的學習目標。

接下來是一個更實際的例子,Chung 表示自己經常使用這個prompt 來測試新模型:用Python 透過梯度下跌實現logistic 迴歸。

這個任務並不存在唯一正確的答案- 可能有函數式程式設計風格的答案,也可能有物件導向式的答案。這些不同的答案可能都是正確的。這樣一來,使用其中一個作為唯一正確答案是合適的做法嗎?

Chung 給了一些觀察:

我們越來越希望教會模型掌握更抽象的行為指令微調的目標函數似乎是教導這些行為的「瓶頸」 最大似然目標是「預先定義的」函數(即不可學習的參數) 我們能否參數化目標函數並學習它?

這就是RLHF 的核心思想。

使用人類回饋的強化學習(RLHF)

強化學習(RL)提供了一種學習目標函數的方法。

強化學習的目標是最大化預期的獎勵函數,而我們可以使用一個神經網路模型(獎勵模型)來為更複雜的情況制定獎勵。

那要怎麼訓練這個獎勵模型呢?

對於給定的輸入,為其提供兩個可能的答案,然後讓人類提供這兩個答案的偏好。也就是說不是提供一個最佳答案,而是讓人類評估兩個答案中哪個比較好。 AI 模型就可以用這種方式學習人類的偏好。

例如在上圖的例子中,人類比較偏好結果2,但這個結果並不見得就是最佳結果,只能說比結果1 好。

對於有著清晰明確答案的簡單任務,這種比較方法可能用處不大,不如使用有最大似然目標的監督式學習。

但對於開放式的生成任務,相較於為答案評分,比較候選答案之間的相對優劣會更容易。

下面是這種獎勵模式的數學描述:

有了獎勵模型之後,就可以透過強化學習來學習語言模型的參數,以最大化預期獎勵。

這裡,目標函數就是剛剛的獎勵模型,也就是參數Φ,其在初始的強化學習後就固定了。

在這個公式中,對於一個prompt,策略模型(通常是根據監督式指令微調的檢查點模型進行初始化)會產生一些候選結果;然後它們被提供給獎勵模型,獎勵模型返回分數,策略模型就可以根據這個回饋進行調整。這就像是一個試錯過程。

我們可以透過基於梯度的迭代方法來最大化預期獎勵,這個過程要用到一些策略梯度演算法,如PPO。

總結起來即為:獎勵模型編碼人類偏好,然後將其傳遞給策略模型,讓其透過強化學習進行學習。

但在實踐中,很多人並不喜歡RLHF,甚至希望拋棄這個方法,因為它很難做好。

RLHF 的一個常見問題是「獎勵攻擊(rewardHacking)」。

舉個例子,假設有人類標註者對一些完成結果進行標註—— 標記一對結果中哪一個更好,而如果他們標記的都剛好是更長的結果更好,那麼策略模型就會認為獎勵模型更喜歡更長的結果,然後漸漸地,它就會越來越多地給出很長但看起來很愚蠢的結果。這時候獎勵模型給予的獎勵越來越高,但人類的滿意度卻會下跌。這種現像其實很難控制,Chung 表示目前還沒有徹底解決這個問題的方法。

但即使有這些問題,Chung 認為我們還是應該繼續研究RLHF,他認為原因包括:

最大似然有過於強大的歸納偏見,當模型規模變大時,這個問題會更顯著; 學習目標函數是一種不同的範式,有助於緩解這個問題,能提供很大的提升空間,ChatGPT 等一些成功利用RLHF 的案例只是一個開始; 其原理很可靠,值得進一步發掘其功效。

AI 的未來發展

Chung 最後簡單回顧了AI 過去的發展歷程並談到了自己對AI 未來發展的展望。

他分享說,從基於規則的系統到經典機器學習技術,再到深度學習以及使用RLHF 的深度學習,AI 系統中可學習的部分(圖中藍色部分)在不斷增多,其能力也越來越強大。

現在,損失函數也正在變成系統中的可學習部分,並且已經有GAN 和RLHF 這樣的成功案例。這讓AI 系統可以學習去做那些正確行為難以形式化的任務。

Chung 認為這就是未來的下一個範式,其將帶來的技術進步不會亞於先前每一次範式轉移。

至於哪個AI 模型將成為這個新典範的旗艦代表,就讓我們拭目以待吧。

資訊來源:由0x資訊編譯自8BTC。版權所有,未經許可,不得轉載

Total
0
Shares
Related Posts