首頁  >  文章  >  科技週邊  >  大規模語言模型高效參數微調--BitFit/Prefix/Prompt 微調系列

大規模語言模型高效參數微調--BitFit/Prefix/Prompt 微調系列

王林
王林轉載
2023-10-07 12:13:011473瀏覽

2018 年Google發布了BERT,一經面世便一舉擊敗11 個NLP 任務的State-of-the-art (Sota) 結果,成為了NLP 界新的里程碑; BERT 的結構如下圖所示, 左邊是 BERT 模型預訓練過程, 右邊是特定任務的微調過程。其中, 微調 階段是後續用於一些下游任務的時候進行微調, 例如: 文本分類, 詞性標註, 問答系統等, BERT 無需調整結構 就可以在不同的任務上進行微調。透過」預訓練語言模式   下游任務微調」的任務設計, 帶來了強大的模式效 果。從此,「預訓練語言模式   下游任務微調」便成為了 NLP 領域主流訓練範式。

大规模语言模型高效参数微调--BitFit/Prefix/Prompt 微调系列BERT 結構圖,左邊是預訓練過程,右邊是具體任務微調過程

然而,隨著以GPT3為代表的大規模語言模型(LLM)參數規模的增加,消費級硬體上進行全量微調變得不可行。下表展示了在一張A100 GPU(80G顯存)以及CPU記憶體64GB以上的硬體上進行模型全量微調以及參數高效微調對於CPU/GPU記憶體的消耗情況

大规模语言模型高效参数微调--BitFit/Prefix/Prompt 微调系列#全量參數微調與參數高效能微調顯存佔用對比

除此之外,全面微調模型還會導致多樣性的喪失,並且存在嚴重的遺忘問題。因此,如何高效地進行模型微調已成為業界研究的重點,這也為參數高效微調技術的快速發展提供了研究空間

參數高效微調是指微調少量或額外的模型參數,固定大部分預訓練模型(LLM) 參數, 因而大幅降低了計 算與儲存成本, 同時, 也能達到與全量參數微調相當的效能。參數高效微調方法甚至在某些情況下比全量微調 效果更好,可以更好地泛化到域外場景。

高效能微調技術可粗略分為以下三大類,如下圖所示:增加額外參數(A)、選取一部分參數更新(S)、引入重參數化(R)。 而在增加額外參數這類方法中,又主要分為類適配器(Adapter-like)方法和軟提示(Soft prompts)兩個小類。

常見的參數高效能微調技術包括BitFit、Prefix Tuning、Prompt Tuning、P-Tuning、Adapter Tuning、LoRA等。接下來的章節將對一些主流的參數高效微調方法進行詳細講解

大规模语言模型高效参数微调--BitFit/Prefix/Prompt 微调系列#常見的參數高效微調技術和方法

#BitFit/Prefix/Prompt 微調系列

BitFit

雖然對每個任務進行全量微調非常有效,但它也會為每個預訓練任務產生一個獨特的大型模型, 這使得很 難推斷微調過程中發生了什麼變化,也很難部署,特別是隨著任務數量的增加,很難維護。

理想狀況下,我們希望有一種滿足以下條件的高效微調方法:

上述的問題取決於微調過程能多大程度引導新能力的學習以及暴露在預訓練LM 中學到的能力。雖然, 之 前的高效率微調方法 Adapter-Tuning 、Diff-Pruning 也能夠部分滿足上述的需求。一種參數量較小的稀疏的微調方 法 BitFit 可以滿足上述所有需求。

BitFit 是一種稀疏的微調方法, 它訓練時只更新 bias 的參數或部分 bias 參數。對 Transformer 模型而言, 凍結大部分 transformer-encoder 參數, 只更新 bias 參數跟特定任務的分類層參數。涉及的bias 參數有attention  模組中計算query,key,value 跟隨合併多個attention 結果時涉及到的bias,MLP 層中的bias,Layernormalization 層的bias 參數,預訓練模型中的bias參數如下圖所示。

大规模语言模型高效参数微调--BitFit/Prefix/Prompt 微调系列圖片

PLM 模組代表了一個特定的 PLM 子層, 例如注意力或 FFN,圖中橘色區塊表示可訓練的提示向量, 藍色 塊表示凍結的預訓練模型參數

#

在 Bert-Base/Bert-Large 這種模型裡, bias 參數只佔模型全部參數量的 0.08%~0.09%。但透過在Bert-Large  模型上基於GLUE 資料集進行了BitFit、Adapter 和Diff-Pruning 的效果比較發現, BitFit 在參數量遠小於Adapter、 Diff-Pruning 的情況下,效果與Adapter 、Diff-Pruning 想當,甚至在某些任務上略優於Adapter 、Diff-Pruning。

透過實驗結果可以看出,相對於全量參數微調,BitFit微調結果只更新了極少量的參數,在多個資料集上都取得了不錯的效果。雖然不如全量參數微調,但遠超過固定全部模型參數的Frozen方式。同時,透過比較BitFit訓練前後的參數,發現許多偏移參數並沒有太多變化,例如與計算key相關的偏移參數。而發現計算query和將特徵維度從N放大到4N的FFN層的偏移參數變化最為明顯,只更新這兩類偏壓參數也能取得不錯的效果。反之,固定其中任何一者,模型的效果都會有較大損失

Prefix Tuning

