你知道什么是微調嗎?大模型為什么要微調?以及大模型微調的原理是什么? 原創
“ 預訓練(pre+train)+微調(fine+tuning),是目前主流的范式”
在學習大模型的過程中,怎么設計神經網絡和怎么訓練模型是一個重要又基礎的操作。
但與之對應的微調也是一個非常重要的手段,這里就著重講一下為什么要微調,其優點是什么以及微調的本質。
01、什么是微調?
學習一門技術不但要知其然,也要知其所以然。
想了解為什么要微調,首先要知道什么是微調?
我們常說的大模型,指的是具有大量參數的神經網絡模型,具體的可以看之前的文章??大模型的參數是什么??。然后經過大量的訓練數據訓練出來的模型叫做大模型,也叫做預訓練模型。
微調指的是微調大模型,是在預訓練模型(已經訓練好的大模型)基礎之上,使用少量數據對大模型的全部或部分參數進行調整,以達到在某個領域更好的效果。
舉例來說,剛設計好的一個神經網絡,就類似于一個從來沒上過學的學生,他什么玩意都不懂,只會根據自己的本能去處理問題;
而訓練大模型就相當于讓這個學生完成了九年制義務教育或者上了大學,也就是說它接受過系統的教育,天文地理,物理化學等等均有涉獵,這樣的模型就叫做預訓練模型。
而微調就是在這個基礎上完成某個方向的強化,比如想讓這個學生去參加奧數比賽,就要讓他對數學進行強化學習。
這個就是微調。
微調來源于遷移學習,所謂的遷移學習就是在已經訓練好的模型基礎上進行適當的優化或者說強化,這樣可以更加合理的利用各種資源。
02、為什么要微調?
前面說了什么是微調,這里講一下為什么要微調?
之所以需要進行微調,主要有以下兩方面原因:
- 訓練成本問題
- 訓練數據問題
之所以要進行微調,其實最主要的原因就是成本問題。openAI公司訓練GPT模型,一次的成本大概在幾百萬到上千萬美元;換算成人民幣就是上千萬到上億的成本。
雖然很多公司使用的大模型不需要有GPT模型那么強大,也不需要上億的訓練成本,但從零開始訓練一個大模型,少說也要幾百萬人民幣,這對個人和絕大部分公司來說都是不可接受的。
還一個原因就是,訓練數據的收集同樣需要巨大的成本,而拋開成本來說,很多公司根本無法收集到足夠的訓練數據,而沒有足夠的訓練數據,那么就很難訓練出一個很好的模型。
這時,微調的作用就體現出來了。微調只需要在別人已經訓練好的模型之上,使用少量的數據對模型部分或全部參數進行調整即可。
之所以說對預訓練模型的全部或部分參數進行調整是因為,微調分為全量(參數)微調(Full Fine Tuning)和部分(參數)微調——高效微調PEFT(Parameter-Efficient Fine Tuning),只不過很少有人會進行全量微調。
全量微調就相當于,你本來只是在一個普通的本科院校學習;然后突然有一天有個機會讓你到一所985/211的學校去學習,學習的內容還是一樣,不過人家教的會更好。
部分參數微調就是相當于,你進了你們學校的實驗班或突擊班,去強化學習部分課程。
所以什么情況下適合微調?
- 無法接受訓練的成本問題
- 訓練數據不足
- 想使用別人已經訓練好的開源模型(huggingface上有大量開源模型)
- 數據安全問題,不能接受把數據上傳到第三方大模型公司
這幾種情況比較適合微調,如果不缺錢,又不缺數據,技術又過關;那么自己設計模型,自己訓練是最好的方式。
當然,微調也不是萬能的,只有在相似的條件下才可以進行微調;比如,一個識別貓狗的預訓練模型,你要用人臉數據進行人臉識別微調,這就行不通了。畢竟,貓狗的數據特征和人臉還是有很大差別的。
02、怎么微調,微調的具體步驟?
前面說了,微調的目的是調整模型的參數,所以本質上和步驟上微調和訓練沒太大區別,都需要經過數據收集處理,數據加載,正向傳播,反向傳播優化的過程,然后給模型參數找到一個最優解。
只不過微調大部分情況下都是調整部分參數,而這種微調方式叫做——高效微調。也就是說用少量的數據,優化部分參數,以達到更好的效果。
既然是對模型參數的調整,那么具體是怎么操作的呢?
在神經網絡的訓練過程中,有數據處理,正向傳播,反向傳播和優化器,如果不了解神經網絡訓練過程的可以看??神經網絡的通用訓練流程??。
而微調就發生在優化器上,訓練的過程是優化器根據損失差通過反向傳播的方式調整參數;而微調也是通過優化器去調整模型的參數。
基于pytorch框架的神經網絡,其微調部分參數的原理就是通過凍結參數,把不需要調整的參數凍結,這樣大模型在微調的過程中就只會優化可以被調整的參數。
而全量微調就是不凍結參數,所有參數都會被調整。
代碼如下所示:
"""
基于pytorch框架的神經網絡
"""
# 加載模型
model = AutoModelForCausalLM.from_pretrained(
model_id, torch_dtype="auto", device_map="auto"
)
# 獲取模型參數
for name, param in model.parameters():
# 判斷哪些參數需要凍結 參數名中包含bias的參數被凍結 不會被修改
if "bias" not in name:
param.requires_grad = False
# 優化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
這樣,通過微調模型,就可以讓預訓練模型達到自己想要的效果。
本文轉載自公眾號AI探索時代 作者:DFires
原文鏈接:????https://mp.weixin.qq.com/s/LLZKnJGDB-2iJU2Q1AiuUA??
