训练机器学习的数据集大小很重要 - svpino


训练神经网络的示例数量是我们可以用来影响训练过程的基本工具。
在机器学习术语中,我们称其为“批大小batch size”。批batch不过是将一组示例封装成类似数组的结构而已。
 
首先,一些背景知识
我们不能不专心讨论训练过程的工作原理。这是一个粗略的摘要,应该足以满足我们的目的:

  1. 我们从训练数据集中提取了一些示例数据。
  2. 我们通过模型运行该批次以计算结果。
  3. 我们发现该结果离需要的地方有多远。
  4. 我们将模型的参数调整特定数量。
  5. 我们根据需要重复进行多次迭代。

我们用于创建批示例的数量是我们做出的第一个决定。这是一个至关重要的选择,它将影响流程的工作方式。
我们有三种可能的选择:
  1. 我们可以使用整个训练数据集来创建一个长批次。
  2. 我们可以走到另一个极端,一次只使用一个示例。
  3. 我们可以放在中间,在每批数据中使用一些数据示例。

让我们仔细考虑一下这些选项中的每一个。
 
一次使用整个数据集
机器学习从业者喜欢为所有事物想出一个名字。因此,他们决定将此过程称为“批次梯度下降Gradient Descent ”。 Gradient Descent 是优化算法的名称,而 Batch批概念是因为我们将使用整个数据集。是的,我知道这没有道理,但让我们继续吧。
如果我们使用数据集中的每个示例创建一个批处理,然后在整个过程中运行它,最后只更新一次模型,则将节省大量的处理时间。很好,但另一方面,可能很难同时在内存中容纳很多示例,因此这不适用于大型数据集。
使用整个数据集计算模型更新的最有趣的方面是,我们正在消除数据中的所有噪声,并创建小的且稳定的调整。这听起来很无聊但可以预见。某些问题将从中受益,但是噪声的缺乏可能会阻止算法脱离次优解决方案。
  
一次只使用一个示例
这就是所谓的“随机梯度下降Stochastic Gradient Descent”(通常称为 SGD)
在这种情况下,我们为数据集中的每个示例调整模型的参数。在这里,我们不必一次处理整个事情,因此我们不会有内存限制,而且我们将立即获得有关培训进行情况的反馈。
更新每个示例的参数将导致调整过程中产生很多噪音。这对于特定的问题是有好处的,因为它可以防止它们卡住(值会跳出陷阱),但是在训练模型时也会产生难看,嘈杂的信号。
 
中间取一些数据集
分散差异通常是一个好策略,这就是“小批量梯度下降Mini-Batch Gradient Descent”的作用:它使用数据集中的一些示例来计算对模型的更新。
这是一个很大的折衷,它为我们提供了先前两种方法的优点,并避免了它们的问题。实际上,小批量梯度下降是常用的一种。不过,我们通常将其称为“随机梯度下降”,因为我们确实希望确保使其尽可能地令人困惑。当您听到有人说“ SGD ”时,请记住,他们可能使用一批带有多个示例的批处理。
我们需要回答的最后一个问题是您应该在一个批处理中包含多少个示例。已有大量研究对此做出回答,经验证据表明,较小的批次性能更好。
为了更加具体,并引用 一篇 探讨这一想法的好论文,“ (…)32是一个很好的默认值。”
 
让我们总结一下
好吧,让我们用一些实用的建议来快速总结一下。
在训练过程的每次迭代中使用的示例数量至关重要。良好的做法是始终从32开始,除非您有充分的理由选择其他尺寸。
获得有效的模型后,请随时尝试使用不同的批次大小。通常,我不会偏离默认值太多,并且很少使用16、32、64或128以外的其他值。
并且,当然,向那些努力工作的人们敬酒,使他们使用名称和缩写来使我们感到受欢迎!