总述
优化器两个家族:SGD & Adam。
对于传统CV领域,SGD收敛慢但是泛化性好,Adam反之。但是对GAN这种复杂网络,Adam效果更好。
目前我应用于imagenet训练,SGD已经取得很好的效果,想找一些更好的优化器。
AdaBelief (NeurIPS-2020)
论文链接:https://arxiv.org/pdf/2010.07468.pdf
代码链接:https://github.com/juntang-zhuang/Adabelief-Optimizer
【核心思想】:观测梯度与预测梯度比较,如果差距很小,就走比较大的一步,反之。所以称为梯度方向上的belief。
【安装和使用】:
pip install adabelief-pytorch==0.2.0
from adabelief_pytorch import AdaBelief
optimizer = AdaBelief(model.parameters(), lr=1e-3, eps=1e-16, betas=(0.9,0.999), weight_decouple = True, rectify = False)
【参数设置参考】
Task | lr | beta1 | beta2 | epsilon | weight_decay | weight_decouple | rectify | fixed_decay | amsgrad |
---|---|---|---|---|---|---|---|---|---|
Cifar | 1e-3 | 0.9 | 0.999 | 1e-8 | 5e-4 | False | False | False | False |
ImageNet | 1e-3 | 0.9 | 0.999 | 1e-8 | 1e-2 | True | False | False | False |
AdaHessian (AAAI-2021)
代码链接: GitHub - amirgholami/adahessian: ADAHESSIAN: An Adaptive Second Order Optimizer for Machine Learning
论文链接: https://arxiv.org/pdf/2006.00719.pdf
AdaHessian是一种基于PyTorch的二阶神经网络训练优化器。该库支持卷积神经网络(image_classification)和基于变压器的模型(transformer)的训练。
【spotlight】:克服传统二阶算法迭代计算量大的问题
【安装和使用】:
git clone https://github.com/amirgholami/adahessian.git
from optim_adahessian import Adahessian
optimizer = Adahessian(model.parameters())
pip install torch_optimizer
import torch_optimizer as optim
# model = ...
optimizer = optim.Adahessian(
m.parameters(),
lr= 1.0,
betas= (0.9, 0.999)
eps= 1e-4,
weight_decay=0.0,
hessian_power=1.0,
)
loss_fn(m(input), target).backward(create_graph = True) # create_graph=True is necessary for Hessian calculation
optimizer.step()
AdaBound (ICLR-2019)
代码链接:GitHub - Luolc/AdaBound: An optimizer that trains as fast as Adam and as good as SGD.
论文链接:https://openreview.net/pdf?id=Bkg3g2R9FX
利用学习速率的动态边界来实现从自适应方法到SGD的渐进和平稳过渡
【安装和使用】:
pip install adabound
optimizer = adabound.AdaBound(model.parameters(), lr=1e-3, final_lr=0.1)
Descending through a Crowded Valley - Benchmarking Deep Learning Optimizers (ICML-2021)
论文:http://proceedings.mlr.press/v139/schmidt21a/schmidt21a.pdf
选择了15种常用优化器和8个深度学习问题,对于每个问题和优化器,评估了四种不同调优预算和四种选定的学习率计划的所有可能组合,并用它分析了1,920种可能的配置方案。
结论:
1、优化器的性能,在不同的任务中有很大差异;
2、事实上,大部分优化器的性能惊人地相似,目前尚没有“最通用”的优化方法;
3、对优化器进行(参数)微调,其实和选择优化器一样重要、甚至更重要。
随机加权平均(SWA)
Stochastic Weight Averaging in PyTorch | PyTorch
PyTorch官方推荐!SWA:不增加推理时间提高泛化能力的集成方法
from torchcontrib.optim import SWA
# training loop
base_opt = torch.optim.SGD(model.parameters(), lr=0.1)
opt = torchcontrib.optim.SWA(base_opt, swa_start=10, swa_freq=5, swa_lr=0.05)
for _ in range(100):
opt.zero_grad()
loss_fn(model(input), target).backward()
opt.step()
opt.swap_swa_sgd()
# 对于BN层,还需要加上
opt.bn_update(train_loader,model)