[21.06] LoRA
萬分之一的 LLM
LoRA: Low-Rank Adaptation of Large Language Models
我們必須承認大部分的人都 Train 不了 LLM。
世界這麼大,但能夠迭代 LLM 的公司也就這麼幾家,屈指可數。
研究者們迫切地希望能夠利用這些巨大的模型來解決各種問題,所以如何有效地微調這些模型就成為了一個重要的問題。
定義問題
如果你今天想要對全模型進行微調,具體的步驟應該會像是這樣:
-
模型首先使用預訓練權重 初始化。
-
透過梯度優化更新為 ,以最大化條件語言模型目標:
每個下游任務都需學習不同的參數 ,且其維度 等於原始模型參數的大小 。對於大型模型,像是 GPT-3 這種的, 大約有 175 億參數,儲存和部署多個微調後的模型非常困難。
在過去的研究中,主流的解題思路是 Adapter,剛好之前我們也有讀過:
但相關研究遠不止這些,這裡簡單列個幾篇,有空再來看看:
- [20.04] Exploring Versatile Generative Language Model Via Parameter-Efficient Transfer Learning
- [20.05] AdapterFusion: Non-Destructive Task Composition for Transfer Learning
- [21.04] The Power of Scale for Parameter-Efficient Prompt Tuning
只是這些方法在大規模且延遲敏感的生產場景中仍存在一定限制,因為我們還是需要增加參數量,而且有可能還會干擾原本基於平行運算部署的模型,如下表,在 GPT-2 上加入 Adapter 可以觀察到明顯的延遲增加:
雖然可以透過層剪枝或多任務訓練來減少延遲,但無法完全消除 Adapter 的額外計算開銷。Adapter 設計本質上通過限制瓶頸維度,讓其參數量少於原始模型的 1%。
理論上計算量(FLOPs)應該不大?
但還是不行。
因為大型神經網絡高度依賴硬體平行運算以保持低延遲,但 Adapter 必須順序處理,這在線上推論(batch size 通常為 1)的場景中會導致延遲顯著增加。
那不然我們改 Prefix-Tuning 呢?
Prefix-Tuning 等技術代表了另一種調適策略,但 prefix tuning 在優化過程中表現出非單調的參數效能變化,導致優化困難。而且為了進行調適,必須保留部分序列長度給 prefix,這減少了可用於處理下游任務的序列長度。
感覺更糟了。
作者為了解決上述的這個問題,提出了參數低秩分解 的方法,將任務特定的參數增量 以較小的參數集合 編碼,且
目標轉換為優化較小的參數集合 :
我們保留原始論文上的數學描述,大概的意思就是找到一組參數,量級大概是原始模型的萬分之一,來代表原始模型的參數,並且在這組參數上進行微調。
但是這種參數也不是隨便就能找到,這篇論文就是要教你怎麼找。
解決問題
在開始看方法論之前,我們得先複習一下高中的數學。
秩、全秩、低秩
在數學中,矩陣 (Matrix) 是一個由數字排列而成的表格。例如:
矩陣在數據處理和計算中扮演了非常重要的角色,而秩 (Rank) 是衡量矩陣的關鍵指標之一。
-
秩 (Rank) 是什麼?
秩 (Rank) 表示一個矩陣中行向量或列向量的獨立性。
向量的獨立性指的是:某個行(或列)不能用其他行(或列)的線性組合來表示。如果有某些行或列是彼此的組合,那麼這些行或列就不獨立。 換句話說,矩陣的秩告訴我們這個矩陣中有多少個「有用的獨立資訊」。
如果矩陣 是 的矩陣(即有 行和 列),那麼它的秩 (Rank) 是矩陣中最大獨立的行數或列數。最大秩不會超過矩陣的行數 或列數 ,即
-
全秩 (Full-rank) 矩陣
全秩矩陣是指:矩陣的秩等於行數或列數中的最小值,也就是 。
這表示矩陣中的所有行或列向量都是獨立的,沒有冗餘資訊,像是這樣:
這是一個 的矩陣,兩行向量都是獨立的。因此,它的秩為 2(等於 ),所以這是一個全秩矩陣。每一行或列提供新的資訊,不能用其他行或列的組合來表示。
-
低秩 (Low-rank) 矩陣
低秩矩陣的秩小於其行數或列數,這表示矩陣中的部分行或列向量可以用其他行或列的組合表示,有一些冗餘資訊。這種矩陣雖然可能尺寸較大,但其中的「有用資訊」卻相對較少。
例如,考慮以下矩陣:
在這個矩陣中,第二行等於第一行的 2 倍。因此,兩行向量並不獨立。這個矩陣的秩是 1(只有一個獨立向量),而非 2。因此,這是一個低秩矩陣