在一大块数据上运行算法进行大量迭代,然后对另一个块做同样的事情等等?
(这种方法不会产生与小批量梯度下降相同的结果,因为我没有在一次迭代中包含所有数据,而是从一些数据中学习,然后继续学习更多数据,从更新的权重开始可能仍然会收敛到一个经过合理训练的网络。)
如果每个单独的数据块仍然足够大并且足以代表整个人口的分布,这可能会起作用,但可能不是最好的方法。事实上,我不认为它比仅使用最后一个块并仅在该块上进行训练要好得多。这是因为以下原因。假设您首先在 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。
- 在不同的 PC(每台 PC 使用数据块)上运行相同的算法(相同的模型也只有数据变化),然后在测试集上查看性能,并将最终决策作为所有不同模型的加权平均值' 在测试集上表现最好的模型的权重很高的输出?
是的,这绝对是有效的。这种想法(在不同的数据子集上训练不同的模型)通常被称为“集成”方法。您甚至可以改变您使用的模型(例如,与一些随机森林、一些 SVM、一些神经网络等进行集成)。