# 論文筆記:LoRA: Low-Rank Adaptation of Large Language Models
[論文連結](https://arxiv.org/abs/2106.09685)
## 摘要
- 主要因為訓練大模型全量微調在一般顯卡上一般不可行,所以這篇論文提出LoRA,主要透過凍結預訓練模型權重,並將可訓練的秩分解矩陣注入到Transformer的每一層中,大大減少了下游任務可訓練量,在GPT-3 175B使用Adam上,與全量微調相比,LoRA減少了10000倍參數量,3倍顯存消耗,與Adapter相比,沒有額外推理延遲
[問題1]-微調過程,直接修改預訓練模型可能會破壞模型原始性能
## 引言

## 問題定義
1. 預訓練好的模型:$P_\phi(y \mid x)$
2. 下游數據集:$Z = {(x_i, y_i)}_{i=1,...,N}$
3. 全量微調中優化目標:$\max_{\phi} \sum_{(x,y) \in Z} \sum_{t=1}^{|y|} \log(P_\phi(y_t \mid x, y_{<t}))$
4. LoRA優化目標:$\max_{\Theta} \sum_{(x,y) \in Z} \sum_{t=1}^{|y|} \log (P_{\theta_0 + \Delta\phi(\Theta)}(y_t \mid x, y_{<t}))$
:::info
當預訓練模型為GPT-3 175B時,可訓練參數$|\Theta|$可小至$|\phi_0|$的0.01%
:::
## 動機
- 矩陣大部分是滿秩的,當適應特定任務時,預訓練語言模型具有較低的內在維度,儘管投影到較小的子空間,但仍可以有效的學習
:::success
為什麼要進行低秩分解
1. 現在預訓練模型雖然是經過參數化的,但是微調參數主要集中在一個低維子空間中
2. 參數更新$\Delta W$可以在低維中進行優化,高維參數空間中的大部分參數在微調中幾乎沒有變化
3. 但如果參數更新在高維子空間發生,可能會導致信息遺漏(代碼生成、數學推理)
:::
### 前向傳播
$h = W_0x + \Delta Wx = W_0x + BAx$
- 可以通過設定r到預訓練銓重矩陣來粗略的恢復完全微調的能力
- LoRA通過凍結預訓練矩陣$W_{pretrained} \in \mathbb{R}^{d \times d}$
$W_{finetuned} = W_{pretrained} + \Delta W$
$\Delta W = BA$
$A$是一個隨機初始化的矩陣,服從正態分布$A \sim N(0,1)$
$B$初始化為零矩陣, $B = 0$
:::success
作用:這種訓練方法使得在訓練初期,新增的部分$\Delta W = BA$對原始權重$W_{pretrained}$的影響為零,而不會破壞預訓練模型的初始性能
:::
:::info
問:為什麼初始化使用正態分布?
答:
1. 正態分布有助於梯度有效傳播,避免梯度消失或爆炸
2. 提供足夠隨機性,從而能夠探索更廣泛的參數空間,增加模型找到最優解的可能
3. 平衡訓練初期的影響:正態分布一般初始化值較小,結合$B$初始化為零矩陣,可以在訓練初期去保新增的偏置矩陣對原始預訓練權重為0,從而避免破壞預訓練模型的初始性能
:::
### 無額外推理延遲
對於不同的任務,只需要不同的BA $W = W_0 + BA$
## 應用到Transformer
- 這篇論文只將LoRA應用到Transformer的注意力權重上,沒有應用到其他層
- 對於GPT-3 175B,VRAM從1.2TB減少到350GB,r=4,checkpoint從350GB減少到35MB
:::info
侷限性:例如將AB吸收到W中以消除額外的推理延遲,那麼前向傳遞中將不同A和B的不同任務的輸入批量輸入並不簡單,如果延遲不重要的話,可以不合併權重並動態選擇用於批量樣本的LoRA模塊
:::
## 實驗
- LoRA:為了簡化實驗,只有在Wq跟Wv上面進行LoRA,$|\Theta| = 2 \times L_{Lora} \times d_{model0 \times r}$

### 選擇該用哪些權重矩陣進行適配

- 同時適配$W_q, W_k, W_v, W_o$
- 低秩(rank=4)足以在$\Delta W$中捕獲信息,表現優於單一類型適配且具有更高秩的策略
### 最優r選擇

- 即使R非常小,也表現好
- 同時適配$W_q$跟$W_v$效果好
- 增加r並沒有覆蓋更多有意義的子空間,說明低秩適配矩陣以足夠
### 還可以插到哪個空間
- 線性層(全連接層)
- 注意力層
- embedding層
### 為什麼LoRA在Q, K, V, O上有效
- Q(Query):用於生成查詢向量,決定模型在注意力機制中對輸入的關注程度
- K(Key):用於生成鍵向量,與查詢向量計算相似度,幫助確定注意力分布
- V(Value):用於生成數值向量,實際傳遞注意力機制計算的輸出
- O(Output):用於將多頭注意力的輸出合併並映射回原始維度
:::success
信息傳播的關鍵路徑
1. 查詢與鍵的交互:$Q$和$K$交互決定注意力分布,影響模型對輸入序列的不同部分關注度
2. 數值的加權求和:$V$矩陣通過加權求和,將注意力分布轉化為具體的輸出
3. 多頭輸出的整合:$O$矩陣整合多頭注意力的輸出,提供最後的特徵表示
4. 多頭輸出的整合
:::