Epoch(训练轮次)指模型把整个训练集完整过一遍的次数。一个 epoch 里,每个训练样本通常参与一次前向计算和一次反向传播;如果训练集有 1 万条,batch(批)大小是 100,那大约 100 个 step(迭代步)就是 1 个 epoch。
在小数据集和传统机器学习里,epoch 是核心旋钮:模型可以反复看同一批数据几十、几百遍,验证损失不降就早停。好比复习一本薄讲义,翻来覆去背,每背完一遍就是一个 epoch。但在大模型 pretraining(预训练)里,这个比喻失效了。
原因一,数据太大。预训练语料常是海量网页、书籍、代码等,去重后仍以万亿 token(词元)计。完整遍历一遍的算力成本极高,不少大模型预训练的训练预算,在“还没遍历完”或“刚约一遍”时就用完了。于是训练日志里更常见的进度不是 epoch=10,而是 step 数、已见 token 数、已消耗 FLOPs(浮点运算次数)。
原因二,数据是流式采样的。预训练不必把语料当成一个固定集合,而是从数据管道里不断抽样。不同来源有不同采样权重:高质量代码、百科可能被重复抽到,长尾网页可能一次没被抽中。此时“整个数据集过一遍”边界模糊,讨论 epoch 意义不大。
原因三,停止标准变了。预训练更关心验证损失、算力预算和 token 数,而不是“复习了几轮”。只要 loss(损失)还在合理下降、计算预算允许,就继续跑;预算耗尽或收益递减就停。多跑几个 epoch 还可能让模型死记硬背,伤害泛化。
和相邻概念对比:
| 概念 | 含义 | 常见场景 |
|---|---|---|
| batch(批) | 一次参数更新用的一组样本 | 所有训练 |
| step / iteration(迭代) | 一次参数更新 | 所有训练 |
| epoch(训练轮次) | 训练集整体过一遍 | 小数据、fine-tuning(微调) |
| token(词元)数 | 模型看过多少文本单位 | 大模型预训练 |
| FLOPs(浮点运算次数) | 训练消耗多少计算量 | 预训练预算 |
对从业者,看预训练配置时,别只问“跑几个 epoch”。更该问:训练了多少 token、数据如何配比、哪些数据重复多轮、学习率如何调度、验证损失何时停。微调、小数据集才更常把 epoch 和早停当作主要调节项。对普通人,可以把大模型想成在超大图书馆里快速翻书:重点不是“整馆读了几遍”,而是读了多少页、选了什么书。若看到具体训练轮次,以官方技术报告为准。
