您的位置:首頁 > 軟件教程 > 教程 > 大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析

來源:好特整理 | 時(shí)間:2024-06-12 08:45:55 | 閱讀:163 |  標(biāo)簽: LOR 過程   | 分享到:

博客首發(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原理

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)。

1.1 問題定義

LoRA與訓(xùn)練目標(biāo)是解耦的,但本文設(shè)定就是語言模型建模。

以下將給出語言建模(可自然推廣到序列建模)的基本符號(hào)定義,即最大化給定提示的條件概率(本質(zhì)是極大似然估計(jì))。

The maximization of conditional probabilities given a task-specific prompt

給定一個(gè)參數(shù)為 \(\mathbf{\Phi}\) 預(yù)訓(xùn)練的自回歸語言模型$ 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不住

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析
語言模型的條件概率分布建模目標(biāo)

高效微調(diào)

$ \Delta \mathbf{\Phi}$ 是特定于下游任務(wù)的增量參數(shù)

LoRA將 $ \Delta \mathbf{\Phi}=\Delta \mathbf{\Phi}(\Theta)$ ,用參數(shù)量更少的$ \mathbf{\Theta}$來編碼(低秩降維表示來近似), \(|\mathbf{\Phi}| << | \mathbf{\Theta}|\)

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析
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模塊的秩

1.2 LoRA簡(jiǎn)介

LoRA的核心思想是,在凍結(jié)預(yù)訓(xùn)練模型權(quán)重后,將可訓(xùn)練的低秩分解矩陣注入到的Transformer架構(gòu)的每一層中,從而大大減少了在下游任務(wù)上的可訓(xùn)練參數(shù)量。

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析
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í)不存在額外開銷。

1.3 為什么要LoRA

背景

通常,凍結(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í)(這越來越常見)。

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析
推理性能比較

動(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.

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析
低秩矩陣

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ù)做降維)。

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析
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的具體方案。

1.4 LoRA實(shí)現(xiàn)

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}\) 為LoRA低秩適應(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\)

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析

給定輸入 \(\mathbf{x} \in \mathbb{R}^4bdm5no\) ,添加LoRA后的輸出 \(\mathbf{h} \in \mathbb{R}^kbwekkx\)

這里,將 \(\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í)。

1.5 LoRA參數(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)的)

1.6 LoRA權(quán)重系數(shù) \(\frac{\alpha}{r}\)

實(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):

  • 系數(shù) \(\frac{\alpha}{r}\) 越大,LoRA微調(diào)權(quán)重的影響就越大,在下游任務(wù)上越容易過擬合
  • 系數(shù) \(\frac{\alpha}{r}\) 越小,LoRA微調(diào)權(quán)重的影響就越。ㄎ⒄{(diào)的效果不明顯,原始模型參數(shù)受到的影響也較少)

一般來說,在給定任務(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)重的占比。

1.7 LoRA的秩 \(r\) 如何選擇

和推薦系統(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)能力將逐漸提高甚至過擬合。

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析
論文基于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ì)更少些。

  • 數(shù)據(jù)規(guī)模
    數(shù)據(jù)規(guī)模越大,需要更大的秩 \(r\)

1.8 LoRA的微調(diào)的參數(shù)選取

LoRA原始論文只研究了注意力參數(shù) \(\mathbf{W_q}\) 、 \(\mathbf{W_k}\) 、 \(\mathbf{W_v}\) ,和 \(\mathbf{W_o}\) 。

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析
論文基于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訓(xùn)練

大模型高效微調(diào)-LoRA原理詳解和訓(xù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ù)。

2.1 LoRA訓(xùn)練的梯度計(jì)算

大模型高效微調(diào)-LoRA原理詳解和訓(xùn)練過程深入分析
LoRa的計(jì)算圖和梯度計(jì)算

\(\mathbf{B}\) \(\mathbf{A}\) 的梯度計(jì)算, \(\mathbf{W}_{0}\) 不參與計(jì)算。

繼續(xù)回傳的梯度,包括 \(\mathbf{W}_{0}\) 這一路:

2.2 反向傳播計(jì)算量

全量微調(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ì)算量是增加了的。

2.3 LoRA在哪里減少了顯存占用

\(\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}zoyaenb\) , 減少了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í)際的使用情況:

  • 一張16GB顯存 T4,僅夠6B或7B的模型在batchsize為1時(shí),進(jìn)行int4 QLoRA,這還只是考慮輸入輸出有限時(shí)。
  • 一張32GB顯存 V100,大致夠6B或7B的模型在batchsize為1時(shí),進(jìn)行LoRA微調(diào)。
  • 一張80GB顯存 A800,Qwen1.5 72B 進(jìn)行int4 QLoRA,以及例如Baichuan13B / Qwen14B的LoRA微調(diào)
  • 2張A800 80GB顯存,可以進(jìn)行全參SFT或增量SFT

參考資料

猛猿:圖解大模型微調(diào)系列之:大模型低秩適配器LoRA(原理篇)
LoRA 微調(diào)-MartinLwx's blog|
Parameter-Efficient LLM Finetuning With Low-Rank Adaptation (LoRA)

原創(chuàng)不易,轉(zhuǎn)載需注明出處!

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號(hào)!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]

湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2024 haote.com 好特網(wǎng)