優(yōu)化算法三劍客:SGD、Adam、AdamW的深度對比
優(yōu)化算法三劍客:SGD、Adam、AdamW的深度對比
1. 引言:模型訓(xùn)練的"導(dǎo)航系統(tǒng)"
想象一下,你正在一個復(fù)雜的地形中尋找最低點(最小損失),四周濃霧彌漫(高維空間不可視)。優(yōu)化算法就是你的GPS導(dǎo)航系統(tǒng),它決定著你如何一步步走向目的地。
今天我們要認識三位風(fēng)格迥異的"導(dǎo)航員":穩(wěn)重的老將SGD、靈活的Adam和精致的AdamW。讓我們一起來看看它們各自的看家本領(lǐng)!
2. 隨機梯度下降(SGD):大道至簡
2.1 核心思想
SGD就像一位經(jīng)驗豐富的登山老人,他相信"欲速則不達",每一步都腳踏實地。
基本公式:
$$θ_{t+1} = θ_t - η · ?J(θ_t)$$其中:
- ?
θ_t?:第t步的模型參數(shù) - ?
η?:學(xué)習(xí)率(步長) - ?
?J(θ_t)?:損失函數(shù)在θ_t?處的梯度
2.2 代碼示例
import torch import torch.nn as nn簡單線性回歸示例
model = nn.Linear(10, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)訓(xùn)練循環(huán)
for epoch in range(100):
# 前向傳播
outputs = model(inputs)
loss = criterion(outputs, labels)# 反向傳播 optimizer.zero_grad() loss.backward() # SGD更新:簡單直接的參數(shù)更新 optimizer.step()
2.3 優(yōu)缺點分析
優(yōu)點:
- ? 簡單易懂,理論成熟
- ? 通常能找到更泛化的解
- ? 對學(xué)習(xí)率調(diào)度友好
缺點:
- ? 收斂速度較慢
- ? 對學(xué)習(xí)率敏感
- ? 容易陷入局部最優(yōu)
3. Adam:自適應(yīng)學(xué)習(xí)率的王者
3.1 核心思想
Adam就像一位聰明的年輕向?qū)?/strong>,他會根據(jù)地形自動調(diào)整步伐,陡坡小步走,平路大步跑。
Adam公式分解:
一階矩估計(動量項):
$$m_t = β_1 · m_{t-1} + (1 - β_1) · g_t$$二階矩估計(自適應(yīng)學(xué)習(xí)率):
$$v_t = β_2 · v_{t-1} + (1 - β_2) · g_t2$$偏差校正:
$$m?_t = m_t / (1 - β_1^t) \\ v?_t = v_t / (1 - β_2^t)$$參數(shù)更新:
$$θ_t = θ_{t-1} - η · m?_t / (\sqrt(v?_t) + ε)$$3.2 形象比喻
想象你在下山:
- m_t:考慮了你之前的方向,避免"之字形"走法
- v_t:根據(jù)坡度調(diào)整步長,陡的地方小步走
3.3 代碼示例
# 同樣的模型,使用Adam優(yōu)化器 model = nn.Linear(10, 1) optimizer = torch.optim.Adam( model.parameters(), lr=0.001, # 通常更小的學(xué)習(xí)率 betas=(0.9, 0.999), # 一階和二階矩的衰減率 eps=1e-8 # 數(shù)值穩(wěn)定性項 )訓(xùn)練流程相同,但內(nèi)部更新機制更智能
3.4 優(yōu)缺點分析
優(yōu)點:
- ? 收斂速度快
- ? 對學(xué)習(xí)率不敏感
- ? 適合稀疏梯度場景
缺點:
- ? 可能泛化性能不如SGD
- ? 內(nèi)存占用稍大
- ? 超參數(shù)更多
4. AdamW:權(quán)重衰減的正確打開方式
4.1 核心問題:L2正則化 ≠ 權(quán)重衰減
這是一個很多人的認知誤區(qū)!在Adam中,傳統(tǒng)的L2正則化與自適應(yīng)學(xué)習(xí)率機制會產(chǎn)生不良相互作用。
Adam vs AdamW的區(qū)別:
# Adam (錯誤的方式) gradient = gradient + weight_decay * parameter parameter = parameter - learning_rate * adapted_gradientAdamW (正確的方式)
parameter = parameter - learning_rate * (adapted_gradient + weight_decay * parameter)
數(shù)學(xué)表達:
Adam with L2 regularization:
$$θ_t = θ_{t-1} - η · m?_t / (√v?_t + ε) - ηλθ_{t-1}$$AdamW with decoupled weight decay:
$$θ_t = θ_{t-1} - η · (m?_t / (√v?_t + ε) + λθ_{t-1})$$4.2 核心思想
AdamW就像一位注重細節(jié)的工程師,他發(fā)現(xiàn)Adam的"小毛病"并進行了精準(zhǔn)修復(fù)。
4.3 代碼示例
# 使用AdamW
model = nn.Linear(10, 1)
optimizer = torch.optim.AdamW(
model.parameters(),
lr=0.001,
weight_decay=0.01, # 現(xiàn)在這是真正的權(quán)重衰減!
betas=(0.9, 0.999)
)
4.4 為什么重要?
在計算機視覺和Transformer模型中,AdamW通常比Adam表現(xiàn)更好,因為它實現(xiàn)了真正的權(quán)重衰減,有助于模型更好地泛化。
5. 三劍客對比:各顯神通
5.1 性能對比表格
| 特性 | SGD | Adam | AdamW |
|---|---|---|---|
| 收斂速度 | 慢 | 快 | 快 |
| 超參數(shù)敏感度 | 高 | 中 | 中 |
| 內(nèi)存占用 | 小 | 中 | 中 |
| 泛化性能 | 優(yōu) | 良 | 優(yōu) |
| 使用難度 | 易 | 易 | 易 |
| 適用場景 | 簡單模型、調(diào)優(yōu)好的場景 | 默認選擇、復(fù)雜模型 | 計算機視覺、Transformer |
5.2 選擇指南
選擇SGD當(dāng):
- 你有時間和計算資源進行充分調(diào)優(yōu)
- 追求最好的泛化性能
- 配合優(yōu)秀的學(xué)習(xí)率調(diào)度器
選擇Adam當(dāng):
- 你需要快速原型開發(fā)
- 處理稀疏梯度問題
- 不想花太多時間調(diào)參
選擇AdamW當(dāng):
- 訓(xùn)練Transformer模型(BERT、GPT等)
- 計算機視覺任務(wù)
- 想要Adam的便利+更好的泛化
6. 實戰(zhàn)建議
6.1 學(xué)習(xí)率設(shè)置經(jīng)驗
# 典型的學(xué)習(xí)率設(shè)置 SGD_lr = 0.01 # 相對較大 Adam_lr = 0.001 # 相對較小 AdamW_lr = 0.001 # 與Adam類似權(quán)重衰減設(shè)置
Adam_weight_decay = 0 # 通常不用
AdamW_weight_decay = 0.01 # 常用值
6.2 實際應(yīng)用場景
# 場景1:簡單的全連接網(wǎng)絡(luò) optimizer = torch.optim.Adam(model.parameters(), lr=0.001)場景2:訓(xùn)練ResNet
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
場景3:BERT微調(diào)
optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5, weight_decay=0.01)
7. 總結(jié):沒有銀彈,只有合適
通過我們的對比,可以看到:
- SGD 像老匠人,需要經(jīng)驗但能出精品
- Adam 像現(xiàn)代工具,開箱即用效率高
- AdamW 像精密儀器,在特定場景表現(xiàn)卓越
實踐建議:
- 初學(xué)者從Adam開始
- 追求極致性能考慮SGD+精心調(diào)參
- Transformer和CV任務(wù)優(yōu)先嘗試AdamW
記住,優(yōu)化算法的選擇不是絕對的,最好的方法是在你的具體任務(wù)上進行實驗驗證!
希望這篇博客能幫助你更好地理解這三種優(yōu)化算法。Happy training!

浙公網(wǎng)安備 33010602011771號