循环神经网络中的时代与迭代

Posted

技术标签:

【中文标题】循环神经网络中的时代与迭代【英文标题】:epoch vs. iteration in recurrent neural networks 【发布时间】:2016-07-08 02:48:04 【问题描述】:

我正在使用 RNN 和 LSTM 查看 Keras 的 text generation example,但仍然对术语 epochiteration 之间的区别感到困惑。

尽管here 是之前的问题,但我无法理解answer,或者这个答案与我的理解不同,也与以下示例的处理方式不同。基于这个answer,据说

一个 epoch = 所有训练示例的一次前向传递和一次反向传递

迭代次数 = 传递次数,每次传递使用 [batch size] 示例数。

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

结束这一点:(#training examples/batch size) = (#iterations/#epochs)

不过,下面的example,据我了解,和之前的结论不同。

# train the model, output generated text after each iteration
for iteration in range(1, 60):
    print()
    print('-' * 50)
    print('Iteration', iteration)
    model.fit(X, y, batch_size=128, nb_epoch=1)

    start_index = random.randint(0, len(text) - maxlen - 1)

    for diversity in [0.2, 0.5, 1.0, 1.2]:
        print()
        print('----- diversity:', diversity)

        generated = ''
        sentence = text[start_index: start_index + maxlen]
        generated += sentence
        print('----- Generating with seed: "' + sentence + '"')
        sys.stdout.write(generated)

        for i in range(400):
            x = np.zeros((1, maxlen, len(chars)))
            for t, char in enumerate(sentence):
                x[0, t, char_indices[char]] = 1.

            preds = model.predict(x, verbose=0)[0]
            next_index = sample(preds, diversity)
            next_char = indices_char[next_index]

            generated += next_char
            sentence = sentence[1:] + next_char

            sys.stdout.write(next_char)
            sys.stdout.flush()
        print()

这里,iteration60 并且 epoch 的数量设置为 1,这让我很困惑很多。正如for iteration in range(1, 60) 所述,似乎有 60 个迭代。对于每个迭代,一个epoch按照model.fit(X, y, batch_size=128, nb_epoch=1) 的规定为每个for 循环完成。同样,这里有一个batch_size=128。那么迭代究竟是什么意思呢?

谁能解释一下iterationepoch的区别根据这个例子

【问题讨论】:

RNN 中的术语 Epoch 不同于多层感知器或 CNN ,这里 RNN 训练中的 epoch 涉及单串时间连续的输入输出响应对 【参考方案1】:

我认为在这个例子中,迭代意味着不同的东西:你正在迭代学习过程,并且在每个时期之后你都在用部分学习的模型做一些事情。您正在迭代地进行,这就是使用 iteration 词的原因。

【讨论】:

术语 Epoch 在 RNN 中与多层感知器或 CNN 不同,这里 RNN 训练中的 epoch 涉及单串时间上连续的输入输出响应对。【参考方案2】:

在这种情况下,迭代仅用于显示中间结果。 我们可以删除这段代码:

for diversity in [0.2, 0.5, 1.0, 1.2]:
    print()
    print('----- diversity:', diversity)

    generated = ''
    sentence = text[start_index: start_index + maxlen]
    generated += sentence
    print('----- Generating with seed: "' + sentence + '"')
    sys.stdout.write(generated)

    for i in range(400):
        x = np.zeros((1, maxlen, len(chars)))
        for t, char in enumerate(sentence):
            x[0, t, char_indices[char]] = 1.

        preds = model.predict(x, verbose=0)[0]
        next_index = sample(preds, diversity)
        next_char = indices_char[next_index]

        generated += next_char
        sentence = sentence[1:] + next_char

        sys.stdout.write(next_char)
        sys.stdout.flush()
    print()

而是:

for iteration in range(1, 60):
  model.fit(X, y, batch_size=128, nb_epoch=1)

写:

model.fit(X, y, batch_size=128, nb_epoch=60)

【讨论】:

以上是关于循环神经网络中的时代与迭代的主要内容,如果未能解决你的问题,请参考以下文章

结合注意力与循环神经网络推荐的算法

循环神经网络

深入浅出RNN

设置批量大小*和*神经网络的训练迭代次数?

TensorBoard: 可视化学习

神经网络结构搜索(Neural Architecture search)