預訓練的大語言模型(LLM)可能無法完全滿足特定使用者需求,因此需要通過微調來提升其在特定任務中的表現。通過微調,模型能夠更精準地適應使用者的具體應用情境。本文為您介紹微調LLM時的策略選擇(SFT/DPO)、微調技術(全參/LoRA/QLoRA)以及超參說明,旨在協助實現模型效能的最佳最佳化。
微調方法簡介
SFT/DPO
在Model Gallery模組中,您可以對模型進行監督微調(SFT)和直接偏好最佳化(DPO)訓練。大語言模型(LLM)的訓練流程通常包括以下三步:
1. 預訓練(Pre-Training, PT)
預訓練是LLM訓練流程的第一步,模型在大規模語料庫上進行學習,以掌握基本的文法規則、邏輯能力和常識知識。
目標:讓模型具備語言理解能力、邏輯能力和常識知識。
樣本模型:Model Gallery中提供了很多預訓練後模型供您使用,如Qwen系列、Llama系列。
2. 監督微調(Supervised Fine-Tuning, SFT)
監督微調是對預訓練模型的進一步調整,使其在特定領域的表現更優,適應對話和問答情境。
目標:使模型在輸出形式和輸出內容上表現更優。
樣本問題:使模型能夠專業回答使用者特定領域(如中醫)的問題。
解決方案:準備特定領域(如中醫)相關的一問一答形式的資料對模型進行微調。
3. 偏好最佳化(Preference Optimization, PO)
監督微調後的模型可能會出現文法正確但不符合事實或人類價值觀的回複。偏好最佳化(PO)用於進一步提升模型的對話能力並與人類價值觀對齊。主要的方法包括基於強化學習的PPO(Proximal Policy Optimization)和直接最佳化語言模型的DPO(Direct Prefernece Optimization),DPO使用隱式的強化學習範式,無需顯性獎勵模型,不直接最大化 reward, 因此在訓練上比PPO更加穩定。
3.1 直接偏好最佳化(Direct Preference Optimization, DPO)
DPO的模型由兩個主要組件構成:一個是需要訓練的大型語言模型(LLM);另一個是參考模型,用於防止模型偏離預期。參考模型也是經過微調的大型語言模型,但其參數是凍結的,不會更新。
訓練資料格式:三元組(prompt,chosen(好的結果
),rejected(差的結果 )) 損失函數公式如下,從損失函數公式上來看,DPO演算法的原理是讓模型在好結果上產生的機率盡量大於reference model,同時在差結果上產生的機率盡量低於reference model。
σ是Sigmoid函數,用於將結果映射到(0, 1)範圍。
β是一個超參數,通常在0.1到0.5之間,用於調整損失函數的敏感度。
PEFT: LoRA/QLoRA
參數高效微調技術(Parameter-Efficient Fine-Tuning, PEFT)廣泛應用於微調大型預訓練模型。其核心思想是在保持大部分模型參數不變的情況下,僅通過微調少量參數來實現具有競爭力甚至領先的效能。由於需要更新的參數量較小,所需的資料和計算資源也相應減少,從而提高了微調的效率。在Model Gallery模組中,支援全參微調以及LoRA、QLoRA兩種高效微調技術:
LoRA(Low-Rank Adaptation)
LoRA技術通過在模型的參數矩陣(例如m*n維)旁邊新增一條旁路來實現微調。這條旁路由兩個低秩矩陣(m*r和r*n 維,其中r遠小於m和n)相乘而成。在前向傳播過程中,輸入資料同時通過原始參數矩陣和LoRA旁路,得到的輸出結果相加。訓練過程中,原始參數被凍結,僅對LoRA部分進行訓練。由於LoRA部分由兩個低秩矩陣構成,其參數量遠小於原始矩陣,因此能夠顯著減少訓練的計算開銷。
QLoRA(Quantized LoRA)
QLoRA結合了模型量化和LoRA技術。除了引入LoRA旁路,QLoRA在載入時將大模型量化為4bit或8bit。在實際計算時,這些量化的參數會被反量化為16bit進行處理。這樣做不僅最佳化了非使用狀態下模型參數的儲存需求,還在與LoRA相比較時進一步降低了訓練過程中的顯存消耗。
訓練方法選擇與資料準備
在選擇SFT和DPO時,請根據您的具體應用情境,參考之前的技術介紹進行決策。
選擇全參數訓練與LoRA、QLoRA
複雜任務:推薦使用全參數訓練,因為它能夠充分利用模型的所有參數,從而提升效能。
簡單任務:建議使用LoRA或QLoRA,這兩者訓練速度較快且計算資源需求較低。
小資料量情境:當資料量較小(幾百到小几千條),選擇LoRA或QLoRA有助於防止模型過擬合。
計算資源有限:如果計算資源緊張,可以選擇QLoRA以進一步降低顯存消耗。不過需要注意的是,由於增加了量化和反量化的過程,QLoRA的訓練時間可能會較LoRA更長。
訓練資料準備
簡單任務:不需要大量資料。
SFT資料需求:經驗表明,對於SFT,數千條資料通常能夠達到較好的效果。在這種情況下,資料品質的最佳化比單純增加資料量更為重要。
超參介紹
learning_rate
學習率(learning rate)決定了模型在每次迭代中更新參數的幅度。較大的學習率可能加快訓練速度,但也可能導致參數更新過度,無法收斂到損失函數的最小值。較小的學習率則提供了更穩定的收斂過程,但可能增加訓練時間或陷入局部最優解。使用AdamW最佳化器能有效地防止長期不收斂的問題。
num_train_epochs
epoch是機器學習和深度學習中的重要概念,1個epoch代表對全部訓練資料集進行一次完整的訓練。例如設定epoch為10,則模型會遍曆全部資料集10次來更新訓練參數。
epoch過小可能導致欠擬合,epoch過大可能導致過擬合。推薦設定2~10個epoch。若樣本量少,可增加epoch數以避免欠擬合;若樣本量大,一般2個epoch即可。此外,較小的learning rate通常需要更多的epochs。可以通過觀察驗證集準確率的變化,當其不再提高時,即可終止訓練。
per_device_train_batch_size
在實際訓練中,我們不會遍曆完所有訓練資料再對模型參數進行更新,而是使用更小的資料集進行多次迭代,以提高訓練效率。batch size代表每次迭代中使用的訓練資料數量。例如設定batch size為32,則每次訓練時模型使用32個訓練資料。參數per_device_train_batch_size表示每個GPU卡上一次訓練使用的資料量。
batch size參數主要用於調節訓練速度,不應用於調節訓練效果。較小的batch size會增加梯度估計的方差,需要更多的迭代才能收斂。增大batch size可以縮短訓練時間。
理想的batch size通常是硬體能夠支援的最大值。您可以在Model Gallery > 任務管理 > 訓練任務中單擊指定任務名稱,在任務監控頁查看GPU Memory和Memory的使用方式,選取不會使顯存溢出的最大batch size。

