优化模型参数以使定义的损失函数最小化是深度神经网络训练的核心环节。高效的优化算法和策略对于训练深度神经网络,特别是像Transformer这样的大型模型是必要的。仅仅应用固定学习率的标准随机梯度下降(SGD)通常会导致收敛缓慢或性能不佳。因此,Transformer模型能从更精密的优化技术中获益良多。Adam优化器用于训练Transformer模型最常用的优化器是Adam(自适应矩估计)。Adam结合了另外两种常用优化扩展的优点:RMSProp(根据近期梯度的幅值调整学习率)和动量(有助于在正确方向上加速梯度向量,从而实现更快的收敛)。以下是Adam的核心思想:动量: 它保持过去梯度的指数衰减平均值(一阶矩估计,$m_t$)。这有助于平滑梯度更新并加速收敛,尤其是在曲率较高或梯度噪声较大的区域。自适应学习率: 它保持过去梯度平方的指数衰减平均值(二阶矩估计,$v_t$)。这些信息用于对每个参数的学习率进行逐元素缩放,为与频繁出现特征相关的参数提供较小的更新,为与不常出现特征相关的参数提供较大的更新。它根据梯度的历史情况调整学习率。更新规则包括计算这些有偏的一阶和二阶矩估计,修正它们的偏差(在训练早期特别重要),然后使用这些修正后的估计值来更新模型参数。参数$\theta$在时间步$t$的更新大致如下所示:$$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t $$其中$\eta$是基础学习率,$\hat{m}_t$和$\hat{v}_t$是经过偏差修正的一阶和二阶矩估计,$\epsilon$是一个为数值稳定性而添加的小常数(通常为$1e-8$或$1e-9$)。Adam通常是Transformer模型的优选,因为它在广泛的问题上表现良好,计算效率高,内存需求低,并且对超参数的选择敏感度较低(尽管调优仍然有益)。矩估计指数衰减率的常见选择是$\beta_1 = 0.9$和$\beta_2 = 0.999$。最初的Transformer论文使用了$\beta_1 = 0.9$、$\beta_2 = 0.98$和$\epsilon = 10^{-9}$。学习率调度虽然Adam会针对每个参数调整学习率,但整体的全局学习率(公式中的$\eta$)也同样非常重要。Transformer模型对学习率比较敏感,在整个训练过程中使用固定学习率通常效果不佳。因此,通常会采用学习率调度。Transformer模型最普遍采用的调度方案结合了线性“预热”阶段和衰减阶段。预热: 训练从一个很小的学习率(甚至为零)开始。然后,学习率会在一定数量的初始训练步骤(称为warmup_steps)内线性增加。预热的目的是防止训练早期出现不稳定性。当模型参数随机初始化时,梯度可能非常大且不稳定。开始时较大的学习率可能导致优化过程发散。逐渐增加学习率可以使模型在应用更大更新之前稳定下来。衰减: 预热阶段达到峰值学习率后,学习率在剩余的训练过程中会逐渐降低。这使得模型在收敛到最小值时能进行更精细的调整。最初的Transformer论文使用了逆平方根衰减函数。将预热和衰减结合的常用调度公式为:$$ \text{学习率} = d_{\text{模型}}^{-0.5} \cdot \min(\text{步数}^{-0.5}, \text{步数} \cdot \text{预热步数}^{-1.5}) $$这里,$d_{\text{模型}}$是模型嵌入的维度(例如,512),step_num是当前的训练步数,warmup_steps是预热阶段的持续时间(例如,4000步)。这个公式有效地实现了线性预热和随后的逆平方根衰减。{"layout": {"title": "Transformer学习率调度", "xaxis": {"title": "训练步数"}, "yaxis": {"title": "学习率"}, "showlegend": false, "template": "plotly_white", "width": 600, "height": 400}, "data": [{"x": [0, 1000, 2000, 3000, 4000, 5000, 10000, 20000, 40000, 80000], "y": [0.0, 0.000088388, 0.000176777, 0.000265165, 0.000353553, 0.000316228, 0.000223607, 0.000158114, 0.000111803, 0.000079057], "type": "scatter", "mode": "lines", "line": {"color": "#4263eb", "width": 2}, "name": "学习率调度"}]}一个典型的Transformer学习率调度,显示了线性预热阶段(此处为4000步)和随后的逆平方根衰减。峰值学习率取决于模型维度和预热步数。其他调度方案,如带预热的余弦衰减或预热后的线性衰减,在实践中也得到了使用。选择通常取决于具体的任务和数据集。Hugging Face的transformers等库提供了多种常用学习率调度器的实现。超参数调优寻找最优的优化策略通常需要调整超参数。对于Adam优化器,你可能需要调整$\beta_1$、$\beta_2$和$\epsilon$,尽管默认值(或在有影响力的论文中使用的值,如0.9、0.98、1e-9)通常是一个不错的起点。对于学习率调度,warmup_steps和峰值学习率(或应用于调度的缩放因子)是最重要的可调参数。warmup_steps的常见范围是几千步(例如,1000到10000),通常占总训练步数的一小部分。峰值学习率通常需要仔细调整;其值通常在$10^{-5}$到$10^{-3}$之间,具体取决于模型大小、批次大小和数据集。通常需要通过实验来找到适用于你的特定Transformer模型和任务的最佳优化器设置和学习率调度组合。在此过程中,监控训练和验证损失曲线非常必要。总而言之,结合了预热和衰减阶段的学习率调度与Adam优化器一起使用,是训练Transformer模型的标准且高效的方法。虽然默认参数提供了一个合理的起点,但调整这些超参数可以显著影响训练的稳定性和最终模型性能。