code window

2024年5月9日星期四

深層網路的異常低效率

摘要

Meta的FAIR實驗室研究了一個簡單的層剪枝策略,用於流行的開放權重預訓練大型語言模型(LLMs),發現在不同的問答基準上,性能幾乎沒有退化,直到移除很大一部分(高達一半)的層之後才出現退化。為了修剪這些模型,他們先根據不同層之間的相似度來確定要修剪的最佳層區塊;然後,為了 "修復" 損害,他們進行少量的微調。具體而言,他們使用參數高效微調(PEFT)方法,特別是量化和低秩適應器(QLoRA),這樣他們的每個實驗都可以在單個A100 GPU上執行。從實務的角度來看,這些結果表明層修剪方法可以補充其他PEFT策略,一方面進一步減少微調所需的計算資源,另一方面可以改善推論的記憶體和延遲。從科學的角度來看,這些LLMs對刪除層的魯棒性意味著,要麼目前的預訓練方法沒有正確地利用網路深層的參數,要麼淺層在儲存知識方面扮演關鍵角色。

論文參考: https://arxiv.org/pdf/2403.17887

1 介紹 

在過去幾年中,大型語言模型(LLMs)已經從單純的研究成果演變成有用的產品。這種演變在很大程度上可以歸因於用於訓練的資源規模的巨大增長。由於這些模型在訓練完成後可能會在推論模式下看到其總生命週期FLOP的大部分,因此LLM的預訓練不僅需要考慮高效(即計算最優)訓練,還需要推論感知。

那麼已經訓練過的模型呢?除了神經縮放定律所指出的訓練考量之外,還有許多後訓練技術可以用來降低LLMs的微調和推論成本和時間。特別是,量化可以通過減少模型權重的精度來減少模型的記憶體佔用,低秩適應器(LoRA)可以通過只更新模型參數的一小部分來降低微調和自定義的成本,或者修剪可以通過直接消除不必要的參數或連接來減少推論的記憶體佔用和時間。由於這三種策略或多或少是正交的,因此在資源受限的環境中,理想情況下我們希望能夠結合使用這三種後訓練效率技術。朝著這個方向,流行的QLoRA方法引入了一些創新,使得4位元量化的參數和LoRA微調可以一起工作。


基於這種組合,在這項工作中,他們使用開放權重LLMs研究了一種非常簡單的修剪策略。具體而言,他們開發了一種方法,該方法使用不同層之間的表示相似性來識別給定修剪分數的最佳修剪層;然後,在移除這些層之後,他們使用少量微調(使用QLoRA)來"修復"修剪引起的不匹配。他們的主要結果是,他們可以從模型中刪除大量最深層,而對下游性能的影響最小。例如,對於Llama-2-70B,在性能崩潰之前,他們可以消除大約一半的層。他們的策略概述和修剪Llama-2-70B的結果如圖1所示。


修剪不僅有助於減少推論的佔用,而且還有助於了解網路如何使用其參數:如果您可以移除網路的大部分區塊而對其性能影響最小,那麼這些區塊可能並不是很重要。具體而言,他們對刪除層的直覺來自考慮transformer架構的殘差結構。更詳細地說,最終層的輸出可以分解為所有模型層的輸出之和加上嵌入的輸入。如果這樣一個和具有大量獨立項,那麼刪除其中幾項應該不會顯著改變輸出。然而,由於這些項並非獨立——每一層都是下一層的輸入——因此,如果特定層的殘差貢獻很小,我們應該期望能夠刪除這些項。換句話說,如果每一層的輸出在層與層之間的變化不大。


與他們的層修剪一起,他們研究了不同分離下層表示之間的相似性,並廣泛發現,與淺層相比,更深層在質量上更類似於鄰近層(最後一層除外)。這表明了一個更簡單的修剪策略:從倒數第二層開始刪除層,並從深到淺繼續進行,直到刪除所需的層數。在這種情況下,他們發現,在用少量QLoRA微調修復損害之後,他們可以達到與更複雜的基於相似性的層修剪策略幾乎匹配的性能。這種方法的有效性證明了LLMs可能沒有正確利用網路深層中的參數。


總的來說,他們希望你帶走這三個要點:


• 模型的記憶體佔用和推論時間隨著移除的層數線性減少。這使得層修剪成為一個強大的工具,特別是如果模型的性能對刪除層具有魯棒性。

• 所有的效率方法——修剪、PEFT和量化——都可以有效地相互結合。因此,在這項工作中,每個實驗都在單個A100 GPU上執行,開源和學術界都可以輕鬆使用。

• 模型對移除深層的魯棒性、下游知識任務(如MMLU和BoolQ)性能的急劇轉變、以及自回歸損失相對於這些修剪分數的平滑行為,總體上表明淺層可能在儲存知識方面起著關鍵作用。

