《------往期经典推荐------》
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
目录
- 引言
- 1.随机梯度下降(SGD)
- 2.RMSprop(Root Mean Square Propagation)
- 3. Adagrad(自适应梯度算法)
- 4. Adam(Adaptive Moment Estimation)
- 5. Adadelta
- 6. AdamW
- 7. Nesterov Accelerated Gradient(NAG)
- 8.平均随机梯度下降
- 9. LBFGS
- 10.Resilient Backpropagation
- 总结
引言
优化器是训练模型的核心,因为它们确定权重更新。选择正确的优化器可以显著影响训练深度学习模型的有效性和速度。本文将介绍10个优化器以及如何在PyTorch中实现它们。
1.随机梯度下降(SGD)
SGD通过减去由学习率缩放的损失的梯度来更新参数。通常使用动量来建立随时间的连续更新,以获得更新权重的“正确方向”的越来越好的估计,即使该方向随时间变化。它简单,对凸问题有效,并用于许多模型,如
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.SGD(model.parameters(), lr=0.01)
2.RMSprop(Root Mean Square Propagation)
RMSprop维护平方梯度的移动平均值,将其归一化以处理非静止目标。推荐用于RNN,如InceptionV3,LSTM和GRU。
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.RMSprop(model.parameters(), lr=0.01)
3. Adagrad(自适应梯度算法)
Adagrad调整每个参数的学习率,对不常见的参数执行更大的更新。对稀疏数据有效,用于Word2Vec和文本分类器等模型。
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.Adagrad(model.parameters(), lr=0.01)
4. Adam(Adaptive Moment Estimation)
Adam结合了AdaGrad和RMSProp,根据低阶矩的估计来调整学习率。这是最推荐的默认优化器,因为它非常有效,并且对超参数选择非常健壮。适用于各种模型,数据集和应用程序,用于Transformer和GAN等模型。
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.Adam(model.parameters(), lr=0.001)
5. Adadelta
Adadelta是基于Adagrad的扩展,它使用梯度更新的移动窗口来调整学习速率,使其对CNN和RNN等深度网络具有鲁棒性。
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.Adadelta(model.parameters())
6. AdamW
AdamW类似于Adam,包括解耦的权重衰减,提高了优化性能和泛化能力。适用于BERT和GPT等大型模型。
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)
7. Nesterov Accelerated Gradient(NAG)
NAG在计算梯度之前应用动量更新,减少振荡并加速收敛。适合ResNet和VGG等深度卷积网络。可以非常快,但如果学习率太高,可能会出现分歧。
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, nesterov=True)
8.平均随机梯度下降
ASGD随着时间的推移对权重进行平均,以更好地泛化,稳定CNN和NLP模型等深度网络中的训练。
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.ASGD(model.parameters(), lr=0.01)
9. LBFGS
LBFGS (Limited-memory Broyden–Fletcher–Goldfarb–Shanno)使用有限的内存来近似BFGS算法,适用于Logistic回归和SVM等模型中的中小型数据集。可以有非常快的收敛速度,尽管在内存和运行时间方面代价很高。
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.LBFGS(model.parameters())
10.Resilient Backpropagation
Rprop基于偏导数的符号更新权重,对梯度大小具有鲁棒性,用于多层感知器。
代码示例:
import torch.optim as optim
import torch.nn as nn
from torch.nn import Transformer
model = Transformer()
optimizer = optim.Rprop(model.parameters(), lr=0.01)
总结
通常我们使用最多的优化器是SGD、Adam和AdamW
这几个优化器。因为它非常有效,并且对超参数的选择非常鲁棒。也就是说,优化器的超参数可能对深度学习模型的性能产生最大的影响,因此超参数调优至关重要。这意味着如果超参数选择正确,其他优化器可以在您的特定用例中也可能获得比较好的性能。
好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!