SFT(Supervised Fine-Tuning)簡介
監督微調(Supervised Fine-Tuning,SFT) 是大模型訓練流程中的關鍵環節,其目標是通過高質量的人工標注數據(通常為問答對,包含輸入的prompt和預期輸出的 response),將通用預訓練大模型(如Llama、Qwen等)適配到特定的下游任務或專業領域,使其生成更符合人類期望且有一定偏好格式的輸出。
SFT的必要條件
1. 何時需要啟動SFT
當通過prompt工程,大模型也無法將用戶所想看到的回答呈現出來(即指令跟隨失敗)時;
當大模型生成內容存在事實錯誤或專業度不足時,比如某些領域的詞匯未在預訓練模型的前置知識里;
當用戶對大模型輸出內容有格式要求時,比如某些專業領域(客服)需要格式化輸出,而模型仍有部分回答不符合格式要求。
2. SFT的前期準備
當用戶確定要使用大模型SFT時,請確保已經做好了以下準備:
用戶已經使用prompt工程等方式,將基礎模型的潛力發揮到極致,并且針對垂直領域的測試集,仍然存在一定數量的badcase,且數量是不可接受(一般業界定義專業領域知識測試準確率<75%即為不可接受)的;
針對該垂直領域,用戶已經標注了至少1K的高質量數據集。如何評判一個數據集是否是高質量數據集請見下一節。
3. 何為高質量數據集
高質量數據集一般存在以下特征:
針對某一領域,該數據集覆蓋一定量的badcase或者與badcase特征相似的數據;
該數據集有著多樣的prompt類型(即提問方式非單一)以增加模型的泛化性;
該數據集針對同類型prompt的回答方式統一或結構差異較小;
該數據集不存在模棱兩可的問題以及答案;
該數據集不存在答案重復輸出的數據;
(如需要)該數據集會添加5-10%的通用數據以防止微調后的模型出現災難性遺忘。
數據集配置
針對不同場景下,以下是數據量級的建議:
簡單文本分類任務:對于基礎的分類任務,如判斷文本情感傾向(積極、消極、中性)或對新聞文章進行簡單類別劃分(體育、科技、娛樂等),若用戶使用較小規模模型(如 7B及以下),通常5k-20k條的數據量即可取得不錯效果;若使用更大參數模型(如30B及以上),由于模型學習能力更強,對數據量要求相對降低,2k-10k條也可能實現較好微調。但數據量的大小也與分類數以及任務難易度強相關,類別較多/任務較難的場景可能需要20k條以上的數據,且要做到類別均衡。
信息抽取任務:像從文本中抽取人名、地名、組織機構名等實體,或抽取事件的時間、地點、參與者等關鍵信息這類任務,任務難易度更大,因此對數據量需求相對較高。若用戶使用13B及以下模型時,建議有30k-80k的數據量;若使用30B及以上模型時,20k-60k的數據量較為合適。這是因為信息抽取任務復雜,模型需學習多種實體和關系模式,足夠數據量才能讓模型有效捕捉這些模式。例如,在醫療領域的實體抽取微調中,50k條的高質量醫療文本數據,能使13B模型的F1值達到75%左右。
生成任務(如文本續寫、文案生成):生成任務對模型創造力和語言理解能力要求高,數據量需求更大。對于7B及以下的模型,一般需要100k-300k條以上數據;而13B-30B的模型,50k- 200k條數據較為適宜;30B以上模型,30k-150k數據可能滿足需求。數據不僅要量大,還應多樣化,涵蓋不同風格、主題和語境文本。如在小說續寫微調中,200k條包含各種題材小說片段的數據,可讓7B模型生成更連貫、富有想象力的續寫內容。
復雜問答任務:如開放域問答、專業領域深度問答、領域內長思考鏈生成問答,數據量要求與生成任務相近甚至更高。7B的模型可能需要50k-150k條數據;13B-30B的模型,40k-100k條數據;30B及以上的模型,則需要50k-80k數據。這類任務需模型理解復雜問題語義,檢索知識并生成準確回答,大量的數據幫助模型學習各類問題模式和答案邏輯。但是如果數據中帶有思考推理過程,也即cot數據集,則各類模型所需的數據量可以相對應減少50%-80%。在醫療領域的帶思考過程的問答微調中,10k數量的含各類疾病的治療方式的數據,便能讓14B的模型在開源醫療問題測評集上提點。
需注意,以上數據量僅為經驗參考范圍,實際微調中最佳數據量受數據質量、模型架構、任務復雜度及訓練方法等多種因素影響。例如,若數據質量極高且與任務高度相關,可能用較少數據量就能取得好效果。在微調前,可通過小規模實驗評估不同數據量對模型性能影響,確定適合特定任務和模型的最優數據量。
精調配置
1. 模型選擇
一般來說,1-13B為小模型,13-34B為中模型,70B以上為大模型。
依據任務的難易程度:若客戶明確針對項目的模型需要有長文本續寫能力,或者需要做比較復雜的思維鏈推理,則可以選擇大模型;若只是簡單的短文本問答或者分類任務,選擇小模型即可,因為小模型更容易捕捉短文本的局部特征。若強行用小模型做困難任務,即使做了極致的prompt工程優化,也不可避免地產生幻覺;若使用大模型做簡單任務,則會造成極大的資源浪費。
依據推理時延:一般來說,當推理batch為1時,小模型的推理時延<300ms,中模型的推理時延為500-800ms,大模型的推理時延>1.5s,若客戶針對項目的模型有低時延要求,建議使用小模型。
依據資源數:一般來說,小模型在短文本長度的微調上需要的資源數較少,即使是全量微調,也只需要單機,大模型所需的資源則較多,72b至少也需要4臺A800機器才能微調,這也是需要考慮的情況。
2. 精調方式
主流的精調方式包括:
全參微調 (Full Fine-Tuning)是解凍整個模型權重進行訓練,更新全模型的參數,效果上限高,適合復雜任務,但該方式顯存占用巨大,而且在專業領域的數據集上進行全參微調可能造成災難性遺忘。
LoRA微調 (Low-Rank Adaptation)是凍結預訓練模型的權重,并在每個模塊中注入可訓練的低秩矩陣(Adapter),因為訓練參數少所以可以節省60%-70%的顯存,也比較適合中小數據集且任務較為簡單的情況。由于LoRA微調相當于是給基礎模型外接一個知識庫,因此其效果也略低于全參微調。
從工程經驗上來看,對于全參微調的選擇,滿足以下幾點一般都可以進行全參微調:
任務復雜度高(比如進行長文本思考鏈的推理);
數據量充足(擁有大于10k的高質量數據);
算力無約束(擁有A800/H100/H800/910B2集群);
數據分布劇變(任務所需的領域數據集與基礎模型的KL散度過大)。
而對于LoRA微調,工程上的經驗一般都有以下幾點:
資源受限但需較好效果(只擁有較少的機器數但又想訓練自己的行業大模型);
快速迭代實驗(不一樣的任務需求搭配不同的LoRA權重,比如電商里的修改訂單和商品推薦屬于不一樣的簡單任務);
中小規模數據(僅僅只有1k-50k的數據樣本);
防止災難性遺忘(由于全參微調遺忘過多知識,可以通過增加一定程度的通用數據+LoRA微調減緩)。
關于LoRA微調和全參微調在效果上的差距,在大多數場景,LoRA微調可以達到全參微調95%以上的效果。需要注意的是,LoRA微調和全參微調在學習率上,有著不同的最佳參數取值范圍,這一點在訓練參數選擇中做進一步的說明。
建議先使用小模型+ LoRA微調來驗證實驗設置及微調數據是否有效,如果有效的話,再逐漸增大數據量并遷移到大模型上驗證微調效果。這樣做可以顯著加快迭代效率,避免在大參數模型上反復做無意義的迭代。
3. 精調參數
在SFT中,不同的超參數選擇會影響模型的精度以及性能,下面逐一對部分重要參數進行解釋并給出一般性推薦。
epoch:模型訓練輪數,通常選擇2~5,可以根據eval集的loss曲線來判斷:如果train集的loss曲線下降,eval集loss曲線上升,則說明模型已經過擬合,此刻考慮到基礎模型的通用能力,應該停止訓練;如果train集和eval集loss曲線均在緩慢下降,則說明模型還未收斂,可以繼續進行訓練。按經驗來說,一般性的任務,全參微調訓練3個epoch以內,LoRA微調應該取3-5個epoch。而生成類任務的epoch數可以略微設置大一點,如5~10范圍內。
learning rate:學習率,設置較大時會加速模型迭代,但是模型可能無法收斂到最優點;設置過小時會使得模型迭代較慢,可能陷入局部最優。按照經驗來講, LORA微調選擇 learning rate 在 1e-4 ~ 3e-4,全參微調選擇learning rate在1e-6~5e-6即可。
global batch size:全局批處理大小,在大模型加速框架Megatron下,該值的增大不會導致顯存溢出的問題,但由于梯度累積的存在,其值越大,模型訓練性能會降低。一般來說,小模型使用的gbs值可以小一點,大模型的gbs值一般設置成64及以上,gbs的設置一般是2的次冪,比如2,4,8,16,32等。
seq lens:序列長度,其取值應該大于等于訓練數據里面最長的那個,以防止數據被截斷。一般來說,由于大模型普遍應用旋轉位置編碼,其已經具備了一定的外推性,8k的序列長度已經可以滿足一些簡單的、常規的問答任務。如果有特殊需求,比如長文本續寫或者特長思維鏈推理,才會考慮放大序列長度到32k。而且增大序列長度所需的資源數會成倍增長,通常會開啟序列并行或者激活值重計算的方式來支持模型的長序列微調能力,會嚴重影響訓練性能。
另外,針對這些參數,有一些額外建議供用戶參考:
微調時,learning rate是隨著global batch size的增加而單調遞增但有上界的。當優化器是Adam或者RMSProp時,learning rate是和global batch size的平方根成正比。但是增大global batch size到一定閾值后,learning rate反而應該減小。
當增大global batch size并相應增大learning rate時,為保證模型訓練一定的步數,有時epoch也需要稍微增大一些。
LoRA微調時,最優的learning rate相比于全參微調時最優的learning rate,一般大1~2個數量級。