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