工程实战:梯度累加、Batch Size 与数据组织详解

0 阅读3分钟

在显存有限的条件下,如何通过工程手段实现大厂级的训练效果?本篇文档拆解了“空间换时间”的全部核心逻辑。


一、 Batch Size:模型“见识”的宽度

Batch Size(批大小) 是指模型在每一次参数更新前,一次性处理的样本数量。

1. 运作全流程:看 → 算 → 改

  • 看 (Forward):一次读入 NN 条数据。
  • 算 (Loss/Gradient):计算这 NN 条数据的平均损失,并推导出梯度的平均方向。
  • 改 (Update):优化器根据这个“集体意见”动一次手术,更新参数 θ\theta

2. 设置依据与经验法则

  • 物理天花板:受显存限制。物理 Batch Size 设多大,取决于显卡能塞下多少。
  • 线性缩放 (Linear Scaling):Batch Size 越大,梯度越准。此时通常可以增大学习率 (LR),因为“方向准,油门可以踩得深”。
  • 甜点位:对于大模型微调,等效 Batch Size 通常设定在 32 ~ 128 之间。

二、 梯度累加:小显存跑大 Batch 的黑科技

当理想的 Batch Size 超过显存容量时,我们采用**“分批记账,一次清算”**的战术。

1. 核心逻辑

  • 只存不更:跑若干次小批次(物理 Batch),计算梯度但不更新参数,而是将梯度存储并不断累加。
  • 周期清算:达到预设的累加步数(Steps)后,取累加梯度的平均值,由优化器执行一次参数更新。

2. 核心公式

等效 Batch Size = GPU数量 × 单卡物理 Batch × 梯度累加步数

3. 适用性边界

  • Transformer 架构:✅ 完美适用。由于使用 LayerNorm,不依赖跨样本统计量。
  • 带有 BatchNorm 的模型:⚠️ 慎用。物理 Batch 过小会导致归一化统计量失真。

三、 数据洗牌 (Shuffle) 与分组策略

同一组数据,不同的“喂养”顺序会产生截然不同的训练效果。

1. Shuffle (洗牌) 的必要性

  • 打破序列依赖:防止模型学习到数据排列的虚假规律(如:先代码后诗歌会导致模型“学了后面忘了前面”)。
  • Epoch 间重洗:每一轮复习(Epoch)都应重新打乱,让模型在不同组合中寻找共性,提升泛化能力

2. Length Grouping (长度分组)

  • 原理:将长度相近的文本分在同一个 Batch。
  • 目的:减少无效的 Padding(补零),极大地提升计算效率,榨干显卡性能。

四、 知识点总结 (Q&A)

追问焦点核心结论
Batch Size 越大越好吗?不一定。太大可能导致模型掉进局部死循环,适度的随机噪声有助于跳出“坑”找到更优解。
梯度累加有副作用吗?主要是时间成本。参数更新频率降低,训练步数变少,可能需要适当延长训练周期。
为什么 Transformer 适合?它的归一化层(LayerNorm)是单样本独立的,不会因为物理 Batch 小而崩塌。

🛠️ 炼丹师备忘录

实战配置建议:

  1. 先把 per_device_train_batch_size 设为显存能承受的最大值(如 4 或 8)。
  2. 再通过 gradient_accumulation_steps 凑够你想要的全局 Batch(如 32 或 64)。
  3. 确保 shuffle=True,并开启混合精度训练以进一步优化空间。