博客首發(fā)于我的知乎,詳見:https://zhuanlan.zhihu.com/p/702629428 一、LoRA原理 LoRA(Low-Rank Adaptation of LLMs),即LLMs的低秩適應(yīng),是參數(shù)高效微調(diào)最常用的方法。 LoRA的本質(zhì)就是用更少的訓(xùn)練參數(shù)來近似LLM全參數(shù)微調(diào)所
博客首發(fā)于我的知乎,詳見: https://zhuanlan.zhihu.com/p/702629428
LoRA(Low-Rank Adaptation of LLMs),即LLMs的低秩適應(yīng),是參數(shù)高效微調(diào)最常用的方法。
LoRA的本質(zhì)就是用更少的訓(xùn)練參數(shù)來近似LLM全參數(shù)微調(diào)所得的增量參數(shù),從而達(dá)到使用更少顯存占用的高效微調(diào)。
LoRA與訓(xùn)練目標(biāo)是解耦的,但本文設(shè)定就是語(yǔ)言模型建模。
以下將給出語(yǔ)言建模(可自然推廣到序列建模)的基本符號(hào)定義,即最大化給定提示的條件概率(本質(zhì)是極大似然估計(jì))。
The maximization of conditional probabilities given a task-specific prompt
給定一個(gè)參數(shù)為 \(\mathbf{\Phi}\) 預(yù)訓(xùn)練的自回歸語(yǔ)言模型$ P_{\Phi}(y|x)$。
\(x\) 為輸入, \(y\) 為輸出
note: 為與原文符號(hào)一致,下文 \(\mathbf{\Phi}\) 、 \(\mathbf{\Theta}\) 、 \(\mathbf{W}\) 均表示模型參數(shù)
全參數(shù)微調(diào)
每次full fine-tuning訓(xùn)練,學(xué)一個(gè) \(\Delta \mathbf{\Phi}\) , \(|\Delta \mathbf{\Phi}|\) 參數(shù)量大hold不住
語(yǔ)言模型的條件概率分布建模目標(biāo)
高效微調(diào)
$ \Delta \mathbf{\Phi}$ 是特定于下游任務(wù)的增量參數(shù)
LoRA將 $ \Delta \mathbf{\Phi}=\Delta \mathbf{\Phi}(\Theta)$ ,用參數(shù)量更少的$ \mathbf{\Theta}$來編碼(低秩降維表示來近似), \(|\mathbf{\Phi}| << | \mathbf{\Theta}|\)
LoRA訓(xùn)練目標(biāo)
Transformer架構(gòu)參數(shù)
Transformer層的輸入和輸出維度大小 \(d_{model}\)
\(\mathbf{W_q}\) 、 \(\mathbf{W_k}\) 、 \(\mathbf{W_v}\) ,和 \(\mathbf{W_o}\) 分別代表自注意力的query、key、value和output投影矩陣
\(\mathbf{W}\) 或 \(\mathbf{W}_0\) 代表預(yù)訓(xùn)練的權(quán)重矩陣
\(?\mathbf{W}\) 是微調(diào)后得到的增量參數(shù)矩陣(訓(xùn)練后,優(yōu)化算法在參數(shù)上的累計(jì)更新量)
\(r\) 代表LoRA模塊的秩
LoRA的核心思想是,在凍結(jié)預(yù)訓(xùn)練模型權(quán)重后,將可訓(xùn)練的低秩分解矩陣注入到的Transformer架構(gòu)的每一層中,從而大大減少了在下游任務(wù)上的可訓(xùn)練參數(shù)量。
LoRA結(jié)構(gòu)
We propose Low-Rank Adaptation(LoRA), which freezes the pre trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks.
在推理時(shí),對(duì)于使用LoRA的模型來說,可直接將原預(yù)訓(xùn)練模型權(quán)重與訓(xùn)練好的LoRA權(quán)重合并,因此在推理時(shí)不存在額外開銷。
背景
通常,凍結(jié)預(yù)訓(xùn)練模型權(quán)重,再額外插入可訓(xùn)練的權(quán)重是常規(guī)做法,例如Adapter?捎(xùn)練的權(quán)重學(xué)習(xí)的就是微調(diào)數(shù)據(jù)的知識(shí)。
但它們的問題在于,不僅額外增加了參數(shù),而且還改變了模型結(jié)構(gòu)。
這會(huì)導(dǎo)致模型訓(xùn)練、推理的計(jì)算成本和內(nèi)存占用急劇增加,尤其在模型參數(shù)需在多GPU上分布式推理時(shí)(這越來越常見)。
推理性能比較
動(dòng)機(jī)
深度網(wǎng)絡(luò)由大量Dense層構(gòu)成,這些參數(shù)矩陣通常是滿秩的。
相關(guān)工作表明,When adapting to a specific task, 訓(xùn)練學(xué)到的過度參數(shù)化的模型實(shí)際上存在于一個(gè)較低的內(nèi)在維度上(高維數(shù)據(jù)實(shí)際是在低維子空間中)
We take inspiration from Li et al. (2018a); Aghajanyan et al. (2020) which show that the learned over-parametrized models in fact reside on a low intrinsic dimension.
低秩矩陣
LoRA就假設(shè)LLM在下游任務(wù)上微調(diào)得到的增量參數(shù)矩陣 \(\Delta \mathbf{W}\) 是低秩的(肯定不是滿秩),即存在冗余參數(shù)或高度相關(guān)的參數(shù)矩陣,但實(shí)際有效參數(shù)是更低維度的。
We hypothesize that the change in weights during model adaptation also has a low “intrinsic rank”, leading to our proposed Low-Rank Adaptation (LoRA) approach.
LoRA遂設(shè)想,對(duì)全參數(shù)微調(diào)的增量參數(shù)矩陣 \(\Delta \mathbf{W}\) 進(jìn)行低秩分解近似表示(即對(duì)參數(shù)做降維)。
PCA降維示意圖,源于https://lightning.ai/pages/community/tutorial/lora-llm/
這樣訓(xùn)練 \(\Delta \mathbf{W}\) 的低秩分解近似參數(shù)矩陣,效果上相比其他PEFT方法不會(huì)打什么折扣,而且還能在推理時(shí)不增加額外開銷。
LoRA allows us to train some dense layers in a neural network indirectly by optimizing rank decomposition matrices of the dense layers’ change during adaptation instead, while keeping the pre-trained weights frozen
LoRA的大體思路就是這樣,具體的矩陣分解也是靠微調(diào)過程學(xué)習(xí)的。
接下來,介紹LoRA的具體方案。
LoRA就是低秩矩陣適應(yīng),在凍結(jié)原有LLM參數(shù)時(shí),用參數(shù)量更小的矩陣進(jìn)行低秩近似訓(xùn)練。
LoRA原理
對(duì)于預(yù)訓(xùn)練權(quán)重矩陣 \(\mathbf{W}_{0} \in \mathbb{R}^{d \times d}\) ,LoRa限制了其更新方式,即將全參微調(diào)的增量參數(shù)矩陣 \(\Delta \mathbf{W}\) 表示為兩個(gè)參數(shù)量更小的矩陣$\mathbf{B} \(和\) \mathbf{A}$的低秩近似:
其中, \(\mathbf{B}\in \mathbb{R}^{d \times r}\) 和 \(\mathbf{A}\in \mathbb{R}^{r \times d}\) 為L(zhǎng)oRA低秩適應(yīng)的權(quán)重矩陣,秩 \(r\) 遠(yuǎn)小于 \(d\) 。
此時(shí),微調(diào)的參數(shù)量從原來 \(\Delta \mathbf{W}\) 的 \(d*d\) ,變成了 \(\mathbf{B}\) 和 \(\mathbf{A}\) 的 \(2*r*d\) ?芍 \(2*r*d << d*d\) (有 \(2r << d\) )
給定輸入 \(\mathbf{x} \in \mathbb{R}^dddd3d93ddd5\) ,添加LoRA后的輸出 \(\mathbf{h} \in \mathbb{R}^dddd3d93ddd5\) :
這里,將 \(\Delta \mathbf{h}=\mathbf{B}\mathbf{A} \mathbf{x}\) ,便于后續(xù)求導(dǎo)計(jì)算。
在訓(xùn)練時(shí),原始參數(shù) \(\mathbf{W}_{0}\) 被凍結(jié),意味著 \(\mathbf{W}_{0}\) 雖然會(huì)參與前向傳播和反向傳播,但是不會(huì)計(jì)算其對(duì)應(yīng)梯度 \(\frac{\partial L}{\partial \mathbf{W}_0}\) ,更不會(huì)更新其參數(shù)。
在推理時(shí),直接按上面的式子將 \(\mathbf{B}\mathbf{A}\) 合并到 \(\mathbf{W}_{0}\) 中,因此相比原始LLM不存在推理延時(shí)。
在開始訓(xùn)練時(shí):
矩陣 \(\mathbf{B}\) 通過高斯函數(shù)初始化, \(b_i \sim N(0, {\sigma_b}^2)\)
矩陣 \(\mathbf{A}\) 為全零初始化, \(a_i = 0\)
這使得訓(xùn)練開始前,LoRA的旁路 \(\mathbf{B}\mathbf{A}=0\) ,那么微調(diào)就能從預(yù)訓(xùn)練權(quán)重 \(\mathbf{W}_{0}\) 開始。
這樣就能和全參數(shù)微調(diào)時(shí)一樣,能有相同的開始。
這個(gè)策略要求,至少 \(\mathbf{B}\) 和 \(\mathbf{A}\) 中有一個(gè)被初始化為全0項(xiàng)。
但如果,全被初始化為0,
\(\mathbf{B}\)
和
\(\mathbf{A}\)
就訓(xùn)不動(dòng)了。因?yàn)椋?
\(\mathbf{B}\)
和
\(\mathbf{A}\)
全0時(shí),處于鞍點(diǎn),兩個(gè)權(quán)重的梯度也全為0?
(
\(\mathbf{B}\)
的梯度
\(\frac{\partial L}{\partial \mathbf{B}}\)
依賴
\(\mathbf{A}\)
,
\(\mathbf{A}\)
的梯度
\(\frac{\partial L}{\partial \mathbf{A}}\)
依賴
\(\mathbf{B}\)
,如果僅一項(xiàng)為0訓(xùn)練是可以啟動(dòng)的)
實(shí)際實(shí)現(xiàn)時(shí), \(\Delta \mathbf{W} = \mathbf{B}\mathbf{A}\) 會(huì)乘以系數(shù) \(\frac{\alpha}{r}\) 與原始預(yù)訓(xùn)練權(quán)重合并 \(\mathbf{W}_{0}\) , \(\alpha\) 是一個(gè)超參:
直觀來看,系數(shù) \(\frac{\alpha}{r}\) 決定了在下游任務(wù)上微調(diào)得到的LoRA低秩適應(yīng)的權(quán)重矩陣 \(\mathbf{B}\mathbf{A}\) 占最終模型參數(shù)的比例。
給定一個(gè)或多個(gè)下游任務(wù)數(shù)據(jù),進(jìn)行LoRA微調(diào):
一般來說,在給定任務(wù)上LoRA微調(diào),讓 \({\alpha}\) 為 \(r\) 的2倍數(shù)。(太大學(xué)過頭了,太小學(xué)不動(dòng)。)
根據(jù)經(jīng)驗(yàn),LoRA訓(xùn)練大概很難注入新的知識(shí),更多是修改LLM的指令尊隨的能力,例如輸出風(fēng)格和格式。原始的LLM能力,是在預(yù)訓(xùn)練是獲得的(取決于參數(shù)量、數(shù)據(jù)規(guī)模X數(shù)據(jù)質(zhì)量)。
LoRA的秩 \(r\) 決定,LoRA的低秩近似矩陣的擬合能力,實(shí)際任務(wù)需要調(diào)參挑選合適的秩 \(r\) 維度。系數(shù) \(\frac{\alpha}{r}\) 中 \(\alpha\) 決定新老權(quán)重的占比。
和推薦系統(tǒng)中的評(píng)分矩陣分解、文本的非負(fù)矩陣分解,以及奇異值分解一樣。LoRA的低秩分解近似矩陣 \(\mathbf{B}\) 和 \(\mathbf{A}\) 的秩 \(r\) 的大小,決定了其擬合能力。
理想的情況是找到一個(gè)秩 \(r\) ,使得LoRA的低秩近似結(jié)構(gòu) \(\mathbf{B}\mathbf{A}\) 能具備全參數(shù)微調(diào)的增量矩陣 \(\Delta \mathbf{W}\) 的表達(dá)能力,能越接近越好。
秩 \(r\) 成為了LoRA的超參數(shù),隨著秩 \(r\) 維度的不斷增加,參與訓(xùn)練的參數(shù)量也隨之增加,LoRA的低秩適應(yīng)能力將逐漸提高甚至過擬合。
論文基于GPT-3 175B,WikiSQL和MultiNLI數(shù)據(jù)上,進(jìn)行了關(guān)于LoRA秩
\(r\)
選取的實(shí)驗(yàn)分析
Weight Type指明對(duì)Attention的那部分參數(shù)做了低秩適應(yīng)?梢园l(fā)現(xiàn),在這個(gè)2個(gè)數(shù)據(jù)集上, \(r\) =4,8時(shí)基本上要略優(yōu)于 \(r\) =64的效果。更高的 \(r\) 不一定帶來更好的效果。
作者指出,增加 \(r\) 并不能涵蓋更有意義的子空間,這表明低秩適應(yīng)矩陣就足夠了。但是,并不可能期望一個(gè)小的 \(r\) 適用于每個(gè)任務(wù)或數(shù)據(jù)集
一些秩 \(r\) 選取經(jīng)驗(yàn):
微調(diào)的下游任務(wù)
:
簡(jiǎn)單任務(wù)所需的秩
\(r\)
不大,任務(wù)越難/多任務(wù)混合的情況,需要更大的秩
\(r\)
基座能力
:
越強(qiáng)的基座,所需的秩
\(r\)
應(yīng)該更小。例如Qwen2-72B-Instruct對(duì)比Qwen2-7B-Instruct。
越強(qiáng)的基座在處理同等任務(wù)時(shí),需要微調(diào)的樣本數(shù)也通常會(huì)更少些。
LoRA原始論文只研究了注意力參數(shù) \(\mathbf{W_q}\) 、 \(\mathbf{W_k}\) 、 \(\mathbf{W_v}\) ,和 \(\mathbf{W_o}\) 。
論文基于GPT-3 175B,對(duì)比分析了訓(xùn)練預(yù)算有限時(shí),關(guān)于LoRA的微調(diào)注意力參數(shù)的選擇
在訓(xùn)練預(yù)算為18M時(shí) (roughly 35MB if stored
in FP16) on GPT-3 175B,注意力權(quán)重全部選擇時(shí)的效果最佳。
這表明,即使全部的注意力參數(shù)即使秩更小時(shí)( \(r=2\) ),相比秩更大的( \(r=8\) )部分注意力參數(shù),具有更強(qiáng)的建模能力。
在實(shí)際中,一般會(huì)把FFN的參數(shù)也考慮進(jìn)來。
LoRA反向傳播的過程
LoRA訓(xùn)練時(shí),將凍結(jié)預(yù)訓(xùn)練權(quán)重
\(\mathbf{W_0}\)
,只優(yōu)化低秩矩陣
\(\mathbf{B}\)
和
\(\mathbf{A}\)
。
LoRA訓(xùn)練后,只需保存低秩矩陣的 \(\mathbf{B}\) 和 \(\mathbf{A}\) 參數(shù)。
LoRa的計(jì)算圖和梯度計(jì)算
\(\mathbf{B}\) 和 \(\mathbf{A}\) 的梯度計(jì)算, \(\mathbf{W}_{0}\) 不參與計(jì)算。
繼續(xù)回傳的梯度,包括 \(\mathbf{W}_{0}\) 這一路:
全量微調(diào)前向計(jì)算:$ \mathbf{h} = \mathbf{W}_0
\mathbf{x}$
全量微調(diào)反向計(jì)算:
LoRA微調(diào)計(jì)算:$\mathbf{h} = \mathbf{W}_{0}\mathbf{x} + \mathbf{B}\mathbf{A} \mathbf{x} $
此時(shí),微調(diào)的參數(shù)量從原來 \(\Delta \mathbf{W}\) 的 \(d*d\) ,變成了 \(\mathbf{B}\) 和 \(\mathbf{A}\) 的 \(2*r*d\) 。可知, \(2*r*d << d*d\) (有 \(2r << d\) )
不考慮pytorch、llm.c或8-bit優(yōu)化器、Float8的訓(xùn)練優(yōu)化實(shí)現(xiàn)?梢钥吹剑馓荻扔(jì)算的話,實(shí)際計(jì)算量是增加了的。
\(\mathbf{B}\) 和 \(\mathbf{A}\) 的梯度是小頭這里,暫時(shí)忽略。
預(yù)訓(xùn)練權(quán)重 \(\mathbf{W_0}\) 的梯度存儲(chǔ)開銷,實(shí)際就是LoRA能大大減少了顯存占用的關(guān)鍵。
在LoRA訓(xùn)練時(shí), \(\mathbf{W_0}\) 仍然會(huì)參與前向傳播和反向傳播,但是不會(huì)計(jì)算其對(duì)應(yīng)梯度 \(\frac{\partial L}{\partial \mathbf{W}_0}\) ,更不會(huì)更新其參數(shù)。
因此,這一步不再需要計(jì)算和保存梯度 \(\frac{\partial L}{\partial \mathbf{W}_0}\) ,以及更新 \(\mathbf{W_0}\) 。
以 \(d=4096, r=16\) 為例,這部分減少的梯度顯存占用粗略估計(jì)為: \(d*d - 2*d*r = 1 - \frac{2r}dddd3d93ddd5\) , 減少了99.2187%。
若以Adaw optimizer的視角來看,其優(yōu)化器所需維護(hù)的states(梯度的一階矩(均值)和二階原始矩(有偏方差)),那么顯存占用減少地更多。
按照LoRA論文報(bào)告的結(jié)果,LoRA微調(diào)使得在訓(xùn)練GPT3 175B時(shí)的,顯存消耗從1.2TB降至350GB;
當(dāng) \(r=4\) 時(shí),最終保存的模型從350GB降至35MB,極大降低了訓(xùn)練的開銷。
下表,來源于LlamaFactory Github展示的微調(diào)LLM的最小硬件依賴估算值。
方法 | 精度 | 7B | 13B | 30B | 70B | 8x7B | 8x22B |
---|---|---|---|---|---|---|---|
Full | AMP | 120GB | 240GB | 600GB | 1200GB | 900GB | 2400GB |
Full | 16 | 60GB | 120GB | 300GB | 600GB | 400GB | 1200GB |
Freeze | 16 | 20GB | 40GB | 80GB | 200GB | 160GB | 400GB |
LoRA/GaLore/BAdam | 16 | 16GB | 32GB | 64GB | 160GB | 120GB | 320GB |
QLoRA | 8 | 10GB | 20GB | 40GB | 80GB | 60GB | 160GB |
QLoRA | 4 | 6GB | 12GB | 24GB | 48GB | 30GB | 96GB |
QLoRA | 2 | 4GB | 8GB | 16GB | 24GB | 18GB | 48GB |
實(shí)際的使用情況:
猛猿:圖解大模型微調(diào)系列之:大模型低秩適配器LoRA(原理篇)
LoRA 微調(diào)-MartinLwx's blog|
Parameter-Efficient LLM Finetuning With Low-Rank Adaptation (LoRA)
原創(chuàng)不易,轉(zhuǎn)載需注明出處!
機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)