Adam(Adaptive Moment Estimation)
在 SGD 基礎上,自動幫每個參數調 learning rate,還順便幫你加好 momentum。
可以把 Adam 想成:
-
自動幫你加好「動量」,讓 loss 比較平滑下降(不會亂抖)
-
自動幫「每個參數」調整合適的步伐(learning rate),不需要你一直調來調去
特點:自適應學習率,每個參數有獨立的學習率
optimizer = optim.Adam(
model.parameters(),
lr=1e-3, # 學習率
betas=(0.9, 0.999), # 一階和二階動量的衰減率
eps=1e-8, # 數值穩定性
weight_decay=0, # 注意:在 Adam 中不建議使用
amsgrad=False # 是否使用 AMSGrad 變體
)
參數說明:
| 參數 | 說明 | 推薦值 |
|---|---|---|
lr | 學習率 | 1e-3 ~ 1e-4 |
betas | (β1, β2) 動量參數 | (0.9, 0.999) |
eps | 防止除零 | 1e-8 |
weight_decay | 不建議使用 | 0 |
數學原理(簡化):
m_t = β1 × m_(t-1) + (1-β1) × gradient # 一階動量
v_t = β2 × v_(t-1) + (1-β2) × gradient² # 二階動量
weight_new = weight - lr × m_t / (√v_t + ε)
優點:
-
收斂快速
-
對學習率不敏感
-
適合大多數問題
缺點:
-
weight_decay 實作有問題(使用 AdamW 代替)
-
泛化能力略遜於 SGD
-
容易在訓練後期震盪
什麼情況我會建議你用 Adam?
-
剛設計一個新 CNN 架構,想先確定「這個模型有沒有基本可學性」:用 Adam,好收斂
-
資料不是超級大、你比較在意「快點收斂到一個 ok 的結果」而不是 squeeze 出最後 1~2%:用 Adam
-
你目前還不太熟調 learning rate schedule:用 Adam 可以少踩坑一點
等你比較熟了,想追更好泛化(test accuracy)時,可以再嘗試從 Adam 換成 SGD+Momentum。
相關筆記
- 優化器:優化器總覽
- RMSprop:Adam 的二階動量來源
- AdamW(Adam with Weight Decay):修正 Adam 的 L2 正則化問題