本文的結構如下。在§2中,他們首先對實際後訓練策略和激發他們工作的深度學習科學調查進行文獻回顧。然後,在§3中,他們直觀地解釋了他們的層修剪策略,並詳細解釋了他們的方法,而在§4中,他們迭代了所有的實驗結果。最後,在§5中,他們通過強調未來工作的方向來總結。具體的模型、微調、數據集和評估細節可以在附錄A中找到,評估消融實驗可以在附錄B中找到。


2 文獻回顧

在本節中,他們回顧了後訓練效率的實用策略,並討論了一些為他們的方法提供動機或洞見的科學研究:在§2.1中,他們首先回顧了修剪的歷史,然後討論了其在LLM中的現代應用;在§2.2中,他們將修剪與蒸餾進行對比,蒸餾是減少LLM參數數量的另一種策略;然後在§2.3中,他們討論了可以與他們的修剪策略結合使用的各種實用的高效微調和推理加速方法;最後在§2.4中,他們重點介紹了一些對LLM的一些深度相關統計特性的科學研究,這些研究與他們的結果相輔相成。


2.1 修剪

修剪是一種通過刪除不必要的參數(單個或成組)來減小已訓練的機器學習模型大小的方法。神經網路的修剪歷史悠久,最初的構想是,非結構化修剪技術通過根據預定義的標準刪除單個參數來稀疏化網路。例如,如果模型的某個參數的值非常小,那麼刪除它(即將其設置為零)可能對性能影響最小。受這一早期工作的啟發,現代研究人員開始探索這種非結構化修剪的不同標準,主要集中在計算機視覺模型上。具體而言開發了一種迭代修剪方法,用於交替修剪和微調網路,以達到更好的壓縮率和性能。

雖然這些模型變得更小了,但它們不一定更有效:通過根據標準刪除單個參數來稀疏化網路會導致不規則或偽隨機的稀疏模式,如果沒有專門為稀疏設計的硬體或庫,就很難加速。為此,開發了結構化修剪技術,以組的形式刪除不相關的參數,例如卷積網路中的特定通道或過濾器。隨著這增加了它們的實用相關性,研究人員開始在計算機視覺和預transformer NLP架構中探索結構化修剪。

隨著語言建模取得了前所未有的進展,最近的工作集中在將結構化修剪方法應用於Transformer。這些研究幾乎考慮了模型架構的每一個可能的組件來進行消除,方法包括丟棄注意力頭、丟棄層、修剪隱藏狀態、秩約簡大權重矩陣、用更小的密集矩陣替換稀疏權重矩陣、以及上述組的許多組合。

在先前也考慮transformer層丟棄的工作中,大多數研究BERT風格的模型,而他們考慮GPT風格的模型,這是用於大規模語言建模和生成的最常見模型。由於其雙向masked語言模型(MLM)目標,BERT風格的模型自然適合於理解任務,而GPT風格的模型由於其自回歸目標而更適合生成。雖然鑑於更強大的GPT風格模型,這種分歷已經受到質疑,但先前的工作發現BERT和GPT模型在單詞的層表示演變方面存在顯著的定性差異。總的來說,這表明層丟棄策略在兩個系列之間的行為會有所不同。

一項針對BERT風格預訓練模型的研究得出結論,最佳的層修剪策略是丟棄最後的層;這部分與他們的結果產生共鳴,儘管相比之下,他們發現(a)對於某些修剪尺寸,保留模型的最後幾層實際上是有益的,而且(b)對於所有修剪尺寸,保留最後一層是必不可少的。此外,雖然作者也研究了不同層之間表示的相似性(如同他們的方法),但他們實際上發現淺層表示之間的相似性高於深層表示,這與他們的結果非常不同。重要的是考慮的模型由幾億個參數組成,這比他們在工作中考慮的模型規模要小得多。也許正因為如此,儘管作者也對修剪後的模型進行了微調,但他們沒有觀察到我們在§4.1中報告的下游精度的急劇轉變。

相比之下,雖然確實考慮了GPT風格的模型,但方法論卻大不相同:(i)他們沒有先進行預訓練,然後使用固定的層丟棄策略,而是在修改後的預訓練過程中增量丟棄層; (ii)作者研究了他們自己的1B以下參數模型,而他們專注於常用和/或微調用於實際應用的現成可用的開放權重的大規模2.7B-70B參數模型系列。

最後,transformer中的層丟棄的系統方法也在wav2vec模型的背景下進行了研究,wav2vec模型是僅編碼器模型,將語音映射到嵌入,參數規模在億級。使用這些模型開發了一種基於層與下游指標相關性的層修剪算法。除了模型架構和領域之外,與他們工作的一個重要區別是考慮了非連續的修剪方案,例如丟棄交替層。他們對層修剪的直覺預測,這不應該同樣有效——至少對於僅解碼器語言模型而言——因為它會在每個移除的層塊處產生多個不匹配。 


2.2 模型蒸餾

另一種完全不同的減少已訓練機器學習模型大小的方法是模型蒸餾,其中知識從大的"教師"模型轉移到更小的"學生"模型通過訓練學生模型以模仿教師模型預測的分佈。其基本見解是,這可以將教師模型的非常通用的知識和能力轉化為更簡潔、壓縮和可能特定於技能的表示。

