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