目录
1、批量梯度下降(Batch Gradient Descent, BGD)
2、小批量梯度下降(Mini-Batch Gradient Descent, MBGD)
4. 带动量的 SGD(SGD with Momentum)
5、Nesterov 动量加速(Nesterov Accelerated Gradient, NAG)
6、AdaGrad(Adaptive Gradient Algorithm)
7、 RMSProp(Root Mean Square Propagation均方根传播)
8、Adam(Adaptive Moment Estimation自适应矩估计)(适合大部分任务,是通用优化器。)
9、 AdamW(Adam with Weight Decay)
11、LAMB(Layer-wise Adaptive Moments optimizer for Batch training)
参考文章:
在讲解之前,有一个概念:学习率!
学习率(Learning Rate, lr
)是深度学习模型训练中至关重要的超参数,在使用优化器(如 SGD、Adam 等)时,学习率决定了模型在每次迭代中参数的调整幅度。较大的学习率可以加速收敛,但可能会导致模型错过全局最优点甚至发散;较小的学习率则收敛较慢,但能更精细地逼近全局最优点。合适的学习率能够让模型在合理的时间内达到最优性能。
学习率的类型:
-
常数学习率:在整个训练过程中保持学习率不变。例如
lr=0.01
。 -
自适应学习率:随着训练进展自动调整学习率(如在 Adam、RMSprop 中)。
-
学习率调度器:根据设定规则逐步衰减学习率,例如每隔若干轮训练减少一半学习率,或在达到特定条件后调整学习率。如
StepLR
、ExponentialLR
,可以结合使用。例如# 常数学习率 optimizer = optim.SGD(model.parameters(), lr=0.01) # 使用学习率调度器 scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1) # 其中 step_size 表示每 10 轮训练后学习率缩小为原来的 10%
优化器用于更新神经网络的权重,以减少或最小化损失函数(loss function)的值以提高模型准确性,同时,优化器还能根据损失函数的梯度调整学习速率,帮助模型更好地学习,避免在训练过程中陷入局部最小值。下面是常见的优化器。
1、批量梯度下降(Batch Gradient Descent, BGD)
原理:在每次迭代中,利用整个训练集计算一次梯度,然后更新参数。其更新公式如下:
优缺点:梯度估计精确,收敛稳定。但每次迭代都使用整个训练集,计算代价高,不适合大规模数据。
PyTorch 实现: 在实际中,PyTorch 的 DataLoader
可以灵活设置 batch_size
,批量梯度下降一般会使用一个较大的 batch_size
,如 batch_size = len(dataset)
。
2、小批量梯度下降(Mini-Batch Gradient Descent, MBGD)
原理:在每次迭代中,随机抽取一个小批量(mini-batch)数据来计算梯度,再更新参数。更新公式为:
优缺点:计算效率高,适合大规模数据;平衡了 SGD 的噪声和 BGD 的计算量。但对小批量大小较为敏感,不同批次之间的更新方向可能不一致,可能造成震荡。
PyTorch 使用: 在 PyTorch 中,可以通过 DataLoader
设置 batch_size
来实现小批量梯度下降。常用的小批量大小为 16、32 或 64:
from torch.utils.data import DataLoader # 导入 PyTorch 的 DataLoader 类,用于数据加载
# 创建数据加载器 train_loader
train_loader = DataLoader(
dataset, # 数据集对象,包含所有样本和标签
batch_size=32, # 每批次加载 32 个样本,设置适合的批次大小可平衡内存使用和计算效率
shuffle=True # 是否在每个 epoch 前随机打乱数据集,shuffle=True 能提升模型的泛化能力
)
在训练过程中,通常会在循环中按小批量处理数据。例如:
for inputs, labels in train_loader: # 遍历数据加载器,每次迭代获取一批次数据(inputs)及其标签(labels)
optimizer.zero_grad() # 清零上一轮的梯度信息,避免梯度累积影响当前梯度计算
outputs = model(inputs) # 前向传播:将输入数据传入模型,获取预测输出(outputs)
loss = criterion(outputs, labels) # 计算损失:使用损失函数(criterion)计算预测值和真实值之间的误差
loss.backward() # 反向传播:计算损失对模型参数的梯度
optimizer.step() # 更新参数:利用优化器根据梯度信息更新模型参数
3、随机梯度下降(SGD)(最常见的优化器之一)
原理:每次更新参数时,使用当前数据的梯度。更新公式如下:
优缺点:简单易用,但当梯度方向变化较大时,容易在局部最小值陷入震荡。
PyTorch 使用:
import torch.optim as optim # 导入 PyTorch 的优化器模块
# 使用随机梯度下降(SGD)优化器创建模型参数的优化器
optimizer = optim.SGD(
model.parameters(), # 指定需要优化的参数,即模型的所有参数
lr=0.01 # 设置学习率(learning rate),控制每次参数更新的步长,较小的学习率有助于稳定收敛
)
4. 带动量的 SGD(SGD with Momentum)
原理:在 SGD 基础上增加了动量(Momentum),通过累计梯度变化,提升梯度在相同方向上的速度,减缓垂直方向的震荡。更新公式如下:
优点:加速收敛,减缓震荡,适合处理有噪声的梯度。
PyTorch 使用:
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
5、Nesterov 动量加速(Nesterov Accelerated Gradient, NAG)
原理:相比普通动量 SGD,NAG 会先根据当前速度估计一个位置,再计算该位置的梯度,用这个梯度更新参数,使优化更精确。更新公式如下:
优点:在梯度方向快速变化的情况下,NAG 比普通动量能更早感知梯度变化,从而更准确地更新。
PyTorch 使用:
import torch.optim as optim # 导入 PyTorch 的优化器模块
# 使用 Nesterov 动量加速的随机梯度下降优化器
optimizer = optim.SGD(
model.parameters(), # 需要优化的参数,即模型的所有参数
lr=0.01, # 设置学习率,决定每次更新的步长
momentum=0.9, # 动量系数,用于加速收敛并减少震荡
nesterov=True # 启用 Nesterov 动量加速
)
6、AdaGrad(Adaptive Gradient Algorithm)
原理:自适应地调整每个参数的学习率,对于稀疏的参数更新较快。更新公式如下:
优缺点:适合稀疏数据,但会导致学习率不断缩小,可能导致收敛过早。
PyTorch 使用:
optimizer = optim.Adagrad(model.parameters(), lr=0.01)
7、 RMSProp(Root Mean Square Propagation均方根传播)
原理:RMSProp 通过指数加权移动平均来控制学习率,使得学习率可以在训练中动态适应。更新公式如下:
优点:适合处理不平衡数据的梯度更新,尤其在 RNN 中效果显著。
PyTorch 使用:
optimizer = optim.RMSprop(model.parameters(), lr=0.01, alpha=0.9)
#alpha 是动量项的衰减因子,用于计算梯度的均值平方。
#如果设置过高,可能会导致步长变小,更新速度慢;如果过低,则可能使优化过程不稳定。
8、Adam(Adaptive Moment Estimation自适应矩估计)(适合大部分任务,是通用优化器。)
原理:Adam 结合了动量和 RMSProp 的优势,通过自适应调整学习率。更新公式如下:
优点:适合大型数据集和高维空间,通常是深度学习中的首选优化器。
PyTorch 使用:
optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999))
#betas 控制两个动量项的指数加权平均,(0.9, 0.999) 是通常的默认值。
#第一个值影响一阶动量(均值),第二个值影响二阶动量(方差)。不同任务中可以根据梯度波动程度适当调整这两个值。
注意:虽然MSprop 和 Adam 确实是自适应学习率算法,因为它们会根据每个参数的梯度大小来自动调整步长。然而,设置 lr
(学习率)仍然很重要,因为它决定了这些自适应调整的整体步长的基准。因为自适应学习率只是相对调整每个参数的步长,lr
决定的是这些调整在整体上的放大或缩小。例如,lr=0.01
表示所有的自适应步长都会以 0.01
为基础放大或缩小。
9、 AdamW(Adam with Weight Decay)
原理:在 Adam 基础上加入了权重衰减(weight decay),用于正则化(但不是 L2 正则化),减轻过拟合。更新过程与 Adam 类似,但对每次更新的参数施加权重衰减。AdamW 在许多深度学习任务中表现优于 Adam。
PyTorch 使用:
optimizer = optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
10、RAdam(Rectified Adam)
原理:RAdam 是 Adam 的一种变体,通过调整学习率来适应当前的训练步数,避免了 Adam 中因初始学习率过大带来的不稳定性。更新公式如下:优点:适用于需要更稳定收敛的模型训练场景。
PyTorch 实现:需要安装 torch-optimizer
库。
from torch_optimizer import RAdam
optimizer = RAdam(model.parameters(), lr=0.001)
11、LAMB(Layer-wise Adaptive Moments optimizer for Batch training)
原理:LAMB 针对大批量数据设计,适合处理大规模分布式训练,尤其在 BERT 等大规模预训练模型中效果显著。更新公式如下:优点:在不牺牲精度的情况下可以使用更大批次的训练,提高计算效率。
PyTorch 实现:需要安装 torch-optimizer
库。
from torch_optimizer import Lamb
optimizer = Lamb(model.parameters(), lr=0.001)
12、Lookahead
原理:Lookahead 在已有优化器的基础上增加了“慢更新”和“快更新”机制,使得模型在解空间中进行更稳定的探索,有助于减少过拟合。
更新公式如下:优点:可以提高模型训练的稳定性和泛化能力。
PyTorch 实现:可以结合其他优化器(例如 Adam)使用。
from torch_optimizer import Lookahead
base_optimizer = optim.Adam(model.parameters(), lr=0.001)
optimizer = Lookahead(base_optimizer=base_optimizer, k=5, alpha=0.5)
别忘了给这篇文章点个赞哦,非常感谢。我也正处于学习的过程,可能会有错,如果有问题,欢迎在评论区留言讨论,一起学习!