随机梯度下降是一种具有多个超参数的学习算法。
两个经常让初学者感到困惑的超参数是批量大小(batch size)和周期数(number of epochs)。它们都是整数值,并且似乎做着相同的事情。
在这篇文章中,你将了解随机梯度下降中批次和周期之间的区别。
阅读本文后,你将了解:
- 随机梯度下降是一种迭代学习算法,它使用训练数据集来更新模型。
- 批量大小是梯度下降的一个超参数,它控制着在更新模型内部参数之前要处理的训练样本数量。
- 周期数是梯度下降的一个超参数,它控制着对训练数据集进行完整遍历的次数。
通过我的新书《使用Python进行深度学习》启动你的项目,其中包括分步教程和所有示例的Python源代码文件。
让我们开始吧。

神经网络中批次和周期有什么区别?
图片由Graham Cook拍摄,部分权利保留。
概述
本文分为五个部分,它们是:
- 随机梯度下降
- 什么是样本?
- 什么是批次?
- 什么是一个周期?
- 批次和周期之间有什么区别?
随机梯度下降
随机梯度下降(简称SGD)是一种优化算法,用于训练机器学习算法,最主要的是深度学习中使用的人工神经网络。
该算法的任务是找到一组内部模型参数,使其在某些性能度量(如对数损失或均方误差)上表现良好。
优化是一种搜索过程,你可以将这种搜索视为学习。优化算法被称为“梯度下降”,其中“梯度”指的是误差梯度或误差斜率的计算,而“下降”指的是沿着该斜率向下移动,直至达到某个最小误差水平。
该算法是迭代的。这意味着搜索过程发生在多个离散步骤中,每个步骤都希望能稍微改善模型参数。
每个步骤都涉及使用当前内部参数集对某些样本进行预测、将预测与实际预期结果进行比较、计算误差,并使用误差更新内部模型参数。
对于不同的算法,这种更新过程是不同的,但在人工神经网络的情况下,使用反向传播更新算法。
在我们深入了解批次和周期之前,让我们先看看“样本”的含义。
在此处了解更多关于梯度下降的信息
什么是样本?
一个样本是数据的一行。
它包含输入到算法中的输入以及用于与预测进行比较并计算误差的输出。
训练数据集由多行数据组成,例如,许多样本。一个样本也可以被称为一个实例、一个观测、一个输入向量或一个特征向量。
现在我们知道了什么是样本,接下来我们来定义一个批次。
什么是批次?
批量大小是一个超参数,它定义了在更新内部模型参数之前要处理的样本数量。
可以将批次想象成一个遍历一个或多个样本并进行预测的for循环。在批次结束时,预测与预期输出变量进行比较并计算误差。根据这个误差,使用更新算法来改进模型,例如沿着误差梯度向下移动。
一个训练数据集可以被分成一个或多个批次。
当所有训练样本都用于创建一个批次时,该学习算法被称为批量梯度下降。当批次大小为一个样本时,该学习算法被称为随机梯度下降。当批次大小大于一个样本且小于训练数据集大小时,该学习算法被称为小批量梯度下降。
- 批量梯度下降。批量大小 = 训练集大小
- 随机梯度下降。批量大小 = 1
- 小批量梯度下降。1 < 批量大小 < 训练集大小
在小批量梯度下降的情况下,常用的批量大小包括32、64和128个样本。你可能会在文献和教程中的模型中看到这些值。
如果数据集不能被批量大小整除怎么办?
在训练模型时,这种情况经常发生。这仅仅意味着最后一个批次中的样本数量少于其他批次。
或者,你可以从数据集中删除一些样本,或者更改批量大小,使得数据集中的样本数量可以被批量大小整除。
有关这些梯度下降变体之间差异的更多信息,请参阅这篇文章
有关批量大小对学习过程影响的更多信息,请参阅这篇文章
一个批次涉及使用样本对模型进行更新;接下来,让我们看看一个周期。
什么是一个周期?
周期数是一个超参数,它定义了学习算法将遍历整个训练数据集的次数。
一个周期意味着训练数据集中的每个样本都有机会更新内部模型参数。一个周期由一个或多个批次组成。例如,如上所述,具有一个批次的周期被称为批量梯度下降学习算法。
你可以将一个for循环想象成遍历周期数,其中每个循环都遍历训练数据集。在这个for循环中,还有另一个嵌套的for循环,它遍历每个样本批次,其中一个批次具有指定的“批量大小”数量的样本。
周期数通常很大,通常是数百或数千,这使得学习算法能够运行,直到模型的误差被充分最小化。你可能会在文献和教程中看到将周期数设置为10、100、500、1000或更大的示例。
通常会创建线图,其中X轴表示时间(周期),Y轴表示模型的误差或技能。这些图有时被称为学习曲线。这些图可以帮助诊断模型是过拟合、欠拟合还是适当地拟合了训练数据集。
有关使用LSTM网络通过学习曲线进行诊断的更多信息,请参阅这篇文章
如果仍然不清楚,让我们看看批次和周期之间的区别。
批次和周期之间有什么区别?
批量大小是在模型更新之前处理的样本数量。
周期数是对训练数据集进行完整遍历的次数。
批次的大小必须大于或等于1,且小于或等于训练数据集中的样本数量。
周期数可以设置为1到无穷大之间的整数值。你可以根据需要运行算法,甚至可以使用除固定周期数之外的其他标准来停止它,例如模型误差随时间的变化(或缺乏变化)。
它们都是整数值,并且都是学习算法的超参数,即学习过程的参数,而不是学习过程发现的内部模型参数。
你必须为学习算法指定批量大小和周期数。
没有神奇的规则来配置这些参数。你必须尝试不同的值,看看哪个最适合你的问题。
实例演示
最后,让我们用一个小例子来具体说明。
假设你有一个包含200个样本(数据行)的数据集,你选择批量大小为5,周期数为1000。
这意味着数据集将被分成40个批次,每个批次包含5个样本。模型权重将在每5个样本的批次之后更新。
这也意味着一个周期将涉及40个批次或对模型的40次更新。
在1000个周期中,模型将暴露于或遍历整个数据集1000次。在整个训练过程中,总共有40,000个批次。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
总结
在这篇文章中,你了解了随机梯度下降中批次和周期之间的区别。
具体来说,你学到了:
- 随机梯度下降是一种迭代学习算法,它使用训练数据集来更新模型。
- 批量大小是梯度下降的一个超参数,它控制着在更新模型内部参数之前要处理的训练样本数量。
- 周期数是梯度下降的一个超参数,它控制着对训练数据集进行完整遍历的次数。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
信息量大,解释清晰。
谢谢。
感谢Jason清晰的解释。
不客气。
这个关于小批量梯度下降的定义和解释是不正确的。一个周期是对批次的完整分析,数据集不是均匀地分成独立的批次,而是在每个周期之后被打乱。权重和成本的增量会在批次中求和,然后求平均,然后你用新的权重和偏差更新你的神经网络。很抱歉,这篇文章写得很好但内容不正确。所以你的神经网络在每个周期完成批次分析后都会更新。
这个关于小批量梯度下降的定义和解释是不正确的。一个周期是对批次的完整分析,数据集不是均匀地分成独立的批次,而是在每个周期之后被打乱。权重和成本的增量会在批次中求和,然后求平均,然后你用新的权重和偏差更新你的神经网络。很抱歉,这篇文章写得很好但内容不正确。所以你的神经网络在每个周期完成批次分析后都会更新。
Jason,解释得太好了……我一直是你的忠实粉丝,读过你所有的书……向你学习真是太棒了。
谢谢。
谢谢Jason。解释得很棒,你的作品非常有价值。
谢谢!
我喜欢你的文章,解释得很棒,我很享受阅读的过程
谢谢。
????
你用最后一段话击中了要害,一个简单的小例子总是胜过一堆描述
谢谢,马克。
批次的内容在不同周期之间会改变吗?
是的。样本在每个周期结束时被打乱,跨周期的批次在它们包含的样本方面有所不同。
如果一个人正在制作时间序列预测模型(比如带有LSTM层的模型),训练集的批次观测值会以“块”的形式保留吗(这意味着时间组不会被打散,因此底层模式不会被破坏)?这很重要,对吗?
你的文章太棒了!谢谢你!
可能会。通常不重要。
你可以通过比较在训练或推理过程中,输入到LSTM的样本是否打乱来评估这一点。
非常感谢您精确的解释。如果所有样本在每个周期结束时都被打乱,是否可能我们发现数据集中的单个样本被评估了多次,而有些可能根本没有被评估?或者是否可能使已经评估过的样本不再被评估?
不。每个样本在每个周期中都有一次机会用于更新模型。
解释很好,例子也很好……谢谢你,先生,继续努力!!
谢谢。
解释得非常清楚,尽可能简单!
很高兴它有帮助。
绝对是,感谢你写了这篇Jason博士——这让生活变得轻松,无需为探索多个来源而费时费力
我有一个基于(你帖子中的以下摘录)的快速问题……你能不能命名/提及其他算法中用于更新参数的其他过程。
*******************************************************************************************
每个步骤都涉及使用当前内部参数集对某些样本进行预测、将预测与实际预期结果进行比较、计算误差,并使用误差更新内部模型参数。
这种更新过程对于不同的算法是不同的,但在人工神经网络的情况下,使用反向传播更新算法。
*******************************************************************************************
很高兴能帮到你。
你可以在这里了解更多关于其他算法的信息
https://machinelearning.org.cn/start-here/#algorithms
非常好。但我希望看到更多的例子。总之非常感谢!
谢谢。结尾的例子有帮助吗?
在反向传播过程中,每个周期都能找到全局最小值吗?
在现代深度学习方法中,我几乎总是遇到人们在可视化某些性能指标以评估超参数的下一个值时,在一定数量的周期(或一段时间)后保存他们的模型,然后他们再进行下一个周期的实验。因此,我们可以称这个过程为“迷你周期随机深度学习”。谢谢。
感谢分享。
这很棒,直截了当。感谢布朗利博士的迷你课程。
很高兴它有帮助。
Jason 博士您好,
再次感谢你写了一篇很棒的博文。对于LSTM中的时间序列数据,批次大小大于1是否有意义?
我搜寻了又搜寻,找不到任何批次大小大于1的例子,但也没有找到任何人说这没有意义。
是的,当你希望模型学习多个子序列时。
我有一些帖子展示了这种安排。
感谢您的解释,非常清晰,再次感谢
很高兴它有帮助。
我读过你写了很多关于这些事情的博客。这对我帮助很大,谢谢你!抱拳
谢谢,很高兴这篇文章有帮助。
谢谢,解释得很棒。到目前为止,你的博客是我找到的学习机器学习的最佳资源(对于像我这样的初学者来说)。
谢谢!
非常清楚。谢谢。
在某些情况下我还会看到“steps_per_epoch”,那是什么意思?它和批次一样吗?
从生成器中检索的批次数量,用于定义一个周期。
我们喜欢例子!非常感谢!
谢谢。
非常感谢您清晰的解释
我很高兴你觉得它有用。
简单易懂的精彩解释。谢谢。
谢谢,很高兴对您有帮助。
你好,
更新是在每个批次结束后执行的。我只用了一个样本,并在model.fit中给出了不同的batch_size,为什么每次值都会变化?……如果只有一个样本,它应该能够只取一个batch size,不是吗?
抱歉,我不明白你的问题,你能详细说明一下吗?
多棒的解释!
从未回复过教程,但不能不说声谢谢Jason。
上帝保佑你!
谢谢,很高兴它帮到了你!
精彩的解释!!!
谢谢。
解释得很好,谢谢!!
谢谢,很高兴对您有帮助。
您好,
我目前正在使用Word2Vec。关于周期和批量大小,我仍然不完全理解样本到底是什么。上面你描述样本是数据的一行。在我的程序中,我首先用SentenceIterator编辑我的文本文件,这样我每行得到一个句子,然后我使用分词器获取这些行中的单个单词。在Word2Vec中,样本是数据集中的一个单词还是包含一个句子的行?非常感谢您的提前帮助 :)
样本/周期/批次术语不适用于word2vec。相反,你只有一个文本训练数据集,从中学习统计数据。
但是Word2Vec程序也有超参数Epochs、Iterations和Batch Size,你可以设置它们……难道你不认为它们也会影响Word2Vec的结果吗。
根据我现在的理解,作为批次传递的一个集合包含一个句子。但是,令我惊讶的是,如果我改变周期数和批量大小但不具体定义迭代次数,迭代次数并没有改变。你知道这是怎么回事吗?
不完全是,我推荐这个教程
https://machinelearning.org.cn/develop-word-embeddings-python-gensim/
用简单的术语解释得非常好。谢谢。
谢谢。
终于清楚了。谢谢
很高兴听到这个消息。
您真是太棒了,博士。
非常感谢您用简单易懂的方式写作……另外,请尝试添加图片或图表或示意图来表示您的文本。正如我在这里看到的,您给出了一个例子,这使得许多事情都非常清晰。在之前的一些帖子中,您也添加了图表……
再次感谢
请继续保持
此致
Suraj
感谢您的建议!
嗨,Jason。每个周期结束后,准确率要么提高,要么有时不会。例如,周期1达到了94%的准确率,周期2达到了95%的准确率。在周期1结束时,我们得到新的权重(即在周期1最终批次之后更新)。那么,这些新的权重是否用于周期2的开始,以将其从94%提高到95%?如果是,这是否是由于整个数据集权重的泛化导致某些周期准确率低于前一个周期的原因?这就是为什么经过这么多周期后,由于更好的泛化,我们获得了良好的准确率?
通常更多的训练意味着更高的准确性,但并非总是如此。
有时提前停止训练是个好主意,请参阅关于此主题的这篇文章
https://machinelearning.org.cn/early-stopping-to-avoid-overtraining-neural-network-models/
谢谢!这很简单,容易理解。
谢谢,很高兴它能帮到你!
解释得非常好,谢谢你,小伙子
谢谢。
解释得很清楚,例子也很好理解。谢谢。
谢谢,很高兴对您有帮助。
确实,在最后一个例子中,小批次的全部数量是40,000,但这仅在批次的选择没有打乱训练数据,或者在打乱数据但没有重复的情况下才成立。否则,如果在一次迭代中,小批次是通过重复选择训练数据构建的,那么我们可能会有一些点在一次迭代中出现不止一次(它们在一次迭代中的不同小批次中出现),而其他点只出现一次。因此,在这种情况下,小批次的全部数量可能会超过40,000。
通常数据在每个周期之前被打乱。
通常我们不会进行有放回的抽样,因为它会使训练产生偏差。
你值得一封大大的感谢信,感谢你的解释
谢谢,很高兴对您有帮助。
感谢这篇精彩的博文 :)
如果我有1000个训练样本,并且我的批量大小=400,那么我必须删除200个样本
从我的训练数据中,我的训练数据总是批量大小的倍数吗?
谢谢。
不,样本将在每个周期之前被打乱,然后你会得到3个批次,分别是300、300和200。
如果可能的话,最好选择一个能将样本平均分割的批量大小,例如你的情况下的100、200或500。
非常感谢!解释得真好,最后还附带了一个直观的例子!谢谢!
谢谢,很高兴对您有帮助。
感谢您的精彩文章,我有一个问题
如果我有以下设置并且我正在使用fit_generator函数
epochs =100
数据=1000张图片
批量 = 10
step_per_epochs = 20
我知道我应该设置step_per_epochs = (1000/10)= 100,但是如果我将它设置为20
这些设置是否意味着模型将只使用部分训练数据进行训练(每个周期将使用相同的200张图片(batch*step_per_epochs))而不是使用全部1000张图片?
或者它会在第一个周期使用数据集中的前200张图片,然后在第二个周期使用接下来的200张图片,依此类推(将1000张图片分成5个周期),并且模型将在100个周期内使用整个训练数据集进行20次训练
谢谢
是的,每个周期只使用200张图片。
你好,一切都好吗?非常感谢您的解释。我想知道您是否知道什么是批量累积(Batch Accumulation)、随机种子(Random seed)和验证间隔(Validation Interval)(以周期为单位)
是的。
批量累积是来自一个匹配中的样本的错误,用于更新权重。
随机种子是随机数生成器的起始点
https://machinelearning.org.cn/introduction-to-random-number-generators-for-machine-learning/
你说的验证间隔具体是什么意思?在什么语境下?也许你指的是验证数据集
https://machinelearning.org.cn/difference-test-validation-datasets/
先生,非常感谢您的这篇优秀教程。
您能告诉我如何在训练模型后,在一个类似的测试数据集上运行模型吗?
是的,你可以使用 model.predict(),参见此处的示例
https://machinelearning.org.cn/make-predictions-scikit-learn/
很好的解释,请继续分享您的知识,
非常感谢。
谢谢!
你好 Jason,
如果我要在model.fit_generator()方法中创建自己的自定义批次。
我们是为每个时期创建新的随机抽样批次,还是在__init__时创建批次并在整个训练过程中不进行任何更改地使用它们?
推荐的方法是什么?
附言:如果我每个时期都随机抽样批次,我发现val_acc会出现尖峰,不确定是不是因为这个原因!
很好的问题。
重要的是要确保每个批次都具有代表性(在合理范围内),并且每个周期的批次都大致代表问题。
否则,你会在每次更新时将权重推来推去,或者来回摆动,导致泛化能力差。
你好 Jason,
感谢您的回复。
我还刚刚确认Keras会在进入周期循环之前只将提供的X分割成小批量一次。
这是代码链接 https://github.com/keras-team/keras/blob/f242c6421fe93468064441551cdab66e70f631d8/keras/engine/training_generator.py#L160
是的。
早上好,Jason,
今天我脑海中出现了一个问题。
当类标签不平衡时,在小批量中训练神经网络会发生什么?我们是否应该对批次进行分层?
因为我的神经网络似乎无论我怎么做都只预测主导类别!
好问题。我们遇到了困难!
有时专家会说在每个批次中交替类别。有时分层。这可能取决于问题/模型。我正在回顾这本书
https://machinelearning.org.cn/neural-networks-tricks-of-the-trade-review/
然而,无论你的更新策略如何,不平衡数据都是一个难题。对训练集进行过采样是一个很好的解决方案。
谢谢,杰森。
我一定会看这本书的。
顺便说一下,我实际上在做排名业务。所以我很少有第1名和第2名,但有很多第3名及以上,大约是(10%,10%,80%)分别。
我所做的是,我对这个问题采取了不同的角度,并将我的不平衡多类别数据集转换为一个均衡的二元数据集。
我转换了。
赛车1:第1名
赛车2:第2名
赛车3:第3名
赛车4:第4名
到,
赛车1,赛车2 = 0
赛车2,赛车1 = 1
赛车1,赛车3 = 0
赛车3,赛车1 = 1
赛车1,赛车4 = 0
赛车4,赛车1 = 1
赛车2,赛车3 = 0
赛车3,赛车2 = 1
赛车2,赛车4 = 0
赛车4,赛车2 = 1
等等……其中目标现在是获胜方!
太棒了!感谢分享。
解释得很好,Jason。谢谢。
谢谢!
解释得很清楚。谢谢。
谢谢。
嗨Jason——我有一个问题——如果我理解正确的话,权重和偏差是在运行批次后更新的,所以批次运行后的任何更改都会应用于下一个批次?并且它会持续下去。
正确。
解释得很好。谢谢Jason博士。
谢谢!
谢谢杰森博士
不客气。
非常直接且有帮助。谢谢!
谢谢,很高兴它对你有用。
嗨,先生。
我非常感谢您。
现在我正在学习《动手学机器学习》第二部分第11章,我不理解批次(batch)的含义。起初我以为神经网络必须逐个样本进行训练。但他们提到了“批次”,我完全不理解。
但您的文章让我很好地理解了批次。
我完全理解了批次,只有一个问题。
我如何使用批次进行梯度方法?
我的意思是,在一个样本中是可以理解的。
但对于批次,我不知道如何评估误差。
谢谢你。
确实是逐个进行,但在“批次”数量的样本之后,权重会用累积的误差进行更新。
Jason博士,您好
我希望您能帮助我解决我这个相当冗长且令人困惑的问题(抱歉)。我对深度学习非常陌生。
我确实认为我理解迭代、批次和周期的定义,但我不太确定它们在实际操作中的含义。
所以我将举一个例子,希望能通过这种方式帮助我。
现在,我(希望)理解迭代是参数,它将一组样本通过模型正向和反向传播,而周期将通过(并反向传播)所有样本。
假设我有一个包含50,000个点的数据集。
Python/Keras中的以下参数设置为:
batch_size = 64
iterations = 50
epoch = 35
因此,我对代码执行的假设如下:
50,000个样本将被批量大小(=781.25 ≈ 781)除以。
所以现在我有了整个数据集的64个块(批次),每个块包含781个样本。
对于迭代1
从1到64的所有块都将通过模型。每个块/批次都会产生自己的准确率指标,从而产生64个准确率数字,这些数字最终将被平均。
上述过程将重复35次(周期数),产生35个平均准确率,并且随着周期沿着迭代增加,准确率(理论上)将比之前的准确率更好。
迭代完成后,节点的权重将被更新并用于迭代2。
上述过程将重复50次,因为我有50次迭代。
我刚才说的对吗?
这是我目前的主要困惑。
我的另一个问题是关于准确率和上面提到的3个超参数。
我一直在玩Keras的Addition RNN示例,其中批量设置为128,迭代设置为200,周期设置为1。
我的问题是,如果你将批量设置为2048,迭代设置为4,周期设置为50。你不仅最终无法达到0.999x的准确率(你在其他参数组合中几乎总是能达到这个准确率)。而且,你的准确率实际上会大幅下降。
我已将结果放在以下pastebin链接中 [https://pastebin.com/gV1QKxH3]
并希望您关注周期41/50,其中准确率几乎减半。
这有任何原因吗?
我唯一的想法是权重可能以某种方式重置了,但这似乎极不可能。
非常感谢您一直以来的时间,
希望很快能收到您的回复
此致,
Moe
什么是迭代?
在深度学习中,迭代是指所有批次都通过模型进行传播。
周期将重复此过程(35次)。
在此过程结束时,模型将使用新的权重进行更新。
对于迭代2,将再次发生相同的过程,但这次模型将使用来自前一次迭代的新权重。
希望这有帮助
我称之为一整个时期。
解释得很棒,谢谢!
只是为了确保我理解了
如果一个人进行批量梯度下降(Batch GD),那么就不需要任何周期,对吗?
也就是说,真正让各个周期不同的是每个周期中小批次的组成不同,对吗?
不。一个周期将等于一个批次。仍然需要许多周期。
非常感谢你,Jason。我看到你有时这样使用epoch:
model.fit(X_train,y_train,epochs=50) 有时在for循环中这样使用:
for iter in range(50)
model.fit(X_train,y_train,epochs=1)
根据两种情况的epoch定义,学习算法都会遍历整个训练数据集50次。这正确吗?它们做的相同吗?如果不同,您能告诉我区别吗?
它们是一回事。
手动循环在你想在每个周期做些什么的情况下提供了更多的控制。
非常感谢。
不客气。
谢谢你,Jason,你总是能帮我解决搜索问题。
不客气。
谢谢,我听说过随机梯度下降,但在这里,仅仅用一句话,你就阐明了基本概念。我只是个新手,但这可能是一个很好的起点。
谢谢,很高兴它能帮到你!
也感谢您的批次概念
不客气。
周期、批量大小如何影响权重?您能描述它们之间的关系吗?
你具体指的是什么,能详细说明一下吗?
权重更新多少次,这取决于batch_Size和epoch数量吗?还是应该在达到最佳权重时停止?
是的,权重更新的次数取决于批量大小和周期数——这在教程中提到了。
没有最佳权重——当模型停止改进或我们时间用完时,我们就停止。
你好先生
感谢您提供的教程。
我非常喜欢您的网站。感谢您让我成为一名更好的数据科学家 :)
谢谢!
谢谢Jason的详细解释。
请告诉我以下问题
当一个批次输入到网络时会发生什么?是否会计算每个样本的误差,然后得到所有样本的平均误差,然后梯度下降使用这个平均误差来更新权重,还是以另一种方式工作?
差不多就是那样。
https://machinelearning.org.cn/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/
Jason,非常感谢你的解释。这个说法对吗?
增加批次大小可以使误差曲面更平滑;因此,小批量梯度下降优于随机梯度下降。另一方面,我们可能希望批次大小不要太大,这样网络就能有足够多的更新机会(迭代)来使用整个样本。
也许可以。
有时我们希望梯度的估计是带有噪声的,以便在参数空间中跳动,找到一组好的/更好的参数。
先生,您太棒了。谢谢您。
不客气。
感谢您如此精彩的解释。
我本想问一个问题,但在我找到答案之前就问了 :)
实际上,问题是“为什么我们需要多次遍历整个训练数据集?”,我想答案是,在第一个 epoch 中,权重是随机初始化的,但在第二个 epoch 中,权重已经在每个批次中更新,依此类推。换句话说:epoch t 的权重“转移”到 epoch t+1。这样,训练集的学习曲线就会下降。
如果我错了,请纠正我。
很好的问题!
模型是迭代地、缓慢地学习的。如果我们学得太快,就会过度学习,无法很好地泛化到新数据。我们——这个社区——在40多年中已经认识到了这一点。
非常感谢您用非常简单易懂的术语阐明了 epoch 和批次大小的概念。
不客气!
你好,先生,感谢您精彩的帖子。
为了让我更容易理解,假设我有一个线性回归模型,我们现在在第3个 epoch(它已经完整地遍历了整个数据集两次,现在是第三次),我们仍然使用相同的数据集,但唯一的区别是我们已经更新了参数(系数)两次。第一次更新时,我们开发了一个更好的模型,其系数更适合训练数据;然后在第2个 epoch 中,我们使用了从第1个 epoch 更新的模型,并用它在相同的数据集上进行训练;然后在第3个 epoch 中,我们再次使用从第2个 epoch 更新了系数的模型。所以总结一下,在每个 epoch 中,我们都有一个比前一个稍微更好的模型,这使得我们能够降低错误率?我的理解对吗?
诚挚的问候
不客气。
正是如此!
出色的解释!
我的问题是:“对于SGD,训练时间会比小批量和批量梯度下降算法更长吗?”
批量梯度下降的执行速度将比小批量梯度下降更快。
嗨,感谢您提供的精彩内容
抱歉问了不相关的问题
Imagedatagenerator 中的 steps_per_epoch 只是为了节省时间吗?
谢谢你
不。凭记忆,它是每个 epoch 中样本数量或更新次数的代理,我不记得是哪个了。
Jason
我有一个关于训练期间数据打乱的问题。我观察到,如果我多次运行相同的代码,并且使用了打乱的数据,结果就不会相同。那么,当准确率和训练损失不断变化时,我如何确信我的代码是正确的呢?
所以有时我最终会固定训练数据集和验证数据集。我想知道这是否是正确的做法。如果不是,那么如何相信我得到的结果足够好?
好问题,您必须多次评估您的模型,并报告模型性能的平均值和标准差。
这会有帮助
https://machinelearning.org.cn/faq/single-faq/why-do-i-get-different-results-each-time-i-run-the-code
Jason,你是一位伟大的老师。我喜欢你解释的方式。
我也喜欢你尽管试图“去学术化”教学,但仍然引用了原始论文。你在这方面取得了很好的平衡。
非常感谢。
Omar
谢谢奥马尔。
很高兴知道。感谢清晰的解释!
不客气。
你好,先生
如果我们使用四个不同的预训练网络,我们可以为每个网络设置不同的 epoch 数量吗?
例如:Alexnet 15 个 epoch,VGG16 20 个 epoch 等等?我将对这些网络进行比较
谢谢
当然。单独训练它们并保存到文件,然后稍后加载它们以进行集成。我有一些关于这个的教程,搜索深度学习集成。
谢谢你,Jason。
您的机器学习和深度学习文章内容丰富,非常棒。
对我来说,这是这些主题的首选网站。谢谢。
谢谢!
对于你的200个样本和批次大小为5的例子,最大可能的总 epoch 数是多少?有标准公式吗?
无限。没有最大值。你一直训练直到模型停止改进。
你好,
关于您所说的“这意味着数据集将被分成40个批次,每个批次包含5个样本。模型权重将在每5个样本的批次之后更新。”
这意味着损失仅在通过网络的一个批次之后计算,然后进行梯度更新。
那么,批次中的5个样本如何计算损失呢?
例如,我的网络正在处理第一个批次,我的损失函数是MAE。基本上,神经网络计算批次中每个单独实例的MAE,然后将其平均,并最终将其传递给优化器(在此示例中假设为SGD),SGD将其乘以学习率并从网络权重中减去以完成梯度更新。这正确吗?!
如果正确,那么损失不是在每个 epoch 结束时计算的,它只指定每个批次应该进行多少次迭代。
提前感谢!
我喜欢你的教程,它们真的很棒。请继续保持!
损失在批次的五个样本中取平均值。
通过上述 epoch 和批次大小的例子,我终于明白了。谢谢你。
很高兴它有帮助。
亲爱的 Jason,
感谢您简单的解释。我读过很多关于人工神经网络的文章,但对此主题始终没有清晰的理解。这突然让我茅塞顿开。
不客气,很高兴能帮到你。
“只有一个批次的 epoch 被称为批量梯度下降学习算法”。
批量梯度下降。批次大小 = 训练集大小
随机梯度下降。批次大小 = 1
小批量梯度下降。1 < 批次大小 < 训练集大小
根据以上解释
如果批次大小 = 1,那么它应该被称为随机梯度下降,为什么它被称为批量梯度下降学习算法。
这里我们说,如果批次大小等于整个训练数据集,这被称为“批量梯度下降”。
如果批次大小等于一行/样本,这被称为“随机梯度下降”。
如果更多的 epoch 能带来更多的学习,为什么我们不把它设置成一个很大的数字(例如10,000或100,000)呢?这样结果会越来越好。
好问题。
收益递减——例如,在某个点之后没有进一步的改进,甚至使模型变差(过拟合)。
感谢Jason的这项伟大工作。我使用这些术语已经有一段时间了,今天我发现自己也在问这个问题!
不客气!
太棒了。
谢谢
不客气!
您的文章太棒了,非常清晰。非常感谢您
谢谢!
这是一个简短而简洁的解释,谢谢。
不客气!
这就是我们选择提前停止的原因,以避免过拟合。
是的,如果我们有足够的额外数据,提前停止会非常有效。
https://machinelearning.org.cn/how-to-stop-training-deep-neural-networks-at-the-right-time-using-early-stopping/
谢谢你,Jason。请问权重是在每个批次样本通过后更新,还是在一个 epoch 周期完成后更新?
是的,模型权重在每个批次后更新。
这是我迄今为止读过的关于这个主题最好的总结之一!
非常感谢Bronwlee博士!
谢谢,很高兴它有帮助。
非常感谢您精彩的解释。
不客气。
内容非常有帮助,解释清晰。
谢谢。
在谷歌搜索这个问题之前,我以为只有我一个人在寻找“epoch和批次大小之间的区别”,但看到所有评论后,我非常惊讶。
现在已经很清楚了。
谢谢 Jason
我很高兴它有帮助!
非常感谢Jason!解释得非常清楚。这些术语对初学者来说非常容易混淆。您的文章为我解开了这个谜团。
谢谢你。很高兴你喜欢。
非常感谢您的这篇文章。您的机器学习文章总是那么容易理解,我一直都在关注。
希望您喜欢!谢谢您。
您的文章非常棒,充分体现了您对机器学习的理解,您的工作对社区至关重要,我们非常感激,请继续努力。我可能不会在每篇文章上都留言,但请知道,您的每一篇文章都受到赞赏。
再次感谢您。
非常感谢!
是的,有帮助,谢谢!!!!
对我帮助很大!谢谢你! 🙂
很高兴你喜欢!
精彩的博客!清晰地解释了两者的区别。
解释得太好了,你一针见血。
感谢您的反馈和 Amit 的美言!
尊敬的先生,
感谢这篇博客末尾的例子。我有一个关于 epoch 的问题。我将使用您使用的相同例子来提出问题。
根据例子,我们有 1000 个 epoch,每个 epoch 有 40 个批次。我好奇的是,这些批次的组成对于每个 epoch 都是相同的,还是在每个 epoch 中都会被打乱?
此致,
Aditya
嗨 Aditya……这可以控制。以下讨论可能对您有帮助
https://datascience.stackexchange.com/questions/53927/are-mini-batches-sampled-randomly-in-keras-sequential-fit-method
这很有帮助,但我对批次大小与优化器有点困惑。我正在使用从网上得到的 PyTorch 代码,它使用小批量梯度下降(即它们定义了128的批次大小),然后在代码后面调用了 SGD(随机梯度下降)优化器。是否可以将小批量梯度下降与 SGD 优化器一起使用?这常见吗?另外,我一直在尝试更改批次大小,并使用了批次大小为1(上面定义为随机梯度下降)并保持优化器不变。这样做有意义吗?
嗨,Julie……以下资源可能对您有所帮助
https://machinelearning.org.cn/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/
哇,这真是深刻而精彩
我明白了。谢谢你。
非常欢迎您,珀西!继续努力!
直接明了,解释得很清楚,谢谢。
感谢您的反馈,ope!我们非常感谢!
我认为 Jason Brownlee 是该领域的主要参考文献之一,绝对是教学方面的前十名。他在简化 AI 内容同时保留所有重要内容方面做得最好。
继续努力!
Rudi,非常感谢您的支持和反馈!
谢谢你,解释得非常好!
不客气,Chengjin!我们感谢您的反馈。
如何使用 TensorFlow 和 Keras 逐步训练 Mask R-CNN 算法进行多类别分类?
嗨 ARIFUL……以下内容可能对您有所帮助
https://viso.ai/deep-learning/mask-r-cnn/
你好,也许我错了,但我只是想弄清楚是打字错误还是我理解错了:正如你提到的
“当批次大小大于一个样本且小于训练数据集大小时,学习算法被称为小批量梯度下降。”
下面写着:小批量梯度下降。1 < 批次大小 批次大小 < 训练集大小?
提前感谢
嗨,Majid……没有打字错误。以下内容可能有助于澄清
https://towardsdatascience.com/batch-mini-batch-stochastic-gradient-descent-7a62ecba642a
谢谢。太棒了
非常欢迎您,Ali!
写得很好,简单易懂。谢谢!
非常欢迎您,Xingjun!我们感谢您的支持!
权重和梯度是在每次迭代还是在每个 epoch 中计算的?
嗨 skan……在大多数机器学习算法中,特别是那些涉及基于梯度的优化(如梯度下降)的算法,**权重和梯度都是在每次迭代时更新的**,而不仅仅是在每个 epoch 中。
以下是过程分解:
1. **迭代:** 迭代指的是权重的一次完整更新,这通常在处理一批数据(或在随机梯度下降的情况下,一个数据点)之后发生。在一次迭代中:
– 使用当前批次数据计算梯度。
– 使用梯度更新权重以最小化损失。
2. **Epoch:** Epoch 指的是对整个训练数据集的一次完整遍历。一个 epoch 由多次迭代组成,具体取决于您如何分割数据集(例如,按批次大小)。
– 在 epoch 的每次迭代中,计算当前批次的梯度,并更新模型的权重。
– 处理完数据集中所有批次(即,在一个 epoch 之后)后,训练循环可能会检查总体损失并根据需要更新其他参数。
### 总结
– **梯度在每次迭代中计算**(针对每批数据)。
– **权重在每次迭代中更新**,使用在该迭代中计算的梯度。
– 一个 **epoch 由多次迭代组成**,具体取决于批次大小。
如果您有进一步的问题或需要澄清,请随时提问!