
寫(xiě)在最前
LoRA 全稱為 Low-Rank Adaptation,翻譯成中文就是低秩適配
⊙﹏⊙ 是不是一頭霧水?沒(méi)關(guān)系,相信我,看完下文你就會(huì)明白個(gè)大概了
那如果還不懂怎么辦呢?那就請(qǐng)狠狠的給我一鍵三連,以示鼓勵(lì)吧 ???
直入正文
丹尼爾:蛋兄,我常常聽(tīng)到 LoRA 微調(diào),那什么是 LoRA 呢?它又為什么可以加速微調(diào)呢?原理是什么呢?
蛋先生:這個(gè)問(wèn)題問(wèn)得好!但是能不能別一下子全問(wèn)完,不然這篇文章就沒(méi)法寫(xiě)了 ╮(╯▽╰)╭
丹尼爾:?? Sorry!那先說(shuō)說(shuō)什么是 LoRA 吧
蛋先生:LoRA 全稱 Low-Rank Adaptation,中文叫低秩適配。
丹尼爾:開(kāi)頭講過(guò)啦,看名字看不出什么啊,是不是名字起得不好,不能顧名思義?(¬_¬)
蛋先生:別急,等會(huì)我講完原理,你就會(huì)覺(jué)得這個(gè)名字其實(shí)起得挺好的 ( ̄▽ ̄)ノ
先說(shuō)說(shuō) LoRA 是什么吧,它是一種非常流行的大模型微調(diào)方法。大模型的參數(shù)很多,每個(gè)參數(shù)都去調(diào)整的話不僅消耗資源,而且并不是每個(gè)參數(shù)的調(diào)整都有意義。因此,我們需要一種方法,通過(guò)調(diào)整少量參數(shù)就能讓大模型適應(yīng)特定領(lǐng)域的任務(wù),這就是 LoRA 的由來(lái)。
簡(jiǎn)單來(lái)說(shuō),LoRA 就是只調(diào)整模型權(quán)重里很小一部分參數(shù),讓預(yù)訓(xùn)練模型更好地適應(yīng)特定(通常是小規(guī)模)的數(shù)據(jù)集 (??????)??
丹尼爾:它是怎么做到只調(diào)整一小部分參數(shù)的呢?
蛋先生:假設(shè)預(yù)訓(xùn)練大模型的原始權(quán)重參數(shù)為 W?,經(jīng)過(guò)微調(diào)后的權(quán)重參數(shù)為 W,那么就有以下公式
W = W? + △W
丹尼爾:這個(gè) △W 就是權(quán)重參數(shù)調(diào)整的量(權(quán)重更新矩陣),也就是我們要學(xué)習(xí)的部分是嗎?
蛋先生:沒(méi)錯(cuò)!假設(shè) W? 是 100×100 的矩陣,那么 △W 也是 100×100 的矩陣,請(qǐng)問(wèn)總共需要調(diào)整多少個(gè)參數(shù)?
丹尼爾:1 萬(wàn)啊
蛋先生:真聰明 ( ̄▽ ̄)b
丹尼爾:我謝謝你的夸獎(jiǎng)哦,把我當(dāng)小學(xué)生了 (╯°□°)╯
蛋先生:1 萬(wàn)個(gè)參數(shù)都調(diào),這種稱為全量微調(diào)
丹尼爾:那 LoRA 怎么優(yōu)化?(o?▽?)o
蛋先生:別急,我們?cè)賮?lái)看一個(gè)矩陣乘積 AB(A 矩陣乘以 B 矩陣),A 是 100×{rank} 的矩陣,B 是 {rank}×100 的矩陣,它們的結(jié)果是什么形狀的矩陣呢?
丹尼爾:無(wú)論 rank 取多少,AB 的結(jié)果都正好是 100×100 的矩陣。咦,這個(gè)結(jié)果正好跟 △W 形狀一樣!(⊙o⊙)
蛋先生:對(duì)了!所以在 LoRA 中,我們不再學(xué)習(xí)一個(gè)完整的 △W,而是直接把它參數(shù)化為 AB,這樣天然就是低秩的。如果 rank 取 10,那么這兩個(gè)矩陣共有多少個(gè)值(權(quán)重參數(shù))呢?
丹尼爾:讓我算算...100×10 + 10×100 = 2000 個(gè)參數(shù)!(≧?≦)?
蛋先生:聰明!原來(lái)是 10000 個(gè)參數(shù),現(xiàn)在只要 2000 個(gè),只有原來(lái)的五分之一
丹尼爾:但有個(gè)疑問(wèn),△W≈A@B 這個(gè)為什么成立呢?
蛋先生:語(yǔ)言模型在下游任務(wù)中,不需要“徹底改寫(xiě)”原有能力,而是“往某些方向上調(diào)整”。這些調(diào)整在數(shù)學(xué)上往往集中在低秩子空間,所以這樣做不會(huì)損失太多效果。就像畫(huà)畫(huà)時(shí),你只需要在關(guān)鍵位置勾幾筆,而不是把整張畫(huà)重畫(huà)一遍。
丹尼爾:如果 rank 取更少,那豈不是參數(shù)更少了
蛋先生:回到 LoRA 名稱中的 low rank,不就是指這里要取更少的維度嗎
丹尼爾:原來(lái)如此。那具體怎么應(yīng)用到模型中?
蛋先生:我們可以選擇原來(lái)的部分全連接層替換為 LoRA 層,用公式表示就是將 XW 替換成 XW?+XAB。
XW = X(W?+AB) = XW?+XAB
丹尼爾:哇,我好像看出來(lái)了,這里就體現(xiàn)了 adaption 適配!
蛋先生:沒(méi)錯(cuò)!因?yàn)樗恍薷脑瓉?lái)的權(quán)重,只是加了個(gè)擴(kuò)展。編程原則有個(gè)開(kāi)閉原則,對(duì)修改關(guān)閉,對(duì)擴(kuò)展開(kāi)放,這里就是這樣的。

