【学习率调整】batch_size与学习率关系
来源
paper weekly原创文章,阅读原文。
学习率的一般原则
Qwen3-32B对于几千个样本小数据集的sft学习率,在1e-5这个级别较为合适;其与大部分任务,都是1e-6(小模型),顶多3e-6(大模型);在text2sql类任务上,可以尝试1e-5;数学任务可以尝试4e-6, 在areal上训挺好,在verl上也得1e-6。
当 Batch Size 增大时,学习率的调整并非一个固定不变的规则,而是存在多种理论和实践方案,其适用性取决于优化器类型、Batch Size 的大小范围以及模型训练所处的阶段。以下是几种主要的缩放定律及其适用场景:
-
平方根缩放 (Square Root Scaling)
- 规则: Batch Size 扩大到
k
倍,学习率扩大到√k
倍。 - 原理: 该规则旨在保持 SGD 更新步长的**方差(噪声强度)**不变。因为增大 Batch Size 会降低梯度估计的方差,为了维持训练过程中有益的噪声水平,需要相应地增大学习率,但增大的幅度是方差减小幅度的平方根。
- 出处与适用: 最早由2014年的论文提出,也被《Train longer, generalize better》等研究认同。对于 Adam、RMSProp 等自适应优化器,理论分析和实践(如训练BERT的论文)倾向于支持平方根缩放。
- 规则: Batch Size 扩大到
-
线性缩放 (Linear Scaling)
- 规则: Batch Size 扩大到
k
倍,学习率也扩大到k
倍。 - 原理: 该规则更符合直观认知,假设在短时间内连续几个 Batch 的梯度方向变化不大,那么将
k
个样本的梯度累加(等价于 Batch Size 为k
)后,学习率也应同比例放大才能达到相同的更新效果。从随机微分方程 (SDE) 的视角来看,为了保持 SDE 的形式不变,也需要线性缩放。 - 出处与适用: 在实践中,尤其对于 SGD 优化器在较小 Batch Size 范围内,线性缩放往往表现更好。它被认为是平方根缩放在小 Batch Size 下的一个局部近似。
- 规则: Batch Size 扩大到
-
基于损失函数的最优缩放 (Optimal Scaling via Loss Function)
- 规则: 学习率随 Batch Size 单调递增,但存在一个上界。当 Batch Size 较小时,近似于线性缩放;当 Batch Size 非常大时,学习率趋于饱和,不再增长。
- 原理: OpenAI 的研究从最优化角度出发,将学习率视为一个需要优化的参数,目标是使每一步的损失函数期望下降量最大。通过损失函数的二阶泰勒展开,推导出最优学习率公式,该公式表明学习率与 Batch Size 的关系是非线性的,且受模型 Hessian 矩阵和梯度噪声的影响。
- 关键概念: 存在一个“分水岭”Batch Size
B_max
,当 Batch Size 超过此值后,继续增大 Batch Size 带来的效率提升会急剧下降,甚至得不偿失。 - 适用: 这是对 SGD 的一个更本质和全面的分析,指出了前两种缩放定律的局限性(它们都隐含了学习率可以无限增大的错误结论)。
-
Adam 优化器的“涌现”现象 (Surge Phenomenon for Adam)
- 规则: 对于 Adam 优化器,在某些情况下(特别是当 Hessian 矩阵的非对角元素作用显著时),存在一个最优的 Batch Size。当实际 Batch Size 超过这个最优值时,最佳学习率反而应该减小。
- 原理: 这种“先增后减”的现象被称为“Surge”。其直观解释是,Adam 的自适应机制本身可能不是最优的,适度的梯度噪声(来自较小的 Batch Size)反而能修正这种次优性。当 Batch Size 过大导致噪声过小时,就需要通过降低学习率来避免因自适应策略的缺陷而导致的训练不稳定或效果下降。
- 适用: 这是针对 Adam 优化器的最新研究发现,揭示了其与 SGD 在缩放行为上的根本不同。
总结与实践建议:
- 对于 SGD: 在小到中等 Batch Size 范围内,可以尝试线性缩放作为起点,它通常是有效的。但要意识到它有上限,当 Batch Size 非常大时,学习率不应无限制增加,应参考基于损失函数的分析,寻找饱和点。
- 对于 Adam/RMSProp: 通常推荐使用平方根缩放。但最新的研究提示,在非常大的 Batch Size 下,可能需要警惕“Surge”现象,即学习率可能需要下调。
- 通用原则: 无论采用哪种理论,学习率的最终调整都应以实际验证为准。理论提供了良好的起点和搜索范围,但最佳学习率往往需要通过实验(如网格搜索、学习率预热、学习率调度器等)来确定。同时,增大 Batch Size 时,通常还需要配合学习率预热 (Learning Rate Warmup) 策略,以稳定训练初期的过程。
基准学习率的确定
在讨论“学习率扩大 k 倍”或“扩大到 √k 倍”时,这个“基准学习率”(Baseline Learning Rate)指的是在原始、较小的 Batch Size 下,经过验证能够使模型有效、稳定训练并达到良好性能的那个学习率。
简单来说,它就是你“炼丹”时的起点。这个值通常是通过在小规模实验、网格搜索(Grid Search)、学习率范围测试(Learning Rate Range Test)或遵循社区最佳实践(例如,ResNet-50 在 ImageNet 上常用 0.1 作为初始学习率)等方式确定的。
为什么需要基准学习率?
所有的缩放定律(平方根、线性、最优缩放)都不是凭空给出一个绝对的学习率值,而是提供一个相对调整的规则。它们回答的问题是:“如果我现在用的 Batch Size 是 B,学习率是 LR_base,并且效果不错;那么当我把 Batch Size 增大到 k * B 时,新的学习率 LR_new 应该设置为多少,才能期望获得与之前相似甚至更好的训练动态和最终效果?”
举例说明:
- 场景: 你在 CIFAR-10 数据集上用 Batch Size = 128 训练一个 ResNet,通过实验发现学习率设置为 0.01 时效果最好。那么,这里的 0.01 就是你的基准学习率 (LR_base)。
- 应用线性缩放: 现在你想把 Batch Size 增大到 512(即 k = 512 / 128 = 4)。根据线性缩放规则,新的学习率应为:
LR_new = LR_base * k = 0.01 * 4 = 0.04
。 - 应用平方根缩放: 同样将 Batch Size 增大到 512 (k=4)。根据平方根缩放规则,新的学习率应为:
LR_new = LR_base * √k = 0.01 * √4 = 0.01 * 2 = 0.02
。
重要提示:
- 起点而非终点: 通过缩放定律计算出的
LR_new
是一个非常好的初始猜测值或搜索起点,但它不一定是该 Batch Size 下的全局最优值。最佳实践是在这个新学习率附近进行微调(例如,尝试 0.03, 0.04, 0.05)。 - 配合学习率预热 (Warmup): 当使用非常大的 Batch Size 和相应放大的学习率时,直接使用高学习率可能会导致训练初期不稳定。因此,通常会配合“学习率预热”策略,即在训练开始的若干步(或若干个epoch)内,将学习率从一个很小的值(如0)线性地增加到
LR_new
,以稳定训练过程。