選自 lightning.AI
作者:Sebastian Raschka
機器之心編譯
編輯:陳萍
作者表示:在各種有效的 LLM 微調方法中,LoRA 仍然是他的首選。
LoRA(Low-Rank Adaptation)作為一種用于微調 LLM(大語言模型)的流行技術,最初由來自微軟的研究人員在論文《 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 》中提出。不同于其他技術,LoRA 不是調整神經網絡的所有參數,而是專注于更新一小部分低秩矩陣,從而大大減少了訓練模型所需的計算量。
由于 LoRA 的微調質量與全模型微調相當,很多人將這種方法稱之為微調神器。自發布以來,相信很多人都對這項技術感到好奇,想要從頭開始編寫代碼從而更好的理解該研究。以前苦于沒有合適的文檔說明,現在,教程來了。
這篇教程的作者是知名機器學習與 AI 研究者 Sebastian Raschka,他表示在各種有效的 LLM 微調方法中,LoRA 仍然是自己的首選。為此,Sebastian 專門寫了一篇博客《Code LoRA From Scratch》,從頭開始構建 LoRA,在他看來,這是一種很好的學習方法。
簡單來說,本文通過從頭編寫代碼的方式來介紹低秩自適應(LoRA),實驗中 Sebastian 對 DistilBERT 模型進行了微調,并用于分類任務。
LoRA 與傳統微調方法的對比結果顯示,使用 LoRA 方法在測試準確率上達到了 92.39%,這與僅微調模型最后幾層相比(86.22% 的測試準確率)顯示了更好的性能。
Sebastian 是如何實現的,我們接著往下看。
從頭開始編寫 LoRA
用代碼的方式表述一個 LoRA 層是這樣的:
其中,in_dim 是想要使用 LoRA 修改的層的輸入維度,與此對應的 out_dim 是層的輸出維度。代碼中還添加了一個超參數即縮放因子 alpha,alpha 值越高意味著對模型行為的調整越大,值越低則相反。此外,本文使用隨機分布中的較小值來初始化矩陣 A,并用零初始化矩陣 B。
值得一提的是,LoRA 發揮作用的地方通常是神經網絡的線性(前饋)層。舉例來說,對于一個簡單的 PyTorch 模型或具有兩個線性層的模塊(例如,這可能是 Transformer 塊的前饋模塊),其前饋(forward)方法可以表述為:
在使用 LoRA 時,通常會將 LoRA 更新添加到這些線性層的輸出中,又得到代碼如下:
如果你想通過修改現有 PyTorch 模型來實現 LoRA ,一種簡單方法是將每個線性層替換為 LinearWithLoRA 層:
以上這些概念總結如下圖所示:
為了應用 LoRA,本文將神經網絡中現有的線性層替換為結合了原始線性層和 LoRALayer 的 LinearWithLoRA 層。
如何上手使用 LoRA 進行微調
LoRA 可用于 GPT 或圖像生成等模型。為了簡單說明,本文采用一個用于文本分類的小型 BERT(DistilBERT) 模型來說明。
由于本文只訓練新的 LoRA 權重,因而需要將所有可訓練參數的 requires_grad 設置為 False 來凍結所有模型參數:
接下來,使用 print (model) 檢查一下模型的結構:
由輸出可知,該模型由 6 個 transformer 層組成,其中包含線性層:
此外,該模型有兩個線性輸出層:
通過定義以下賦值函數和循環,可以選擇性地為這些線性層啟用 LoRA:
使用 print (model) 再次檢查模型,以檢查其更新的結構:
正如上面看到的,線性層已成功地被 LinearWithLoRA 層取代。
如果使用上面顯示的默認超參數來訓練模型,則會在 IMDb 電影評論分類數據集上產生以下性能:
- 訓練準確率:92.15%
- 驗證準確率:89.98%
- 測試準確率:89.44%
在下一節中,本文將這些 LoRA 微調結果與傳統微調結果進行了比較。
與傳統微調方法的比較
在上一節中,LoRA 在默認設置下獲得了 89.44% 的測試準確率,這與傳統的微調方法相比如何?
為了進行比較,本文又進行了一項實驗,以訓練 DistilBERT 模型為例,但在訓練期間僅更新最后 2 層。研究者通過凍結所有模型權重,然后解凍兩個線性輸出層來實現這一點:
只訓練最后兩層得到的分類性能如下:
- 訓練準確率:86.68%
- 驗證準確率:87.26%
- 測試準確率:86.22%
結果顯示,LoRA 的表現優于傳統微調最后兩層的方法,但它使用的參數卻少了 4 倍。微調所有層需要更新的參數比 LoRA 設置多 450 倍,但測試準確率只提高了 2%。
優化 LoRA 配置
前面講到的結果都是 LoRA 在默認設置下進行的,超參數如下:
假如用戶想要嘗試不同的超參數配置,可以使用如下命令:
不過,最佳超參數配置如下:
在這種配置下,得到結果:
- 驗證準確率:92.96%
- 測試準確率:92.39%
值得注意的是,即使 LoRA 設置中只有一小部分可訓練參數(500k VS 66M),但準確率還是略高于通過完全微調獲得的準確率。
原文鏈接:https://lightning.ai/lightning-ai/studIOS/code-lora-from-scratch?continueFlag=f5fc72b1f6eeeaf74b648b2aa8aaf8b6