雖然是一種非常通用的技術,但在語言模型的設置中,蒸餾已經通過以下方式實現:(a)白盒方法,其中學生模型被訓練以模仿教師模型的logits或隱藏狀態;以及(b)黑盒方法,其中學生模型只能訪問教師模型生成的輸出token。後一種方法廣泛涵蓋了學生模型在某種程度上用教師模型增強的文本上訓練的情況,例如通過添加合成標籤、生成高質量的合成文本、提供思路推理(旨在增強學生模型的推理能力)或通過註釋指令來增強學生模型的指令跟隨能力。

與層修剪相比,這些蒸餾方法需要大量計算資源,因為它們依賴於大型教師模型處理大量數據。相比之下,他們基於相似性的修剪策略只需要計算預訓練語料庫的一小部分上不同層之間的相似性,而他們的第二個更簡單的修剪策略只使用修剪後的精簡模型。


2.3 高效微調和推理加速  

作為直接減小模型大小的補充,參數高效微調(PEFT)專注於降低將LLMs專門化到特定任務的成本。具體而言,低秩適應器(LoRA)通過凍結預訓練模型並引入少量額外可訓練權重來減少微調的內存和計算。他們使用其量化版本QLoRA來保持實驗的成本效益。可以與他們工作結合的其他PEFT方法是:在第一種方法中,LoRA矩陣的初始化被調整為量化方案;在第二種方法中,LoRA秩是根據不同LLM模塊自適應選擇的。

為了進一步提高效率,他們可以將層修剪後的模型與進一步加速推理的方法相結合:使用推測解碼,tokens從較小的草稿模型中快速生成,然後由主模型並行評估;使用Medusa,草稿模型被丟棄以換取額外的解碼頭,但最終實現了類似的效果。特別是,在推測解碼設置中,考慮高度壓縮的層修剪模型作為潛在的草稿模型會很有趣。


2.4 深度相關研究的廣度

最後,讓我們重點介紹一些研究LLMs深度相關特性的科學工作。一個相關方向考慮語言模型中知識和語言特性是如何編碼的。一方面分析了事實關聯的存儲和回憶:這些工作強調知識位於中間層或最終層,這對直接編輯或刪除模型的部分事實知識有影響。另一方面,嘗試執行此類編輯的證據表明,信息可能跨層非局部存儲。類似研究了推理過程中處理事實的方式,區分了注意力頭(用於屬性提取)和MLP塊(用於主題豐富)的作用:兩者都分佈在幾個層中。

接下來,在早期的"邏輯鏡頭"之後,發明了一種稱為"調諧鏡頭"的技術,通過使用可學習的仿射變換將中間表示轉換為token分佈來研究預測的軌跡。通過研究這種分佈的層到層動力學,作者注意到它傾向於收斂。這種收斂非常強烈地表明,更深的層可能是可修剪的,而他們必須訓練仿射探測器的事實可能與他們觀察到最後一層不能修剪有關。觀察到只要激活深度超過一半,就可以從在中間激活上訓練的線性探測器確定基礎文本中的地理特徵。

更抽象地發現,激活的稀疏性在網路前向傳遞的大約一半處發生轉變,從稀疏演變為密集。也許與此相關,研究了在微調過程中更新最多的模型權重,發現它們位於中間層。

總的來說,這些深入研究是對他們工作的補充,一方面,提供證據表明刪除LLM最深層不會顯著改變模型的性能,另一方面,表明在刪除大約一半LLM最深層後,性能會出現急劇的修剪轉變。


3 方法

在本節中,他們給出了為什麼他們認為層修剪有效的直覺(§3.1),然後詳細解釋了他們的方法(§3.2)。


3.1 直覺

他們對層丟棄的直覺來自將表示視為層索引的緩慢變化函數。具體而言,transformer的層到層表示演化由殘差迭代方程給出  


$$x^{(\ell+1)} = x^{(\ell)} + f(x^{(\ell)}, \theta^{(\ell)})$$


其中\((x^{(\ell)}, \theta^{(\ell)})\)分別是層\(\ell\)的多維輸入和參數向量,\(f(x, \theta)\)描述了一個多頭自注意力和MLP層塊的變換。像任何殘差網路一樣,如果我們展開這個迭代,我們看到經過\(L\)個總層後,輸出描述為所有層變換之和 


$$x^{(L)} = x^{(0)} + \sum_{\ell=0}^{L-1} f(x^{(\ell)}, \theta^{(\ell)})$$


如果和中的項很多\((L \gg 1)\)且獨立,例如,如果塊函數改為整體輸入的函數\(f(x^{(0)}, \theta^{(\ell)})\),那麼對和式(2)的任何特定貢獻都可能被忽略。

當然,它們根本不是獨立的:如果我們刪除層\(\ell - 1\),那麼我們現在必須將該層的舊輸入\(x^{(\ell-1)}\)連接到層\(\ell\)的塊函數中,如下所示:  