保持相同的per_device_train_batch_size,增加GPU卡數,相當於增加總的batch size。
seq_length
對於LLM,訓練資料經過分詞器(tokenizer)處理後,會得到一個token序列,sequence length代表模型接受的單個訓練樣本的token序列長度。如果訓練資料的token序列長度超過這個長度,資料會被截斷;如果小於這個長度,資料會被填充。
在訓練時,我們可以根據訓練資料的token序列長度分布,選擇合適的sequence length。給定文本序列,使用不同的分詞器進行處理後,得到的token序列長度通常相似,因此我們可以統一使用OpenAI tokens 線上計算工具來估算文本的token序列長度。
對於SFT演算法,請估算system prompt + instruction + output的序列長度;對於DPO演算法,請估算system prompt + prompt + chosen 和 system prompt + prompt + rejected的序列長度,並取其中的較大值。
lora_dim/lora_rank
在Transformer中應用LoRA,主要是在多頭注意力(multi-head attention)部分進行。有實驗表明:
適配多頭注意力中的多個權重矩陣比僅適配單一類型的權重矩陣效果更佳。
增加秩(rank)不一定能涵蓋一個更有意義的子空間,一個低秩的適配矩陣可能已經足夠。
在Model Gallery提供的llm_deepspeed_peft演算法中,LoRA適配了多頭注意力中的所有4種權重矩陣,並且我們提供的預設秩值為32。
lora_alpha
LoRA縮放係數,更高的lora_alpha會增強LoRA矩陣的影響,適合訓練資料量少的情況;較低的lora_alpha減弱LoRA矩陣的影響,適合訓練資料量大的情況。lora_alpha的取值一般在lora_dim取值的1/2~2。
dpo_beta
在DPO訓練中使用,控制與參考模型的偏離程度,預設值為0.1。較高的beta值意味著與參考模型的偏離較小。該參數在SFT訓練中會被忽略。
load_in_4bit/load_in_8bit
在QLoRA中使用,分別代表以4 bit和8 bit精度載入基模型。
gradient_accumulation_steps
較大的batch size需要更多的顯存,這可能導致OOM(CUDA out of memory)錯誤。因此,我們通常設定較小的batch size。然而,較小的batch size會增加梯度估計的方差,影響收斂速度。為了在避免OOM的同時提高收斂速度,我們引入了梯度累積(gradient accumulation)。通過在積累多個batch 的梯度後再進行模型最佳化,我們可以實現更大的有效batch size,其值為設定的batch size* gradient_accumulation_steps。
apply_chat_template
當apply_chat_template設為true時,訓練資料將自動加入模型預設的chat template。如果您希望使用自訂的聊天模板,請將apply_chat_template設定為false,並在訓練資料中自行插入所需的特殊標記(special token)。即使apply_chat_template為true,您仍然可以手動定製系統提示(system prompt)。
system_prompt
在system prompt中,您可以提供說明、指導和背景資訊,以協助模型更好地回答使用者的詢問。例如,您可以使用以下system prompt:“你是一位熱情、專業的客服,溝通友好且回答簡練,喜歡通過例子來解決使用者的問題。”