?優化器一:Adam(Adaptive Moment Estimation)
?一、適用場景總結(實踐導向)
場景 | 是否推薦用 Adam | 說明 |
---|---|---|
小模型訓練(如 MLP、CNN) | ??? | 穩定、無需復雜調參,適合快速實驗 |
初學者使用或結構新穎 | ?? | 容錯率高,容易收斂 |
醫學圖像初步建模 | ?? | 常用于 baseline 訓練 |
復雜大模型(如 Transformer) | ? 不推薦 | 替代方案為 AdamW,更穩定 |
?二、PyTorch代碼與推薦參數設置
import torch
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3, # 學習率betas=(0.9, 0.999), # 一階和二階動量系數eps=1e-8, # 數值穩定項weight_decay=0.0 # L2正則化強度
)
-
lr=1e-3
:標準初始值,大部分任務適用;若 loss 波動劇烈可調小至1e-4
-
betas=(0.9, 0.999)
:默認設置幾乎不需要改 -
eps=1e-8
:保證數值穩定,基本不改 -
weight_decay=0.0
:Adam 本身不建議加 L2 正則(詳見后面誤區)
?三、實戰調參技巧
目的 | 推薦設置 | 說明 |
---|---|---|
想加快訓練收斂 | lr = 1e-3 (初始) | 可在訓練初期較快降低 loss |
loss 波動大 / 不下降 | lr = 1e-4 ~ 5e-5 | 小學習率更穩,適合細調 |
防過擬合 | weight_decay = 1e-5 (慎用) | Adam 的 weight_decay 實際為梯度正則,不太有效,建議改用 AdamW |
微調已有模型 | lr = 5e-5 或更小 | 防止破壞已有特征表示 |
調整學習率 | 加 StepLR 或 CosineAnnealingLR 調度器 | 調整學習率以適應不同階段收斂需求 |
學習率調度器示例:
from torch.optim.lr_scheduler import StepLR
scheduler = StepLR(optimizer, step_size=20, gamma=0.5) # 每20輪將lr減半
?四、常見誤區與建議
-
?誤用 weight_decay:在 Adam 中加入
weight_decay
相當于錯用 L2 正則,實際對參數更新方向產生影響,不是標準正則方式
?推薦使用 AdamW 替代 -
學習率調度器常被忽視:Adam 雖然自適應,但仍推薦使用調度器,否則后期收斂慢
-
?適合作為 baseline 起點優化器,特別是結構不熟時、或做 ablation 實驗時
?優化器二:AdamW(Adam with decoupled Weight Decay)
?一、適用場景總結(實踐導向)
場景 | 是否推薦用 AdamW | 說明 |
---|---|---|
Transformer 模型訓練(如 BERT、Swin Transformer) | ??? | 論文標準優化器,收斂穩定 |
微調預訓練模型(如 BERT fine-tune) | ??? | 默認使用 AdamW,效果好且安全 |
圖像分割任務(如 UNETR、TransUNet) | ?? | 權重正則更合理 |
小模型實驗 | ? | 也可以用,但優勢不如 Adam 明顯 |
核心優點:解決了 Adam 中正則化不標準的問題!
?二、PyTorch代碼與推薦參數設置
import torch
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4, # 通常比 Adam 略小betas=(0.9, 0.999), eps=1e-8,weight_decay=0.01 # 推薦加上!默認值一般 0.01
)
-
lr=1e-4
:起始建議略小于 Adam;若是預訓練模型微調,用1e-5 ~ 3e-5
-
weight_decay=0.01
:這個值是有效的 L2 正則項,推薦設置! -
其他參數基本保留默認
🧪 三、實戰調參技巧
目的 | 推薦做法 | 說明 |
---|---|---|
Transformer 預訓練 | lr = 1e-4 ,weight_decay = 0.01 | 官方推薦設置 |
微調 BERT、Swin 等預訓練模型 | lr = 2e-5 或更小;weight_decay = 0.01 | 防止破壞已有參數 |
防止訓練不穩定 | 使用 warmup + 調度器 | transformer 很依賴 warmup 技術(見下) |
📉 搭配調度器(transformer常用):
from transformers import get_linear_schedule_with_warmupscheduler = get_linear_schedule_with_warmup(optimizer,num_warmup_steps=500, # 前500步線性升溫num_training_steps=10000 # 總訓練步數
)
?或者直接在pytorch中創建
from torch.optim.lr_scheduler import CosineAnnealingLR
scheduler = CosineAnnealingLR(optimizer, T_max=50)
?四、常見誤區與建議
-
不要用普通 Adam 加 weight_decay:請務必用 AdamW
-
?Transformer 必須用調度器(特別是 warmup),否則很容易訓練失敗
-
?直接使用 Adam 調高 weight_decay 會使收斂變差,原因為其 weight_decay 與標準 L2 不等價
?實戰總結:什么時候用 AdamW?
應用 | 推薦 |
---|---|
微調 BERT、Swin Transformer 等預訓練模型 | ??? |
醫學圖像分割中使用 Transformer 網絡 | ?? |
需要正則效果(防止過擬合) | ? |
新任務上做 baseline,想加入合理正則項 | ? |
?
?優化器三:SGD + Momentum(隨機梯度下降 + 動量)
?一、適用場景總結(實踐導向)
場景 | 是否推薦用 SGD+Momentum | 說明 |
---|---|---|
圖像分類(如 ResNet、VGG、DenseNet) | ??? | 默認優化器,經典高效 |
大規模數據訓練 | ?? | 表現穩定,泛化強 |
醫學圖像(圖像分割 / 分類)傳統CNN模型 | ?? | 與 AdamW 表現相當甚至更好 |
小數據集、快速測試 | ? 不推薦 | 收斂慢、對學習率更敏感 |
?二、PyTorch代碼與推薦參數設置
import torch
optimizer = torch.optim.SGD(model.parameters(),lr=0.1, # 高起始學習率momentum=0.9, # 動量系數weight_decay=5e-4, # 標準 L2 正則nesterov=True # 推薦開啟
)
-
lr=0.1
:SGD 起始學習率高!但需配合學習率調度器 -
momentum=0.9
:常用設定,加快收斂,減少振蕩 -
nesterov=True
:一般推薦打開,提升穩定性 -
weight_decay=5e-4
:這是傳統 ImageNet 設置的標準正則
?三、實戰調參技巧
目標 | 推薦設置 | 說明 |
---|---|---|
CNN訓練(ResNet、VGG) | lr = 0.1 ,調度器減半 | 不要一開始就設置太低 |
訓練早期不收斂 | 檢查 batch size 和 lr 配合 | batch size 變大時 lr 要增大(線性關系) |
想更快穩定收斂 | 開啟 nesterov=True ,調大 momentum | 對震蕩敏感任務更有效 |
中后期 loss 不再下降 | 加 MultiStepLR 、CosineAnnealingLR | 非自適應優化器必須調度 lr! |
📉 推薦調度器設置(圖像任務中常見)
from torch.optim.lr_scheduler import MultiStepLRscheduler = MultiStepLR(optimizer, milestones=[30, 60, 90], # 在這些 epoch 處學習率減半gamma=0.1
)
from torch.optim.lr_scheduler import CosineAnnealingLRscheduler = CosineAnnealingLR(optimizer, T_max=100)
?四、常見誤區與建議
-
?用默認學習率 0.01 或太小的 lr 會嚴重阻礙收斂
SGD 通常使用較大的初始 lr(0.1 是經典設置),但需要調度器配合!
-
?不使用調度器就用 SGD → 后期訓練停滯
學習率下降對于 SGD 是必須的!
-
?泛化能力更強:訓練慢但往往結果比 Adam 更好,常用于正式比賽、ImageNet 模型、CV base model 訓練
?實戰總結:什么時候用 SGD+Momentum?
應用 | 推薦 |
---|---|
圖像分類任務(ResNet 等) | ??? |
圖像分割中使用 CNN 結構(UNet) | ?? |
模型較淺,想減少過擬合 | ?? |
對訓練速度不敏感、追求最終精度 | ??? |
transformer 模型或 NLP任務 | ? 不推薦 |