【深度学习】batch_size和学习率lr之间的关系
参考文献
https://blog.csdn.net/jgj123321/article/details/106196577
问题描述
在训练ssd的过程中,出现了训练几轮之后loss开始变成nan的现象
搜索了之后发现了上面的博客里的说法,于是研究一下batchsize和lr之间的关系
分析
按上面的说法,当batchsize减小时,lr也要跟着减小
豆包的解释:
在深度学习模型训练中,batch size(批量大小)与学习率(LR)存在密切关联,尤其是当batch size减小时需相应降低学习率。以下从理论原理、数学推导、实际影响及经验策略四个维度展开解析:
一、核心关联:梯度估计的方差与更新稳定性
-
batch size对梯度的影响
- batch size越大:梯度估计基于更多样本,噪声(方差)越小,梯度方向更接近全局最优方向。
- batch size越小:梯度仅基于少量样本,方差显著增大,更新方向可能剧烈波动(如图1所示)。
-
学习率与梯度噪声的平衡
- 当batch size较小时,若学习率保持不变,较大的步长会放大梯度噪声的影响,导致参数更新震荡甚至发散。
- 减小学习率可缩小步长,使模型在噪声较大的梯度引导下更平稳地收敛。
二、数学推导:从SGD到Mini-Batch SGD的理论支撑
-
梯度期望与方差的数学表达
设训练集样本为${x_i, y_i}_{i=1}^N$,模型参数为$\theta$,损失函数为$L(\theta; x_i, y_i)$。- 批量梯度(Batch Gradient):
$$g_B = \frac{1}{B} \sum_{i=1}^B \nabla L(\theta; x_i, y_i)$$
其中$B$为batch size,梯度期望为$\mathbb{E}[g_B] = \nabla L(\theta)$,方差为$\text{Var}(g_B) = \frac{1}{B} \text{Var}(\nabla L(\theta; x_i))$。 - 结论:方差与$B$成反比,即batch size越小,梯度方差越大。
- 批量梯度(Batch Gradient):
-
学习率与batch size的线性缩放原则
- 当batch size从$B_1$调整为$B_2$时,为保持梯度更新的“等效强度”,学习率应按比例调整:
$$\text{LR}_2 = \text{LR}_1 \times \frac{B_2}{B_1}$$ - 推导:更新量$\Delta\theta = -\text{LR} \cdot g_B$,若保持$\Delta\theta$的期望不变,则:
$$\text{LR}_2 \cdot \frac{1}{B_2} = \text{LR}_1 \cdot \frac{1}{B_1} \quad \Rightarrow \quad \text{LR}_2 = \text{LR}_1 \times \frac{B_2}{B_1}$$ - 示例:若原batch size=256,LR=0.1;当batch size降至64时,LR应调整为$0.1 \times \frac{64}{256} = 0.025$。
- 当batch size从$B_1$调整为$B_2$时,为保持梯度更新的“等效强度”,学习率应按比例调整:
三、实际影响:训练动态与收敛特性对比
指标 | 大batch size(如256) | 小batch size(如16) |
---|---|---|
梯度稳定性 | 方差小,更新方向更稳定,适合大学习率 | 方差大,更新方向波动大,需小学习率抑制震荡 |
训练速度 | 单次迭代耗时更长,但每个epoch的迭代次数少(如10000样本/B=256需391次迭代) | 单次迭代耗时短,但总迭代次数多(B=16需625次迭代),完整epoch耗时可能更长 |
泛化能力 | 可能陷入尖锐局部最优,泛化性略差(大batch的正则化效应弱) | 梯度噪声类似数据增强,可能跳出平坦局部最优,泛化性更好(需配合小LR) |
内存占用 | 占用更多显存(需存储更多样本的中间激活值) | 显存占用低,适合小显存设备 |
四、经验策略:如何根据batch size调整学习率
-
线性缩放策略(适用于SGD+动量)
- 当batch size按倍数$k$缩放时,学习率也按$k$倍调整,即:
$$\text{LR}{\text{new}} = \text{LR}{\text{old}} \times k \quad (k = \frac{B_{\text{new}}}{B_{\text{old}}})$$ - 适用场景:ImageNet分类、目标检测等大规模视觉任务,如ResNet训练中常用此策略。
- 当batch size按倍数$k$缩放时,学习率也按$k$倍调整,即:
-
小batch size的补偿策略
- 若batch size过小(如B=1~8),除降低学习率外,可结合以下技巧:
- 增加迭代次数:因为小batch的每个epoch迭代次数更多,需保证总训练样本数足够(如原计划100 epoch,可增至150 epoch)。
- 添加梯度平滑:如使用EMA(指数移动平均)对梯度进行平滑,减少噪声影响。
- 启用warm-up策略:初始阶段用极小学习率(如1e-5)热身,再线性提升至目标学习率,避免初始阶段梯度爆炸。
- 若batch size过小(如B=1~8),除降低学习率外,可结合以下技巧:
-
自适应优化器的特殊处理
- 对于Adam、RMSprop等自适应优化器,batch size对学习率的影响相对较弱(因自适应调整二阶矩),但仍建议:
- 当batch size从标准值(如32)减半时,学习率可按0.5~0.7倍缩放(而非严格线性)。
- 避免batch size过小(如B<4),否则自适应优化器可能因梯度方差过大而失效。
- 对于Adam、RMSprop等自适应优化器,batch size对学习率的影响相对较弱(因自适应调整二阶矩),但仍建议:
五、总结:核心逻辑与实践建议
- 本质原因:小batch size导致梯度方差增大,需通过减小学习率来平衡更新步长,避免震荡。
- 黄金法则:batch size与学习率按线性比例同步调整($LR \propto B$),但需结合任务特性灵活微调。
- 工程实践:
- 若显存充足,优先使用较大batch size(如32~256),并按线性法则设置学习率。
- 若必须使用小batch size(如设备显存限制),建议:
# 示例:batch size从32降至8时,学习率调整 original_lr = 0.01 original_batch = 32 new_batch = 8 new_lr = original_lr * (new_batch / original_batch) # 0.01 * (8/32) = 0.0025
- 配合warm-up、梯度累积等技巧(如将多个小batch的梯度累加后更新,等效增大batch size),可进一步优化训练稳定性。
关于batchsize
batchsize和iteration的关系很大
如果batchsize为4,就会在每个iteration中选择四张图像,利用gpu的并行计算功能同时处理这四张图像并进行反向传播,当batchsize过大,同时处理的数据量超过了gpu的能力,训练就会失败
也就是说:每个epoch中,迭代iteration的次数 = 数据集图像数量 / batchsize
关于学习率lr
学习率(Learning Rate,简称 LR)是深度学习优化过程中最重要的超参数之一,其本质是控制模型参数更新的步长