大模型训练流程里有个不起眼但必做的动作:每个 epoch 开始前把数据打乱。看起来只是洗牌,实则直接影响模型学成什么样。本文按机制层思路,讲清顺序为什么有影响、打乱在哪个层次做、以及什么时候反而不该随机。
不打乱:同类扎堆的后果
先看不打乱会出什么问题。语料常按来源聚集,比如前十万条都是新闻,后十万条都是论坛回帖。如果不打乱,模型连续几千步只见到新闻体,语言风格被往一个方向猛拉,等见到回帖时,前面的倾向已经固化。好比一个人连续几天只读同一位作者的文章,观点会越带越偏;平时我们交替使用 DeepSeek 和 Kimi,也是为了不被单一风格带偏。
机制:独立同分布被破坏
往机制里再走一层。随机梯度下降的推导假设样本近似独立同分布,同类样本扎堆等于破坏了这个前提:batch 内梯度高度同向,更新步长被「放大」到单一方向,损失曲面上的行走变成剧烈折返。表现出来就是 loss 曲线抖、收敛慢,最终模型在某些任务上强、某些任务上弱,分布不均衡。严重时模型会对训练后期见到的来源「偏心」,评估集按来源一切,成绩差得离谱。
全局打乱与分布式切分
再说打乱的层次。最常见的是全局打乱:每个 epoch 用新随机种子重排全部样本,保证任何相邻 batch 的样本来源都尽量杂。分布式场景下还多一层:全局打乱后的数据要切成连续分片分给各卡,各卡拿到的 micro-batch 是打乱结果的片段,整套流程在数据并行是怎么分工的里能看到完整位置。
例外:课程学习与时序数据
什么时候不该纯随机?课程学习就是故意的例外:把样本按从易到难排序,让模型先学基础再学复杂,此时顺序本身就是教学信号,课程学习为什么有效讲的就是这笔顺序账。另一种情况是时序敏感的数据,比如按时间排列的对话,打乱会切断上下文依赖,这类数据要做窗口内打乱而非全局打乱。
| 场景 | 要不要全局打乱 | 做法 |
|---|---|---|
| 普通语料训练 | 要 | 每个 epoch 换新种子重排全部样本 |
| 分布式多卡 | 要,且先打乱再切片 | 各卡拿到的 micro-batch 才够杂 |
| 课程学习 | 不纯随机 | 按从易到难排序,顺序即教学信号 |
| 时序敏感数据 | 不全局打乱 | 窗口内打乱,别切断上下文 |
执行细节也值得留意。随机种子要跨 epoch 更换,否则每个 epoch 顺序相同,等于把同一副牌反复按同一顺序发;数据切分给各卡之前就要完成全局打乱,各卡打完折再互相交换反而增加通信。还有一个容易漏的点:打乱要打到样本级别,只打乱 batch 之间的顺序而 batch 内部还按主题排列,效果会打对折。样本顺序还会和收敛节奏互相作用,力度设置可以参考微调时学习率为什么比预训练小;顺序乱序带来的不稳定,有时要靠回放旧数据兜底,灾难性遗忘怎么防讲了两条路。
相邻 batch 的样本数怎么定,则看batch size 大了好还是小了好;喂进去的样本干不干净,则是指令数据的质量那篇要回答的问题。
- 不打乱的后果:同类样本扎堆,风格偏向、梯度折返、分布失衡
- 全局打乱:每 epoch 换新种子重排,让相邻 batch 来源尽量杂
- 分布式注意:先全局打乱再切分片,各卡 micro-batch 才够杂
- 例外一:课程学习故意排序,顺序即教学信号
- 例外二:时序数据做窗口内打乱,别切断上下文
聊聊数据打乱的常见疑问
- 每个 epoch 都要重新打乱吗?:要,每轮都该换新的随机种子,同顺序反复出现等于没打乱。
- 打乱能救回烂数据吗?:不能,它只影响学习顺序不影响数据质量,配比和过滤该做的还得做。
- 小数据集也需要打乱吗?:更需要,数据少还扎堆时模型几十步就能把单一来源背下来,泛化直接垮掉。


