【发布时间】:2011-06-12 18:20:00
【问题描述】:
epoch和iteration在训练多层感知器时有什么区别?
【问题讨论】:
标签: machine-learning neural-network deep-learning artificial-intelligence terminology
epoch和iteration在训练多层感知器时有什么区别?
【问题讨论】:
标签: machine-learning neural-network deep-learning artificial-intelligence terminology
在神经网络术语中:
例如:如果您有 1000 个训练示例,并且您的批量大小为 500,那么完成 1 个 epoch 需要 2 次迭代。
仅供参考:Tradeoff batch size vs. number of iterations to train a neural network
术语“批次”是模棱两可的:有些人用它来指定整个训练集,有些人用它来指代一次前向/后向传递中的训练示例数(就像我在这个答案中所做的那样)。为了避免这种歧义并明确批次对应于一次前向/后向传递中的训练示例数,可以使用术语mini-batch。
【讨论】:
Epoch 和 iteration 描述不同的事物。
一个epoch描述了算法看到整个数据集的次数。因此,每次算法看到数据集中的所有样本时,就完成了一个 epoch。
迭代描述了一个批次数据通过算法的次数。在神经网络的情况下,这意味着 前向传播和后向传播。所以,每次你通过神经网络传递一批数据,你就完成了一次迭代。
举个例子可能会更清楚。
假设您有一个包含 10 个示例(或样本)的数据集。您的批量大小为 2,并且您已指定希望算法运行 3 个 epoch。
因此,在每个 epoch 中,您有 5 个批次 (10/2 = 5)。每个批次都通过算法,因此每个 epoch 有 5 次迭代。 由于您指定了 3 个 epoch,因此您总共有 15 次迭代 (5*3 = 15) 用于训练。
【讨论】:
许多神经网络训练算法涉及将整个数据集多次呈现给神经网络。通常,整个数据集的单个表示被称为“纪元”。相比之下,一些算法一次向神经网络提供一个数据。
“迭代”是一个更笼统的术语,但由于您与“epoch”一起询问它,我假设您的来源是指将单个案例呈现给神经网络。
【讨论】:
要了解它们之间的区别,您必须了解Gradient Descent Algorithm and its Variants。
在我开始实际回答之前,我想建立一些背景。
batch 是完整的数据集。它的大小是可用数据集中训练示例的总数。
mini-batch size 是学习算法在单遍(向前和向后)中处理的示例数。
Mini-batch 是给定 mini-batch 大小的数据集的一小部分。
迭代次数是算法已经看到的数据批次数(或者只是算法在数据集上执行的次数)。
Epochs 是学习算法看到完整数据集的次数。现在,这可能不等于迭代次数,因为数据集也可以小批量处理,本质上,一次可能只处理数据集的一部分。 在这种情况下,迭代次数 不等于 epochs 的数量。
在批量梯度下降的情况下,整个批次在每次训练过程中都被处理。因此,梯度下降优化器的收敛比 Mini-batch 梯度下降更平滑,但需要更多时间。如果存在,批量梯度下降保证找到一个最优值。
随机梯度下降是小批量梯度下降的一种特殊情况,其中小批量大小为1。
【讨论】:
我猜在神经网络术语的上下文中:
为了定义迭代(又名steps),您首先需要了解batch size:
批量大小:您可能不希望一次性处理整个训练实例,因为它效率低下并且需要大量内存。所以通常做的是将训练实例分成子集(即批次),对选定的子集(即批次)执行一次传递,然后通过反向传播优化网络。子集(即批次)中的训练实例数称为 batch_size。
迭代:(也称为训练步骤)您知道您的网络必须一次性遍历所有训练实例才能完成一个 epoch。可是等等!当您将训练实例分成批次时,这意味着您只能在一次前向传递中处理一个 batch(训练实例的子集),那么其他批次呢?这就是迭代这个术语发挥作用的地方:
定义: 为完成一个 epoch(即遍历所有训练实例),您的网络必须执行的转发次数(您创建的批次数)称为迭代。
例如,当您有 10,000 个训练实例,并且您想以 10 的大小进行 批处理;您必须执行 10,000/10 = 1,000 迭代 才能完成 1 epoch。
希望这能回答你的问题!
【讨论】:
您有训练数据,您可以将这些数据打乱并从中挑选小批量。当您使用一个小批量调整权重和偏差时,您已经完成了一次迭代。
一旦你用完你的小批量,你就完成了一个纪元。然后你再次打乱你的训练数据,再次挑选你的小批量,并再次遍历所有这些。那将是你的第二个纪元。
【讨论】:
通常情况下,您会将测试集拆分为小批量以供网络学习,并逐步通过您的层数进行训练,并一直应用梯度下降。所有这些小步骤都可以称为迭代。
一个epoch对应于整个训练集遍历整个网络一次。限制这一点可能很有用,例如争取过拟合。
【讨论】:
据我了解,当您需要训练 NN 时,您需要一个包含许多数据项的大型数据集。 NN在训练时,数据项一个一个地进入NN,称为一次迭代;当整个数据集经过时,称为一个纪元。
【讨论】:
我相信iteration相当于batch SGD中的单batch forward+backprop。 Epoch 正在遍历整个数据集一次(正如其他人提到的那样)。
【讨论】:
一个纪元包含几个迭代。这实际上就是这个epoch。让我们将 epoch 定义为数据集上的迭代次数,以便训练神经网络。
【讨论】:
Epoch 是神经网络已经看到所有数据的 1 个完整周期。
有人可能会说 100,000 张图像来训练模型,但是,内存空间可能不足以一次处理所有图像,因此我们将模型的训练拆分在称为批次的较小数据块上。例如批量大小为 100。
我们需要使用多个批次覆盖所有图像。所以我们需要 1000 次迭代才能覆盖所有 100,000 张图像。 (100 批大小 * 1000 次迭代)
一旦神经网络查看整个数据,它就被称为 1 Epoch(点 1)。一个人可能需要多个时期来训练模型。 (假设是 10 个 epoch)。
【讨论】:
一个时期是用于训练的样本子集的迭代,例如神经网络中的梯度下降算法。一个很好的参考是:http://neuralnetworksanddeeplearning.com/chap1.html
请注意,该页面有一个使用 epoch 的梯度下降算法的代码
def SGD(self, training_data, epochs, mini_batch_size, eta,
test_data=None):
"""Train the neural network using mini-batch stochastic
gradient descent. The "training_data" is a list of tuples
"(x, y)" representing the training inputs and the desired
outputs. The other non-optional parameters are
self-explanatory. If "test_data" is provided then the
network will be evaluated against the test data after each
epoch, and partial progress printed out. This is useful for
tracking progress, but slows things down substantially."""
if test_data: n_test = len(test_data)
n = len(training_data)
for j in xrange(epochs):
random.shuffle(training_data)
mini_batches = [
training_data[k:k+mini_batch_size]
for k in xrange(0, n, mini_batch_size)]
for mini_batch in mini_batches:
self.update_mini_batch(mini_batch, eta)
if test_data:
print "Epoch {0}: {1} / {2}".format(
j, self.evaluate(test_data), n_test)
else:
print "Epoch {0} complete".format(j)
查看代码。对于每个 epoch,我们随机生成梯度下降算法的输入子集。页面上还解释了为什么 epoch 有效。请看一下。
【讨论】:
根据Google's Machine Learning Glossary,一个epoch定义为
"对整个数据集进行一次完整的训练,这样每个示例都被看到一次。因此,一个 epoch 代表N/batch_size 个训练迭代,其中 N 是示例的总数。"
如果您使用 batch size 6 训练 10 个 epochs 的模型,给定总共 12 个样本,这意味着:
模型将能够在 2 次迭代 (12 / 6 = 2) 即单个 epoch 中看到整个数据集。
总体而言,该模型将有 2 X 10 = 20 次迭代(每轮迭代次数 X 轮次次数)
每次迭代后都会重新评估损失和模型参数!
【讨论】:
对整个数据集进行一次完整的训练,这样每个 例子见过一次。因此,一个 epoch 代表 N/batch sizetrainingiterations,其中 N 是 例子。
在训练期间对模型的权重进行一次更新。 一次迭代包括计算参数的梯度 关于单个batch数据的损失。
作为奖励:
在一个iteration(即一个gradient 更新)model training。
另见batch size。
【讨论】: