目录
1. 随机梯度下降系优化器:SGD
1.1 算法种类
1.2 优缺点
2 SGDM 即为SGD with momentum 动量
2.1 公式
2.2 动量的优缺点
优点
缺点
2.3 使用场景
3 AdaGrad
3.1 公式
3.2 AdaGrad的优缺点
优点
缺点
3.3 使用场景
3.4 Adam
3.4.1 Adam优化器的公式
3.4.2 Adam优化器的优缺点
优点
缺点
3.4.3 使用场景
4 怎么选择优化器
昨天在计算大模型微调占用内存,然后看到优化器Adam占用两倍的模型参数(一阶矩、二阶矩),仔细思考没想明白,今天把优化器的内容补充下;
优化器在机器学习和深度学习中扮演着至关重要的角色,它们负责更新模型的参数以最小化损失函数。优化器基于训练数据和模型预测的误差,调整模型参数,使模型更好地拟合数据。
1. 随机梯度下降系优化器:SGD
SGD全称Stochastic Gradient Descent,随机梯度下降,1847年提出。每次选择一个mini-batch,而不是全部样本,使用梯度下降来更新模型参数。它解决了随机小批量样本的问题,但仍然有自适应学习率、容易卡在梯度较小点等问题。
核心思量:就是每次随机挑一个或者一组(mini-batch)数据来优化神经网络的参数。有大佬证明过,这种方式可以近似地等价于原始的梯度下降法。采用SGD的好处就是可以在保证精度的同时降低计算量,让神经网络可以应用于更大规模的数据上。
假设我们有参数向量 𝜃,损失函数为 𝐿,学习率为 𝜂(eta),并且 𝜃𝑗是参数向量中的第 𝑗个元素。SGD更新规则可以表示为:
其中:
- 𝜃𝑗是参数向量 𝜃 中的第 𝑗个参数。
- 𝜂 是学习率,控制更新步长的大小。这个是超参数,需要预先设定的,一般小于1;
- ∇𝜃𝐿(𝜃;𝑥𝑖,𝑦𝑖) 是损失函数 𝐿关于参数 𝜃 的梯度,该梯度是在样本 (𝑥𝑖,𝑦𝑖)上计算的。
1.1 算法种类
1.SGD是最基本的随机梯度下降,它是指每次参数更新只使用一个样本,这样可能导致更新较慢。
2.Batch-SGD是批随机梯度下降,它是指每次参数更新使用所有样本,即把所有样本都代入计算一遍,然后取它们的参数更新均值,来对参数进行一次性更新,这种更新方式较为粗糙;需要更多的内存。
3.Mini-Batch-SGD是小批量随机梯度下降,它是指每次参数更新使用一小批样本,这批样本的数量通常可以采用trial-and-error的方法来确定,这种方法被证明可以有效加快训练速度。
1.2 优缺点
- 优点:计算效率高,容易跳出局部最小值。
- 缺点:由于每次迭代只使用一小部分数据,更新方向可能不稳定。当遇到局部最优点或鞍点时,梯度为0,无法继续更新参数;
2 SGDM 即为SGD with momentum 动量
-
原理:动量优化器在SGD的基础上增加了一个动量项,使得更新过程更加平滑,减少震荡,加速收敛。
- 优点:有助于更快地收敛到最优解,特别是在非凸或噪声较大的损失函数中。
提出背景:SGD可能会在垂直方向上产生大幅度的振荡,这会导致训练过程变得非常慢,因为模型需要花费很多迭代来克服这些振荡。此外,在鞍点附近,SGD也可能会陷入停滞,这是因为梯度可能非常小。
思想:来源于物理学中的惯性原理,即物体倾向于保持其运动状态不变。在优化算法中,动量有助于平滑参数更新,减少振荡,加快收敛速度,并帮助模型更快地穿过鞍点。
2.1 公式
动量始终使用的是梯度的信息,只不过在更新参数的时候,不仅使用了当前的梯度,同时前一步的梯度也参与了计算。
训练过程中模型内存使用: 模型参数P+梯度P+动量参数P
设 𝑣𝑡 是动量项,𝛾 是动量系数(通常设置为0.9),𝜂是学习率,∇𝜃𝐿(𝜃)是损失函数关于参数 𝜃θ 的梯度。动量更新规则如下:
其中:
- 𝑣𝑡 是在时间步 𝑡的动量项(梯度的变种),它是一个累积梯度的加权和。
- 𝛾 是介于0和1之间的动量系数,决定了前一次梯度的影响程度。
- 𝜂是学习率,控制参数更新的幅度。
- ∇𝜃𝐿(𝜃) 是在当前参数 𝜃 下损失函数的梯度。
2.2 动量的优缺点
优点
- 加速收敛:动量有助于加速在平坦区域的收敛,因为一旦算法确定了正确的方向,它就会沿该方向持续前进,减少在垂直方向上的振荡。
- 改善稳定性:在训练过程中,动量可以平滑更新过程,减少因随机梯度造成的波动。
- 逃逸鞍点:动量有助于模型更快地逃离鞍点,因为即使在梯度很小的地方,动量也能推动参数更新。
缺点
- 可能过冲:如果动量设置得过高,算法可能会在最小值附近过冲,导致模型在最小值附近振荡,不能稳定收敛。
- 动态调整困难:动量系数和学习率的选择可能需要通过实验来确定,而且可能需要随训练过程进行调整,这增加了训练的复杂性。
2.3 使用场景
- 当训练数据集很大时,SGD的随机性可能会导致更新方向不稳定,动量可以帮助平滑这个过程。
- 当损失函数表面具有许多局部最小值或鞍点时,动量可以帮助模型更快地穿越这些区域。
- 在深度学习中,特别是在训练深度神经网络时,动量常被用来加速收敛和提高稳定性。
3 AdaGrad
AdaGrad(Adaptive Gradient)算法是为了解决传统随机梯度下降(SGD)在优化过程中的一些局限性而提出的。在SGD中,所有参数都共享同一个全局学习率,这意味着无论参数的特性如何,它们的更新步长都是一样的。然而,在实践中,不同的参数可能需要不同的更新步长来更有效地收敛。例如,一些参数可能需要更小的步长以避免在最小值附近振荡,而另一些参数可能需要更大的步长来加速收敛。
AdaGrad的提出正是为了适应不同参数的特性,通过为每个参数分配一个自适应的学习率,从而在优化过程中自动调整每个参数的更新步长。这样,AdaGrad能够在处理稀疏数据时表现得更为优秀,因为在稀疏数据中,某些参数可能很少更新,而AdaGrad可以为这些参数提供较大的学习率,以确保它们能够及时地进行有效的更新。
- 原理:AdaGrad为每个参数维护一个历史梯度的累积平方和,然后基于这个累积和动态调整学习率。
- 优点:自适应学习率,对稀疏数据有效。
- 缺点:历史梯度的累积可能导致学习率过快衰减。
3.1 公式
设 是参数 𝜃𝑗 在时间步 𝑡的梯度平方,𝐺𝑡,𝑗 是从开始到时间步 𝑡 所有梯度平方的累加和,𝛼 是初始学习率,𝜖 是一个很小的正数(为了防止除数为零)。
在时间步 𝑡,AdaGrad的更新公式为:梯度越大迭代的步长越小;
在AdaGrad中,如果某个参数的历史梯度平方累积和 较大,意味着该参数在过去的迭代中收到的梯度较大或较多,那么在接下来的迭代中,该参数的学习率会相应减小,即 减小。因此,虽然单次梯度 𝑔𝑡,𝑗可能很大,但由于学习率的减小,实际的更新步长可能并不会很大。
3.2 AdaGrad的优缺点
优点
- 自适应学习率:AdaGrad为每个参数提供自适应的学习率,这使得它在处理稀疏数据时特别有效。
- 处理稀疏特征:对于在训练过程中很少更新的参数,AdaGrad能够给予较大的学习率,帮助它们更快地收敛。
缺点
- 学习率衰减过快:AdaGrad的学习率会随着训练的进行而单调递减,这可能导致学习率过早地变得太小,从而阻碍模型的进一步改进。
- 存储成本:AdaGrad需要为每个参数存储一个梯度平方的累加和,这会增加内存的使用。
3.3 使用场景
AdaGrad非常适合于处理稀疏数据和具有大量零值或极少更新的特征的情况。例如,在自然语言处理(NLP)任务中,词嵌入矩阵往往非常稀疏,AdaGrad能够为不常见的词提供更大的学习率,有助于它们更快地学习到有意义的表示。
在深度学习中,AdaGrad可能不是最优选择,特别是在需要长时间训练的模型中,因为它的学习率衰减问题可能会导致训练后期的收敛速度变慢。然而,对于那些数据集较小或特征稀疏的任务,AdaGrad仍然是一个值得考虑的优化算法。在实际应用中,AdaGrad经常被更先进的自适应优化算法如Adam和RMSprop所取代,这些算法在学习率调整方面提供了更好的性能。
3.4 Adam
Adam优化器(Adaptive Moment Estimation)由Diederik P. Kingma和Jimmy Ba在2014年提出,旨在结合AdaGrad和RMSprop的优点,同时解决它们的一些缺点。AdaGrad能够自适应地调整学习率,但在训练后期学习率会过快衰减;RMSprop通过使用滑动平均来解决AdaGrad的这一问题,但在处理稀疏数据时效果不佳。Adam试图提供一个更全面的解决方案,既能处理非稀疏数据,又能处理稀疏数据,并且能够自适应地调整每个参数的学习率。
3.4.1 Adam优化器的公式
Adam优化器结合了一阶矩估计(即动量)和二阶矩估计(类似于RMSprop)。它维护了两个滑动平均值,分别是梯度的一阶矩(即梯度的均值)和梯度的二阶矩(即梯度平方的均值)。
设 𝜃 是参数向量,𝛽1 和 𝛽2是两个超参数,分别用于控制一阶和二阶矩估计的指数衰减率,𝛼 是学习率,𝜖 是一个很小的正数,用于防止除数为零。
β1 的默认值是 0.9,而 𝛽2的默认值是 0.999。
一阶矩估计:(其实就是动量)当前梯度与前面梯度(动量)的加权平均。
一阶矩估计:(学习率调节器)当前梯度平方与前面梯度(动量)平方的加权平均。
-
一阶矩的偏差校正:是 𝛽1 的 𝑡次幂,它表示了从算法开始到当前时间步 𝑡的所有历史一阶矩估计的衰减累积效应。在初始迭代时,这个值接近于0,但随着迭代次数增加,它会逐渐接近1。通过除以 ,偏差校正确保了 的估计更加准确,尤其是在迭代开始时。
-
二阶矩的偏差校正:类似的,是 𝛽2 的 𝑡 次幂,它表示了所有历史二阶矩估计的衰减累积效应。由于 𝛽2 通常设置得更接近于1(如0.999),它的 𝑡次幂在迭代初期会非常小,导致 的值在开始时可能很大。偏差校正通过除以 来调整这个估计,确保它更接近于真实值。
3.4.2 Adam优化器的优缺点
优点
- 自适应学习率:为每个参数提供自适应的学习率,能够处理稀疏和非稀疏数据。
- 快速收敛:在实践中,Adam通常能够比传统的SGD更快地收敛。
- 简单易用:相比其他自适应优化算法,Adam的超参数设置较为直观,且通常不需要大量的调参即可获得良好效果。
- 鲁棒性强:Adam对学习率的选择相对不敏感,且在不同的任务和模型上表现出较好的泛化能力。
缺点
- 可能在非凸问题中收敛到次优解:虽然Adam在许多任务中表现良好,但在某些非凸优化问题中,它可能无法找到全局最优解。
- 偏差校正:虽然Adam通过偏差校正来减轻初始迭代时的偏差问题,但这种校正可能在某些情况下引入额外的复杂性。
3.4.3 使用场景
Adam优化器因其优秀的性能和广泛的适用性,已经成为深度学习中最为流行的优化算法之一。它在各种场景下都能提供良好的优化效果,包括但不限于:
- 计算机视觉:在图像识别、目标检测和图像生成等任务中。
- 自然语言处理:在文本分类、机器翻译和文本生成等领域。
- 推荐系统:在个性化推荐和广告投放的模型训练中。
- 强化学习:在智能体的学习和决策制定中。
总的来说,Adam优化器因其灵活性和高效性,成为了深度学习模型训练的首选优化算法。
4 怎么选择优化器
五大优化器其实分为两类,SGD、SGDM,和Adagrad、RMSProp、Adam。使用比较多的是SGDM和Adam。
如上所示,SGDM在CV里面应用较多,而Adam则基本横扫NLP、RL、GAN、语音合成等领域。所以我们基本按照所属领域来使用就好了。比如NLP领域,Transformer、BERT这些经典模型均使用的Adam,及其变种AdamW。
SGDM训练慢,但收敛性更好,训练也更稳定,训练和验证间的gap也较小。而Adam则正好相反。
ref:
https://zhuanlan.zhihu.com/p/208178763