训练大模型时,一批喂多少样本是个绕不开的选择。batch size 调大,单步梯度更稳;调小,同样数据能走更多步。两边各有代价,没有绝对的好坏。本文按机制层思路,把两头的账算清楚,再给出常见的搭配逻辑。
大批次:稳的代价
先看大批次的好处与代价。好处是梯度估计准:batch 越大,采样噪声被平均得越彻底,单步方向更可靠,loss 曲线更平滑。代价首先是显存,激活值按 batch 线性增长,大 batch 常常是显存先爆;其次是同样数据下的步数变少,一个 epoch 的更新机会缩水,总训练时间未必缩短。这类似把一堆问题一次性丢给腾讯元宝:它答得稳,但你要等它全部答完;一条条问豆包,响应快却容易前后不一致。
小批次:快的代价
再看小批次。小 batch 的梯度噪声大,单步方向左右摇摆,但摇摆本身有逃出尖锐极小值的作用,实践中泛化有时反而略好。代价是 GPU 算不满——并行度上不去,算力闲置;以及相邻两步的梯度可能互相抵消,有效进度打折。极端情况下,batch 小到每卡只有几条样本,梯度方向基本是随机游走,训练变成碰运气。
有效步长与学习率联动
机制上两者通过「有效步长」联动。梯度噪声随 batch 增大而减小,此时可以配更大的学习率补偿步数变少,这就是常见的大 batch 配大学习率、小 batch 配小学习率的经验。反过来在小 batch 上硬用大学习率,噪声加震荡,模型直接发散。学习率和训练阶段的匹配逻辑,在微调篇里有专门展开,这里记住一条就够:动 batch,就要重审学习率。
梯度累积:折中办法
想大 batch 的稳又不想吃显存,梯度累积是标准折中:连续累积多个小 batch 的梯度再统一更新,数学效果接近大 batch,显存只按小 batch 算。代价是更新频率降低,同样步数下墙上时间变长。实践里的常见动线是:先按显存上限设单卡 batch,不够再上梯度累积,最后按总样本量和步数预算反推 global batch。多卡场景下 global batch 是各卡之和,切分逻辑见数据并行是怎么分工的;单卡放不下时的分层处理见流水线并行和ZeRO 分片。
最后说一个常见误配:batch 调大后忘记动学习率,loss 下降变慢就盲目加步数,其实换个大一点的学习率就解决了。batch 大小还会影响相邻样本的相关性,样本顺序的讲究见训练数据的顺序有影响吗;训练不稳导致旧能力掉落时,灾难性遗忘怎么防里的回放思路也常被用上。
| 症状 | 可能的原因 | 处理方向 |
|---|---|---|
| loss 下降变慢 | batch 调大后学习率没跟着动 | 先重审学习率,再谈加步数 |
| 显存爆掉 | 激活值随 batch 线性增长 | 降单卡 batch,改用梯度累积 |
| 算力闲置 | batch 太小,并行度上不去 | 适当加大 batch |
| 训练发散 | 小 batch 上硬用大学习率 | 学习率随 batch 一起降 |
- 大批次:梯度稳、曲线平滑,但显存贵、步数少
- 小批次:步进快、偶有泛化好处,但噪声大、算力易闲置
- 联动:batch 大学率可大,batch 小学率要小
- 折中:梯度累积模拟大 batch,显存只按小 batch 算
- 动线:先定单卡 batch,再累积,最后反推 global batch
关于 batch size 的三个常问问题
- batch 越大收敛一定越快吗?:不一定,步数少了以后单 epoch 更新机会也少,总时间常按「每样本计算量」折算才公平。
- 梯度累积和大 batch 完全等价吗?:梯度层面接近,但按小 batch 做统计归一化的层会看出差别,严格说不等价。
- 调 batch 要重新调学习率吗?:通常要,batch 翻倍而学习率不变,相当于有效步长减半,收敛会明显变慢。


