1. 介绍
torch.optim 是PyTorch库中的一个优化器模块,用于实现各种优化算法。优化器模块提供了一系列优化算法,如随机梯度下降(SGD)、Adam、Adagrad 等。这些优化算法用于调整神经网络的权重和学习率,以最小化损失函数。通过优化算法,可以帮助神经网络更快地收敛到最优解,提高训练效率和准确率。
2. 常见的优化算法
1. SGD 算法
class torch.optim.SGD(params, lr=0.001, momentum=0, dampening=0, weight_decay=0, nesterov=False, *, maximize=False, foreach=None, differentiable=False, fused=None)
optim.SGD 是 torch.optim 模块中的随机梯度下降(SGD)优化器类。它的参数介绍如下:
- params:包含网络参数的可迭代对象。通常使用模型的 parameters() 方法来获取网络的参数。 eg: SGD(myModule_1.parameters(),lr=0.01) 来优化模型的所有参数
- lr:学习率(learning rate),用于控制权重更新的步长。默认值为0.001。
- momentum:动量参数,用于加速梯度下降算法。默认值为0。
- dampening:动量的抑制因子。默认值为0。
- weight_decay:权重衰减参数,用于控制模型的正则化项。默认值为0。
- nesterov:是否使用 Nesterov 动量。默认值为False。
SGD 优化器通过调整网络的权重来最小化损失函数,核心思想是通过计算损失函数的梯度,沿着梯度的反方向更新网络的权重,从而逐步接近最优解。学习率决定了每次更新的步长,动量则决定了更新方向的惯性。通过调整学习率和动量的大小,可以影响优化过程的速度和稳定性。
注意:在使用时 需要:
optim = torch.optim.SGD(myModule_1.parameters(),lr=0.01)
# 模型优化的步骤:
# 首先 需要将 数据清零,再进行反向传播与优化
optim.zero_grad() # 将 数据 清零 result_loss.backward() # 反向传播,求出每个节点的梯度 optim.step() # 进行调优
示例:
import torch.optim
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential, CrossEntropyLoss
from torch.utils.data import DataLoader
input = torchvision.datasets.CIFAR10("../TorchVersion/dataset",train=True,
transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(input,batch_size=64)
class myModule(nn.Module):
def __init__(self):
super(myModule, self).__init__()
self.module1 = Sequential(
Conv2d(3, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Flatten(), # 展平
Linear(1024, 64),
Linear(64, 10)
)
def forward(self,x):
x = self.module1(x)
return x
myModule_1 = myModule()
cross_loss = CrossEntropyLoss()
optim = torch.optim.SGD(myModule_1.parameters(),lr=0.01)
for epoch in range(10):
running_loss = 0.0
for data in dataloader:
img, target = data
output = myModule_1(img)
result_loss = cross_loss(output,target)
optim.zero_grad() # 将 数据 清零
result_loss.backward() # 反向传播,求出每个节点的梯度
optim.step() # 进行调优
# 计算每一 epoch 的损失总值,判断是否完成了优化
running_loss = running_loss + result_loss
print(running_loss)
2. Adam 算法
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False, *, foreach=None, maximize=False, capturable=False, differentiable=False, fused=None)
- params:这是一个包含模型参数的迭代器,或者是定义了参数组的字典。这些参数是在训练过程中需要被优化的变量。
- lr(学习率):一个浮点数,表示每个参数更新的步长。学习率是一个重要的超参数,它决定了模型在学习过程中的速度和稳定性。
- betas:一个包含两个浮点数的元组,通常设置为(0.9, 0.999)。这两个值分别控制一阶矩估计和二阶矩估计的指数移动平均的系数。它们有助于调整优化器的动量。
- eps:一个小的正数,用于增加数值计算的稳定性。默认值为10−810^{-8}10−8。
- weight_decay:一个浮点数,表示权重衰减(L2正则化)的系数。权重衰减有助于防止过拟合,通过在损失函数中添加权重的平方和来实现。
Adam算法是在2014年提出的一种基于一阶梯度的优化算法,它结合了动量(Momentum)和RMSprop(Root Mean Square Propagation)的思想,自适应地调整每个参数的学习率。
Adam算法的核心在于计算每个参数的一阶矩(即梯度的均值)和二阶矩(即梯度的未中心化方差)的指数移动平均,并利用这些矩的估计值来调整每个参数的学习率。
标签:loss,optim,torch,算法,Pytorch,参数,优化 From: https://blog.csdn.net/SILVERCROWNAGE/article/details/141362800Adam 算法梯度的对角缩放(diagonal rescaling)具有不变性,因此很适合求解带有大规模数据或参数的问题。该算法同样适用于解决大噪声和稀疏梯度的非稳态(non-stationary)问题。超参数可以很直观地解释,并只需要少量调整。