極少數據就能微調大模型,一文詳解LoRA等方法的運作原理
本文經AI新媒體量子位(公眾號ID:QbitAI)授權轉載,轉載請聯系出處。
最近和大模型一起爆火的,還有大模型的微調方法。
這類方法只用很少的數據,就能讓大模型在原本表現沒那么好的下游任務中“脫穎而出”,成為這個任務的專家。
而其中最火的大模型微調方法,又要屬LoRA。
但包括LoRA在內,這類方法的核心原理究竟是什么?它和大模型之間的關系又是什么?我們具體來看。
一、前言
先從最近大火的LoRA (《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGEMODELS》)說起。
圖片
該文章在ICLR2022中提出,說的是利用低秩適配(low-rankadaptation)的方法,可以在使用大模型適配下游任務時只需要訓練少量的參數即可達到一個很好的效果。
LoRA是怎么去微調適配下游任務的?
流程很簡單,LoRA利用對應下游任務的數據,只通過訓練新加部分參數來適配下游任務。
而當訓練好新的參數后,利用重參的方式,將新參數和老的模型參數合并,這樣既能在新任務上到達fine-tune整個模型的效果,又不會在推斷的時候增加推斷的耗時。
LoRA的示意圖如下:
圖片
圖中藍色部分為預訓練好的模型參數,LoRA在預訓練好的模型結構旁邊加入了A和B兩個結構,這兩個結構的參數分別初始化為高斯分布和0,那么在訓練剛開始時附加的參數就是0。
A的輸入維度和B的輸出維度分別與原始模型的輸入輸出維度相同,而A的輸出維度和B的輸入維度是一個遠小于原始模型輸入輸出維度的值,這也就是low-rank的體現(有點類似Resnet的結構),這樣做就可以極大地減少待訓練的參數了。
在訓練時只更新A、B的參數,預訓練好的模型參數是固定不變的。在推斷時可以利用重參數(reparametrization)思想,將AB與W合并,這樣就不會在推斷時引入額外的計算了。
而且對于不同的下游任務,只需要在預訓練模型基礎上重新訓練AB就可以了,這樣也能加快大模型的訓練節奏。
由于本文不具體介紹LoRA,所以詳細信息可以查看LoRA原文。我們只需要知道LoRA文章后續的實驗已經論證該方法的有效性。
那么進一步思考,為什么LoRA的這種思路能work得不錯呢?
答案就是接下來要講的本征維度 (Intrinsic dimension)了。
這點LoRA原文也提到過,該文章靈感來源于下面兩篇文章:
1、MEASURING THE INTRINSIC DIMENSION OF OBJECTIVE LANDSCAPES,發表在ICLR2018,為了方便接下來該論文稱為【論文1】
2、INTRINSIC DIMENSIONALITY EXPLAINS THE EFFECTIVENESS OF LANGUAGEMODEL FINE-TUNING,發表在ACL2021,為了方便接下來該論文稱為【論文2】
二、本征維度是什么?
本征維度的概念在【論文1】中提出。
訓練一個神經網絡往往包含如下幾步:
1、對于一個給定的數據集,先設計網絡的結構和選擇對應的loss
2、對網絡中的參數進行隨機的初始化
3、訓練網絡使得loss越來越低
而訓練階段可以認為是在一個固定的目標圖(objective landscape)上,尋找出有效的路徑。
這里解釋一下為什么是固定的目標圖。因為在數據集和網絡結構固定下來后,待優化的問題就已經定義好了,所以目標圖也就是確定的了。
如下圖所示:
那么對于一個參數量為D的模型,我們訓練該模型,也就意味著在D維空間上尋找有效的解。文章認為D可能是冗余的,可能實際上只需要優化其中的d個參數就可以找到一個有效的解。
用公式表示如下:
其中表示D維的優化參數,
表示隨機初始化的一個參數并且在訓練時是不進行更新的,P是一個隨機初始化的D×d大小的矩陣且訓練時也不進行更新,
表示待優化的d維參數。
也就是說可以在訓練網絡時只更新d維參數,就可以達到該網絡應有的效果。那么這個d就是所謂的該模型的本征維度。
這里講完可能還有點暈,我們看一下如下這張圖:
上圖中,藍色部分為初始化好的網絡參數,綠色為
,紅色為
。網絡訓練的時候只訓練紅色部分,其它參數都是固定的。d就是本征維度。
上面講的只更新d維參數,讓網絡達到應有的效果,那么什么應有的效果呢?文章定義,在只更新d維參數的情況下,網絡效果達到訓練原始模型時效果的90%時,那么就認為達到了“應有的效果”,并且d就為本征維度。
例如在做mnist這個數字分類任務時,如果原始模型精度能到0.9,那么在只更新d維參數的時候,精度能夠達到90%×0.9=0.81,就認為這時候的d為本征維度記為。
三、使用本征維度思考大模型微調的有效性
【論文2】將之前提出的本征維度用來思考大模型微調的有效性,為什么現在用幾百或者幾千張圖片就可以對大模型進行有效的微調?
根據【論文1】闡述,對于某一類問題,在一定精度上(比如達到90%的精度)有本征特征的存在。對于大模型而言,進行本征維度的測試就能知道在解決某一類下游問題時,需要調整多少參數就能近似的解決當前的問題。
如果真的有實驗能證明僅僅調整少數的參數就能很好的解決下游問題,那么也就能回答上述問題,即對大模型做少量的微調(調整少量的參數),就能解決當前的問題。
下面無特殊說明的話,“文章”指的都是【論文2】
3.1 對于大模型而言,是否存在本征維度?
同【論文1】一樣,【論文2】也利用公式來進行模型的訓練,即訓練時只調整d維參數。但與【論文1】的實驗有點不同的是,【論文1】中是隨機初始化的,而【論文2】中是預訓練好的參數。
【論文2】首先選擇BERT-Base\BERT-Large\RoBERTa-Base\RoBERTa-Large四個模型,并選擇GLUE benchmark中的MRPC和QQP兩個數據集(兩個數據集都是用來測試句子對是否相同意義的任務)。
上下兩個子圖分別表示MRPC和QQP兩個任務,每個子圖有四條實線表示四個模型的準確率,四條虛線表示達到fine-tune整個模型90%的準確率的值,橫坐標表示訓練d維的大小。從圖中可以看出兩個任務,四個不同的模型,只需要訓練較小的d維參數就可以達到90%的精度。本征維度這個概念在大模型中是成立的。
所以在訓練某個下游任務時,只需要訓練少量參數就能達到不錯的效果了。這時文章開頭的問題就已經解決了。但是作者做了一些其他的實驗,發現了一些有意思的結論。
3.2 預訓練的好壞與本征維度的關系
文章提出這樣一個假設,預訓練模型能夠隱式地降低模型在NLP各個任務的本征維度。
基于這個猜想,文章做了下面實驗,在預訓練RoBERTa-base模型的時候,每隔10K保存下對應的預訓練模型,然后測試保存下來的預訓練模型在MRPC、QQP、Yelp Polarity、SST-2、MNLI、ANLI六個數據集本征維度。
結果如下:
可以看出,在不同數據集上有相同的趨勢,就是預訓練次數越多,模型在各個任務上的本征維度越低。實驗并沒有特意去優化所謂的本征維度,只是預訓練久一點而已。所以印證了預訓練模型的表征能力越強(訓練得越好),本征維度越小。
3.3 預訓練模型參數與本征維度的關系
本來在做預訓練參數與本征維度關系的時候,需要統一模型的結構,這樣更有說服力。但是作者說,這樣要訓練很多大模型的實驗,為了更方便的對比文章根據已有的結構來做實驗。從實驗結果的趨勢來看,不同結構也能得到有效的結論。
文章利用已有的預訓練模型,在MRPC數據集上計算本征維度。
實驗結果如下:
上圖中縱坐標表示本征維度的值,橫坐標表示模型的參數量。從圖中的趨勢可以明顯看出,模型越大本征維度越小,即越強的模型本征維度越低。
3.4 本征維度與泛化能力的關系
上面介紹了fine-tune(3.1)、預訓練(3.2)和本征維度的關系,但本征維度與泛化能力的關系還沒有驗證。即我們現在知道了讓本征維度小的方式,但是本征維度小了,泛化能力就能上去嗎?
文章又做了下面的實驗,把3.2保存下來的模型,在對應的的本征維度上,進行不同數據集的測試,結果如下:
圖片
可以看出本征維度低的模型,訓練出來的模型準確率是更高的。也就是說本征維度越低,泛化性能越好。
回到引言的問題:為什么LoRA思路能work?
因為大模型存在本征維度的概念,只需要調整少量參數就能在下游任務上得到很好的效果。