Advertisement

梯度下降优化算法

阅读量:

An overview of gradient descent optimization algorithms

其核心思想是通过负梯度方向优化模型参数

梯度下降的变体

本文阐述了三种梯度下降算法的实现过程,并对其核心区别进行了详细说明。具体而言,在每种算法中所采用的数据样本数量构成了其显著的技术特征。

批量梯度下降(BGD)

批量梯度下降是根据全部数据集计算梯度。

复制代码
 for i in range(nb_epochs):

    
   params_grad = evaluate_gradient(loss_function, data, params)
    
   params = params - learning_rate * params_grad

通过查看代码可以观察到:第一步,在所有数据上计算梯度向量;随后,在所有数据上计算梯度向量;接着利用该梯度向量来更新参数;其中学习率保持恒定。

随机梯度下降(SGD)

SGD是通过单个训练样本更新参数。

SGD对于每个样本都行进行更新,更新频繁,因此参数更新变化大。

复制代码
 for i in range(nb_epochs):

    
   np.random.shuffle(data)
    
   for example in data:
    
     params_grad = evaluate_gradient(loss_function, example, params)
    
     params = params - learning_rate * params_grad

在处理大规模数据集时,批量梯度下降会进行不必要的重复计算。其原因在于,在参数更新之前它会对具有相似特征的数据样本进行重复计算。相比之下,随机梯度下降(SGD)每次仅处理一个样本,从而避免了这一冗余计算。因此,在优化效率上随机梯度下降表现更为出色。

Mini-batch gradient descent

Mini-batch 梯度下降每 batch 个样本进行一次参数更新

1 减少了参数更新的次数,更加稳定的训练

2 矩阵化,可以利用最先进的深度学习框架使梯度计算更加高效

在大多数场景中,batchsize被设定在50至256之间。
小批量梯度下降算法是神经网络训练中应用最为广泛的算法之一。

复制代码
 for i in range(nb_epochs):

    
   np.random.shuffle(data)
    
   for batch in get_batches(data, batch_size=50):
    
     params_grad = evaluate_gradient(loss_function, batch, params)
    
     params = params - learning_rate * params_grad

挑战

常见的梯度下降算法,并不能保证很好的收敛性,也面临着一些挑战。

学习率的设定具有显著挑战性。较小的学习率会降低模型的收敛速度,而较大的学习率则可能导致模型难以收敛,并可能引起损失函数在最小值区域出现剧烈震荡甚至发散。

不同学习率设置在训练过程中进行调整。其中一种常见的方法是退火策略。该方法通过设定的时间间隔或当前损失函数值达到阈值时降低学习率。然而,在这种方法中,默认的学习率设置是预先确定好的,并不能根据数据集的具体特性进行动态调整。

3 此外,在模型训练过程中采用了统一的学习速率来处理各个参数。值得注意的是,在面对稀疏数据且不同特征具有显著频率差异时,并不希望以相同的更新力度影响全部参数;相反地,则倾向于优先对少数、高频率的特征进行更为精细的调整。

4 避免陷入局部最小点。

梯度下降优化算法

Momentum

Momentum 可以在相关方向加速SGD并且抑制震荡。

从物理学角度来看,在重力作用下将一个物体置于山坡顶部,在滚下过程中该物体逐渐积累动量,并且速度逐渐加快直至稳定。

Nesterov accelerated gradient

NAG是一种给我们动量项先验。使用动量项去更新参数。计算

heta -amma v_{t-1}

可以给参数下一个位置

Adagrad

Adagrad是一种基于梯度的自适应优化算法,在实现过程中采用了自适应学习率机制。该算法通过为与高频特征相关的参数设定较小幅度的学习步长,并对与低频特征相关的参数设定较大的学习步长以达到优化效果。由此可见,在面对高频变化明显的数据时具有较好的适用性,并特别适用于稀疏数据场景。此外,在实际应用中发现该算法显著提升了标准随机梯度下降(SGD)的稳定性,并且能够有效处理大规模神经网络的训练问题

G_{t}

是过去梯度的平方和。

Adagrad的主要优点是消除了手动调整学习率。