$$x^{(\ell+1)} = x^{(\ell-1)} + f(x^{(\ell-1)}, \theta^{(\ell)})$$


其中,為了清晰起見,儘管刪除了層,我們沒有對層或輸入重新標記。一般來說,原始輸入和新輸入之間的這種不匹配應該對網路造成很大損害。然而,如果在一些初始層之後,表示收斂到關於層索引的緩慢變化函數,


$$x^{(\ell)} \approx x^{(\ell-1)} + \epsilon$$


其中在某種適當意義上\(\epsilon \ll x^{(\ell)}\),那麼刪除特定層\(\ell\)(即,在從(1)到(3)的過程中進行替換\(x^{(\ell)} \to x^{(\ell-1)}\))應該只會將後續層\(x^{(\ell+1)}\)中的表示變化一小部分。類似地,要成功修剪層\(\ell\)之前的\(n\)層,即從\(\ell - n, \ldots, \ell - 1\)開始索引的那些層,我們希望修剪塊的輸入應該與修剪塊的輸出非常相似:


$$x^{(\ell)} \approx x^{(\ell-n)} + \epsilon$$


無論如何,任何層刪除都有級聯效應:由於在修剪後,\(x^{(\ell+1)}\)是由與之前不同的函數計算的,參見(1)與(3)的對比,並且由於\(x^{(\ell+1)}\)直接或間接地輸入到後續層\(\ell + 2, \ldots, L\),刪除淺層應該比刪除深層有更大的影響。

由此,他們有以下假設,他們將通過實驗來驗證:

(0) 我們應該能夠修剪殘差網路的層。

(1) 我們應該在修剪更深層方面獲得更大的成功。  

(2) 我們成功修剪的層塊應該具有與其輸入相似的輸出。


在下一小節§3.2中,他們將解釋修剪算法的細節,在接下來的§4中,他們將呈現支持(0)-(2)點的實驗證據。


3.2 層修剪算法

他們的主要層修剪算法非常簡單:

0. 選擇要修剪的層數\(n\)。

1. 計算層\(\ell\)的輸入\(x^{(\ell)}\)與層\(\ell+n\)的輸入\(x^{(\ell+n)}\)之間的角距離\(d(x^{(\ell)}, x^{(\ell+n)})\),參見下面的(7),在中性預訓練數據集或感興趣的下游任務的代表性數據集上。  

2. 找到使該距離最小化的層$\ell^*$:

$$\ell^*(n) \equiv \arg\min_{\ell} d(x^{(\ell)}, x^{(\ell+n)})$$

3. 丟棄層\(\ell^*\)到\(\ell^*+n-1\);將舊\(\ell^*\)的舊輸入連接到舊的\((\ell^*+n)\)層塊。

4. (可選)在中性預訓練數據集或感興趣的特定數據集上用少量微調來修復層\(\ell^*+n\)處的不匹配。

如果圖中的文字比列表中的文字對你更有幫助,那麼請注意,該算法也描述在圖1的(a)-(b)面板中。

詳細說明進一步說明第一步,單個長度為\(T\)的序列的角距離(7)由下式給出


$$d(x^{(\ell)}, x^{(\ell+n)}) \equiv \frac{1}{\pi} \arccos \left( \frac{x^{(\ell)T} \cdot x^{(\ell+n)T}}{\|x^{(\ell)T}\| \|x^{(\ell+n)T}\|} \right)$$


其中內積是在序列的最後token \(T\)處在模型的隱藏維度上進行的,\(| \cdot |\)表示\(L_2\)範數,而\(1/\pi\)是慣例。然後應該在足夠多的樣本上對這個距離求和,以獲得低波動估計,但總體而言應該非常小。 

詳細說明進一步說明最後一步的"可選性",他們發現,在問答基準上幾乎沒有性能下降,參見圖1(d)和§4.1中的其他,可以通過少量微調擴展到更大的修剪分數。根據資源限制和修剪模型的預期應用,這可能是不必要的。然而,修復過程確實對困惑度有顯著影響,參見圖1(d)和§4.2中的其他。

對於角距離測量和修復,如果最終目標是對下游任務進行監督微調(SFT),那麼在該數據集的樣本上評估距離,然後將修復過程與SFT結合起來可能會很有用。相反,為了獲得最大的通用性,最自然的做法是用近似模型最初預訓練時的統計數據的預訓練數據集來測量距離和修復。

最後,他們還研究了一種更簡單的修剪策略,該策略受到跨不同模型系列分析角距離的啟發:丟棄最深層(不包括LLM頭之前的最後一層),然後像之前一樣通過少量微調來(非可選地)修復損害。為了絕對清晰,這意味著如果我們從一個\(L\)層模型中修剪\(n\)層,那麼我們將刪除從\((L-n)\)到\((L-1)\)的層(包括兩端)。


4 結果

