讀懂大模型高效微調:從SoftPrompts到QLoRA的技術躍遷

MLNLP社群是國內外知名的機器學習與自然語言處理社群,受眾覆蓋國內外NLP碩博生、高校老師以及企業研究人員。
社群的願景是促進國內外自然語言處理,機器學習學術界、產業界和廣大愛好者之間的交流和進步,特別是初學者同學們的進步。
來源 | 知乎
作者 | wxchyy

前言

本文將介紹大模型微調的各種方法,傳統的全量微調對於普通硬體環境來說,十分困難,對此本期將介紹一些高效微調的方法。

主流的高效微調方法介紹

我們將高效微調方法粗略分為三類:
  • • Additive(增加額外引數)
  • • Selective(選取一部分引數更新)
  • • Reparametrization-based(引入重引數化)。

(1)Additive

Additive即引入額外引數,主要分為Adapters(介面卡)和Soft Prompts(軟提示)兩個小類。介面卡設計在前饋神經網路模組的內部額外增加一個輔助模組。以此實現模型的針對性增強。
Soft Prompts包括Prompt Tuning、Prefix Tuning以及P-Turning等。Soft Prompt的特點是繞過龐大的預訓練模型權重的直接調整,轉而關注於最佳化模型的響應機制,僅透過對提示的精心設計和調整引導大模型產生期望的輸出變化。

(2)Selective

Selective聚焦於有選擇性地對模型現有引數集合進行細微的調整。調整依據可涉及模型層次的深度、不同型別的功能層,乃至具體引數的重要性進行選擇性調參。

(3)Reparametrization-based

其中,LoRA是這一類中的一個典型代表。透過變化預訓練模型的引數配置,乃至對網路架構本身進行適度改造,力求較小規模的模型或引數逼近並複製大模型的效能表現。

Prompt策略

(1)Hard Prompt (硬提示):又稱為離散Prompt,Hard Prompt體現了直觀且直接的干預方式,它是由研究者手動精心構造的一系列具有明確語義的文字標記。然而,這一過程也伴隨著顯著的侷限—創造一個既高效又能精準引導模型輸出的Hard Prompt,往往需要深厚的專業洞察力與大量的試錯工作,是一個勞動密集且可能效果不確定的任務。
(2)Soft Prompt (軟提示):Soft Prompt常被稱為連續Prompt,Soft Prompt實質上是一種可學習的向量表示,即一系列在向量空間中透過演算法最佳化得到的張量,它們與模型的輸入嵌入層緊密相連,能夠隨訓練資料集的具體需求動態調整。儘管Soft Prompt在適應性和效能上展現出顯著優勢,但其不足之處在於缺乏直觀的人類可讀性。
接下來將介紹一些軟提示的具體微調方法。

Prefix Tuning

Prefix Tuning作為一種增量調整策略,透過在模型輸入前附加一系列專為特定任務設計的連續向量來實現其獨特性。在此機制中,僅對這些被稱為“字首”的引數進行最佳化,並將其融入模型每一層級的隱藏狀態之中,而模型的其餘部分保持不變。儘管Prefix Tuning技術大幅度減少了模型引數量(約減少至原引數量的千分之一),其模型效能仍能與全量微調模型相媲美,尤其是在資料資源有限的場景下,展現出了超越常規微調方法的卓越效能,為高效模型調優開闢了新的途徑。

Prompt Tuning

之前介紹的Prefix Tuning 在實際應用中也有若干侷限性。
1)其執行機制基於在原有輸入Prompt之前附加字首,這會佔用模型的輸入容量。
2)Prefix Tuning 的字首長度(L)、插入位置(如編碼器 / 解碼器)等超引數需人工設定。這種人工預設類似於離散模板的設計過程(如模板長度、佔位符位置),若超引數選擇不當,可能導致模型效能下降。
在此背景下,Prompt Tuning僅在模型輸入嵌入層整合提示引數,而非遍歷所有模型層插入Prefix引數。這一調整極大簡化了模型結構調整的複雜度,規避了MLP訓練的調整,轉而依賴於在輸入層面精心設計的Prompt Token來驅動模型針對特定任務的響應能力。
與Prefix Tuning侷限於在Transformer架構內部增添字首模組不同,Prompt Tuning採取了一種更為高效的外部模型架構,該架構與基礎預訓練模型相隔離,形成一個獨立的外掛系統。尤其值得注意的是,Prompt Tuning進一步提出了Prompt Ensembling策略,在單個訓練批次中整合多個針對同一任務的不同形式的Prompt,這實質上模擬了多個模型的整合學習效應,卻大幅降低了實際整合多個模型的高昂成本。透過這種策略,每個Batch內的多樣化Prompt促進了模型對任務理解的深度與廣度,增強了模型的健壯性和靈活性。

