背景
我們?nèi)粘KJ(rèn)識的「大模型」都是經(jīng)過微調(diào)之后得到的墩瞳。大模型只是一個(gè)「文本續(xù)寫的模型」蜓肆。在未經(jīng)過任何微調(diào)或者基于人類反饋的強(qiáng)化學(xué)習(xí)(RLHF)之前臭蚁,模型只能實(shí)現(xiàn)基本的文本接龍间校,并沒有直接理解用戶任何指令或意圖的能力枯途。
下面是開源大模型零一萬物 Yi-34b 未經(jīng)過微調(diào)之前碌宴,模型的輸出:
上面的輸出其實(shí)從語法結(jié)構(gòu)什么來說都是對的杀狡,但是它的輸出并不是「對話」,而是像繼續(xù)編寫某個(gè)文本里的片段贰镣。
經(jīng)過 Chat 數(shù)據(jù)微調(diào)訓(xùn)練之后呜象,模型才學(xué)會(huì)如何和人類進(jìn)行正常交流:
用來微調(diào)的 Chat 對話模型使用的訓(xùn)練數(shù)據(jù)為下圖所示,由符合預(yù)期的「一問一答」數(shù)據(jù)組成:
社區(qū)上的大模型碑隆,無論是 GPT 還是開源大模型恭陡,基本都遵循先進(jìn)行預(yù)訓(xùn)練然后微調(diào),得到一個(gè)對話或者其他用途的模型上煤。
什么是預(yù)訓(xùn)練休玩?
在預(yù)訓(xùn)練階段,模型通過學(xué)習(xí)大量的數(shù)據(jù)來提取特征、理解語義和推理能力拴疤,從而對通識知識永部,代碼知識獲得一般性認(rèn)識。質(zhì)量較高的預(yù)訓(xùn)練數(shù)據(jù)可以增強(qiáng)模型的泛化能力呐矾,減少在后續(xù)特定任務(wù)上的訓(xùn)練調(diào)優(yōu)時(shí)間和資源消耗羔飞。
預(yù)訓(xùn)練是一種無監(jiān)督學(xué)習(xí)方式宵统,是指使用隨機(jī)文本片段在大規(guī)模數(shù)據(jù)集上對神經(jīng)網(wǎng)絡(luò)模型進(jìn)行初始訓(xùn)練抬探,以便模型能夠?qū)W習(xí)廣泛的特征和知識硫戈。
預(yù)訓(xùn)練使用的訓(xùn)練數(shù)據(jù)格式,「只有輸出」罚随,沒有輸入的標(biāo)簽玉工。大模型使用這種大量沒有標(biāo)記的數(shù)據(jù)來自己學(xué)習(xí)訓(xùn)練數(shù)據(jù)中數(shù)據(jù)的規(guī)律(中英文語法,代碼語法淘菩,通識知識等)
預(yù)訓(xùn)練適合什么場景遵班?
從 0 開始訓(xùn)練一個(gè)新的通用大模型。
基座大模型 LLaMA2 中文數(shù)據(jù)非常少瞄勾,只占 0.13%费奸,有必要使用更多比例中文數(shù)據(jù)繼續(xù)預(yù)訓(xùn)練使大模型學(xué)會(huì)中文表達(dá)。
基座大模型 LLaMA2 模型代碼內(nèi)容的占比同樣也不高(4%)进陡,使用預(yù)訓(xùn)練添加更多比例的代碼數(shù)據(jù)愿阐,強(qiáng)化大模型代碼能力(Code LLaMA代碼模型)
出了一門新的編程語言,為了讓模型能夠?qū)W到最新的編程語言結(jié)構(gòu)趾疚,可以考慮預(yù)訓(xùn)練缨历。
什么是微調(diào)?
- 微調(diào)使用 「一問一答」的格式糙麦,即有標(biāo)注的訓(xùn)練數(shù)據(jù)辛孵,在基于原有模型參數(shù)上,來讓模型更清楚地知道什么樣的輸入下他應(yīng)該給予什么樣的輸出赡磅,按照訓(xùn)練數(shù)據(jù)里的模式進(jìn)行學(xué)習(xí)魄缚。
大模型先通過預(yù)訓(xùn)練學(xué)習(xí)基礎(chǔ)知識,再通過微調(diào)讓模型學(xué)會(huì)基于它通過預(yù)訓(xùn)練已經(jīng)學(xué)會(huì)的知識焚廊,學(xué)習(xí)如何去根據(jù)用戶指令輸出正確適當(dāng)?shù)膬?nèi)容冶匹。
我能用微調(diào)定制什么?
-
設(shè)置風(fēng)格咆瘟、語氣嚼隘、格式等定性方面:
場景舉例:創(chuàng)建一個(gè)語音對話機(jī)器人,不通過提示詞的方式袒餐,每次讓模型輸出的內(nèi)容盡可能精簡如50字以內(nèi)飞蛹。
大模型智能Code Review谤狡,通過打標(biāo)過的優(yōu)質(zhì)數(shù)據(jù)使得大模型 Review 的結(jié)果輸出更加有效和高質(zhì)量。
-
提高生成預(yù)期輸出的可靠性:
將天氣查詢的需求轉(zhuǎn)換為 JSON 請求參數(shù)卧檐,通過大量示例作為微調(diào)訓(xùn)練數(shù)據(jù)提升輸出 JSON 的信息抽取的效果墓懂,并降低輸出非法 JSON 內(nèi)容的概率。
要求大模型只輸出代碼塊泄隔,即使通過提示詞告訴模型只能一次性輸出代碼塊且不添加任何解釋拒贱,但大模型偶爾也會(huì)輸出解釋和多個(gè)代碼塊宛徊。此時(shí)用一些少量微調(diào)數(shù)據(jù)可以改善這些問題佛嬉。
-
提升效果
- 使用大模型生成 Pandas 數(shù)據(jù)分析和可視化代碼。大模型本身理解 Pandas 代碼的編寫闸天,但是編寫準(zhǔn)確率在一些場景下可能不是特別高暖呕,通過一系列經(jīng)過打標(biāo)正確的訓(xùn)練數(shù)據(jù)提升大模型理解用戶需求編寫 Pandas 代碼的效果和正確率。
-
比較復(fù)雜的苞氮,有大量任務(wù)說明的提示詞湾揽。
- 比如將用戶的一段描述轉(zhuǎn)換為一個(gè)甚至多個(gè)接口請求參數(shù),需要在提示詞里添加大量說明文檔和樣例笼吟。
-
減少 Token 占用
- 就像上面的例子库物,在提示詞里添加大量文檔說明,使用按 Token 計(jì)費(fèi)的模型如 GPT4 會(huì)顯得很貴贷帮。同時(shí)較少的 Token 能獲得更快的推理速度戚揭。
可以使用微調(diào)來讓大模型新增知識嗎?
不推薦撵枢,在需要有可信依據(jù)的場景上民晒,比如構(gòu)建智能客服機(jī)器人,通常會(huì)使用 RAG 的方式配合向量搜索等方式從文檔庫搜尋與用戶詢問問題最為相關(guān)的內(nèi)容锄禽,并將匹配到的文檔段落作為知識內(nèi)容添加到提示詞中潜必,大模型使用提示詞中的知識來回答用戶的問題。
微調(diào)改善的是大模型在某種模式下的表現(xiàn)(如風(fēng)格沃但,準(zhǔn)確度磁滚,幻覺問題等)。雖然微調(diào)也能一定程度上記憶新增的知識宵晚,但由于微調(diào)是改變模型的參數(shù)結(jié)構(gòu)垂攘,使得模型在生成新 token 時(shí)輸出與訓(xùn)練數(shù)據(jù)模式更相似的內(nèi)容。從輸出準(zhǔn)確度上來說是不如在提示詞中添加的知識內(nèi)容坝疼。
微調(diào)方式
在大模型預(yù)訓(xùn)練參數(shù)上進(jìn)行參數(shù)微調(diào)訓(xùn)練搜贤,有三種方式:
全參數(shù)微調(diào),即完全監(jiān)督微調(diào)钝凶,在所有參數(shù)層上根據(jù)標(biāo)注數(shù)據(jù)去調(diào)整原始預(yù)訓(xùn)練模型中的 QKV 參數(shù)層仪芒。
-
LoRA唁影,即 LLM 的低秩適配(Low-Rank Adaptation),通過兩個(gè)較小的矩陣來擬合調(diào)整后的參數(shù)層掂名,這個(gè)過程可以理解為 X + Z = Y 据沈,其中 X 為原始參數(shù),Y 為訓(xùn)練之后的參數(shù)饺蔑,訓(xùn)練過程中就是尋找可以將 X 擬合為 Y 的 Z 矩陣锌介。Z 矩陣由 兩個(gè)較小的 Wa 矩陣 和 Wb 矩陣組成。
QLoRA, 與 LoRA 方式類似猾警,也是訓(xùn)練兩個(gè)擬合參數(shù)層來達(dá)到對原始模型的調(diào)整孔祸。區(qū)別在于為了節(jié)省訓(xùn)練硬件資源, QLoRA 會(huì)先將原始模型參數(shù)量化至 4-bit 并凍結(jié)发皿,然后添加一小組可學(xué)習(xí)的低秩適配器權(quán)重( Low-rank Adapter weights)崔慧,這些權(quán)重通過量化權(quán)重的反向傳播梯度進(jìn)行調(diào)優(yōu),在量化之后的參數(shù)上進(jìn)行 LoRA 訓(xùn)練穴墅,這將大幅下降顯存的占用(33b 的模型 以 FP16 全量加載需消耗 80GB 顯存惶室,量化至 4 bit之后模型加載僅需要 20 GB 左右顯存的占用)
-
除了量化并凍結(jié)原始參數(shù),QLoRA 還支持分頁優(yōu)化器:使用NVIDIA統(tǒng)一內(nèi)存特性玄货,將部分顯存溢出的部分 offload 到內(nèi)存中實(shí)現(xiàn)分頁皇钞,來進(jìn)一步避免 OOM 的問題。(即下圖紫色箭頭部分)
關(guān)于全量參數(shù)微調(diào) 和 LoRA 方式效果的對比松捉,以下以 SQL 生成場景舉例夹界,柱狀圖從深到淺依次是未經(jīng)過微調(diào)訓(xùn)練、LoRA 方式訓(xùn)練和全參數(shù)訓(xùn)練后模型生成的準(zhǔn)確度:
在 SQL 數(shù)據(jù)集上惩坑,根據(jù)模型大小和微調(diào)方法預(yù)測準(zhǔn)確率掉盅,LoRA微調(diào)模型的表現(xiàn)幾乎可與全參數(shù)微調(diào)模型相當(dāng)。需要注意的是以舒,LoRA 微調(diào)的 13B 模型的表現(xiàn)略優(yōu)于全參數(shù)微調(diào)的 7B 模型趾痘。
關(guān)于 QLoRA 訓(xùn)練的效果:
從上圖中可以看到,在5-shot MMLU 場景下蔓钟,QLoRA 效果與常規(guī) LoRA 效果接近永票,甚至能反超常規(guī) LoRA 微調(diào)效果。
關(guān)于資源消耗:
在上表中:
LLaMA-13B+LoRA(2M)表示使用 LLaMA-13B作為基本模型和 LoRA 訓(xùn)練方法在 200 萬指令數(shù)據(jù)上訓(xùn)練的模型滥沫。
可以看到全量參數(shù)的訓(xùn)練時(shí)間約為 LoRA 方式的 2~3 倍侣集。
從效果上來看,LoRA 與全參數(shù)微調(diào)效果差距在1 ~ 9%左右兰绣。但是在特定場景上(math 數(shù)據(jù)集)僅相差 1% 左右世分,因此在垂直領(lǐng)域訓(xùn)練上 LoRA 能保持較好的效果,同時(shí)顯著降低訓(xùn)練時(shí)長缀辩。
以 6b 參數(shù)量的模型分別以不同方式啟動(dòng)訓(xùn)練臭埋,顯存占用情況:
從上表中可以看到:
全參數(shù)訓(xùn)練顯存占用約為 LoRA 的 4.5倍
使用 QLoRA 方式顯存占用相對于 LoRA 又可以省一倍踪央。
6B 參數(shù)的微調(diào),一張 24G 顯存的顯卡運(yùn)行LoRA微調(diào)綽綽有余瓢阴。
因此畅蹂,結(jié)合訓(xùn)練效果看,LoRA 或者 QLoRA 的高效微調(diào)的方式成本較低效果相對也較好荣恐,因此以LoRA 的方式來對基座模型進(jìn)行預(yù)訓(xùn)練是最為合適的液斜。