文章目錄
- 1 工作原理
- 2 常見優化器
- 2.1 SGD
- 2.2 Adam
- 3 優化器參數
- 4 學習率
- 5 使用最佳實踐
本文環境:
- Pycharm 2025.1
- Python 3.12.9
- Pytorch 2.6.0+cu124
? 優化器 (Optimizer) 是深度學習中的核心組件,負責根據損失函數的梯度來更新模型的參數,使模型能夠逐步逼近最優解。在 PyTorch 中,優化器通過torch.optim
模塊提供。
? Pytorch 鏈接:https://docs.pytorch.org/docs/stable/optim.html。
1 工作原理
? 優化器的工作流程如下:
- 計算損失函數的梯度 (通過
backward()
方法)。 - 根據梯度更新模型參數 (通過
step()
方法)。 - 清除之前的梯度 (通過
zero_grad()
方法)。
result_loss.backward() # 計算梯度
optim.step() # 更新參數
optim.zero_grad() # 清除梯度
2 常見優化器
? PyTorch 提供多種優化器,以 SGD 和 Adam 為例。
2.1 SGD
? 基礎優化器,可以添加動量 (momentum) 來加速收斂。

參數 | 類型 | 默認值 | 作用 | 使用建議 |
---|---|---|---|---|
params | iterable | - | 待優化參數 | 必須傳入model.parameters() 或參數組字典,支持分層配置 |
lr | float | 1e-3 | 學習率 | 控制參數更新步長,SGD常用0.01-0.1,Adam常用0.001 |
momentum | float | 0 | 動量因子 | 加速梯度下降(Adam內置動量,無需單獨設置) |
dampening | float | 0 | 動量阻尼 | 抑制動量震蕩(僅當momentum>0時生效) |
weight_decay | float | 0 | L2正則化 | 防止過擬合,AdamW建議0.01-0.1 |
nesterov | bool | False | Nesterov動量 | 改進版動量法(需momentum>0) |
maximize | bool | False | 最大化目標 | 默認最小化損失,True時改為最大化 |
foreach | bool | None | 向量化實現 | CUDA下默認開啟,內存不足時禁用 |
differentiable | bool | False | 可微優化 | 允許優化器步驟參與自動微分(影響性能) |
fused | bool | None | 融合內核 | CUDA加速,支持float16/32/64/bfloat16 |
2.2 Adam

- 特點:自適應矩估計,結合了動量法和 RMSProp 的優點。
- 優點:通常收斂速度快,對學習率不太敏感。
參數名稱 | 類型 | 默認值 | 作用 | 使用建議 |
---|---|---|---|---|
params | iterable | - | 需要優化的參數(如model.parameters() ) | 必須傳入,支持參數分組配置 |
lr | float | 1e-3 | 學習率(控制參數更新步長) | 推薦0.001起調,CV任務可嘗試0.0001-0.01 |
betas | (float, float) | (0.9, 0.999) | 梯度一階矩(β?)和二階矩(β?)的衰減系數 | 保持默認,除非有特殊需求 |
eps | float | 1e-8 | 分母穩定項(防止除以零) | 混合精度訓練時可增大至1e-6 |
weight_decay | float | 0 | L2正則化系數 | 推薦0.01-0.1(使用AdamW時更有效) |
decoupled_weight_decay | bool | False | 啟用AdamW模式(解耦權重衰減) | 需要權重衰減時建議設為True |
amsgrad | bool | False | 使用AMSGrad變體(解決收斂問題) | 訓練不穩定時可嘗試啟用 |
foreach | bool | None | 使用向量化實現加速(內存消耗更大) | CUDA環境下默認開啟,內存不足時禁用 |
maximize | bool | False | 最大化目標函數(默認最小化) | 特殊需求場景使用 |
capturable | bool | False | 支持CUDA圖捕獲 | 僅在圖捕獲場景啟用 |
differentiable | bool | False | 允許通過優化器步驟進行自動微分 | 高階優化需求啟用(性能下降) |
fused | bool | None | 使用融合內核實現(需CUDA) | 支持float16/32/64時啟用可加速 |
3 優化器參數
? 所有優化器都接收兩個主要參數:
params
:要優化的參數,通常是model.parameters()
。lr
:學習率(learning rate),控制參數更新的步長。
? 其他常見參數:
weight_decay
:L2 正則化系數,防止過擬合。momentum
:動量因子,加速 SGD 在相關方向的收斂。betas
(Adam 專用):用于計算梯度及其平方的移動平均的系數。
4 學習率
? 學習率是優化器中最重要的超參數之一。
- 太大:可能導致震蕩或發散。
- 太小:收斂速度慢。
- 常見策略:
- 固定學習率 (如代碼中的 0.01)。
- 學習率調度器 (Learning Rate Scheduler) 動態調整。
5 使用最佳實踐
- 梯度清零:每次迭代前調用
optimizer.zero_grad()
,避免梯度累積。 - 參數更新順序:先
backward()
再step()
。 - 學習率選擇:可以從默認值開始 (如 Adam 的 0.001),然后根據效果調整。
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoaderdataset = torchvision.datasets.CIFAR10(root='./dataset', # 保存路徑train=False, # 是否為訓練集transform=torchvision.transforms.ToTensor(), # 轉換為張量download=True # 是否下載
)dataloader = DataLoader(dataset, batch_size=1)class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.model = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2),nn.Flatten(),nn.Linear(64 * 4 * 4, 64),nn.Linear(64, 10))def forward(self, x):return self.model(x)loss = nn.CrossEntropyLoss()
model = MyModel()
torch.optim.Adam(model.parameters(), lr=0.01)
optim = torch.optim.SGD(model.parameters(), lr=0.01)for epoch in range(20):running_loss = 0.0# 遍歷dataloader中的數據for data in dataloader:# 獲取數據和標簽imgs, targets = data# 使用模型對數據進行預測output = model(imgs)# 計算預測結果和真實標簽之間的損失result_loss = loss(output, targets)# 將梯度置零optim.zero_grad()# 反向傳播計算梯度result_loss.backward()# 更新模型參數optim.step()running_loss += result_lossprint(f'第 {epoch + 1} 輪的損失為 {running_loss}')