赞
踩
目录
1、SGD (实现随机梯度下降算法(momentum、nesterov可选))
1.1、使用动量(Momentum)的随机梯度下降法(SGD)
1.2、使用牛顿加速度(NAG, Nesterov accelerated gradient)的随机梯度下降法(SGD)
2、ASGD(随机平均梯度下降(Averaged Stochastic Gradient Descent))
6、RMSProp(Root Mean Square Prop,均方根传递)
12、L-BFGS(Limited-memory Broyden–Fletcher–Goldfarb–Shanno)
最近因为模型训练不稳定的原因,在解决loss震荡不稳定的情况下,有人提出说可以先用adadelta优化器跑下试试看,于是开始了解,还未尝试。下面这个手册真心的棒,分析了各个优化器的优缺点和推荐使用程度,最后还给出了部分常见优化器的对比。
PyTorch中文文档:https://pytorch-cn.readthedocs.io/zh/latest/
PyTorch英文文档:https://pytorch.org/docs/stable/index.html
从最新(1.2.0)版本的Pytorch文档中可以知道,pytorch一共有11个优化器(当然,可实现的算法不止11种),分别是
SGD
ASGD
Adagrad
Adadelta
Rprop
RMSprop
Adam
Adamax
SparseAdam
AdamW
L-BFGS
下面分析加粗的常用优化器:
torch.optim.SGD(params,lr=<required parameter>,momentum=0,dampening=0,weight_decay=0,nesterov=False)
参数:
--params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
--lr (float) – 学习率
--momentum (float, 可选) – 动量因子(默认:0,通常设置为0.9,0.8)
--weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0)
--dampening (float, 可选) – 动量的抑制因子(默认:0)
--nesterov (bool, 可选) – 使用Nesterov动量(默认:False)论文:http://www.cs.toronto.edu/~hinton/absps/momentum.pdf
例子:
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()
优点:①使用mini-batch的时候,可以收敛得很快
缺点:①在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确
②不能解决局部最优解的问题
推荐程度:不推荐!
更新的时候在一定程度上保留之前更新的方向,用法为在torch.optim.SGD的momentum参数不为零,
优点:加快收敛速度,有一定摆脱局部最优的能力,一定程度上缓解了没有动量的时候的问题
缺点:仍然继承了一部分SGD的缺点
推荐程度:可以一试
可以理解为往标准动量中添加了一个校正因子
理解策略:在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误。所以需要一个更聪明的小球,能提前知道它要去哪里,还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡
优点:梯度下降方向更加准确
缺点:对收敛率的作用却不是很大
推荐程度:不如不试
简单地说ASGD就是用空间换时间的一种SGD,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。