左圖是傳統的全量微調,每一個任務訓練一個模型,右邊是Prompt Tuning,可以同時處理不同任務,進而提高模型的泛化能力。
實驗研究表明,儘管Prompt Tuning未必能在所有指標上全面超越Fine Tuning,但其實現的效能已十分接近,表明其能以較低的開發成本達成與高成本方法相近的成果。

P-Tuning V1

P-Tuning V1是由中國研究團隊引領的調優技術,屬於軟提示方式的一種創新演變,旨在連續空間中自動探索並最佳化提示序列,以替代傳統的人工設計。相對於上面講述的Prompt tuning的Prompt是純連續軟提示和模型凍結的方案,P-Tuning則採用了一種人為設計離散模板、連續虛擬token和部分模型調優的混合方案。具體來講:
1 P-Tuning 首先將下游任務轉化為自然語言填空問題,即構造一個包含 “輸入文字(X)”、“模式(Pattern)” 和 “答案(Answer)” 的三元組。
如:情感分類任務:
輸入文字 X = “這部電影情節緊湊,演員演技線上”,
模式 P = “[X],這句話的情感是 [MASK]”,
答案 A = “積極”(填充到 [MASK] 位置)。
2 為了增強模式對任務的適應性,P-Tuning 在模式的關鍵位置,通常是輸入文字 X 和 [MASK] 之間插入 k 個可訓練的連續向量(虛擬 token),記為  。這些虛擬 token 的初始值隨機初始化,訓練時透過反向傳播最佳化。
3 與 Prompt Tuning不同,P-Tuning 不僅訓練虛擬 token,還會微調預訓練模型的部分底層引數。主要底層引數對輸入的語義理解更敏感,微調後能更好地將虛擬 token 與原始輸入的語義融合,例如Embedding 層以及前1-3層Transformer層。
4 P-Tuning 的訓練目標與 MLM(Masked Language Mode)任務一致:最大化模型預測 [MASK] 位置答案的機率。
P-Tuning少樣本效果接近全引數微調,透過離散模式的顯式任務引導 + 虛擬 token 的動態調整,P-Tuning 在少樣本下的效果顯著優於純軟提示,接近全引數微調。不過P-Tuning仍需人工設計初始模板,雖然虛擬 token 能最佳化模式,但初始模板的結構仍需人工設計,對非結構化任務的適配性較弱。同時還需要微調部分底層引數來增加學習任務模式,這也增大了微調的引數量。

P-Tuning V2

P-Tuning V2在P-Tuning V1的基礎上應運而生,旨在克服前者存在的若干侷限性,並進一步拓展了該技術的應用邊界。
回顧P-Tuning V1,其效果顯著受到模型規模(Scale)的制約,這一點與Prompt Tuning領域普遍觀察到的現象相呼應。從邏輯上講,當依託於一個強大的大模型時,豐富的預訓練知識基礎使得模型能更深刻地理解並利用精心設計的Prompt模板,進而在特定任務上實現卓越效能。反之,如果模型規模較小,其內在知識儲備和理解能力的侷限性將直接影響Prompt調優的效果,從而限制了P-Tuning V1在小模型上的表現潛力。
P-Tuning V2該版本不僅融合了P-Tuning和Prefix Tuning的核心思想,更重要的是,它創新性地納入了深度Prompt編碼(Deep Prompt Encoding)和多工學習(Multi-task Learning)等先進策略,以此為核心最佳化機制。透過深度Prompt編碼機制深化了模型對Prompt的處理能力,還憑藉多工學習策略的整合,進一步拓寬了其在複雜任務和模型泛化方面的應用範圍。
1)原始 P-Tuning 的虛擬 token 僅插入到輸入層,而 P-Tuning v2 將提示擴充套件到模型的多個 Transformer 層,以強化模型對Prompt的響應能力。具體來說,為每一層的注意力模組新增可訓練的提示向量(Key/Value 字首),直接干預模型的中間計算過程,增強對長程依賴和複雜任務的建模能力,同時P-TuningV2不對模型的底層引數進行微調。
2)P-Tuning v2 透過統一的 “輸入 + 提示” 結構替代任務特定模板,避免了人工設計模板的需求,適用於分類、生成、抽取等多種任務型別。
P-Tuning V2不論在何種模型規模下,均展現出了與傳統微調(Fine-Tuning)相當的優越效能。這一成就尤為重要,因為它顛覆了以往認為調優效果與模型引數規模緊密相關的普遍認知,成功打破了模型尺寸對調優效果的限制,不論是在資源受限的小模型上,還是在計算能力強大的大模型中,都能夠穩定地輸出與全量微調相媲美的高質量結果。

小結

