优化算法
1、随机梯度下降 SGD
-
标准梯度下降法(GD, Gradient Descent),
-
随机梯度下降法(SGD, Stochastic Gradient Descent)
-
批量梯度下降法(BGD, Batch Gradient Descent)
-
Mini-batch gradient descent( mini-batch gradient descent, MBGD )
2、动量法
Nesterov 动量随机下降法(NAG ,英文全称是 Nesterov Accelerated Gradient,或者叫做 Nesterov Momentum 。
Nesterov 动量随机梯度下降方法是在上述动量梯度下降法更新梯度时加入对当前梯度的校正,简单解释就是往标准动量方法中添加了一个校正因子。
有利于跳出当前局部最优的沟壑,寻找新的最优值,但收敛速度慢
3、AdaGrad
AdaGrad 法根据训练轮数的不同,对学习率进行了动态调整。具体表现在,对低频出现的参数进行大的更新(快速下降的学习率),对高频出现的参数进行小的更新(相对较小的下降学习率)。因此,他很适合于处理稀疏数据。
4、RMSProp
RMSProp(Root Mean Square Prop),均方根反向传播。
RMSProp算法使⽤了小批量随机梯度按元素平⽅的指数加权移动平均来调整学习率。
5、AdaDelta
AdaDelta 法也是对 AdaGrad 法的一种改进,它旨在解决深度模型训练后期,学习率过小问题。相比计算之前所有梯度值的平方和,AdaDelta 法仅计算在一个大小为 �w 的时间区间内梯度值的累积和。
6、Adam
是另一种学习率自适应的优化算法,相当于 RMSProp + Momentum 的效果,即动量项的 RMSprop 算法。
Adam 算法在 RMSProp 算法基础上对小批量随机梯度也做了指数加权移动平均。和 AdaGrad 算法、RMSProp 算法以及 AdaDelta 算法一样,目标函数自变量中每个元素都分别拥有自己的学习率。
Adam 总结:由于 Adam 继承了 RMSProp 的传统,所以学习率同样不宜设置太高,初始学习率设置为 0.01 时比较理想。
把一阶动量和二阶动量都用起来,就是Adam了Adaptive + Momentum。
优点:
-
通过一阶动量和二阶动量,有效控制学习率步长和梯度方向,防止梯度的振荡和在鞍点的静止。
-
超参数具有很好的解释性,且通常无需调整或仅需很少的微调。
缺点:
-
可能不收敛。
-
可能错过全局最优解:自适应学习率算法可能会对前期出现的特征过拟合,后期才出现的特征很难纠正前期的拟合效果。后期Adam的学习率太低,影响了有效的收敛。
7、AdamW
AdamW(Adam with Weight Decay)是GPT-4及其前身GPT-3主要使用的优化算法。AdamW是Adam优化器的改进版本,结合了L2正则化(权重衰减),用于防止过拟合并提高模型的泛化能力。
-
Adam:Adam优化器通过计算梯度的一阶和二阶动量的指数加权平均来调整每个参数的学习率。它在处理稀疏梯度和非平稳目标时表现良好。
-
Weight Decay:在AdamW中,权重衰减项是直接添加到参数更新公式中,而不是像L2正则化那样仅影响梯度。这种方法更有效地防止过拟合。
AdamW本质上就是在损失函数里面加入了L2正则项,然后计算梯度和更新参数的时候都需要考虑这个正则项。
8、AdamW和Adam对比
在训练大模型(如GPT-3和GPT-4)时,使用AdamW而不是Adam主要是为了更好地控制权重衰减的效果,提高模型的泛化能力和稳定性。具体来说,AdamW和Adam的主要区别在于如何处理权重衰减(L2正则化)。以下是使用AdamW而不是Adam的一些关键原因:
1. 权重衰减的实现方式不同
-
Adam:在Adam优化器中,权重衰减(通常通过L2正则化实现)是通过将L2正则化项添加到损失函数中,然后计算损失的梯度。这会导致正则化项影响梯度的计算。
-
AdamW:在AdamW优化器中,权重衰减是直接应用于权重更新步骤,而不是通过损失函数。这意味着权重衰减不会影响梯度计算,而是通过在每次参数更新时直接减去一个与当前权重值成比例的项来实现。
2. 更好的训练稳定性和泛化能力
-
更好的泛化能力:AdamW中的直接权重衰减方法可以更有效地防止过拟合,因为它明确地分离了梯度更新和权重衰减过程。这使得模型在训练过程中能够更好地找到泛化能力强的参数组合。
-
训练稳定性:在Adam中,由于正则化项被包含在损失函数的梯度计算中,这可能导致梯度的更新方向受到干扰,从而影响训练的稳定性。而AdamW中的权重衰减不会影响梯度的方向,只是在每次更新时进行一个简单的减法操作,使得训练过程更稳定。
3. 简化超参数调节
在Adam中,由于L2正则化是通过损失函数实现的,调整正则化强度时需要仔细调节学习率和正则化参数的相对比例。而在AdamW中,权重衰减的强度是独立于学习率的,简化了超参数调节过程。
4. 实践中的经验和实验结果
多项研究和实践经验表明,AdamW在训练深度神经网络(特别是大规模语言模型)时,比传统的Adam优化器表现更好。例如,AdamW在大模型训练中显示出更好的泛化性能和更低的验证误差,这也是为什么现代大模型(如GPT-4)选择使用AdamW而不是Adam的原因之一。
总结
在Adam优化器中,权重衰减通常通过在损失函数中添加正则化项来实现。这意味着正则化项会影响梯度的计算。而在AdamW(Adam with Weight Decay)中,权重衰减是通过直接在参数更新步骤中减去权重的一部分来实现的,而不影响梯度计算。
使用AdamW而不是Adam的主要原因在于其改进的权重衰减机制,这种机制能够提高训练的稳定性和模型的泛化能力,同时简化了超参数的调节过程。这些优势使得AdamW在大规模深度学习模型的训练中表现更为优越,因此被广泛采用,包括在GPT-4的训练过程中。
防止过拟合
神经网络的过拟合怎么防止
-
获取更多的训练数据,数据增强
-
减小网络容量,降低模型复杂程度
-
添加权重正则化
-
添加dropout
-
提前终止训练
-
模型截枝,去除模型中不重要的权重或神经元的方法,简化模型
激活函数
常见的激活函数 https://zhuanlan.zhihu.com/p/364620596
1、Sigmoid函数
2、Tanh/双曲正切激活函数
3、 ReLU激活函数
-
当输入为正时,导数为1,一定程度上改善了梯度消失问题,加速梯度下降的收敛速度;
-
计算速度快得多。ReLU 函数中只存在线性关系,因此它的计算速度比 sigmoid 和 tanh 更快。
-
被认为具有生物学合理性(Biological Plausibility),比如单侧抑制、宽兴奋边界(即兴奋程度可以非常高)
4、Leaky ReLU
为了解决 ReLU 激活函数中的梯度消失问题,当 x < 0 时。
为什么使用Leaky ReLU会比ReLU效果要好呢?
-
Leaky ReLU 通过把 x 的非常小的线性分量给予负输入(0.01x)来调整负值的零梯度(zero gradients)问题,当 x < 0 时,它得到 0.1 的正梯度。该函数一定程度上缓解了 dead ReLU 问题,
-
leak 有助于扩大 ReLU 函数的范围,通常 a 的值为 0.01 左右;
-
Leaky ReLU 的函数范围是(负无穷到正无穷)
5、Parametric ReLU激活函数
6、ELU激活函数
与 ReLU 相比,ELU 有负值,这会使激活的平均值接近零。均值激活接近于零可以使学习更快,因为它们使梯度更接近自然梯度。 函数表达式为
-
没有 Dead ReLU 问题,输出的平均值接近 0,以 0 为中心;
-
ELU 通过减少偏置偏移的影响,使正常梯度更接近于单位自然梯度,从而使均值向零加速学习;
-
ELU 在较小的输入下会饱和至负值,从而减少前向传播的变异和信息。
-
一个小问题是它的计算强度更高,计算量较大
7、GELU
GELU(Gaussian Error Linear Unit)是一种激活函数,最初由Hendrycks和Gimpel在2016年提出,并在随后的研究中被证明在深度神经网络中表现良好,尤其在自然语言处理和语音识别领域得到广泛应用。下面详细介绍一下GELU的定义、特点以及应用情况。
1. 定义和数学表达式
2. 特点和优点
-
非线性: GELU是非线性的激活函数,能够帮助神经网络模型学习复杂的非线性关系。
-
光滑性: GELU在整个实数范围内都是光滑的,这对于梯度的计算和反向传播是有利的。
-
近似于ReLU: 当输入 ( x ) 较大时,GELU接近于线性关系,类似于ReLU,因此可以帮助提升模型的稀疏表示能力。
-
性能: 实验证明,GELU在许多任务和模型中能够提供比传统的ReLU等激活函数更好的性能和泛化能力。
3. 应用场景
GELU广泛应用于各种深度学习模型中,特别是在自然语言处理(NLP)任务中,如BERT和GPT等语言模型的构建中。它能够在处理自然语言中的复杂特征和模式时,提供更加灵活和有效的非线性变换能力。
4. 与其它激活函数的比较
-
ReLU vs GELU: 相较于ReLU,GELU在处理负数输入时能够产生更平滑的输出,这有助于减少梯度消失的问题,并有助于提高训练的稳定性和收敛速度。
-
Swish vs GELU: Swish是另一个近似于GELU的激活函数,但它使用sigmoid函数而不是GELU中的误差函数的累积分布函数。在一些比较实验中,GELU在某些任务上表现出更好的性能,但选择哪种激活函数通常还取决于具体任务和模型的特性。
总结
GELU作为一种非线性的激活函数,在深度学习领域中得到了广泛的应用和研究。它通过引入误差函数的累积分布函数,提供了一种光滑和非线性的转换方式,有助于提高模型的表达能力和泛化能力,尤其在处理自然语言等复杂任务时表现出色。