訓練神經(jīng)網(wǎng)絡(luò)不是把數(shù)據(jù)倒進模型然后等著收結(jié)果。它更像是在高維空間里開一輛沒有地圖的車——你得自己摸索哪條路能下山,哪條是死胡同。
本文拆解四個決定模型成敗的訓練決策:優(yōu)化器選擇、正則化策略、批歸一化(Batch Normalization,一種穩(wěn)定梯度流動的技術(shù)),以及多任務(wù)/遷移/課程學習等進階技巧。這些原則通用于圖像分類、語言模型、推薦系統(tǒng)。
優(yōu)化器:你的"下山算法"選對了沒
訓練神經(jīng)網(wǎng)絡(luò)本質(zhì)是優(yōu)化問題:找一組權(quán)重讓損失函數(shù)最小。優(yōu)化器就是那個負責搜索的算法。
模型預(yù)測后計算誤差,通過反向傳播算出損失對每個權(quán)重的梯度。優(yōu)化器用這些梯度更新權(quán)重,把模型往更好的方向推。這個過程重復(fù)成千上萬次。
但深度網(wǎng)絡(luò)的損失 landscape(高維曲面)布滿山谷、高原和鞍點——梯度接近零但模型遠未最優(yōu)的地方。選對優(yōu)化器決定了你能不能高效走出這片地形。
SGD(隨機梯度下降):老牌但難馴服
SGD 用最基礎(chǔ)的思路:不用整個數(shù)據(jù)集算梯度(太貴),每次隨機抽一個樣本或小批量更新。這引入的噪聲反而能幫模型跳出局部最優(yōu)。
代價是學習率得手工調(diào),且在鞍點和稀疏梯度面前吃力。現(xiàn)在 CV 研究訓 ResNet 時還會用 SGD,配合動量和學習率衰減能跑出頂尖精度——但得愿意花時間調(diào)參。
動量解決了 SGD 的震蕩問題。它給優(yōu)化過程加了一個"速度向量",累積歷史梯度的加權(quán)平均,讓更新方向更穩(wěn)定,穿過狹長山谷時不會來回反彈。
代碼示例:optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
Adam 家族:自適應(yīng)學習率的"懶人包"
Adam(Adaptive Moment Estimation,自適應(yīng)矩估計)2014 年出現(xiàn)后迅速成為默認選擇。它給每個參數(shù)單獨算自適應(yīng)學習率,結(jié)合了動量(一階矩)和梯度平方的指數(shù)平均(二階矩)。
Adam 對學習率不敏感,收斂快,適合大多數(shù)任務(wù)的快速原型。但它在某些 CV 任務(wù)上的最終精度不如調(diào)好的 SGD,且泛化差距(generalization gap,訓練集和測試集表現(xiàn)的差距)更大。
AdamW 是 Adam 的修正版,把權(quán)重衰減(L2 正則)和梯度更新解耦。原版 Adam 的權(quán)重衰減實現(xiàn)有問題,會導致正則效果打折扣。AdamW 在 Transformer 訓練中幾乎成了標準配置。
RMSprop 和 Adagrad 是更早的自適應(yīng)方法。Adagrad 對稀疏梯度效果好但學習率單調(diào)遞減會提前卡住;RMSprop 用指數(shù)移動平均改進了這一點,在 RNN 訓練里曾經(jīng)很流行。
選擇建議:快速驗證用 Adam/AdamW,追求最終精度且有時間調(diào)參時切 SGD+Momentum。
學習率調(diào)度:訓練過程的"油門控制"
固定學習率很少是最優(yōu)的。前期需要大學習率快速接近最優(yōu)區(qū)域,后期需要小學習率精細調(diào)整。
Step Decay(階梯衰減):每 N 個 epoch 把學習率乘以一個系數(shù)(比如 0.1)。簡單有效,但衰減時機得手動設(shè)。
Cosine Annealing(余弦退火):學習率按余弦曲線從初始值降到接近零。不需要調(diào)衰減時機,在圖像分類里表現(xiàn)穩(wěn)定。
ReduceLROnPlateau(平臺衰減):驗證集損失不下降時自動降低學習率。省人工,但可能因驗證噪聲導致過早衰減。
Warmup(預(yù)熱):訓練初期用小學習率慢慢爬升,避免早期大梯度破壞預(yù)訓練權(quán)重。訓大模型時幾乎是必選項。
正則化:防止模型"死記硬背"
神經(jīng)網(wǎng)絡(luò)參數(shù)遠多于訓練樣本時,極易過擬合——在訓練集上表現(xiàn)完美,遇到新數(shù)據(jù)就垮。正則化是給模型加的約束,逼它學泛化規(guī)律而非記憶樣本。
L1/L2 正則:給權(quán)重"減肥"
L2 正則(權(quán)重衰減)在損失函數(shù)里加 λΣw2,懲罰大權(quán)重,讓模型偏好簡單解。L1 正則加 λΣ|w|,會產(chǎn)生稀疏權(quán)重(部分權(quán)重歸零),可用于特征選擇。
實際實現(xiàn)時,L2 正則通常直接加在優(yōu)化器的 weight_decay 參數(shù)里。注意 Adam 的 weight_decay 行為和 SGD 不同,這也是 AdamW 出現(xiàn)的原因。
Dropout:訓練時的"隨機斷聯(lián)"
Dropout 以概率 p 隨機把神經(jīng)元輸出置零。這迫使網(wǎng)絡(luò)不能依賴任何單個神經(jīng)元,必須學更魯棒的特征表示。
Hinton 團隊 2012 年提出時,Dropout 讓圖像分類誤差顯著下降。現(xiàn)在全連接層仍常用 p=0.5,卷積層用得更輕(p=0.2-0.3)或改用 BatchNorm。
推理時 Dropout 關(guān)閉,但輸出要乘以 (1-p) 補償訓練時的期望值差異。現(xiàn)代框架自動處理這個縮放。
Early Stopping:用驗證集當"剎車"
監(jiān)控驗證集損失,連續(xù) N 輪不下降就停訓,回滾到最佳檢查點。這是最簡單也最有效的正則化手段之一,零額外計算成本。
關(guān)鍵 hyperparameter(超參數(shù))是 patience(耐心值)——等多少輪。設(shè)太小會錯過后續(xù)優(yōu)化,設(shè)太大浪費算力。CV 任務(wù)常用 10-20 個 epoch。
數(shù)據(jù)增強:給訓練集"造親戚"
圖像領(lǐng)域,隨機裁剪、翻轉(zhuǎn)、旋轉(zhuǎn)、顏色抖動是標配。這些變換保留語義標簽但改變像素分布,等效于免費擴充數(shù)據(jù)集。
AutoAugment 和 RandAugment 用搜索或隨機策略組合變換,在 ImageNet 上能提幾個點。但增強策略得和任務(wù)匹配——醫(yī)學圖像亂翻轉(zhuǎn)可能把"左肺病灶"變成錯誤標簽。
Mixup 和 CutMix 是進階玩法:把兩張圖按像素或區(qū)域混合,標簽也按比例分配。這強迫模型學"中間狀態(tài)",決策邊界更平滑。
NLP 的數(shù)據(jù)增強更棘手。同義詞替換、回譯(back-translation,把句子翻譯成另一語言再譯回來)是常用手段,但效果不如圖像穩(wěn)定。GPT 時代的合成數(shù)據(jù)是另一套邏輯。
批歸一化:馴服梯度爆炸與消失
深度網(wǎng)絡(luò)訓練時,層間數(shù)據(jù)分布不斷變化(internal covariate shift,內(nèi)部協(xié)變量偏移),導致梯度不穩(wěn)定。BatchNorm 2015 年出現(xiàn)后,讓訓深層網(wǎng)絡(luò)變得可行。
操作很簡單:對每個 mini-batch,按通道算均值和方差,歸一化到標準正態(tài),再學一個縮放 γ 和偏移 β 恢復(fù)表達能力。公式:y = γ(x - μ)/√(σ2+ε) + β
BatchNorm 的實際效果
允許用更大學習率,加速收斂;降低對初始化的敏感度;有輕微正則化效果(每個樣本的歸一化統(tǒng)計受同 batch 其他樣本影響,類似 Dropout 的噪聲)。
但它也有麻煩:訓練和推理的統(tǒng)計量不同(推理用滑動平均),小 batch 時估計不準;對序列數(shù)據(jù)不友好(句子長度變,batch 統(tǒng)計不穩(wěn)定)。
替代方案
LayerNorm:對每個樣本單獨歸一化,跨通道和位置。Transformer 標配,解決 BatchNorm 的序列問題。
GroupNorm:通道分組歸一化,小 batch 時比 BatchNorm 穩(wěn)定,檢測分割任務(wù)常用。
InstanceNorm:每個樣本每個通道單獨歸一化,風格遷移里用得多,完全抹除 batch 維度信息。
進階學習策略:站在別人肩膀上
當數(shù)據(jù)或算力有限時,怎么讓模型學得更好?三類策略:多任務(wù)學習、遷移學習、課程學習。
多任務(wù)學習:一個模型干多件事
硬參數(shù)共享:底層共享,頂層分頭。參數(shù)效率高,但任務(wù)沖突時會互相拖累。
軟參數(shù)共享:每個任務(wù)獨立網(wǎng)絡(luò),用正則約束參數(shù)接近。靈活但參數(shù)多。
關(guān)鍵設(shè)計是損失加權(quán)。不同任務(wù)損失量級差幾個數(shù)量級是常態(tài),直接相加會讓大損失任務(wù)主導。常用策略:手工調(diào)權(quán)重、用不確定性估計自動加權(quán)、梯度歸一化平衡不同任務(wù)的梯度幅值。
多任務(wù)在推薦系統(tǒng)里極常見:同時預(yù)測點擊、收藏、時長,共享用戶/物品表征。
遷移學習:借別人的預(yù)訓練
預(yù)訓練 + 微調(diào)是現(xiàn)在深度學習的默認范式。ImageNet 預(yù)訓練權(quán)重、BERT/GPT 預(yù)訓練模型,都是遷移學習的產(chǎn)物。
微調(diào)策略:凍結(jié)底層(通用特征),只訓頂層(任務(wù)相關(guān));或用極小學習率全層微調(diào),避免破壞預(yù)訓練知識。
領(lǐng)域差距大時(醫(yī)學影像 vs 自然圖像),預(yù)訓練收益下降。這時自監(jiān)督預(yù)訓練(對比學習、MAE)在目標領(lǐng)域從頭訓可能更好。
課程學習:讓模型像學生一樣進步
Bengio 團隊 2009 年提出:訓練初期用簡單樣本,逐漸加入復(fù)雜樣本。模仿人類教育——先學加減再學微積分。
實現(xiàn)難點在"難度"定義。圖像里可用標簽噪聲、模糊程度、樣本損失值;NLP 里可用句子長度、詞匯稀有度。
課程學習在小樣本、噪聲標簽場景有效果,但大規(guī)模預(yù)訓練時代用得少了——數(shù)據(jù)太多,簡單/難樣本的邊界模糊,隨機采樣加充分訓練往往更省事。
混合精度與分布式:工程層面的加速
訓練大模型時,純算法優(yōu)化不夠,得動工程手段。
混合精度訓練:FP16(半精度浮點)存權(quán)重和計算,F(xiàn)P32 存 master 權(quán)重。顯存減半,Tensor Core 加速,但梯度下溢(太小變零)需要 loss scaling 補償。
分布式數(shù)據(jù)并行:多卡各算一個 batch,梯度聚合后同步。PyTorch DDP、DeepSpeed 是主流實現(xiàn)。關(guān)鍵 hyperparameter 是 batch size 和 learning rate 的縮放——線性縮放規(guī)則:batch 翻 4 倍,lr 也翻 4 倍,但到某個點后失效。
模型并行:單卡放不下整個模型時,把層切到不同卡。Pipeline 并行和 Tensor 并行是兩種切法,Megatron-LM、DeepSpeed 實現(xiàn)了復(fù)雜組合。
調(diào)試訓練:當 loss 不下降時
訓練失敗是常態(tài)。系統(tǒng)化的 debug 流程:
先過擬合一個 batch:把訓練集砍到幾十個樣本,模型應(yīng)該能輕松擬合到 loss 接近零。如果做不到,是模型/代碼 bug。
檢查數(shù)據(jù)流:可視化輸入和標簽,確認預(yù)處理沒搞錯。曾經(jīng)有人訓分類器發(fā)現(xiàn)準確率 10%(隨機水平),最后發(fā)現(xiàn)標簽文件錯位一行。
監(jiān)控梯度:用 TensorBoard 看梯度分布。全零說明反向傳播斷了;爆炸說明學習率太大或 loss scaling 沒調(diào)好。
簡化再擴展:從最小配置開始(小模型、小數(shù)據(jù)、單卡),確認能跑通后再逐步放大。一上來就訓 175B 參數(shù)模型,出問題根本定位不了。
最后留一個問題:你最近一次訓模型時,loss 曲線最詭異的形狀是什么樣的——是震蕩不降、突然 NaN、還是驗證集先降后升?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.