优化器与学习率策略
概述
优化器和学习率策略是大模型训练成功的关键因素。不同优化器在内存占用、收敛速度、最终精度上各有优劣;合理的学习率调度能够帮助模型更快收敛并获得更好的泛化性能。
常见优化器对比
SGD(随机梯度下降)
原理:沿着梯度负方向更新参数,学习率固定。
特点:
- 内存占用小
- 收敛速度慢
- 容易陷入局部最优
- 在大模型训练中很少使用
Adam
原理:自适应学习率优化器,维护一阶矩和二阶矩估计。
公式:
mt=β1mt−1+(1−β1)gt
vt=β2vt−1+(1−β2)gt2
m^t=1−β1tmt,v^t=1−β2tvt
θt=θt−1−αv^t+ϵm^t
特点:
- 自适应学习率,收敛快
- 内存占用是SGD的2倍
- 大模型中泛化性能不如AdamW
- 默认参数:β1=0.9, β2=0.999, ε=1e-8
AdamW
原理:对Adam的权重衰减进行修正,正确分离权重衰减和梯度。
改进点:
- Adam中权重衰减与梯度相加后更新,存在偏差
- AdamW将权重衰减直接加到参数上,修正了这个错误
- 在L2正则化场景下,AdamW比Adam表现更好
适用场景:
- 大模型预训练和微调的首选优化器
- Transformer架构训练
Lion(Lion Optimizer)
原理:基于符号更新的优化器,只使用动量的符号方向进行参数更新。
更新公式:
mt=β1mt−1+(1−β1)gt
θt=θt−1−αsign(mt)−λθt−1
特点:
- 内存占用更少,只需要存储动量,不需要二阶矩
- 收敛速度快,在很多大模型任务上优于AdamW
- 学习率通常需要比AdamW小(约1/10)
- 对超参数更敏感
- 在T5、PaLM等大模型上验证有效
优化器对比总结
| 优化器 | 内存占用 | 收敛速度 | 泛化性能 | 适用场景 |
|---|
| SGD | 低 | 慢 | 一般 | 传统机器学习、小模型 |
| Adam | 高(2倍) | 快 | 一般 | 大多数深度学习任务 |
| AdamW | 高(2倍) | 快 | 好 | 大模型预训练、Transformer |
| Lion | 中(1倍) | 更快 | 更好 | 大规模大模型训练 |
学习率调度策略
Warmup(热身)
原理:训练开始时,学习率从很小的值逐步上升到设定的最大值,避免模型在训练初期不稳定。
为什么需要Warmup:
- 模型参数初始是随机的,梯度方差大,大学习率容易导致训练震荡
- 逐步增大学习率让模型逐渐稳定
- 在大批次训练中尤为重要
设置方式:
- 通常设置总训练步数的1%-10%作为warmup
- 增量预训练中,warmup_ratio一般为0.01(1个epoch的话就是1%)
- SFT通常为0.03(3个epoch就是3%)
学习率衰减策略
Cosine衰减(余弦退火)
原理:学习率按照余弦函数从最大值逐渐衰减到0。
特点:
- 平滑衰减,在大模型训练中表现稳定
- 比线性衰减更常用
- 公式:
ηt=ηmin+21(ηmax−ηmin)(1+cos(Ttπ))
线性衰减
原理:学习率从最大值线性衰减到0。
特点:
阶梯衰减(Step Decay)
原理:每经过固定步数,学习率乘以一个衰减因子。
特点:
增量预训练中的学习率设置经验
- 学习率大小影响:学习率越大,下游任务性能越好,但上游任务(原始预训练)遗忘越多
- 数据量较小建议:使用较小学习率,通常为原预训练阶段最大学习率的10%(例如原3e-4,现在用3e-5)
- 学习率缩放:学习率与batch size平方根成正比,batch size增大4倍,学习率扩大2倍
- warmup与学习率关系:学习率越大,通常需要更大的warmup比例
梯度裁剪(Gradient Clipping)
原理:当梯度范数超过阈值时,将梯度按比例缩放,限制其范数不超过阈值。
if∣∣g∣∣>max_norm:g=∣∣g∣∣g⋅max_norm
作用:
- 防止梯度爆炸
- 稳定训练过程
- 在RNN和Transformer中都常用
常用阈值:通常设置为1.0或5.0
关键实验结论
Warmup步数的影响
实验表明:
- 模型经过充分训练后,不同预热步数最终性能差别不大
- 训练前期,更长的预热步数无论上游还是下游任务,loss都更低(下游学的快,上游忘的慢)
- 资源不允许充分训练时,较小学习率+较长warmup是不错的选择
学习率大小的影响
实验结论:
- 充分训练后,学习率越大,下游性能越好,但上游遗忘越多
- 训练前期,大学习率会导致loss大幅上升,随后才下降
- 资源有限时,较小学习率更安全
中断训练后的学习率恢复
在原数据集上继续训练时,使用Rewarmup效果不如常量学习率,且学习率越大损伤越大。因此:
- 训练中断后重启时,应该恢复学习率到中断前的状态(包括数值和衰减率)
- 不要重新进行warmup
面试常见问题
-
**Adam和AdamW的区别是什么?
- Adam在实现时将权重衰减与梯度相加,导致L2正则化效果不正确;AdamW修正了这个错误,将权重衰减直接应用到参数上,在大模型训练中泛化性能更好。
-
**Lion优化器相比AdamW有什么优势?
- Lion内存占用更低,只需要存储一阶动量,不需要存储二阶矩;在很多大模型任务上收敛更快,最终精度更高;但学习率需要调小,对超参数更敏感。
-
**为什么需要学习率warmup?
- 训练初期模型参数随机,梯度方差大,大学习率容易导致训练不稳定;warmup逐步增大学习率,让模型逐渐稳定,对大规模批次训练尤为重要。
-
**增量预训练中学习率和warmup如何设置?
- 数据集较小的话建议使用较小学习率,约为原预训练学习率的10%;学习率与batch size平方根成正比缩放;warmup_ratio与学习率成正比,通常为总epoch的1%左右;资源有限时较小学习率+较长warmup更稳妥。
-
**什么是梯度裁剪?为什么需要它?
- 梯度裁剪限制梯度的最大范数,当梯度范数超过阈值时按比例缩放,防止梯度爆炸,稳定训练过程,在大模型训练中是常用技巧。
-
**训练中断后重新启动,学习率应该如何处理?
- 应该恢复学习率到中断之前的状态(包括数值和衰减率),不要重新进行warmup,因为warmup会损伤性能。