最早的Prompt Tuning,是直接在模型外部進行操作,而不修改Transformer。而Prefix Tuning只在Transformer的不同Layer層前面新增加了一些神經網路模組MLP。P-Tuning也類似,在Embedding層增加了一些新的神經網路引數。P-TuningV2則還會有更深層次的字首增加。

Reparametrization-based(引入重引數化)

Reparametrization-based(引入重引數化)是一類在機器學習和深度學習中廣泛應用的最佳化技術,主要用於解決隨機梯度估計和模型訓練中的問題。這類方法的核心思想是透過對隨機變數進行數學變換,將原本難以直接最佳化的隨機過程轉化為可微分的確定性過程,從而簡化梯度計算並提高訓練效率。在微調中,我們將其分為LoRA、AdaLoRA以及QLoRA,下面分別進行介紹。

LoRA

低秩適配(LoRA)方法,透過設計特定結構,在涉及矩陣乘法的模組中引入兩個低秩矩陣A和B,以模擬全量微調過程,從而只對語言模型中起關鍵作用的低秩本質維度進行更新。儘管大模型引數規模巨大,但其中的關鍵作用通常是由低秩本質維度發揮的。

LoRA的思路是,我先不管左邊這條網路路,只管右邊這個我們需要新訓練的外掛網路通路小模型,其名稱為更新矩陣(Update Matrix)。矩陣A和B的初始化方式也不一樣,其中B是零矩陣,A是正態分佈矩陣(隨機初始化,均值為0,方差為σ2),二者的維度分別為d×r和r×d。外掛通路的核心就是小矩陣模擬大矩陣。公式如下:

LoRA的核心思想是把公式中的ΔW改為BAx,將大矩陣從一個d×d維的高維空間變成了相對較小的AB。LoRA直接作用於域模型結構。把大模型變成小模型並不意味著大模型完全被替換了,LoRA只是在矩陣層面的替換,只能替換特定層,LoRA微調要做的就是用矩陣BA的乘積把矩陣W替換掉。
接下來介紹一下PEFT庫裡LoRA微調的一些引數:
  • • r(int): LoRA低秩矩陣的維數,影響LoRA矩陣的大小。
  • • lora_alpha(int): LoRA縮放的alpha引數,LoRA適應的比例因子。
  • • target_modules(Optional[List[str],str]):適配模組,指定LoRA應用到的模型模組,通常是attention和全連線層的投影。如果指定了此項,則僅替換具有指定名稱的模組。傳遞字串時,將執行正則表示式匹配。傳遞字串列表時,將執行完全匹配,或者檢查模組名稱是否以任何傳遞的字串結尾。如果指定為“all-linear”,則選擇所有線性/Conv1D模組,不包括輸出層。如果未指定,則根據模型架構選擇模組。如果體系結構未知,則引發錯誤—在這種情況下,應該手動指定目標模組。
  • • lora_dropout(int):在LoRA模型中使用的dropout率。
  • • bias(str): LoRA的偏移型別。可以是“none”“all”或“lora_only”。如果是“all”或“lora_only”,則在訓練期間更新相應的偏差。注意,這意味著,即使停用介面卡,模型也不會產生與沒有自適應的基本模型相同的輸出。
  • • modules_to_save(List[str]):除了介面卡層,還要設定為可訓練並儲存在最終檢查點中的模組列表。
注意:實驗結果表明,權重矩陣的種類和rank值r的選擇對訓練結果具有很大的影響。

AdaLoRA

1)在LoRA中,超引數中增量矩陣的r是無法自適應調整的,它是我們在一開始訓練LoRA時就需要設定的值。
2)權重矩陣的種類和不同層的權重矩陣的選擇對結果影響非常大。
3)只微調了大模型中的部分模組,如Q、K、V,以及最終的輸出,而並沒有微調前饋網路(FFN)模組。Transformer架構中最重要的就是一個Attention接了一個FFN, LoRA只訓練了Attention而忽視了FFN,事實上,FFN更重要。
ADAPTIVE BUDGET ALLOCATION FOR PARAMETER-EFFICIENTFINE-TUNING論文提出了一個針對性的解決方案,以解決原來的LoRA論文中未解決的問題。也就是AdaLoRA。

  • • AdaLoRA 提出了" 預算”的概念,將總引數預算(如總秩 (  )動態分配給不同的權重矩陣,而非為所有矩陣設定相同的 r。
  • • AdaLoRA 透過敏感度評估自動確定需要訓練的權重矩陣,而非人工選擇。
  • • AdaLoRA 將 FFN 納入低秩分解,動態分配預算。

1)第一,既然降維中用B×A替代矩陣,那麼如何做降維替代更好呢?

