Answers:
在神经网络术语中:
示例:如果您有1000个训练示例,并且批次大小为500,那么将需要2次迭代才能完成1个纪元。
仅供参考:权衡批次大小与迭代次数以训练神经网络
“批处理”一词含糊不清:有些人用它来指定整个训练集,有些人用它来指代一次向前/向后传递中的训练示例数(就像我在此答案中所做的那样)。为了避免这种歧义并清楚地表明批次与一次向前/向后传递中的训练示例数量相对应,可以使用术语mini-batch。
时代和迭代描述了不同的事物。
一个时期描述了算法看到整个数据集的次数。因此,每次算法看到数据集中的所有样本时,一个纪元就完成了。
一个迭代描述的次数一批次通过算法传递的数据。在神经网络的情况下,这意味着前进和后退。因此,每次通过NN传递一批数据时,就完成了一次迭代。
一个例子可能会更清楚。
假设您有一个包含10个示例(或示例)的数据集。批处理大小为2,并且已指定要让算法运行3个纪元。
因此,在每个时期中,您有5个批次(10/2 = 5)。每个批次都会通过算法,因此每个时期有5次迭代。由于您指定了3个时期,因此总共需要进行15次迭代(5 * 3 = 15)进行训练。
许多神经网络训练算法都涉及将整个数据集多次呈现给神经网络。通常,整个数据集的单个表示形式称为“时代”。相反,某些算法一次只将一个案例提供给神经网络。
“迭代”是一个更为笼统的术语,但是由于您将其与“历元”一起提出来,因此我认为您的出处是指将单个案例呈现给神经网络。
要了解它们之间的区别,您必须了解梯度下降算法及其变体。
在开始实际答案之前,我想建立一些背景。
一个批次是完整的数据集。它的大小是可用数据集中训练示例的总数。
最小批量大小是学习算法在一次遍历中(向前和向后)处理的示例数。
一小批是给出的数据集的一小部分小批量大小。
迭代次数是算法看到的数据批处理数量(或简单来说是算法在数据集上完成的传递次数)。
时代是次数的学习算法看到完整的数据集。现在,这可能不等于迭代次数,因为数据集也可以按小批处理。本质上,单遍可能只处理数据集的一部分。在这种情况下,迭代次数不等于时期数。
在批次梯度下降的情况下,整个批次将在每个训练遍上进行处理。因此,梯度下降优化器的收敛效果比Mini-batch梯度下降法更平滑,但是需要更多时间。如果存在批次梯度下降,可以保证找到最佳值。
随机梯度下降是小批量梯度下降的一种特殊情况,其中小批量大小为1。
通常,您将测试集分成小批供网络学习,然后逐步进行训练,逐步遍历您的层数,一直向下进行渐变下降。所有这些小步骤都可以称为迭代。
一个时期对应于一次遍历整个网络的整个训练集。限制这一点很有用,例如,对抗过度拟合。
一个纪元包含一些迭代。这实际上就是这个“时代”。让我们将“ epoch”定义为数据集上的迭代次数,以训练神经网络。
我相信迭代等效于批处理SGD中的单个批处理正向+反向传播。Epoch一次遍历整个数据集(如其他人所述)。
我想在神经网络术语的上下文中:
为了定义迭代(也称为步骤),您首先需要了解批量大小:
批处理大小:您可能不希望一次向前处理整个训练实例,因为它效率低下并且需要大量内存。因此,通常要做的是将训练实例分成子集(即批),对所选子集(即批)执行一次遍历,然后通过反向传播优化网络。子集(即批次)内训练实例的数量称为batch_size。
迭代:(又称训练步骤)您知道您的网络必须一次通过所有训练实例才能完成一个纪元。可是等等!当您将训练实例拆分为批次时,这意味着您只能在一个前向传递中处理一个批次(训练实例的子集),那么其他批次呢?这是术语“ 迭代”起作用的地方:
例如,当您有1000个训练实例,而您想要以10个大小进行批处理时;你必须做10000/10 = 1000 次迭代才能完成一个时期。
希望这可以回答您的问题!
历元是用于训练的样本子集的迭代,例如中性网络中的梯度下降算法。一个很好的参考是: http //neuralnetworksanddeeplearning.com/chap1.html
请注意,页面上有一个使用历元的梯度下降算法代码
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)
看代码。对于每个时期,我们随机生成梯度下降算法的输入子集。该页还说明了为什么纪元有效。请看一下。