介於有盒友想要chatgpt那種大模型的教程,隨便寫一點。
參考文獻
文再文老師的文章
隨着ChatGPT的爆火,各類大語言模型(後文以大模型代指)如雨後春筍般不斷湧出,以提示詞和微調爲主流的工作也在AI領域變得熱門,這類工作能使大模型更好地處理下游任務。
本文主要介紹黑盒環境下大模型的微調優化方法,部分複雜公式將使用LaTeX格式進行書寫,請讀者在大腦中自行編譯。
微調是指稍微地改變大模型的參數矩陣,使其輸出符合預期,其任務可以寫成如下優化問題:
min f(X)
其中X是大模型的參數矩陣,其參數量的數量級通常以B(億)爲單位。而f(X)指大模型處理下游任務時的損失函數,因此我們要找到合適的矩陣X,能夠最小化損失函數。
同時,因爲f(X)中包含大模型的輸出,其對於X是黑盒的存在,因此我們無法求f(X)對於X的精確導數,傳統的梯度下降法難以直接應用。
一種常見的做法是採用零階(Zeroth-Order)梯度技術,即利用函數值的差分估計梯度:
\hat{\nabla}f(X)=\frac{f(X+\mu Z)-f(X-\much Z)}{\mu}Z
其中Z是隨機方向的單位矩陣
這種方法類似於數學中導數的定義式,是一種有效的梯度估計方法。
但是微調之所以被稱爲微調,原因在於對於現有的大模型初始參數矩陣X^0,我們不應該改變太多,以使大模型失去本身的性能,甚至導致其胡言亂語。所以即使利用零階梯度解決了黑盒環境,與傳統的優化問題不同,我們無法隨機初始化一個參數。
而且在以往大模型的微調實驗中,大家發現梯度矩陣存在低秩結構,即大部分奇異值極小甚至爲0。有效地捕捉這其中梯度地低秩結構,將有效地提升大模型微調的效果。
一種簡單的做法是低秩自適應(LoRA,Low-Rank Adaptation),即針對維度m×n的參數矩陣X^0,尋找合適的低秩矩陣AB,使得
min f(X^0+AB)
其中A的維度是m×r,B的維度是r×n,r遠小於min{m,n}。如此一來,因爲矩陣A、B的秩均小於等於r,其乘積矩陣AB的秩也小於等於r。
參考文獻中文再文老師他們採用的做法,是針對零階梯度的方向矩陣Z,將其改寫爲矩陣UV相乘。改寫後的梯度公式如下:
\hat{\nabla}f(X)=\frac{f(X+\mu UV)-f(X-\much UV)}{\mu}UV
其中U的維度是m×r,C的維度是r×n,r遠小於min{m,n}。
注意到,這種做法與LoRA幾乎類似,但是是針對梯度的低秩稀疏化。LoRA是針對參數改變量AB的低秩稀疏化,而AB的計算也有一番學問,筆者在此不再贅述。
除此之外,他們的算法還採取了一種懶惰策略,即並非每次迭代都重新選擇梯度的方向矩陣V,而是在一定迭代週期內,固定方向矩陣V,不斷更新U。這種做法本質上是一種零階的子空間選擇方法,使得大模型參數在一個週期內尋找以V爲基的低秩子空間可行解,從而達到子空間選擇的效果,更有助於大模型的微調。
文再文老師還在文中提出了一種動量方法的變體,即每次梯度更新利用部分上一次的梯度信息,加速迭代。值得注意的是,由於算法是週期性的,在每個週期結束時,子空間的V發生了改變,不能簡單的使用不同條件下的梯度信息。針對這一問題,文中採用了一種類似近端算子的做法,即尋找一個距離上一次梯度足夠近又符合新的V^{t+1}的梯度動量,避免了上述問題。
常見的開源大模型有llama、OPT等,較小的參數有13B,較大的有66B甚至更多,有興趣的盒友可以買幾張4090嘗試跑一下。
筆者就寫到這裏,有更多想了解的可以交流討論。
更多遊戲資訊請關註:電玩幫遊戲資訊專區
電玩幫圖文攻略 www.vgover.com