在本節中,他們展示了修剪策略在不同問答(QA)基準上的有效性,並強調了性能中一個穩健的修剪驅動轉變(§4.1),而相比之下,他們發現修復後修剪模型的自回歸困惑度在其轉變點處是連續的(§4.2);然後,在比較不同模型大小和系列之間的相似性統計後(§4.3),他們將主要的基於相似性的修剪策略與更簡單的移除最深層的策略進行對比(§4.4)。



對於實驗,他們修剪了從2.7B到70B參數的各種大規模LLMs,跨越32到80個未修剪層。具體而言,他們使用了Llama-2系列、Qwen系列、Mistral-7B和Phi-2中的模型。對於這些模型,他們使用QLoRA執行"修復"步驟:模型量化為4位精度,然後在Colossal Clean Crawled Corpus(C4)的164M或328M個token上進行微調,這是一個常見的預訓練數據集。因此,他們的每個實驗都在單個A100 GPU上執行。對於QA評估,他們使用了Massive Multitask Language Understanding(MMLU),這是一個常見的世界知識和問題解決基準,以及BoolQ,這是一個常見的是/否閱讀理解基準,其中答案必須從文本本身推斷出來。關於模型、修復過程、數據集選擇和評估細節的具體內容可以在附錄A中找到;不同超參數選擇的評估消融實驗可以在附錄B中找到。


4.1 QA基準的準確性 

他們的第一組結果如圖2所示,其中繪製了5-shot MMLU準確性與移除層的比例的關係:在左面板中,他們展示了Llama-2系列;在中間面板中,他們展示了Qwen系列的模型;在右面板中,他們展示了Mistral-7B和Phi-2。為了更好地比較具有不同總層數的模型,在這些圖中,他們選擇將x軸歸一化為移除層的比例(而不是移除層的絕對數量)。請注意,由於MMLU包含具有四個可能回答的多項選擇問題,隨機猜測的預期準確性為25%。


重要的是,他們觀察到穩健性能的特徵平坦區域,隨後是隨機準確性的急劇轉變,對於Llama-2系列中的模型,修剪分數約為45%-55%,對於Mistral 7B為35%,對於Phi-2為25%,對於Qwen系列的模型為20%。這意味著獲得模型最高分數所需的基本知識不會因大量層移除而丟失——即使這一比例可能相當大(!)——直到最終在特定於模型的臨界閾值處丟失該知識。比較有無修復的曲線,他們看到微調通過更好地保持未修剪的性能並將隨機猜測的相變推到稍大的修剪分數而提供了適度的改進。 


總的來說,他們看到層修剪對於更大和更深的模型(如Llama-2-13B和Llama-2-70B)更加穩健,他們假設這可能與以下事實有關:要麼較小的模型過度訓練,使參數冗餘度降低,要麼更深的模型在絕對意義上可以承受更多層的丟失。此外,Qwen系列很奇怪,他們將在§4.3中進一步詳細說明這一點。




4.2 下一個token預測的損失

在本節中,他們研究了層修剪對預訓練優化目標(即下一個token預測的交叉熵損失)的影響,當在C4驗證數據集的子集上評估時。為了在具有不同大小詞彙表\(V\)的模型之間進行公平比較,他們將損失歸一化為\(\log V\),這對應於以均勻概率隨機採樣token的損失。(有關更多詳細信息,請參閱附錄A.2。)

在圖3中,他們繪製了所有七個模型的歸一化C4驗證損失,在修復後(左面板)和修復前(右面板),作為移除層的比例的函數。在沒有修復的情況下,他們看到每個模型都有一個稍微尖銳的轉變到隨機猜測,大約在QA基準準確性也急劇轉變到隨機猜測的修剪分數處,這表明模型在這一點上已經無可救藥地受損,參見圖2。接下來,對比兩個圖的尺度,他們看到修復顯著恢復了所有模型接近未修剪水平的下一個token預測能力,損失隨著層丟棄緩慢線性增加。最突出的是——從科學角度來看——修復後的連續性通過我們之前發現QA基準有急劇轉變的修剪分數:這種解耦說明了一種使下游任務性能(如MMLU和BoolQ)與連續性能指標(如交叉熵損失)脫鉤(或創造不一致)的方法。


4.3 表示之間的角距離

鑑於角距離在他們的修剪策略中發揮的核心作用,讓我們花一小節來看看這七個模型的這些距離。對於這個分析,每個模型的角距離是在C4驗證集的10k個樣本上平均的。

回想一下之前的圖1(c):對於Llama-2-70B,它繪製了比較第\(\ell\)層和第\((\ell+n)\)層的角距離\(d(x^{(\ell)}, x^{(\ell+n)})\),跨所有初始索引\(\ell\)用於從\(n=1\)到\(n=64\)的塊大小;曲線的最小值\(\ell^*(n)\)給出了給定\(n\)的最佳修剪塊。一種更緊湊的顯示相同數據的方式如圖4的熱圖所示:每個方塊都用顏色表示層\(\ell\)和\(\ell+n\)之間的行歸一化角距離,跨所有可能的\(\ell\)和\(n\),直到總層數的很大一部分;給定塊大小的最佳修剪層\(\ell^*(n)\)對應於每行中的最小距離。 

