【问题标题】:Why training loss is increased at the beginning of each epoch?为什么在每个 epoch 开始时训练损失会增加?
【发布时间】:2017-10-25 09:08:26
【问题描述】:

我正在训练一个线性回归模型。我使用 tf.contrib.data 准备数据集,将其打乱并分批提供:

  dataset = tf.contrib.data.TFRecordDataset(filename)
  dataset = dataset.map(
      _parse_function, num_threads=16, output_buffer_size=100 * batch_size)
  dataset = dataset.repeat(5)
  dataset = dataset.shuffle(buffer_size=100000)
  dataset = dataset.padded_batch(batch_size, padded_shapes=([None], [None]))
  iterator = dataset.make_initializable_iterator()
  x_inputs, y_ = iterator.get_next()

以下是我们的训练损失:

很奇怪,在每个 epoch 的开始(迭代 = 100k)我们在训练损失中都有一个脉冲。如果训练过程继续进行,我们会在接下来的 epoch 开始时看到相同的模式。

【问题讨论】:

  • 如果您提供最少的代码来重现您的问题,那么回答起来会容易得多。但问题可能出在您的数据顺序上。

标签: machine-learning tensorflow tensorflow-datasets


【解决方案1】:

假设您的数据集的记录少于 100000 条,则问题可能是输入 shuffle 的随机性不足。直观地说,如果现有数据没有被打乱并且在它们的顺序上有一些结构,那么训练过程可能会过度拟合到文件末尾的记录,当你从头开始重新启动时,模型在记录上的表现就不会那么好了靠近文件的开头,损失会增加。

正确的解决方案取决于数据集的精确细节,但以下一些方法可能有用:

  1. 如果可能,将传递给 Dataset.shuffle()buffer_size 增加到与数据集一样大。 (如果您的整个数据集不适合内存,这可能是不可能的。)

  2. 通过在训练前随机化输入文件的顺序,确保数据在记录的顺序上没有任何结构。

  3. 除了随机化文件中的顺序外,您还可以将数据划分为几个不同的文件,并使用以下命令随机化您访问这些文件的顺序:

    dataset = tf.data.Dataset.list_files(shard_filenames)
    dataset = dataset.shuffle(len(shard_filenames))
    dataset = dataset.flat_map(lambda filename: tf.data.TFRecordDataset(filename))
    # ...
    
  4. 作为 (3) 的扩展,您可以使用 Dataset.interleave() 代替 Dataset.flat_map() 一次读取多个分片。

【讨论】:

  • 我有一百万个训练集并试图将 buffer_size 增加到百万但问题没有解决。我发现这可能是“sampled_softmax”的问题。当我将其更改为其他(例如'rank_sampled_softmax')时,我在训练损​​失中看不到这种模式。有什么想法吗?
  • 正如大卫在他的评论中建议的那样,我们需要查看更多代码并有一些方法来重现问题以提出更多想法。如果采样的 softmax 确实是问题所在,我们将无法从问题中猜测:)。
  • @mrry 我遇到了同样的问题。数据的排序真的是原因吗?关于训练过程可能会在时代结束时过度拟合的论点在我看来并不合理。模型只有在一遍又一遍地看到相同的数据时才能过拟合,而在数据集的一个时期内情况并非如此。
【解决方案2】:

在这里看到相同的锯齿图案:https://discuss.pytorch.org/t/strange-behavior-with-sgd-momentum-training/7442

建议的解决方案是确保您的数据加载器加载带有替换的数据。

【讨论】:

  • 这个链接的问题不是完全相同的锯齿模式,并且有不同的原因。在链路的情况下,在每个 epoch 开始时损失有所下降,随后在 epoch 期间增加。在 OP 的情况下,在 epoch 开始时损失有一个跳跃,然后在 epoch 期间下降。
猜你喜欢
  • 1970-01-01
  • 2021-04-13
  • 2022-11-15
  • 2021-07-24
  • 2018-12-15
  • 2020-10-24
  • 1970-01-01
  • 2012-10-09
  • 2020-01-27
相关资源
最近更新 更多