丹尼爾:那 W? 和 A、B 怎么訓(xùn)練?
蛋先生:其中 W? 是凍結(jié)的,我們只微調(diào) A 和 B 即可。
丹尼爾:計(jì)算效率怎么樣?
蛋先生:在訓(xùn)練時(shí),前向傳播雖然多了一次矩陣乘法,但因?yàn)閰?shù)大幅減少,反向傳播的開(kāi)銷也隨之下降,所以整體微調(diào)速度反而更快。而在推理時(shí),可以把 W?+AB 合并成一個(gè)整體,幾乎不會(huì)增加額外計(jì)算量。
丹尼爾:原來(lái)如此!那除了 A 和 B,還有別的可調(diào)參數(shù)嗎?
蛋先生:當(dāng)然,LoRA 公式中還會(huì)有縮放因子,rank 和縮放因子都屬于超參數(shù),可以在訓(xùn)練過(guò)程中進(jìn)行調(diào)整。
丹尼爾:現(xiàn)在來(lái)看,LoRA 的名字起得確實(shí)不錯(cuò)
寫(xiě)在最后
在此聲明,以上內(nèi)容并不嚴(yán)謹(jǐn)。嚴(yán)謹(jǐn)與通俗易懂在表達(dá)上往往難以兼顧,就像安全與便利常常難以平衡一樣 ( ̄~ ̄; )
因此,建議有興趣的同學(xué),在此基礎(chǔ)上,自行查閱專業(yè)資料以獲得更深入的了解
親們,都到這了,要不,點(diǎn)贊或收藏或關(guān)注支持下我唄 o( ̄ ▽  ̄)d
關(guān)鍵字: LoRA, 大模型微調(diào), LLM, AI,低秩適配, Fine-tuning, PEFT