假设我们有500k项目的训练数据,如果我们一次训练一个项目或一次训练一个项目或者一次训练所有项目是否重要?
考虑inputTrainingData
和outputTrainingData
是[[]]
和train_step
是任何通用的张量流训练步骤。
选项1一次训练一个项目 -
for i in range(len(inputTrainingData)):
train_step.run(feed_dict={x: [inputTrainingData[i]], y: [outputTrainingData[i]], keep_prob: .60}, session= sess)
选项2一次训练所有 -
train_step.run(feed_dict={x: inputTrainingData, y: outputTrainingData, keep_prob: .60}, session= sess)
就培训质量而言,上述备选方案1和2之间是否有任何区别?
是,有一点不同。选项1的内存消耗要少得多,但准确性也低得多。选项2可能占用你所有的RAM,但应该证明更准确。但是,如果您一次使用所有训练集,请务必限制步数以避免过度拟合。理想情况下,批量使用数据(通常在16到256之间)。大多数优化技术是“随机的”,即它们依赖于示例的统计样本来估计模型更新。总结: - 更多数据=>更准确(但内存更多)=>过度拟合的风险较高(因此限制了训练步骤的数量)
这些选项之间有所不同。通常,您必须使用批量大小来训练128次迭代的数据。你也可以使用一个批量大小,就像你们的第一个例子一样。这种方法的优点是可以输出神经网络的训练效率。
如果您正在学习所有数据,那么您的速度会快一些,但只有在效率良好的情况下才会知道最后。
最好的方法是制作批量大小并通过堆栈学习。因此,您可以在每次堆叠后输出高效率并控制您的效率。
数学上这两种方法是不同的。一种称为随机梯度下降,另一种称为批量梯度下降。您缺少最常用的一种 - 迷你批量梯度下降。关于该主题已经进行了大量研究,但基本上不同的批量大小具有不同的收敛特性。通常人们使用大于一的批量大小而不是完整的数据集。这通常是必要的,因为大多数数据集不能同时适合内存。此外,如果您的模型使用批量标准化,则批量大小为1将不会收敛。这个paper讨论了批量大小(以及其他因素)对性能的影响。需要注意的是,较大的批量大小也不一致。 (他们实际上认为这不是批量大小本身,而是批量较大时更新的事实。我建议批量大小为32开始并试验看批量大小如何影响性能。
下面是我链接的论文中批量大小对培训和验证性能的影响图。