Epoch vs迭代当训练neural network时
在训练多层感知器时, 时代与迭代有什么区别?
在neural network术语中:
- 一个时代 = 所有训练样例中的一个前进传球和一个后退传球
- 批量大小 =一个前进/后退过程中的训练示例数量。 批量越大,您需要的内存空间就越多。
- 迭代次数 =通过次数 ,每次通过使用[批量大小]的示例数量。 要清楚的是,一次传球=一次正向传球+一次落后传球(我们没有把传球和传球作为两次不同的传球)。
例如:如果您有1000个培训示例,并且批量大小为500,则需要2次迭代才能完成1个纪元。
FYI: 权衡批次大小与迭代次数来训练neural network
术语“批”是不明确的:有些人用它来指定整个训练集,有些人用它来指一个前进/后退传球中的训练实例的数目(就像我在这个答案中所做的那样)。 为避免歧义,并明确批次对应于一个前进/后退过程中的训练实例的数量,可以使用术语小批量 。
时代和迭代描述不同的事情。
时代
一个时代描述了algorithm看到整个数据集的次数。 因此,每次algorithm已经看到数据集中的所有样本,一个时期已经完成。
迭代
迭代描述一批数据通过algorithm的次数。 在neural network的情况下,这意味着正向传递和反向传递 。 所以,每当你通过neural network传递一批数据,你就完成了一次迭代 。
例
一个例子可能会更清楚。
假设您有一个包含10个示例(或样本)的数据集。 您的批量大小为2,并且您已指定您希望algorithm运行3个时期。
因此,在每个时代,你有5批(10/2 = 5)。 每个批次都通过该algorithm,因此每个历元有5次迭代。 既然你已经指定了3个时期,你总共有15次迭代(5 * 3 = 15)进行训练。
许多neural network训练algorithm涉及将整个数据集的多个呈现给neural network。 通常,整个数据集的单个呈现被称为“时代”。 相比之下,一些algorithm一次将数据呈现给neural network。
“迭代”是一个更为通用的术语,但是由于您和“时代”一起提出了这个问题,我认为您的来源是指将单个案例呈现给neural network。
一个时代包含一些迭代。 那实际上是这个“时代”所在。 我们将'epoch'定义为数据集上的迭代次数,以训练neural network。
通常情况下,您会将testing集分成小批量以供networking学习,并通过层数逐步进行培训,逐渐采用梯度下降法。 所有这些小步骤可以称为迭代 。
一个时代对应整个训练集一次通过整个networking。 限制这个可能是有用的,例如打过度劳累。
我相信迭代相当于批量SGD中的单个批量前向+后退。 时代正在经历整个数据集(正如别人提到的那样)。
你有一个训练数据,你洗牌,并从中挑选小批量。 当您使用一个小批量调整权重和偏差时,您已完成一次迭代。 一旦你用完了你的小批量,你已经完成了一个时代。 然后你再次洗牌你的训练数据,再次select你的小批次,并重新遍历所有的人。 那将是你的第二个时代。
就我的理解,当你需要训练一个neural network时,你需要一个庞大的数据集涉及到很多数据项。 当NN被训练时,数据项逐个进入NN,即迭代; 当整个数据集通过时,它被称为时代。
历元是用于训练的样本子集的迭代,例如中性networking中的梯度下降algorithm。 一个很好的参考是: http : //neuralnetworksanddeeplearning.com/chap1.html
请注意,该页面具有使用纪元的梯度下降algorithm的代码
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)
看代码。 对于每个时期,我们随机生成梯度下降algorithm的input子集。 为什么纪元是有效的也在页面中解释。 请看一下。