在 Prefix Tuning 之前的工作主要是人工設計離散的模版或自動化搜尋離散的模版。對於人工設計的模版, 模版的變化對模型的最終表現特別敏感, 加一個字、少一個字或是變動位置都會造成比較大的變化。而對於自動 化搜尋模版, 成本也比較高;同時, 以前這種離散化的 token 搜尋出來的結果可能並不是最優的。除此之外, 傳統的微調範式利用預訓練模型去對不同的下游任務進行微調, 對每個任務都要保存一份微調後的模型權重, 一 方面微調整個模型耗時長;另一方面也會佔很多儲存空間。基於上述兩點, Prefix Tuning 提出固定預訓練LM,為LM 添加可訓練, 任務特定的前綴, 這樣就可以為不同任務保存不同的前綴, 微調成本也小; 同時, 這種 Prefix  實際是連續可微的 Virtual Token  (Soft Prompt/Continuous Prompt),相較於離散的 Token ,較佳優化,效果較好。

那麼,需要重寫的內容是:那麼 prefix 的意思是什麼呢? prefix 的作用是引導模型提取 x 相關的訊息,進而更好地產生 y。例如,我們要做一個summarization 的任務,那麼經過微調後,prefix 就能領悟到當前要做的是個「總結形式」的任務,然後引導模型去x 中提煉關鍵訊息;如果我們要做一個情感分類的任務,prefix 就能引導模型去提煉出x 中和情感相關的語意訊息,以此類推。這樣的解釋可能不那麼嚴謹,但大家可以大致體會一下prefix 的作用

Prefix Tuning 是在輸入token 之前構造一段任務相關的virtual tokens 作為Prefix,然後訓練的時候只更新Prefix 部分的參數,而PLM 中的其他部分參數固定。針對不同的模型結構,需要建構不同的Prefix:

  • 針對自迴歸架構模型:在句子前面加上前綴, 得到z = [PREFIX; x; y],適合的上文能夠在固定LM 的情況下去引導生成下文(例如:GPT3 的上下文學習)。
  • 針對編碼器-解碼器架構模型:Encoder 和 Decoder 都增加了前綴,得到 z = [PREFIX; x; PREFIX0; y]。 Encoder 端增加前綴是為了引導輸入部分的編碼, Decoder 端增加前綴是為了引導後續 token 的產生。

大规模语言模型高效参数微调--BitFit/Prefix/Prompt 微调系列圖片

對內容重寫,不改變原意,使用中文重寫: 對於上一個部分的微調,我們會更新所有Transformer參數(紅色框),並且需要為每個任務儲存完整的模型副本。而下部分的前綴調整則會凍結Transformer參數,並且只優化前綴(紅色框)

該方法其實和構造Prompt 類似, 只是Prompt 是人為構造的“顯式”的提示,且無法更新參數, 而Prefix 則是可以學習的「隱式」的提示。同時,為了防止直接更新 Prefix 的參數導致訓練不穩定和表現下降的情況,在 Prefix 層前面加了 MLP 結構, 訓練完成後, 只保留 Prefix 的參數。除此之外, 透過消融實驗證實, 只調整 embedding 層的表現力不夠,將導致表現顯著下降,因此,每層都加了 prompt 的參數,而改變較大。

Prefix Tuning 雖然看起來方便,但也存在以下兩個顯著劣勢:

Prompt Tuning

大模型全量微調對每個任務訓練一個模型, 開銷和部署成本都比較高。同時, 離散的 prompts  (指人工設計 prompts 提示語加入到模型) 方法, 成本比較高, 且效果不太好。 Prompt Tuning 透過反向傳播更新參數來學習 prompts,而不是人工設計 prompts;同時凍結模型原始權重, 只訓練 prompts 參數, 訓練完以後, 用同一個模型 可以做多任務推理。

大规模语言模型高效参数微调--BitFit/Prefix/Prompt 微调系列圖片

模型調整需要為每個任務製作整個預訓練模型的特定任務副本下游任務和推理必須在分開批次。 Prompt Tuning 只需要為每個任務儲存一個小的特定於任務的提示,並且使用原始預訓練模型啟用混合任務推理。

Prompt Tuning 可以看作是Prefix Tuning 的簡化版本,它給每個任務定義了自己的Prompt,然後拼接到資料 上作為輸入,但只在輸入層加入prompt tokens,並且不需要加入MLP 進行調整來解決難訓練的問題。

透過實驗發現,隨著預訓練模型參數量的增加,Prompt Tuning 的方法會逼近全參數微調的結果。同時, Prompt Tuning 也提出了Prompt Ensembling,也就是在一個批次(Batch) 裡同時訓練同一個任務的不同prompt  (即採用 多種不同方式詢問同一個問題) ,這樣相當於訓練了不同模型, 比模型整合的成本小多了。除此之外, Prompt Tuning 論文中也探討了 Prompt token 的初始化方法和長度對於模型效能的影響。透過消融實驗結果發現, 與隨機 初始化和使用樣本詞彙表初始化相比, Prompt Tuning 採用類別標籤初始化模型的效果更好。不過隨著模型參數規 模的提升, 這種 gap 最終會消失。 Prompt token 的長度在20 左右時的表現已經不錯(超過20 之後, 提升Prompt token 長度, 對模型的性能提升不明顯了),同樣的, 這個gap 也會隨著模型參數規模的提升而減小(即對於超大規模模型而言,即使Prompt token 長度很短,對性能也不會有太大的影響)。

以上是大規模語言模型高效參數微調--BitFit/Prefix/Prompt 微調系列的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除