本質上就是更好地找出一個B×A。對此有很多經典的方案,如機器學習時代有一個SVD(Singular Value Decomposition,奇異值分解)方法。事實上,AdaLoRA的核心其實就是把SVD用到了極致,用SVD提升矩陣低秩分解的效能。

2)第二,對模型進行剪枝

在整個大模型中並非每個引數都是有用的,其實我們只需要那些最有用的引數,而那些不相關的引數可以不用。那麼,如何找出那些最有用的引數呢?這其實是對大模型進行建模,把模型引數的每個單獨的引數都當成我們要去建模的物件,每個引數都有自己的重要性,我們需要對這個重要性進行評分,這就是在AdaLoRA中做的另一件很重要的事。

3)第三,既然r不能自適應地調整,也不能靠我們決定哪個r能夠在特定訓練集上表現更好,那就讓它動態、自適應地調整r

AdaLoRA的核心理念和技術手段就是用SVD的三元組去替代原來LoRA的BA二元組。LoRA在指定rank值之後,它的BA矩陣的維度就不會發生變化;而AdaLoRA在迭代過程中,一直在做奇異值分解,調整奇異值數量和對角矩陣的維度。

QLoRA

美國華盛頓大學的一篇論文QLoRA: Efficient Finetuning of Quantized LLMs提出了一個新的訓練微調的方法,即QLoRA,就是去訓練量化的大模型。QLoRA透過三個技術的疊加,即4bit即NF4 Normal Four Bit這個新的資料型別加上雙量化的量化策略,再加上記憶體和視訊記憶體管理的Page Optimizers,使它訓練出來的大模型比16bit微調的大模型還要好。

1 NF4

NF4是資訊理論上最優的量化資料型別,適用於正態分佈的資料。我們的機器學習、深度學習、大模型和我們需要儲存的模型引數是有特點的,模型引數本身不是隨機的,且它們的數值會聚集在一塊區域中。夏農在資訊理論中提出的最優資料型別其實是指,假設你知道透過經驗的積累和歷史資料的擬合,知道了資料的分佈情況,知道了要存在計算機中的數大概是什麼樣子的分佈函式,你就可以進行輸入張量的分位數量化。

2 雙量化技術

雙量化技術引入了雙重量化(Double Quantization, DQ)的概念,這是一種對量化常數進行二次量化的過程,目的是進一步節省記憶體容量。具體來說,雙重量化將第一次量化的量化常數作為第二次量化的輸入。這種技術其實就是巢狀的量化。論文中的研究者使用256塊大小的8bit浮點數進行第二次量化,根據Dettmers和Zettlemoyer的研究,8bit量化沒有效能下降。資料雖然被NF4儲存下來了,但真正計算時肯定不能那樣儲存,因為除它外,對其他資料還是用16bit計算。
因此,QLoRA設計了儲存資料型別NF4和計算資料型別BF16,並且採用了存算分離技術,這也是QLoRA的核心價值。計算機在計算時,用Float16表達的浮點數可以直接進行加減乘除矩陣運算;而NF4不能,因為它是極致地壓縮了儲存空間,把計算和儲存分離,只有在算時才解壓縮。因為QLoRA不是對每個階段的每個引數都運算的,而是隻運算部分引數,在運算的時候再回到BF16進行運算,運算完再編碼儲存下來。

3 分頁最佳化器

分頁最佳化器(Page Optimizer)的作用是防止系統崩潰。在執行過程中,在某一層可能因為中間資料量比較龐大,短時間的記憶體峰值導致暫時的OOM(Out Of Memory,記憶體不足)。分頁最佳化器在GPU執行偶爾出現OOM時,可以透過英偉達統一記憶體的功能,在CPU和GPU之間自動進行頁面到頁面的傳輸,和虛擬記憶體技術差不多。
這就是QLoRA透過三個技術的疊加,將65B引數模型的記憶體需求從>780GB降低到<48GB,並保持了16bit微調任務的效能。對於個人開發者來說,如果想實現具有100億個引數的模型,則可採用這種由可靠的技術支撐、廉價、合理的方案,否則需要買很多顯示卡才能使用大模型。

技術交流群邀請函

△長按新增小助手
掃描二維碼新增小助手微信
請備註:姓名-學校/公司-研究方向
(如:小張-哈工大-對話系統)
即可申請加入自然語言處理/Pytorch等技術交流群

關於我們

MLNLP 社群是由國內外機器學習與自然語言處理學者聯合構建的民間學術社群,目前已經發展為國內外知名的機器學習與自然語言處理社群,旨在促進機器學習,自然語言處理學術界、產業界和廣大愛好者之間的進步。
社群可以為相關從業者的深造、就業及研究等方面提供開放交流平臺。歡迎大家關注和加入我們。


相關文章