跨模型,他們得出兩個廣泛的結論:(i)最小距離存在於更深的塊之間,這意味著更深的層通常彼此非常相似,可以更容易地丟棄; (ii)包括最後一層的最深塊的距離具有最大值或接近最大值,這意味著永遠不應該丟棄最後一層。雖然大體上是正確的,但也有一些例外。對於某些模型,例如Phi-2-2.7B,或者對於某些模型中最大的塊,例如Llama-2-7B,最後幾層似乎很重要。如前所述,Qwen系列有點不尋常:在這裡,他們看到淺層塊有一些奇怪的高相似性"島嶼";這可能解釋了圖2中更短的穩健性能區域。




4.4 一個更簡單的修剪策略

受最近結論的啟發,他們嘗試了一個非常簡單的啟發式修剪策略:

(1) 如果從一個\(L\)層模型中修剪\(n\)層,丟棄\((L-n)\)到\((L-1)\)層,以便刪除不包括最後一層的最深塊;  

(2) 然後像之前一樣通過少量微調來修復。

與主要的基於相似性的修剪策略相比,這個更簡單的啟發式算法的優勢在於從未要求從業者將未修剪模型加載到GPU上或進行推理。它還提供了一個有意義的消融實驗,用於優化要修剪的塊的重要性。



在圖5中,他們對比了兩種修剪策略,在修復前(左面板)和修復後(右面板),用於QA基準(MMLU/BoolQ,上/中面板)和自回歸損失(C4驗證,下面板)。一方面,如果不修復修剪造成的損害,簡單的啟發式方法表現非常糟糕:隨著修剪分數的增加,QA基準的準確性迅速下降到(接近)隨機,即使修剪量很小,損失也開始非常迅速地增加。另一方面,在修復後,兩種修剪策略在評估中的結果非常接近:對於QA基準,基於相似性的算法在相變發生之前稍微更好地保持了準確性,儘管簡單算法可能將相變推到稍大的修剪分數;對於損失,曲線幾乎重疊,儘管基於相似性的策略在所有修剪量下都稍微優於簡單策略。這些實驗有力地證明,後修剪微調的目的是修復修剪接口處的損害,而不是獲取額外的知識。

 

5 討論與未來方向 

隨著開放權重LLaMA系列的發布,開源機器學習社區圍繞著讓LLM人人可及的理念團結在一起。這催生了許多圍繞效率的創新,如LoRA和量化(與LoRA),使得大型(接近)最先進的70B模型可以只在單個80GB A100 GPU上進行微調。結合這些其他工具,他們的工作通過一種易於實現的層修剪技術實現了進一步的效率提升。

具體而言,發布版本的Llama-2-70B跨越140 GB內存,每個token消耗大約\(3 \times 10^{10}\) FLOP。通過4位量化和50%的層修剪分數,該模型佔用大約17.5 GB內存,每個token需要大約$1.5 \times 10^{10}$ FLOP:從16位bfloat量化到4位QLoRA精度將模型內存減少4倍,但FLOP基本保持不變,因為計算是以16位精度執行的;層修剪還將根據層修剪分數按比例減少內存和FLOP。這些內存和計算要求使得開放權重最先進模型能夠在消費級GPU上高效運行,甚至無需任何CPU卸載即可進行微調,且只有很小的性能權衡。

在工作結束時,他們留下了以下問題:

• 有哪些更好的層修剪策略?有哪些更好的修復方法?

• 為什麼修復消除了損失中的相變,但沒有消除QA準確性中的相變?

• 使用更全面的評估,不同任務的準確性是否會在不同深度下降?

• 相關地知識通常存儲在淺層或中間層,還是非局部化的?

• 預訓練細節是否會影響修剪能力,例如,基於縮放定律過度訓練或蒸餾的模型是否更難修剪?

• 我們如何使LLM更有效地利用其最深層中的參數? 

其中一些問題將受益於研究不同預訓練檢查點的層相似性和修剪;例如,QA準確性中的急劇相變和臨界深度是在什麼時候出現的,更多的訓練是否會導致更好地使用可修剪參數?其他問題表明需要探索不同的預訓練架構和目標,例如為了更好地利用更深層。通過更全面的評估,如果不同種類的任務在非常不同的深度下降,那麼這可能表明完成這些任務所需的知識存儲在不同的深度。使用修剪來系統地研究這些可解釋性問題將是非常有趣的。

參考文獻(略)

A 實驗細節

在這裡,他們解釋了模型和修復(§A.1)以及評估(§A.2)的各種細節。

A.1 模型和修復細節

本文中的所有模型都使用Hugging Face Trainer API進行微調。模型列表及其在Hugging Face上的路徑如下:



對於修復,他們使用了來自Hugging Face的Colossal Clean Crawled Corpus(C4)版本:data = load_dataset("c4", 'en')。他們如後面段落所述截斷了長樣本,並在可用時添加了特殊token。模型以全局批次大小16進行微調5000步:這對應於每個模型的總微調token為16 × 5000 × [max_seq_length]。他們使用了cosine退火的學習率調度,預熱100步。如果可能,則將峰值學習率設置為模型預訓練的峰值學習率;在實踐中,這意味著除Phi-2(在預訓練期間使用2e-4的峰值LR)、Llama-2-70B(使用3e-5的峰值LR,這是掃描得到的值)和Mistral-7B(使用3e-6的峰值LR,也是掃描得到的值)外,所有模型都使用3e-4的峰值LR進行訓練。所有7B參數或更小的模型都使用2048 token的最大序列長度進行訓練,而所有13B參數或更大的模型都使用4096 token的最大序列長度進行訓練。雖然他們意識到一些模型可能已經在更長的序列上進行了預訓練,例如Qwen-the-outlier,但他們決定在類似大小的模型中保持最大序列長度一致,以便在模型系列之間進行更公平的比較。

除了Hugging Face Trainer API之外,他們還在所有微調中使用了量化和低秩適應器(LoRA):

• 對於量化,他們使用bitsandbytes庫進行QLoRA將模型量化為4位。

• 對於LoRA,他們使用Hugging Face peft庫。他們將LoRA dropout設置為0.05,並將LoRA α保持等於LoRA秩,遵循。除了兩個例外(下面討論),模型都使用LoRA秩64進行訓練。

• 僅將LoRA應用於FFN模塊:

  1. 對於Llama-2和Mistral模型為["gate_proj", "down_proj", "up_proj"],
  2. 對於Phi-2為["fc1", "fc2"],  
  3. 對於Qwen模型為["w1", "w2", "c_proj"]。

這些超參數選擇中絕大多數都是標準的,可以在以前的工作中找到。為了絕對清晰,他們在下面列出了所有模型特定的架構和修復細節:


A.2 評估細節

他們執行了三個主要評估:MMLU的準確性、BoolQ的準確性和C4的損失。

對於MMLU準確性:

• 他們使用來自Hugging Face的cais/mmlu版本的資料集。  

• 他們遵循原始參考文獻中建議的格式,無需進一步的提示工程。

• 對於構建few-shot樣本,他們使用cais/mmlu中的dev集。 

• 對於實驗,他們使用0個few-shot樣本;他們的結果和分析對這種選擇是穩健的,參見圖7。

• 他們報告所有主題的平均準確性。


對於BoolQ準確性:

• 他們使用來自Hugging Face的hassansh/boolq_n_shot版本。

• 對於實驗,他們使用0個few-shot樣本。  

• 完整的BoolQ結果(從正文中截斷)如圖6所示:在左面板中,他們展示Llama-2系列,在中間面板中,他們展示Qwen系列的模型,在右面板中,他們展示Mistral-7B和Phi-2;他們還將沒有修復的實驗設為半透明,以更好地顯示完整的基於相似性的修剪方法的結果。重要的是,雖然他們在這裡看到修復比在圖2的MMLU中發揮了更重要的作用,但在修復後,我們仍然有一個特徵性的穩健性能平坦區域;如前所述,獲得模型最高分數所需的能力不會因大量層修剪而丟失,直到達到特定於模型的臨界閾值。


對於C4驗證損失:

• 他們使用來自Hugging Face的c4版本(即將被棄用,以支持allenai/c4)。

• 由於使用train split進行修復,因此他們在validation split上進行評估。

• 鑑於其大小,他們隨機採樣了60k個序列,並在所有模型中保持固定。

• 在圖3中,他們將損失標準化以便於不同模型系列之間的公平比較,這些模型使用不同的詞彙表大小:為了標準化,他們除以\(\log V\),其中\(V\)是每個模型的詞彙表大小(在§A.1的表格中列出)。這,\(\log V\),自然地設置了給定模型的尺度,對應於均勻採樣token的損失。



B 消融實驗

在這裡,他們詳細說明了各種超參數的消融實驗:提示(§B.1)、微調種子(§B.2)、LoRA秩(§B.3)。定性地說,本文的結果對任何這些參數的變化都非常穩健。

B.1 提示

眾所周知,改變QA評估的提示可以顯著影響結果。為了控制提示,他們在§3.2中描述的主要基於相似性的修剪應用於Llama-2-13B時,對MMLU準確性進行了消融:在圖7的左面板中,他們顯示了改變提示中few-shot樣本順序的結果,在同一圖的右面板中,他們顯示了改變few-shot樣本數量的結果。總的來說,我們看到層修剪方法對這些變化是穩健的。 

B.2 微調種子

在這裡,他們改變微調種子。對於所有實驗,他們使用以下代碼片段來確保可重複性:

SEED_VAL = 0 

transformers.enable_full_determinism(SEED_VAL)


