????????PyTorch 提供了多種優化算法用于神經網絡的參數優化。以下是對 PyTorch 中主要優化器的全面介紹,包括它們的原理、使用方法和適用場景。
一、基本優化器
1. SGD (隨機梯度下降)
torch.optim.SGD(params, lr=0.01, momentum=0, dampening=0, weight_decay=0, nesterov=False)
-
特點:
-
最基本的優化器
-
可以添加動量(momentum)加速收斂
-
支持Nesterov動量
-
-
參數:
-
lr
: 學習率(必需) -
momentum
: 動量因子(0-1) -
weight_decay
: L2正則化系數
-
-
適用場景: 大多數基礎任務
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
2. Adam (自適應矩估計)
torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
-
特點:
-
自適應學習率
-
結合了動量法和RMSProp的優點
-
通常需要較少調參
-
-
參數:
-
betas
: 用于計算梯度及其平方的移動平均系數 -
eps
: 數值穩定項 -
amsgrad
: 是否使用AMSGrad變體
-
-
適用場景: 深度學習默認選擇
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
二、自適應優化器
1. Adagrad
torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0, initial_accumulator_value=0)
-
特點:
-
自適應學習率
-
為每個參數保留學習率
-
適合稀疏數據
-
-
缺點: 學習率會單調遞減
2. RMSprop
torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)
-
特點:
-
解決Adagrad學習率急劇下降問題
-
適合非平穩目標
-
常用于RNN
-
?3. Adadelta
torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)
-
特點:
-
不需要設置初始學習率
-
是Adagrad的擴展
-
三、其他優化器?
1. AdamW
torch.optim.AdamW(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.01, amsgrad=False)
-
特點:
-
Adam的改進版
-
更正確的權重衰減實現
-
通常優于Adam
-
2. SparseAdam
torch.optim.SparseAdam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08)
-
特點: 專為稀疏張量優化
3. LBFGS?
torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-07, tolerance_change=1e-09, history_size=100)
-
特點:
-
準牛頓方法
-
內存消耗大
-
適合小批量數據
-
四、優化器選擇指南
優化器 | 適用場景 | 優點 | 缺點 |
---|---|---|---|
SGD | 基礎任務 | 簡單可控 | 需要手動調整學習率 |
SGD+momentum | 大多數任務 | 加速收斂 | 需要調參 |
Adam | 深度學習默認 | 自適應學習率 | 可能不如SGD泛化好 |
AdamW | 帶權重衰減的任務 | 更正確的實現 | - |
Adagrad | 稀疏數據 | 自動調整學習率 | 學習率單調減 |
RMSprop | RNN/非平穩目標 | 解決Adagrad問題 | - |
五、學習率調度器
PyTorch還提供了學習率調度器,可與優化器配合使用:
# 創建優化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 創建調度器
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)# 訓練循環中
for epoch in range(100):train(...)validate(...)scheduler.step() # 更新學習率
常用調度器:
-
LambdaLR
: 自定義函數調整 -
MultiplicativeLR
: 乘法更新 -
StepLR
: 固定步長衰減 -
MultiStepLR
: 多步長衰減 -
ExponentialLR
: 指數衰減 -
CosineAnnealingLR
: 余弦退火 -
ReduceLROnPlateau
: 根據指標動態調整
六、優化器使用技巧
-
參數分組: 不同層使用不同學習率
optimizer = torch.optim.SGD([{'params': model.base.parameters(), 'lr': 0.001},{'params': model.classifier.parameters(), 'lr': 0.01} ], momentum=0.9)
-
梯度裁剪: 防止梯度爆炸
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
-
零梯度: 每次迭代前清空梯度
optimizer.zero_grad() loss.backward() optimizer.step()
?