目录
基本梯度下降法:包括标准梯度下降法(GD, Gradient Descent),随机梯度下降法(SGD, Stochastic Gradient Descent)及批量梯度下降法(BGD, Batch Gradient Descent);
动量优化法:包括标准动量优化方法(MomentumOptimizer)、牛顿加速梯度动量优化方法(NAG, Nesterov accelerated gradient)等;
Momentum(历史梯度乘以一个权重)-> Nesterov(向前看一步梯度)
自适应学习率优化法:包括Adagrad(Adaptive gradient algorithm)算法,RMSProp(root mean square prop)算法,Adam算法等;
Adagrad(首次引入二阶动量) -> adadelta (只关注过去一段时间)->RMSProp(修改AdaGrad的梯度积累为一阶指数加权的移动平均)
融合优化法:
adam: adagrad + momentum
nadam:Adam+Nesterov
优化器 | 基本原理 | 优点 | 缺点 | 适用场景 | pytorch函数参数(参数含义见pytorch优化器函数) |
---|---|---|---|---|---|
SGD | SGD更新公式:Wt+1=Wt−ηtgt其中ηt表示学习率,gt表示单个样本的梯度,训练时只从训练样本集中随机选取一个样本进行梯度下降;而标准梯度下降法GD是每次使用所有样本更新梯度;批量梯度下降法BGD是介于GD和SGD之间,每次通过一小批样本更新梯度。 | 1.每次只选择一个样本进行求导,当训练样本集很大时,计算速度比GD快很多,内存开销小很多; 2.具有随机性,能够跳出一些比较差的局部最优点; | 1.每步接受信息量有限,对梯度估计容易产生偏差,在山谷和鞍点处梯度下降速度很慢; 2.单样本梯度更新时会引入许多噪声; | SGD在比如SSD或者faster-rcnn等目标检测模型,每个样本都有大量候选框参与训练,这时使用随机梯度下降法能够加快梯度的计算。通常我们采用得更多的是BGD。 | class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False) e) |
MomentumOptimizer | 标准动量优化方法,核心思想就是,使当前训练数据的梯度受到之前训练数据的梯度的影响,对之前的梯度乘以一个权重项成为了动量项。能够减少梯度的波动,加快收敛。 | 1.通过动量更新,参数向量会在有持续梯度的方向上增加速度; 2.使梯度下降时的折返情况减轻,从而加快训练速度; | 如果数据集分类复杂,会导致 Vt-1 和 t时刻梯度 向量方向相差较大;在进行向量求和时,得到的 Vt 会非常小,反而使训练速度大大下降甚至模型难以收敛。 | 适合用于改进在随机梯度下降和批量梯度下降等方法中梯度出现折返等情况,以加速收敛。 | 通过在torch.optim.SGD()函数中设置参数momentum和dampening以实现。 |
NAG (Nesterov) | 牛顿加速梯度动量优化方法,和标准动量优化方法不同的点在于会超前一个动量单位,相当于对于Momentum多了一个本次梯度相对上次梯度的变化量,以“向前看”看到的梯度而不是当前位置梯度去更新。 | 1.如果多次梯度累计方向大致相同,标准动量优化方法中会导致最终下降步幅过大;而NAG可以有效利用损失函数的近似二阶导,从而加快收敛速度。 | 不能根据参数的重要性而对不同的参数进行不同程度的更新。 | 是对标准Momentum方法对改进,可以使得RNN在很多任务上有更好的表现。 | 通过在torch.optim.SGD()函数中设置参数nesterov以实现。 |
LBFGS | L-BFGS算法, 较少使用。 | torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None) | |||
ASGD | 实现平均随机梯度下降算法。在第k步迭代的时候,考虑这一步和前面n-1个梯度的平均值,当前权重减去步长乘以最近n个梯度的平均值。n是自己设置的,当n=1的时候,就是普通的sgd。 | 1.和SGD相当,收敛速度快了很多,计算成本小于BGD。 | 1.和Momentum的原理比较接近,但实现上不如后者简单高效,因此应用也较少。 | 能够加速SGD的收敛 | torch.optim.ASGD(params, lr=0.01, lambd=0.0001, alpha=0.75, t0=1000000.0, weight_decay=0) |
Adamax | Adam的一种基于无穷范数的变种,可参考Adamax优化器 | torch.optim.Adamax(params, lr=0.002, betas=(0.9, 0.999), eps=1e-08, weight_decay=0) | |||
Adagrad | AdaGrad的核心思想是,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有较大的学习率,而具有小梯度的参数有较小的学习率。式中,i表示第i个分类,t表示第t迭代同时也表示分类i累计出现的次数。η0表示初始的学习率取值(一般为0.01)。 | 1.AdaGrad算法能够随着训练过程自动减小学习率; 2.对于分布稀疏或者不均衡的数据集,AdaGrad算法在学习率上有很好的适应性; | 1.仍依赖于人工设置一个全局学习率; 2.随着迭代次数增多,分母上梯度平方的累加将会越来越大,学习率会越来越小,最终会趋近于0,使得训练提前结束。 | 能够根据参数的重要性而对不同的参数进行不同程度的更新的问题。适合处理稀疏梯度。 | torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0) |
RMSprop | RMSProp算法修改了AdaGrad的梯度积累为一阶指数加权的移动平均。 | 1.解决Adagrad分母会不断积累,这样学习率就会收缩并最终会变得非常小的问题。 | 1.RMSprop依然依赖于全局学习率; | RMSprop算是Adagrad的发展和Adadelta的变体,效果趋于二者之间。适合处理非平稳目标,对于RNN效果很好 | torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False) |
Rprop | 和RMSprop比较类似,RMSprop是对Rprop的改进,较少使用 | torch.optim.Rprop(params, lr=0.01, etas=(0.5, 1.2), step_sizes=(1e-06, 50)) | |||
AdaDelta | 1.AdaDelta算法额外维护一个状态变量Delta(x),并使用状态变量的均方根代替 RMSprop 中的学习率参数,使AdaDelta优化器不需要指定超参数。 | 1.训练后期容易反复在局部极小值震荡。 | 相比于RMSprop算法,可以不用指定全局学习率超参数。 | torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0) 这里的lr=1.0表示在delta被应用到参数更新之前对它缩放的系数。 | |
Adam | Adma吸收了Adagrad(自适应学习率的梯度下降算法)和动量梯度下降算法Momentum的优点,既能适应稀疏梯度(即自然语言和计算机视觉问题),又能缓解梯度震荡的问题。 | 1.计算高效; 2.梯度平滑、稳定的过渡,可以适应不稳定的目标函数; 3.调参相对简单,默认参数就可以处理绝大部分的问题。 4.能自然地实现步长退火过程(自动调整学习率) 5.超参数具有很好的解释性,且通常无需调整或仅需很少的微调 | 1.可能不收敛; 2.可能错过全局最优解。 | 很适合应用于大规模的数据及参数的场景; 适用于不稳定目标函数; 适用于梯度稀疏或梯度存在很大噪声的问题; | torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0) |
NAdam | Adam+Nesterov |
2.学习率的选取
学习率控制了每次更新模型参数需要用到多少误差,学习率过大过小都不合适,会有如下优缺点:
学习率 大 | 学习率 小 | |
---|---|---|
学习速度 | 快 | 慢 |
使用时间点 | 刚开始训练时 | 一定轮次过后 |
缺点 |
|
|
2 Adam vs Adagrad adam vs rmsprop
1 Adam vs Adagrad adam vs rmsprop
2 adam 改进