由於從預訓練模型開始,微調種子不會影響初始化,但會影響進一步訓練的隨機方面,如數據順序。為了控制這一點,他們在§3.2中描述的主要基於相似性的修剪應用於Llama-2-13B時,對微調種子進行了消融:在圖8中,我們觀察到層修剪方法對種子選擇是穩健的。




B.3 LoRA秩

在這裡,他們改變用於修復的LoRA秩。不幸的是,他們的計算預算不允許他們在所有實驗配置中進行詳盡的掃描。作為替代,他們採用以下協議進行主要實驗:

• 從秩64開始,遵循QLoRA設置。

• 如果使用該秩進行修復會顯著損害性能(與不修復相比),則為該模型掃描LoRA秩,並根據MMLU準確性選擇性能最佳的LoRA秩用於其他評估。

該協議旨在最大化修復在所有評估中改善性能的機會。為簡單起見,他們使用簡單的修剪啟發式運行此秩選擇協議,Llama-2-70B除外。

在實踐中,這導致他們對每個模型使用秩64,Mistral-7B(秩4)、Llama-2-7B(秩2)和Llama-2-70B(秩8)除外。 (要以表格形式查看相同的信息,請參見§A.1中的第二個表格。)圖9顯示了支持Mistral-7B(左下面板)、Llama-2-7B(中下面板)和Llama-2-70B(右上面板)這些選擇的MMLU準確性掃描:總的來說,雖然LoRA秩對修復模型的定性行為沒有顯著影響,但降低LoRA秩通常會提高性能。在圖9的左上和中上面板中,我們顯示了使用基於相似性的修剪策略對Mistral-7B(上)和Llama-2-7B(中)進行相應的掃描:我們看到,對於這種修剪方法,兩個模型都更加穩健,儘管秩2仍然是Llama-2-7B的最佳表現秩。


LoRA秩下降對MMLU準確性的特徵性改善(即使對於極低的秩(!))值得解釋。一種可能性是,降低LoRA秩可以更好地正則化微調以防止過擬合。特別是,一些敏銳的讀者可能會對§A.1中關於峰值學習率的討論感到驚訝:模型使用預訓練中相同的峰值進行微調;一個"大"的LoRA秩64引入了一些額外的參數,可能會過擬合C4。這種過擬合肯定是有害的,因為我們考慮的模型的實際預訓練數據集(a)我們未知,(b)可能比C4的質量高得多。  

他們直接為Mistral-7B研究了這一點。在圖9的右下面板中,他們繪製了不同LoRA秩的C4驗證損失:我們看到,雖然降低LoRA秩通常會提高MMLU準確性(參見最左面板),但同時它會損害C4驗證損失。這支持了他們的過擬合假設。在未來資源更充足的情況下,通過考慮其他形式的正則化和學習率調整來改善修復過程將會很有趣。

這篇論文研究了一個非常有趣而且實用的問題:如何在不顯著影響性能的情況下修剪大型語言模型的層數,從而減少模型的記憶體佔用和推理延遲。作者提出了一種基於層間表示相似性的啟發式修剪策略,並通過在各種問答任務上的實驗證明了該方法的有效性。


我的閱讀筆記

我認為這項工作有以下幾點意義和啟示:

1. 實用價值。層修剪可以顯著減少模型部署的成本,尤其是在雲端推理等受限資源場景下。該方法與LoRA、量化等其他模型壓縮技術正交,可以協同使用。

2. 理論洞見。作者發現修剪後的模型在QA任務上存在突變點(phase transition),即準確率在某一修剪比例後驟降,而自回歸loss則是平滑變化。這表明QA任務可能主要依賴模型的淺層知識。此外,更深層之間的表示相似性更高,修剪也更魯棒。

3. 簡單有效。基於相似性的啟發式修剪策略已經很有效,而更簡單的從後往前修剪策略也能取得接近的效果。這種簡單性很有吸引力。

4. 擴展空間。在更大的模型、更長序列、更多任務上驗證層修剪效果,以及進一步優化修復方法,都是有趣的未來方向。此外層修剪也為分析知識在網路中的分佈提供了新思路。

不過這項工作也有一些局限性,比如只考慮了GPT類的decoder-only模型,在encoder-decoder模型上效果如何還有待研究。而且修剪比例較大時仍然需要一些微調,並非完全零樣本。

我認為這是一篇兼具實用性和啟發性的好工作,對於降低大模型部署成本和分析語言模型的知識特性都有重要價值。未來進一步擴展層修剪的適用性,并結合知識蒸餾等其他技術,有望進一步提升大模型的效率。

沒有留言:

發佈留言

SambaNova SN40L: 利用Dataflow和專家組合(COE)來克服AI記憶牆的大模型

摘要 GPT-4等整體式大型語言模型(LLM)為現代生成AI應用鋪路。然而,大規模訓練、服務及維護整體式LLM仍然極其昂貴和充滿挑戰。現代AI加速器計算能力與記憶體比例的不成比例增長已經造成了記憶體壁障,需要新的方法來部署AI。最近的研究顯示,許多小型專家模型的組合,每個模型參數...