对于每个 epoch,我可以只使用完整训练数据集的一个子集来训练神经网络吗?

人工智能 神经网络 训练 数据集 梯度下降
2021-10-30 07:35:55

如果一个人有一个足够大的数据集来学习一个高度复杂的函数,比如学习国际象棋游戏,并且在整个数据集上运行小批量梯度下降的处理时间太长,我可以改为执行以下操作吗?

  1. 在一大块数据上运行算法进行大量迭代,然后对另一个块做同样的事情等等?

    (这种方法不会产生与小批量梯度下降相同的结果,因为我没有在一次迭代中包含所有数据,而是从一些数据中学习,然后继续学习更多数据,从更新的权重开始可能仍然会收敛到一个经过合理训练的网络。)

  2. 在不同的 PC(每台 PC 使用数据块)上运行相同的算法(相同的模型也只有数据变化),然后在测试集上查看性能,并将最终决策作为所有不同模型的加权平均值' 在测试集上表现最好的模型的权重很高的输出?

1个回答
  1. 在一大块数据上运行算法进行大量迭代,然后对另一个块做同样的事情等等?

    (这种方法不会产生与小批量梯度下降相同的结果,因为我没有在一次迭代中包含所有数据,而是从一些数据中学习,然后继续学习更多数据,从更新的权重开始可能仍然会收敛到一个经过合理训练的网络。)

如果每个单独的数据块仍然足够大并且足以代表整个人口的分布,这可能会起作用,但可能不是最好的方法。事实上,我不认为它比仅使用最后一个块并仅在该块上进行训练要好得多。这是因为以下原因。假设您首先在 A 块上训练了一段时间,然后在 B 块上训练了很长时间,然后在 C 块上训练了很长时间,等等。在 B 块上学习时,您的模型很可能会“忘记”所有内容它从块 A 中学习。之后在块 C 上学习时,它也可以再次“忘记”从块 B 中学到的所有内容。

在伪代码中,您在此处提出的方法如下所示:

for each chunk:
    for large number of iterations:
        learn on chunk()

一个简单的改进方法是交换循环:

for large number of iterations:
    for each chunk:
        learn on chunk()

我刚刚描述的实际上是我如何解释“小批量梯度下降”,但是块将是小批量(并且小批量/块将在外循环的每次迭代中从完整的总体中随机重新选择,你会'不总是使用相同的块)。请注意,如果您的数据集太大以至于无法同时放入 RAM 中,这将无效,因为您将不得不处理过多的 I/O。


  1. 在不同的 PC(每台 PC 使用数据块)上运行相同的算法(相同的模型也只有数据变化),然后在测试集上查看性能,并将最终决策作为所有不同模型的加权平均值' 在测试集上表现最好的模型的权重很高的输出?

是的,这绝对是有效的。这种想法(在不同的数据子集上训练不同的模型)通常被称为“集成”方法。您甚至可以改变您使用的模型(例如,与一些随机森林、一些 SVM、一些神经网络等进行集成)。