该模型的主要问题是由于分母中平方梯度值的累积求和作用,在训练后期会导致优化步长不断减小直至趋近于零。这种特性使得模型在训练后期难以获得有效的参数更新方向,从而最终导致模型参数无法有效收敛到最优解区域。

Adadelta

Adadelta是对Adagrad的一种发展。与Adagrad不同的是,在于它不会累积所有过去的平方梯度。相反地,在这种算法中将累计梯度的窗口限制在固定大小的范围内。

梯度之和被定义为过去平方梯度的衰减平均值。

更新单元与原作者上部存在不匹配情况。例如,正确的做法是要求更新单元具备与假设单元参数相同的特点。

所以作者重新定义了一个指数衰减平均值,不是平方梯度,而是平方参数

从上面可以看出,我们甚至不需要设置默认学习率。

RMSprop

RMSprop 和 Adadelta 同时开发用于解决Adagrad学习率减少问题。

从上面的等式中可以看出,RMSprop十分类似于Adadelta.换句话说,Adadelta中的梯度之和被定义为过去平方梯度的衰减加权平均值。

Adam

自适应矩估计(ADAM)[14]是一种替代方法用于调整每个参数的学习速率。与Adadelta和RMSprop不同,在优化过程中它们存储过去二阶矩的按指数衰减滑动平均值。

v_{t}

,Adam还像Momentum保存过去**梯度指数衰减平均值

m_{t}

动量可以被理解为在斜面上滑动的质量。而Adam优化器则像是在滑动过程中受到阻力作用的装置。这使得Adam优化器特别适合于寻找那些平缓地形下的最优解。

m_{t},v_{t}

分别是梯度的一阶矩和二阶矩。作者在初始阶段进行观察,并且当衰减率较小时(例如β1 和 β2 接近于 1时)。

m_{t},v_{t}

是 偏向于0 的。

为了抵消这种偏差,作者使用偏差校正技术。

更新参数

默认参数设置。

Adam算法胜于其他自适应学习率方法。

AdaMax

在Adam中vt是反比例缩放平方梯度

也可以缩放其他范数的梯度

当p值较大时(即p趋于无穷大),对应的数值表现出高度不稳定性。从应用角度来看,在实际操作中通常采用L1范数和L2范数作为基准度量指标。值得注意的是,在这种情况下使用无穷范数时仍能获得较为理想的性能。鉴于此原因,在Kingma和Ba于2015年所提出的AdmMax算法中得以应用。

为了避免与Adam混合,作者使用

u_{t}

注意这里并不需要偏差校正技术。通常情况下 参数设置为

ta =0.002,eta _{1}=0.9,eta _{2}=0.999

Nadam

Adam综合运用了RMSprop与Momentum各自的长处:其包含了经过指数衰减处理后的过去平方梯度平均值。

v_{t}

,momentum贡献了过去梯度的指数衰减平均值

m_{t}

相比单纯依赖动量的方法,NAG在性能上表现更为卓越. Nadam (Nesterov-accelerated Adaptive Moment Estimation)作为一种先进的优化算法,其核心在于将Adam与NAG的优势相结合. Adagrad在处理梯度稀疏性方面表现出色,RMSprop则在优化学习率方面表现出色. Nadam则是将Adam与NAG的优点相结合. 为了实现这一融合,必须对Adam中的动量项进行相应调整.

m_{t}

首先,回顾一下相关概念。

J

表示目标函数,

amma

表示动量衰减,

ta

表示学习率。

将上面的等式扩展一下得到:

momentum 方法 包含 动量项和 梯度。

NAG 在梯度方向上可以更精确的更新。因此只需要更新梯度

g_{t}

Dozat 建议采用以下方式改进NAG方法:而非分别对梯度和参数施加动量——即分别应用于当前时刻的梯度计算和下一时刻的参数更新——我们采用超前动量直接对当前参数进行更新

Adam更新规则

用第一个等式替换Adam的第二个等式。

AMSGrad

在某些情况下, 基于自适应学习率的方法无法实现全局最优解. 研究表明, 许多自适应学习率方法的效果受限于其对历史平方梯度指数衰减机制的理解. 其中, 指数加权平均技术旨在稳定地维持一个合理的学习速率.

