為什么要對大模型進行微調
1.成本效益:
o 大模型的參數量非常大,訓練成本非常高,每家公司都去從頭訓練一個自己的大模型,這個事情的性價比非常低。
2.Prompt Engineering 的局限性:
o Prompt Engineering 是一種相對容易上手的使用大模型的方法,但它有明顯缺點。因為通常大模型的實現原理都會對輸入序列的長度有限制,Prompt Engineering 的方式會把 Prompt 搞得很長。越長的 Prompt,大模型的推理成本越高,因為推理成本是跟 Prompt 長度的平方正相關的。另外,Prompt 太長會因超過限制而被截斷,進而導致大模型的輸出質量打折扣,這也是一個非常嚴重的問題。
3.提升特定領域能力:
o Prompt Engineering 的效果達不到要求,而企業又有比較好的自有數據,能夠通過自有數據,更好地提升大模型在特定領域的能力。這時候微調就非常適用。
4.個性化服務:
o 要在個性化服務中使用大模型的能力,這時候針對每個用戶的數據,訓練一個輕量級的微調模型,是一個不錯的方案。
5.數據安全:
o 如果數據不能傳遞給第三方大模型服務,那么搭建自己的大模型就非常必要。
如何對大模型進行微調
從參數規模角度
1.全量微調(Full Fine Tuning, FFT)
o 對全量參數進行全量訓練,用特定的數據,對大模型進行訓練,將 W 變成 W’。W’ 相比 W ,最大的優點就是上述特定數據領域表現會好很多,但缺點是訓練成本高,并且存在災難性遺忘(Catastrophic Forgetting)的風險。災難性遺忘(Catastrophic Forgetting),用特定訓練數據去微調可能會把這個領域的表現變好,但也可能會把原來表現好的別的領域的能力變差。
2.參數高效微調(Parameter-Efficient Fine Tuning, PEFT)
o 只對部分參數進行訓練,解決 FFT 存在的問題。PEFT 是目前比較主流的微調方案。
從訓練數據來源和方法角度
1.增量預訓練(Continue PreTraining)
o 一般垂直大模型是基于通用大模型進行二次的開發。為了給模型注入領域知識,就需要用領域內的語料進行繼續的預訓練。
舉例:假設我們有一個已經在通用語料庫上預訓練的GPT模型,現在我們希望讓這個模型在醫學領域的文本上表現更好。我們可以使用大量的醫學文獻對這個GPT模型進行繼續預訓練,使其適應醫學領域的語言特點。
2.監督式微調(Supervised Fine Tuning, SFT)
o 用人工標注的數據,用傳統機器學習中監督學習的方法,對大模型進行微調。
例如:指令微調(Instruction Tuning)- 輸入文本:“Good morning!” - 任務描述:“翻譯成西班牙語” - 期望輸出:“?Buenos días!”
3.基于人類反饋的強化學習微調(Reinforcement Learning with Human Feedback, RLHF)
o 把人類反饋通過強化學習方式引入到對大模型的微調中,讓生成結果更加符合人類期望。
4.基于AI反饋的強化學習微調(Reinforcement Learning with AI Feedback, RLAIF)
o 與 RLHF 類似,但反饋來源是 AI,以解決人類反饋收集成本高、效率低的問題。
5.直接偏好優化(Direct Preference Optimization)
o 它主要通過直接優化模型對用戶偏好的預測能力來提升模型的性能。與傳統的損失函數優化不同,DPO更加關注模型在實際應用中的表現,特別是在用戶體驗和滿意度方面。
模型微調分成3個階段:
- 第一階段:(Continue PreTraining)增量預訓練,在海量領域文檔數據上二次預訓練模型,以注入領域知識.
- 第二階段: SFT(Supervised
Fine-tuning)有監督微調,構造指令微調數據集,在預訓練模型基礎上做指令精調,以對齊指令意圖 - 第三階段 (1)RLHF(Reinforcement Learning from Human
Feedback)基于人類反饋對語言模型進行強化學習,分為兩步:RM(Reward
Model)獎勵模型建模,構造人類偏好排序數據集,訓練獎勵模型,用來建模人類偏好,主要是"HHH"原則,具體是"helpful,
honest, harmless";RL(Reinforcement
Learning)強化學習,用獎勵模型來訓練SFT模型,生成模型使用獎勵或懲罰來更新其策略,以便生成更高質量、更符合人類偏好的文.
DPO(Direct Preference
Optimization)直接偏好優化方法,DPO通過直接優化語言模型來實現對其行為的精確控制,而無需使用復雜的強化學習,也可以有效學習到人類偏好,DPO相較于RLHF更容易實現且易于訓練,效果更好
一些比較流行的PEFT方案
從成本和效果的角度綜合考慮,PEFT是目前業界比較流行的微調方案。接下來介紹幾種比較流行的PEFT微調方案。
1、Prompt Tuning
Prompt Tuning的出發點,是基座模型(Foundation Model)的參數不變,為每個特定任務,訓練一個少量參數的小模型,在具體執行特定任務的時候按需調用。
Prompt Tuning的基本原理是在輸入序列X之前,增加一些特定長度的特殊Token,以增大生成期望序列的概率。
具體來說,就是將X = [x1, x2, …, xm]變成,X = [x
1, x2, ..., x
k; x1, x2, …, xm], Y = WX`。
例如:
假設我們有一個情感分析任務,原始輸入句子為"I love this movie."
通過Prompt Tuning,我們在原始輸入序列前增加一些提示語,例如:
X’ = [“This is a sentiment analysis task:”, “The sentiment of the following sentence is:”, “I”, “love”, “this”, “movie”, “.”]
2、Prefix Tuning
Prefix Tuning的靈感來源是,基于Prompt Engineering的實踐表明,在不改變大模型的前提下,在Prompt上下文中添加適當的條件,可以引導大模型有更加出色的表現。
Prefix Tuning的出發點,跟Prompt Tuning的是類似的,只不過它們的具體實現上有一些差異。
Prompt Tuning是在Embedding環節,往輸入序列X前面加特定的Token。
而Prefix Tuning是在Transformer的Encoder和Decoder的網絡中都加了一些特定的前綴。
具體來說,就是將Y=WX中的W,變成W = [Wp; W],Y=W
X。
Prefix Tuning也保證了基座模型本身是沒有變的,只是在推理的過程中,按需要在W前面拼接一些參數。
舉例說明:
原始英文句子為:“I love this movie.”
Encoder 輸入變為:W’_encoder = [Wp_encoder; W_encoder]
Decoder 輸入變為:W’_decoder = [Wp_decoder; W_decoder]
然后,我們將新的輸入序列 X 輸入到修改后的 Transformer 模型中進行預測,得到輸出 Y:
假設輸出結果是:“我喜歡這部電影。”
3、LoRA
LoRA是跟Prompt Tuning和Prefix Tuning完全不相同的另一條技術路線。
LoRA背后有一個假設:我們現在看到的這些大語言模型,它們都是被過度參數化的。而過度參數化的大模型背后,都有一個低維的本質模型。
通俗講人話:大模型參數很多,但并不是所有的參數都是發揮同樣作用的;大模型中有其中一部分參數,是非常重要的,是影響大模型生成結果的關鍵參數,這部分關鍵參數就是上面提到的低維的本質模型。
LoRA的基本思路,包括以下幾步:
首先, 要適配特定的下游任務,要訓練一個特定的模型,將Y=WX變成Y=(W+?W)X,這里面?W主是我們要微調得到的結果;
其次,將?W進行低維分解?W=AB (?W為m * n維,A為m * r維,B為r * n維,r就是上述假設中的低維);
接下來,用特定的訓練數據,訓練出A和B即可得到?W,在推理的過程中直接將?W加到W上去,再沒有額外的成本。
另外,如果要用LoRA適配不同的場景,切換也非常方便,做簡單的矩陣加法即可:(W + ?W) - ?W + ?W`。
參考:https://zhuanlan.zhihu.com/p/663557294
4、QLoRA
LoRA 效果已經非常好了,可以媲美全量微調的效果了,那為什么還要有個QLoRA呢?
這里先簡單介紹一下,量化(Quantization)。
量化,是一種在保證模型效果基本不降低的前提下,通過降低參數的精度,來減少模型對于計算資源的需求的方法。
量化的核心目標是降成本,降訓練成本,特別是降后期的推理成本。
QLoRA就是量化版的LoRA,它是在LoRA的基礎上,進行了進一步的量化,將原本用16bit表示的參數,降為用4bit來表示,可以在保證模型效果的同時,極大地降低成本。
論文中舉的例子,65B的LLaMA 的微調要780GB的GPU內存;而用了QLoRA之后,只需要48GB。效果相當驚人!
5、Adapter Tuning
在面對特定的下游任務時,如果進行 Full-Fintuning(即預訓練模型中的所有參數都進行微調),太過低效;而如果采用固定預訓練模型的某些層,只微調接近下游任務的那幾層參數,又難以達到較好的效果。
于是他們設計了如下圖所示的 Adapter 結構,將其嵌入 Transformer 的結構里面,在訓練時,固定住原來預訓練模型的參數不變,只對新增的 Adapter 結構進行微調。同時為了保證訓練的高效性(也就是盡可能少的引入更多參數)
引用地址:https://zhuanlan.zhihu.com/p/650287173
參考地址:https://zhuanlan.zhihu.com/p/627642632