大模型面經——LoRA最全總結 原創
LoRA面經搜集總結。
大家的顯卡都比較吃緊,LoRA家族越來越壯大,基于LoRA出現了各種各樣的改進,最近比較火的一個改進版是 dora,聽大家反饋口碑也不錯。
基于PEFT的話用4090 24G顯存也可以進行大模型的微調,所以LoRA家族這塊還是很有研究和實際落地的潛力。
LoRA整個系列分為兩個部分:
1、LoRA總述
2、LoRA家族演進
本篇開始介紹第一部分:LoRA總述,盡量以面經問題的形式提出并解答,下面是一個快捷目錄。
一、概念
1. 簡單介紹一下LoRA
2. LoRA的思路
3. LoRA的特點
4. LoRA的優點
5. LoRA的缺點
二、訓練理論
1. LoRA權重是否可以合入原模型?
2. ChatGLM-6B LoRA后的權重多大?
3. LoRA微調方法為啥能加速訓練?
4. 如何在已有LoRA模型上繼續訓練?
5. LoRA這種微調方法和全參數比起來有什么劣勢嗎?
6. LORA應該作用于Transformer的哪個參數矩陣?
7. LoRA 微調參數量怎么確定?
8. Rank 如何選取?
9. alpha參數 如何選取?
10. LoRA 高效微調如何避免過擬合?
11. 哪些因素會影響內存使用?
12. LoRA權重是否可以合并?
13. 是否可以逐層調整LoRA的最優rank?
14. Lora的矩陣怎么初始化?為什么要初始化為全0?
一、概念
1. 簡單介紹一下LoRA
通過低秩分解來模擬參數的改變量,從而以極小的參數量來實現大模型的間接訓練。實現思想很簡單,就是凍結一個預訓練模型的矩陣參數,并選擇用A和B矩陣來替代,在下游任務時只更新A和B。
2. LoRA的思路
主要思想:在原模型旁邊增加一個旁路,通過低秩分解(先降維再升維)來模擬參數的更新量。
- 訓練:原模型固定,只訓練降維矩陣A和升維矩陣B。
- 推理:可將BA加到原參數上,不引入額外的推理延遲。
- 初始化:A采用高斯分布初始化,B初始化為全0,保證訓練開始時旁路為0矩陣。
- 可插拔式的切換任務:當前任務W0+B1A1,將lora部分減掉,換成B2A2,即可實現任務切換。
3. LoRA的特點
- 將BA加到W上可以消除推理延遲;
- 可以通過可插拔的形式切換到不同的任務;
- 設計的比較簡單且效果好。
4. LoRA的優點
1)一個中心模型服務多個下游任務,節省參數存儲量
2)推理階段不引入額外計算量
3)與其它參數高效微調方法正交,可有效組合
4)訓練任務比較穩定,效果比較好
5)LoRA 幾乎不添加任何推理延遲,因為適配器權重可以與基本模型合并
5. LoRA的缺點
LoRA參與訓練的模型參數量不多,也就百萬到千萬級別的參數量,所以效果比全量微調差很多。(數據以及算力滿足的情況下,還是微調的參數越多越好)
二、訓練理論
1. LoRA權重是否可以合入原模型?
可以,將訓練好的低秩矩陣(B*A)+原模型權重合并(相加),計算出新的權重。
2. ChatGLM-6B LoRA后的權重多大?
rank 8 target_module query_key_value條件下,大約15M。
3. LoRA微調方法為啥能加速訓練?
1)只更新了部分參數:比如LoRA原論文就選擇只更新Self Attention的參數,實際使用時我們還可以選擇只更新部分層的參數;
2)減少了通信時間:由于更新的參數量變少了,所以(尤其是多卡訓練時)要傳輸的數據量也變少了,從而減少了傳輸時間;
3)采用了各種低精度加速技術,如FP16、FP8或者INT8量化等。
這三部分原因確實能加快訓練速度,然而它們并不是LoRA所獨有的,事實上幾乎都有參數高效方法都具有這些特點。LoRA的優點是它的低秩分解很直觀,在不少場景下跟全量微調的效果一致,以及在預測階段不增加推理成本。
4. 如何在已有LoRA模型上繼續訓練?
理解此問題的情形是:已有的lora模型只訓練了一部分數據,要訓練另一部分數據的話,是在這個lora上繼續訓練呢,還是跟base 模型合并后再套一層lora,或者從頭開始訓練一個lora?
把之前的LoRA跟base model 合并后,繼續訓練就可以,為了保留之前的知識和能力,訓練新的LoRA時,加入一些之前的訓練數據是需要的。每次都要重頭訓練的話成本比較高。
5. LoRA這種微調方法和全參數比起來有什么劣勢嗎?
如果有足夠計算資源以及有10k以上數據,還是建議全參數微調,lora的一個初衷就是為了解決不夠計算資源的情況下微調,只引入了少量參數,就可以在消費級gpu上訓練,但lora的問題在于它不能節省訓練時間,相比于全量微調,他要訓練更久,同時因為可訓練參數量很小,在同樣大量數據訓練下,比不過全量微調。
6. LORA應該作用于Transformer的哪個參數矩陣?
從上圖我們可以看到:
1)將所有微調參數都放到attention的某一個參數矩陣的效果并不好,將可微調參數平均分配到 Wq 和 Wk 的效果最好;
2)即使是秩僅取4也能在 ?W 中獲得足夠的信息。
因此在實際操作中,應當將可微調參數分配到多種類型權重矩陣中,而不應該用更大的秩單獨微調某種類型的權重矩陣。
7. LoRA 微調參數量怎么確定?
LoRA 模型中可訓練參數的結果數量取決于低秩更新矩陣的大小,其主要由秩 r 和原始權重矩陣的形狀確定。實際使用過程中,通過選擇不同的 lora_target 決定訓練的參數量。
以 LLama 為例:
--lora_target q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj
8. Rank 如何選取?
Rank的取值比較常見的是8,理論上說Rank在4-8之間效果最好,再高并沒有效果提升。不過論文的實驗是面向下游單一監督任務的,因此在指令微調上根據指令分布的廣度,Rank選擇還是需要在8以上的取值進行測試。
9. alpha參數 如何選取?
alpha其實是個縮放參數,本質和learning rate相同,所以為了簡化可以默認讓alpha=rank,只調整lr,這樣可以簡化超參。
10. LoRA 高效微調如何避免過擬合?
過擬合還是比較容易出現的。減小r或增加數據集大小可以幫助減少過擬合,還可以嘗試增加優化器的權重衰減率或LoRA層的dropout值。
11. 哪些因素會影響內存使用?
內存使用受到模型大小、批量大小、LoRA參數數量以及數據集特性的影響。例如,使用較短的訓練序列可以節省內存。
12. LoRA權重是否可以合并?
可以將多套LoRA權重合并。訓練中保持LoRA權重獨立,并在前向傳播時添加,訓練后可以合并權重以簡化操作。
13. 是否可以逐層調整LoRA的最優rank?
理論上,可以為不同層選擇不同的LoRA rank,類似于為不同層設定不同學習率,但由于增加了調優復雜性,實際中很少執行。
14. Lora的矩陣怎么初始化?為什么要初始化為全0?
矩陣B被初始化為0,而矩陣A正常高斯初始化。
如果B,A全都初始化為0,那么缺點與深度網絡全0初始化一樣,很容易導致梯度消失(因為此時初始所有神經元的功能都是等價的)。
如果B,A全部高斯初始化,那么在網絡訓練剛開始就會有概率為得到一個過大的偏移值Δ W 從而引入太多噪聲,導致難以收斂。
因此,一部分初始為0,一部分正常初始化是為了在訓練開始時維持網絡的原有輸出(初始偏移為0),但同時也保證在真正開始學習后能夠更好的收斂。
文轉載自公眾號瓦力算法學研所,作者:喜歡瓦力的卷卷
原文鏈接:??https://mp.weixin.qq.com/s/d3WIiA3VDyyRPyWWkwHa3w??
