深度学习优化器

总述

优化器两个家族: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)

代码链接: https://github.com/amirgholami/adahessian 

论文链接: 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

项目地址:GitHub - SirRob1997/Crowded-Valley---Results: This repository contains the results for the paper: "Descending through a Crowded Valley - Benchmarking Deep Learning Optimizers"

选择了15种常用优化器和8个深度学习问题,对于每个问题和优化器,评估了四种不同调优预算和四种选定的学习率计划的所有可能组合,并用它分析了1,920种可能的配置方案。

深度学习优化器_第1张图片

 结论:

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)

你可能感兴趣的:(模型调优,深度学习,pytorch)