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