深度学习中Epoch、Batch以及Batch size的设定
一、什么是Epoch、batch、batch_size:
当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次>epoch。(也就是说,所有训练样本在神经网络中都 进行了一次正向传播 和一次反向传播 )
再通俗一点,一个Epoch就是将所有训练样本训练一次的过程。
然而,当一个Epoch的样本(也就是所有的训练样本)数量可能太过庞大(对于计算机而言),就需要把它分成多个小块,也就是就是分成多个Batch 来进行训练。**
Batch(批 / 一批样本):
将整个训练样本分成若干个Batch。
Batch_Size(批大小):
Batch Size定义:一次训练所选取的样本数。
Batch Size的大小影响模型的优化程度和速度。同时其直接影响到GPU内存的使用情况,假如GPU内存不大,该数值最好设置小一点。
二、理解什么是迭代(iteration)
训练一个Batch就是一次Iteration
Iteration(迭代)就像是工厂的“生产批次处理”。 想象你有一个包含10,000张图片的训练集,但你的GPU内存一次只能处理32张图片。那么:
• 1个Iteration = 工厂处理1个批次的32张图片,然后更新一次机器参数
• 处理完这32张图,就算完成了一次“迭代”
三、为什么要提出Batch Size?
在没有使用Batch Size之前,这意味着网络在训练时,是一次把所有的数据(整个数据库)输入网络中,然后计算它们的梯度进行反向传播,由于在计算梯度时使用了整个数据库,所以计算得到的梯度方向更为准确。但在这情况下,计算得到不同梯度值差别巨大,难以使用一个全局的学习率,所以这时一般使用Rprop这种基于梯度符号的训练算法,单独进行梯度更新。
在小样本数的数据库中,不使用Batch Size是可行的,而且效果也很好。但是一旦是大型的数据库,一次性把所有数据输进网络,肯定会引起内存的爆炸。所以就提出Batch Size的概念。
Batch Size合适的优点:
1、通过并行化提高内存的利用率。就是尽量让你的GPU满载运行,提高训练速度。
2、单个epoch的迭代次数减少了,参数的调整也慢了,假如要达到相同的识别精度,需要更多的epoch。
3、适当Batch Size使得梯度下降方向更加准确。
Batch Size从小到大的变化对网络影响
1、没有Batch Size,梯度准确,只适用于小样本数据库
2、Batch Size=1,梯度变来变去,非常不准确,网络很难收敛。
3、Batch Size增大,梯度变准确,
4、Batch Size增大,梯度已经非常准确,再增加Batch Size也没有用
注意:Batch Size增大了,要到达相同的准确度,必须要增大epoch。
GD(Gradient Descent):就是没有利用Batch Size,用基于整个数据库得到梯度,梯度准确,但数据量大时,计算非常耗时,同时神经网络常是非凸的,网络最终可能收敛到初始点附近的局部最优点。
SGD(Stochastic Gradient Descent):就是Batch Size=1,每次计算一个样本,梯度不准确,所以学习率要降低。
mini-batch SGD:就是选着合适Batch Size的SGD算法,mini-batch利用噪声梯度,一定程度上缓解了GD算法直接掉进初始点附近的局部最优值。同时梯度准确了,学习率要加大。
• 要处理完所有10,000张图片,就需要:10,000 ÷ 32 = 312.5次Iteration
这确实很像编程中的迭代器:for image_batch in dataloader: - 每次循环取出一批数据,就是一次迭代。所以Iteration就是模型学习过程中的“最小学习单元”,每处理一个batch、更新一次权重,就算完成了一次迭代。
三、为什么要使用多于一个epoch?
在神经网络中传递完整的数据集一次是不够的,而且我们需要将完整的数据集在同样的神经网络中传递多次。但请记住,我们使用的是有限的数据集,并且我们使用一个迭代过程即梯度下降来优化学习过程。如下图所示。因此仅仅更新一次或者说使用一个epoch是不够的。
举一个非常简单的例子去形容这个过程:
想象你在准备一场非常重要的考试:
你的学习资料(训练集) = 一本厚厚的教科书(但这是你唯一的一本参考书)
你的大脑(模型) = 需要学习知识的学生
学习方式(梯度下降) = 通过做章节练习题来学习,而不是一次性死记硬背整本书
为什么只学一遍(1个epoch)远远不够?
场景1:第一遍学习(第1个epoch)
你拿起教科书,从头到尾快速阅读了一遍。然后合上书,开始做模拟试卷。
结果会怎样?
你只能记住一些大概的框架和概念
对于具体的公式、细节、易错点都非常模糊
考试成绩很可能不理想
这就好比模型只训练1个epoch: 它只是“见过”数据,但远没有“学会”数据中的复杂模式和细微特征。
场景2:多轮学习(多个epoch)
现在你改变策略:快速阅读第一遍 → 做章节练习题 → 带着问题重读第二遍 → 做综合题 → 第三遍重点复习薄弱环节...
经过多轮学习后:
第1轮:建立知识框架,了解重点章节
第2轮:深入理解核心概念,发现自己的薄弱点
第3轮:巩固难点,建立知识点间的联系
...(继续迭代)
第N轮:知识体系融会贯通,能够灵活应用
随着epoch数量增加,神经网络中的权重的更新次数也在增加,曲线从欠拟合变得过拟合。
那么,到底多少个epoch最合适,这个问题没有正确答案,对于不同的数据集,答案都不相同。
四、为什么要提出Batch Size?
在没有使用Batch Size之前,这意味着网络在训练时,是一次把所有的数据(整个数据库)输入网络中,然后计算它们的梯度进行反向传播,由于在计算梯度时使用了整个数据库,所以计算得到的梯度方向更为准确。但在这情况下,计算得到不同梯度值差别巨大,难以使用一个全局的学习率,所以这时一般使用Rprop这种基于梯度符号的训练算法,单独进行梯度更新。
在小样本数的数据库中,不使用Batch Size是可行的,而且效果也很好。但是一旦是大型的数据库,一次性把所有数据输进网络,肯定会引起内存的爆炸。所以就提出Batch Size的概念。
五、Batch Size合适的优点:
1、通过并行化提高内存的利用率。就是尽量让你的GPU满载运行,提高训练速度。
2、单个epoch的迭代次数减少了,参数的调整也慢了,假如要达到相同的识别精度,需要更多的epoch。
3、适当Batch Size使得梯度下降方向更加准确。
六、Batch Size从小到大的变化对网络影响
1、没有Batch Size,梯度准确,只适用于小样本数据库
2、Batch Size=1,梯度变来变去,非常不准确,网络很难收敛。
3、Batch Size增大,梯度变准确,
4、Batch Size增大,梯度已经非常准确,再增加Batch Size也没有用
注意:Batch Size增大了,要到达相同的准确度,必须要增大epoch。
GD(Gradient Descent):就是没有利用Batch Size,用基于整个数据库得到梯度,梯度准确,但数据量大时,计算非常耗时,同时神经网络常是非凸的,网络最终可能收敛到初始点附近的局部最优点。
SGD(Stochastic Gradient Descent):就是Batch Size=1,每次计算一个样本,梯度不准确,所以学习率要降低。
mini-batch SGD:就是选着合适Batch Size的SGD算法,mini-batch利用噪声梯度,一定程度上缓解了GD算法直接掉进初始点附近的局部最优值。同时梯度准确了,学习率要加大。
七、用非常简单的比喻理解batch_size
想象你是一个老师,要带领学生(模型)掌握一本厚厚的百科全书(训练数据集)里的所有知识。
第一阶段:理想但不可行的“全量学习” (Batch Gradient Descent)
方式: 一次性把整本百科全书读完,然后进行一次总结,更新一次学习方法。
• 对应概念: Batch Size = 整个数据集
• 文中的说法: “不使用Batch Size”
优点:
• 方向绝对正确: 因为基于全部知识进行总结,学习方向是最精准的。 (梯度方向更为准确)
致命缺点:
• 内存爆炸: 要求你有“过目不忘”的本领,能把整本书的内容同时塞进脑子里。对于大数据集,GPU内存根本装不下。 (引起内存的爆炸)
• 容易钻牛角尖: 如果第一遍总结的方向是错的(陷入局部最优),因为没有其他视角,就很难跳出来。 (收敛到初始点附近的局部最优点)
• 不灵活: 学习节奏单一,无法针对难点重点学习。
适用场景:
• 这本书很薄(小样本数据库),你完全可以一次性掌握。这时效果最好。
第二阶段:灵活但低效的“逐字学习” (Stochastic Gradient Descent)
方式: 一次只读一个词条,读一个就马上调整一下自己的理解。
• 对应概念: Batch Size = 1
• 文中的说法: “SGD”
优点:
• 内存需求极低: 一次只处理一个样本,永远不爆内存。
• 善于跳出局部: 因为每个样本都带来新的、可能相反的“观点”,使得学习路径很随机,不容易卡死在某个错误的“局部理解”上。 (缓解了GD算法直接掉进局部最优)
致命缺点:
• 方向混乱、进度缓慢: 学到的知识非常零碎,前后可能矛盾。今天学的“苹果是水果”,可能被明天学的“苹果是手机”带偏。梯度方向来回震荡,收敛极慢。 (梯度变来变去,非常不准确,网络很难收敛)
• 无法并行: 一次教一个学生,无法发挥团队(GPU多核)的力量。
第三阶段:最优折衷的“章节学习” (Mini-batch Gradient Descent)
方式: 把书分成很多章,一次学习一个章节(比如32个词条),学完一章后,对这一章的内容进行统一总结,再更新学习方法。
• 对应概念: Batch Size = n (例如 32, 64)
• 文中的说法: “提出Batch Size的概念”, “mini-batch SGD”
这就是我们实际在用的方法! 它完美地平衡了前两种方法的优缺点:
Batch Size 的三大优点(对应原文):
-
并行化,提高效率 (提高训练速度):
◦ 一个小组(一个Batch)的学生可以一起讨论学习(GPU并行计算),大大提高了学习效率。让你的GPU“满载运行”。 -
梯度方向更准确 (适当Batch Size使得梯度下降方向更加准确):
◦ 基于一个章节(一个Batch)的总结,比基于一个词条(一个样本)的总结更靠谱,方向更稳定。同时又比强行消化整本书(整个数据集)要可行。 -
引入良性噪声,避免僵化 (缓解陷入局部最优):
◦ 每个章节的重点都不一样,这相当于在正确的学习大方向下,引入了一些随机性。这能帮助模型跳出一些不好的局部最优点,找到更优的解。
Batch Size 从小到大的影响(对应原文):
• Batch Size = 1 (SGD): “学得太杂”,方向混乱,收敛困难。
• Batch Size 逐渐增大 (如 32 -> 256): 学习方向越来越稳定,训练曲线越来越平滑,收敛速度加快。
• Batch Size 过大 (如 1024+): 方向确实很准,但:
◦ 可能泛化能力变差: 学得太“死板”,容易过拟合。
◦ 需要更多轮次 (epoch): 因为一次迭代看到的数据多了,但模型需要更多的“宏观调整”(epoch)才能收敛到好的点。 (要到达相同的准确度,必须要增大epoch)
◦ 收益递减: 当Batch Size大到一定程度(比如覆盖了数据多样性的核心部分),再加大效果就不明显了。 (梯度已经非常准确,再增加Batch Size也没有用)
总结与实战指南
方法 核心思想 优点 缺点 适用场景
BGD (No Batch) 全量学习,一步到位 梯度方向最准 内存爆炸、易局部最优、慢 极小数据集
SGD (Batch=1) 逐样本学习,随时更新 内存需求低、能跳出局部最优 收敛慢、不稳定、无法并行 在线学习
Mini-batch (常用) 分批次学习,折中之道 兼顾速度与稳定性、可利用并行 需要调参 绝大多数深度学习任务
给你的黄金法则:
在实践中,Batch Size 是你需要调节的最重要超参数之一。通常从 32 或 64 开始尝试,并确保其大小不会导致GPU内存溢出。它的选择是在梯度计算的“准确性”和训练的“收敛速度/泛化能力”之间进行的一种关键权衡。

浙公网安备 33010602011771号