每一次訓練運行中都有三個超參數佔據主導地位,理解它們之間的互動關係比記住預設值更重要。學習率控制模型在每次更新步驟中權重的變化幅度——太高會導致損失爆炸,太低則會浪費計算資源,緩慢地向一個永遠無法到達的最小值前進。預訓練大型語言模型時,學習率的典型值通常落在 1e-4 到 6e-4 之間,但這個範圍會根據模型大小和優化器而改變。批次大小決定模型在更新權重前看到多少個範例。較大的批次能提供更穩定的梯度估計,但會消耗更多記憶體,有時甚至會影響泛化能力。優化器——幾乎總是某種 Adam(目前標準為 AdamW)的變體——決定如何利用梯度資訊來實際移動權重。AdamW 加入了解耦權重衰減,這作為正則化器,可防止權重無限增長。這三個超參數密切相關:當批次大小加倍時,通常可以提高學習率(線性縮放規則),切換優化器甚至會改變哪些學習率是穩定的。你無法孤立地調整其中一個,並期望得到清晰的結果。
幾乎從來不會選擇固定不變的學習率,這是一種看似常識但有實證支持的觀點。大多數成功的訓練運行會使用預熱階段,後接某種形式的衰減。預熱階段從接近零的學習率開始,並在前幾百到幾千步中逐步提高——這可以防止隨機初始化的模型在學習任何有用的結構之前就進行破壞性的梯度更新。預熱後,餘弦衰減是最受歡迎的調度方式:學習率沿著半餘弦曲線從峰值降到接近零,這讓模型在一段時間內保持在有生產力的學習率,後續再以溫和的冷卻階段幫助其收斂到一個良好的最小值。線性衰減也有效,但餘弦衰減已成為預設,因為它在各種架構中表現一致地良好或更好。近期的一些研究探討了週期性調度和預熱-穩定-衰減模式,但如果你正在啟動一個新專案並希望獲得可靠結果,預熱加餘弦衰減仍是安全的選擇。
根據你是從頭開始預訓練還是微調現有模型,重要的超參數會有顯著差異。預訓練是一種粗暴的過程——你關注學習率、批次大小、優化器和權重衰減,因為你從零開始建立表示。微調則是對已經訓練好的模型進行手術式的調整,規則也會隨之改變。學習率通常會降低一個數量級或更多:預訓練可能使用 3e-4,微調通常使用 1e-5 到 5e-5,因為你希望輕微調整模型,而不是覆蓋它已有的知識。在微調中,訓練週期數變得更加重要——對數據進行一到三次遍歷通常就足夠了,進一步增加則可能在小數據集上導致災難性的過擬合。使用參數高效方法(如 LoRA)時,會引入一個新的超參數:秩(rank),它控制適配器的容量。秩 8 到 64 覆蓋了大多數使用案例,更高的秩會增加表達能力,但需要更多的可訓練參數。LoRA 還引入了自己的 alpha 縮放因子,alpha 與秩的比率有效地控制了適配器的學習率。總體而言,微調涉及的超參數較少,但每個都更敏感,因為你是在一個已經具有強先驗知識的模型上進行操作。
網格搜尋——在預定義的網格上嘗試所有值的組合——是每個人都首先學習的策略,但幾乎沒有人在大規模上使用它。問題在於組合爆炸:五個超參數,每個有五個值,意味著 3,125 次運行,而其中大多數運行都在探索無聊且重複的空間區域。2012 年 Bergstra 和 Bengio 提出的隨機搜尋,極其簡單且持續優於網格搜尋:只需從合理的分佈中抽樣超參數值,並運行固定預算的實驗。這之所以有效,是因為並非所有超參數都同等重要,而隨機抽樣更有可能命中那些重要超參數的關鍵值。除了隨機搜尋,貝葉斯優化(如 Optuna 或 Weights & Biases Sweeps 等工具)會建立超參數與性能之間的模型,並利用該模型建議越來越有前景的配置。基於群體的訓練則採取完全不同的方法——它並行運行許多訓練任務,定期複製表現最好的模型的權重,並變異其超參數,有效地在訓練過程中進化出良好的配置,而不是在訓練前就確定。每種策略都在計算成本與探索效率之間做出權衡,但坦白說,只要預算合理,隨機搜尋就能讓你達到 90% 的目標。
這裡是很少出現在教科書中的部分:大多數生產系統中的超參數並非來自第一原理或嚴謹的搜尋。它們是從處理類似問題的成功論文中複製過來的。當某人預訓練一個 7B 參數模型時,他們會查看 LLaMA 使用的學習率、Chinchilla 推薦的批次大小、GPT-3 報告的權重衰減——並從那裡開始。這不是懶惰;這是有理性的。大型模型的超參數空間非常廣闊,每次實驗的計算成本都高達數千美元,而已發表的配置代表了資金充足的實驗室已經進行的數十萬美元的隱性搜尋。在實務中,超參數調整的技巧在於知道從哪篇論文的設定開始,哪些一兩個旋鈕值得根據你的具體情況調整,以及在什麼時候問題嚴重到需要實際搜尋而不是微調。第一原理對於理解選擇為何有效很重要,但複製成功前輩的設定才是大多數實際訓練運行得以啟動的方式。