Machine learning 训练神经网络时的历元与迭代

Machine learning 训练神经网络时的历元与迭代,machine-learning,neural-network,deep-learning,artificial-intelligence,terminology,Machine Learning,Neural Network,Deep Learning,Artificial Intelligence,Terminology,训练多层感知器时,历元和迭代有什么区别?历元包含几个迭代。这就是这个“时代”。让我们将“历元”定义为训练神经网络所需的数据集迭代次数。许多神经网络训练算法涉及将整个数据集的多个表示形式呈现给神经网络。通常,整个数据集的单个表示被称为“历元”。相比之下,有些算法一次只向神经网络提供一个案例的数据 “迭代”是一个更一般的术语,但由于您与“历元”一起询问,我假设您的来源是指向神经网络呈现单个案例。据我的理解,当您需要训练神经网络时,您需要一个大型数据集,其中包含许多数据项。当训练神经网络时,数据项一个

训练多层感知器时,历元和迭代有什么区别?

历元包含几个迭代。这就是这个“时代”。让我们将“历元”定义为训练神经网络所需的数据集迭代次数。

许多神经网络训练算法涉及将整个数据集的多个表示形式呈现给神经网络。通常,整个数据集的单个表示被称为“历元”。相比之下,有些算法一次只向神经网络提供一个案例的数据


“迭代”是一个更一般的术语,但由于您与“历元”一起询问,我假设您的来源是指向神经网络呈现单个案例。

据我的理解,当您需要训练神经网络时,您需要一个大型数据集,其中包含许多数据项。当训练神经网络时,数据项一个接一个地进入神经网络,称为迭代;当整个数据集通过时,它被称为一个历元。

通常,您会将测试集分成小批量,供网络学习,并使培训逐步通过您的层数,一直应用梯度下降。所有这些小步骤都可以称为迭代


一个历元对应于一次通过整个网络的整个训练集。限制这一点可能很有用,例如防止过度装配。

我认为迭代相当于批次SGD中的单个批次正向+反向。Epoch只对整个数据集进行一次扫描(如其他人所述)。

在神经网络术语中:

  • 一次历元=所有训练示例的一次向前传球和一次向后传球
  • 批量大小=一次向前/向后传递中的训练示例数。批处理大小越大,所需的内存空间就越多
  • 迭代次数=通过次数,每次通过使用[batch size]示例数。需要明确的是,一次传球=一次向前传球+一次向后传球(我们不将向前传球和向后传球视为两次不同的传球)
示例:如果您有1000个培训示例,并且批处理大小为500,则需要2次迭代才能完成1个历元

供参考:



术语“批处理”是不明确的:有些人用它来指定整个训练集,有些人用它来表示一次向前/向后传递中的训练示例数(正如我在这个答案中所做的)。为了避免这种模糊性并明确批次对应于一次向前/向后传递中的训练示例数,可以使用术语mini batch

历元是训练样本子集的迭代,例如,中性网络中的梯度下降算法。一个好的参考是:

请注意,该页面有一个使用历元的梯度下降算法的代码

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有效的原因。请看一看。

纪元和迭代描述了不同的事情


纪元 历元描述算法看到整个数据集的次数。因此,每次算法看到数据集中的所有样本时,一个历元就完成了

迭代 迭代描述一批数据通过算法的次数。在神经网络的情况下,这意味着向前传递和向后传递。因此,每次您通过NN传递一批数据时,您就完成了一次迭代


例子 举个例子可能会更清楚

假设您有一个包含10个示例(或样本)的数据集。批处理大小为2,并且指定了算法要运行3个时期

因此,在每个历元中,您有5个批次(10/2=5)。每个批都通过算法,因此每个历元有5次迭代。
由于您指定了3个时期,因此总共有15次迭代(5*3=15)用于训练。

您有一个训练数据,您可以将其洗牌并从中选择小批量。当您使用一个小批量调整权重和偏差时,您已经完成了一次迭代。一旦你用完了你的小批量,你就完成了一个新纪元。然后再次洗牌训练数据,再次选择小批量,然后再次迭代所有这些数据。那将是你的第二个纪元。

要理解它们之间的区别,你必须理解它们之间的区别

在我开始实际回答之前,我想先建立一些背景知识

批处理是完整的数据集。它的大小是可用数据集中培训示例的总数

Mini batch size是学习算法在单个过程(向前和向后)中处理的示例数

小批量是给定的小批量数据集的一小部分

迭代次数是算法看到的数据批次数(或者简单地说是算法在数据集上完成的通过次数)

Epochs是学习算法查看完整数据集的次数。现在,这可能不等于迭代次数,因为数据集也可以小批量处理,本质上,单次过程可能只处理数据集的一部分。在这种情况下,迭代次数不等于历代次数

在批量梯度下降的情况下,在每个培训通道上处理整个批次。因此,梯度下降优化器比小批量梯度下降优化器的收敛更平滑,但需要更多的时间。如果存在最优值,则保证批量梯度下降能够找到最优值