Adam算法趋于局部次优解,在小批量情况下能够充分地获取梯度信息;然而,在实际应用中发现小批量样本数量通常有限;通过指数加权平均的方法有效降低了这种影响;从而导致整体优化效果欠佳。

针对这种行为, 该研究者开发了一种新型算法 AMSGrad. 该算法采用过去平方梯度的最大值 vt 作为更新依据, 而非传统的指数平均值. vt 的定义与 Adam 中的一致.

与Adam不同,不是使用偏差校正的vt 而是使用最大值来更新参数

完整的更新规则

其他优化算法

随着 AMSGrad 的出现后,多种方法被提议/开发出来以应对优化挑战.例如 AdamW 采用了固定的方法来避免对权重衰减进行调整.

算法的可视化

优化器的选择

如何挑选适合的应用优化器?当你的输入数据呈现稀疏特征时,在这种情况下,则推荐采用带有自适应学习率的方法。这将显著简化你的模型训练流程,并且通常可以通过算法默认设置实现最佳性能。

总体而言,RMSprop是一种基于Adagrad的方法,在处理学习速率急剧下降的问题方面具有显著效果。Adam则通过引入偏差校正和动量项对RMSprop进行了改进,在优化过程中表现出色。研究显示这些算法——包括RMSprop、Adadelta以及Adam——本质上非常接近,在许多情况下表现得非常类似。研究表明随着梯度变得稀疏其偏差校正是有助于Adam在优化过程结束后略胜一筹的到目前为止Adam仍然是最佳的整体选择。

值得指出的是,在近期的研究论文中普遍采用了无动量及简单的学习率退火调度策略来优化SGD算法。从图中可以看出,在大多数情况下SGD能够成功找到全局极小值点。然而需要注意的是,在一些特定场景下该方法相较于某些优化器而言可能会收敛速度较慢,并且对初始参数设置和退火策略的选择较为敏感。此外该算法还存在一个潜在的风险即可能收敛至鞍点而非真正的局部极小值点。因此如果您关注于提升训练效率并有效处理深度或复杂结构的神经网络问题则建议采用自适应的学习率策略以获得更好的优化效果。

其他优化SGD的策略

Shuffling and Curriculum Learning

一般情况下,我们不希望以有意义的顺序为模型提供训练集,因为这可能使优化算法偏颇.在每个 epoch 期间,将训练数据随机打乱是一种常见做法.

另一方面,在某些场景下,我们致力于按顺序解决一系列问题,并认为按照系统化的顺序提供训练集可能有助于提升性能并促进更稳定的收敛。该方法被称作课程学习。

Zaremba和Sutskever [29]仅能运用课程学习评估简单的程序,并明确指出混合策略在性能上优于单一策略。该研究通过逐步提升难度来优化模型对示例的学习能力。

批归一化

在促进学习的过程中,我们常采用均值为零、方差为一的初始值来进行归一化处理.经过模型不断进行训练,各参数的取值范围会发生相应调整.值得注意的是,如果不进行归一化处理,并且当网络结构变得更为复杂时,在某些情况下可能会导致训练速度减缓以及输出波动增大.

批归[30]不仅实现了每个批次数据的归一化处理,并且在反向传播过程中也带来了显著的变化。通过其标准化组件的作用机制,该方法能够允许采用更大的学习率,从而减少了对初始参数设置的高度敏感性.批归还可以被视为一种正则化手段,它不仅有助于提升模型性能,还可能减少甚至完全消除对Dropout技术的需求.

Early stopping

在训练过程中实时跟踪验证集的表现。当模型在验证集上的性能未见提升时,请及时终止训练。

Gradient noise

31

通过添加噪声可以让糟糕初始化的神经网络增强其抗干扰能力,并有助于提升对深度和复杂问题的学习能力。他们质疑这一做法是否真的能够帮助模型跳出现有局部最优解并找到新的局部极小值点;尤其是对于较深的模型来说,在优化过程中可能会经历更多的这样的情况。

参考文献:

代码

代码

全部评论 (0)

还没有任何评论哟~