【问题标题】:Epoch vs Iteration when training neural networks [closed]训练神经网络时的时代与迭代[关闭]
【发布时间】:2011-06-12 18:20:00
【问题描述】:

epochiteration在训练多层感知器时有什么区别?

【问题讨论】:

    标签: machine-learning neural-network deep-learning artificial-intelligence terminology


    【解决方案1】:

    在神经网络术语中:

    • 一个 epoch = 所有训练示例的一次前向传递和一次反向传递
    • batch size = 一次前向/后向传递中的训练示例数。批处理大小越大,您需要的内存空间就越多。
    • 迭代次数 = 传递次数,每次传递使用 [batch size] 示例数。需要明确的是,一次传球 = 一次向前传球 + 一次向后传球(我们不将向前传球和向后传球算作两次不同的传球)。

    例如:如果您有 1000 个训练示例,并且您的批量大小为 500,那么完成 1 个 epoch 需要 2 次迭代。

    仅供参考:Tradeoff batch size vs. number of iterations to train a neural network


    术语“批次”是模棱两可的:有些人用它来指定整个训练集,有些人用它来指代一次前向/后向传递中的训练示例数(就像我在这个答案中所做的那样)。为了避免这种歧义并明确批次对应于一次前向/后向传递中的训练示例数,可以使用术语mini-batch

    【讨论】:

    • 我很困惑。为什么你要训练不止一个 epoch——对所有数据不止一次?这不会导致过拟合吗?
    • @Soubriquet 神经网络通常使用迭代优化方法(大多数情况下,梯度下降)进行训练,这通常需要在训练集上执行多次传递才能获得良好的结果。
    • 但是如果有很多训练样本,比如 1 百万美元,那么仅仅一个 epoch 就足够了吗?如果训练集非常庞大,人们通常会做什么?把训练集分成批次,只执行一个epoch?
    • @pikachuchameleon 这取决于任务的复杂性:在某些情况下,一个 epoch 确实就足够了。
    • @MaxPower - 通常,在每次 迭代 之后执行该步骤,正如 Franck Dernoncourt 的回答所暗示的那样;这就是我们对来自反向传递的信息所做的事情。在每轮迭代 m 次的小批量梯度下降中,我们每轮更新参数 m 次。
    【解决方案2】:

    Epochiteration 描述不同的事物。


    时代

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

    迭代

    迭代描述了一个批次数据通过算法的次数。在神经网络的情况下,这意味着 前向传播后向传播。所以,每次你通过神经网络传递一批数据,你就完成了一次迭代


    示例

    举个例子可能会更清楚。

    假设您有一个包含 10 个示例(或样本)的数据集。您的批量大小为 2,并且您已指定希望算法运行 3 个 epoch。

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

    【讨论】:

    • 您能否解释一下权重是在每个 epoch 后更新还是在每次迭代后更新?
    • @InheritedGeek 权重在每个批次后更新,而不是历元或迭代。
    • @bhavindhedhi 1 批 = 1 次迭代,不是吗?
    • @Bee 不,以每批 10000 个训练样本和 1000 个样本为例,那么完成 1 个 epoch 需要 10 次迭代。
    • @bhavindhedhi 我认为 Bee 的问题是,在您的 10000 个总样本和每批 1000 个样本的示例中,您实际上有 10 个总批次,这等于 10 次迭代。我认为这是有道理的,但不确定这是否是一种正确的解释方式。
    【解决方案3】:

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

    “迭代”是一个更笼统的术语,但由于您与“epoch”一起询问它,我假设您的来源是指将单个案例呈现给神经网络。

    【讨论】:

    • 太好了,你能参考一下有详细说明的出版物吗?
    【解决方案4】:

    要了解它们之间的区别,您必须了解Gradient Descent Algorithm and its Variants

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

    batch 是完整的数据集。它的大小是可用数据集中训练示例的总数。

    mini-batch size 是学习算法在单遍(向前和向后)中处理的示例数。

    Mini-batch 是给定 mini-batch 大小的数据集的一小部分。

    迭代次数是算法已经看到的数据批次数(或者只是算法在数据集上执行的次数)。

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

    在批量梯度下降的情况下,整个批次在每次训练过程中都被处理。因此,梯度下降优化器的收敛比 Mini-batch 梯度下降更平滑,但需要更多时间。如果存在,批量梯度下降保证找到一个最优值。

    随机梯度下降是小批量梯度下降的一种特殊情况,其中小批量大小1

    【讨论】:

      【解决方案5】:

      我猜在神经网络术语的上下文中:

      • Epoch:当您的网络最终遍历整个训练集(即每个训练实例一次)时,它会完成一个 epoch

      为了定义迭代(又名steps),您首先需要了解batch size

      • 批量大小:您可能不希望一次性处理整个训练实例,因为它效率低下并且需要大量内存。所以通常做的是将训练实例分成子集(即批次),对选定的子集(即批次)执行一次传递,然后通过反向传播优化网络。子集(即批次)中的训练实例数称为 batch_size

      • 迭代:(也称为训练步骤)您知道您的网络必须一次性遍历所有训练实例才能完成一个 epoch。可是等等!当您将训练实例分成批次时,这意味着您只能在一次前向传递中处理一个 batch(训练实例的子集),那么其他批次呢?这就是迭代这个术语发挥作用的地方:

      • 定义: 为完成一个 epoch(即遍历所有训练实例),您的网络必须执行的转发次数(您创建的批次数)称为迭代

      例如,当您有 10,000 个训练实例,并且您想以 10 的大小进行 批处理;您必须执行 10,000/10 = 1,000 迭代 才能完成 1 epoch

      希望这能回答你的问题!

      【讨论】:

      • 那么,当我用 epoch=1 中的所有数据训练模型时,为什么我们在更多循环中使用数据?在这些时期会发生什么变化?
      • @MahdiAmrollahi 一般来说,神经方法需要不止一个 epoch 才能找到最佳训练点。在实践中,您的算法需要多次满足每个数据点才能正确学习它。这就是为什么我们在这里有“epoch”的概念,当epoch > 1(比如说2),这意味着你的算法已经遇到了每个训练数据点两次。
      • 你能告诉我步骤和迭代之间有什么区别,因为你说的是​​迭代概念,我已经阅读了 epoch 中的步骤
      • @Hamza 每次你传递一个batch数据(即整个数据的子集),你完成一个迭代/[训练]步骤迭代和[训练]步骤在此术语中是相同的概念。
      【解决方案6】:

      您有训练数据,您可以将这些数据打乱并从中挑选小批量。当您使用一个小批量调整权重和偏差时,您已经完成了一次迭代。

      一旦你用完你的小批量,你就完成了一个纪元。然后你再次打乱你的训练数据,再次挑选你的小批量,并再次遍历所有这些。那将是你的第二个纪元。

      【讨论】:

        【解决方案7】:

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

        一个epoch对应于整个训练集遍历整个网络一次。限制这一点可能很有用,例如争取过拟合。

        【讨论】:

          【解决方案8】:

          据我了解,当您需要训练 NN 时,您需要一个包含许多数据项的大型数据集。 NN在训练时,数据项一个一个地进入NN,称为一次迭代;当整个数据集经过时,称为一个纪元。

          【讨论】:

            【解决方案9】:

            我相信iteration相当于batch SGD中的单batch forward+backprop。 Epoch 正在遍历整个数据集一次(正如其他人提到的那样)。

            【讨论】:

              【解决方案10】:

              一个纪元包含几个迭代。这实际上就是这个epoch。让我们将 epoch 定义为数据集上的迭代次数,以便训练神经网络。

              【讨论】:

              • epoch 不是一个数字...我认为这可能与改写有关。
              • 投反对票,因为这是错误的:一个 epoch 是指模型一次看到所有训练数据的情节或批次的数量。
              【解决方案11】:
              1. Epoch 是神经网络已经看到所有数据的 1 个完整周期。

              2. 有人可能会说 100,000 张图像来训练模型,但是,内存空间可能不足以一次处理所有图像,因此我们将模型的训练拆分在称为批次的较小数据块上。例如批量大小为 100。

              3. 我们需要使用多个批次覆盖所有图像。所以我们需要 1000 次迭代才能覆盖所有 100,000 张图像。 (100 批大小 * 1000 次迭代)

              4. 一旦神经网络查看整个数据,它就被称为 1 Epoch(点 1)。一个人可能需要多个时期来训练模型。 (假设是 10 个 epoch)。

              【讨论】:

                【解决方案12】:

                一个时期是用于训练的样本子集的迭代,例如神经网络中的梯度下降算法。一个很好的参考是: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 有效。请看一下。

                【讨论】:

                  【解决方案13】:

                  根据Google's Machine Learning Glossary,一个epoch定义为

                  "对整个数据集进行一次完整的训练,这样每个示例都被看到一次。因此,一个 epoch 代表N/batch_size 个训练迭代,其中 N 是示例的总数。"

                  如果您使用 batch size 6 训练 10 个 epochs 的模型,给定总共 12 个样本,这意味着:

                  1. 模型将能够在 2 次迭代 (12 / 6 = 2) 即单个 epoch 中看到整个数据集。

                  2. 总体而言,该模型将有 2 X 10 = 20 次迭代(每轮迭代次数 X 轮次次数)

                  3. 每次迭代后都会重新评估损失和模型参数!

                  【讨论】:

                    【解决方案14】:

                    epoch

                    对整个数据集进行一次完整的训练,这样每个 例子见过一次。因此,一个 epoch 代表 N/batch sizetrainingiterations,其中 N 是 例子。

                    iteration

                    在训练期间对模型的权重进行一次更新。 一次迭代包括计算参数的梯度 关于单个batch数据的损失。

                    作为奖励:

                    batch

                    在一个iteration(即一个gradient 更新)model training

                    另见batch size

                    来源:https://developers.google.com/machine-learning/glossary/

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-07-08
                      • 2015-09-18
                      • 2011-04-07
                      • 1970-01-01
                      • 2016-04-08
                      • 1970-01-01
                      相关资源
                      最近更新 更多