随机梯度下降中的一个时期被定义为数据的单次传递。对于每个 SGD minibatch,抽取个样本,计算梯度并更新参数。在 epoch 设置中,样本是在没有替换的情况下抽取的。
但这似乎没有必要。为什么不在每次迭代时从整个数据集中随机抽取k个随机抽取每个 SGD 小批量?在大量时期内,或多或少经常看到样本的小偏差似乎并不重要。
随机梯度下降中的一个时期被定义为数据的单次传递。对于每个 SGD minibatch,抽取个样本,计算梯度并更新参数。在 epoch 设置中,样本是在没有替换的情况下抽取的。
但这似乎没有必要。为什么不在每次迭代时从整个数据集中随机抽取k个随机抽取每个 SGD 小批量?在大量时期内,或多或少经常看到样本的小偏差似乎并不重要。
除了弗兰克关于实用性的回答和大卫关于查看小子组的回答(这两点都很重要)之外,实际上还有一些理论上的理由更喜欢抽样而不进行替换。原因可能与大卫的观点有关(本质上是优惠券收集者的问题)。
2009 年,Léon Bottou 比较了特定文本分类问题 ( ) 的收敛性能。
博图 (2009)。一些随机梯度下降算法的奇怪快速收敛。学习和数据科学研讨会论文集。(作者的pdf)
他通过 SGD 用三种方法训练了支持向量机:
他凭经验检验了性分配的批次。
这后来在理论上得到了论文的证实:
Gürbüzbalaban、Ozdaglar 和 Parrilo(2015 年)。为什么随机改组胜过随机梯度下降。arXiv:1510.08560。(NIPS 2015 邀请演讲视频)
他们的证明仅适用于损失函数是强凸的情况,即不适用于神经网络。但是,可以合理地预期类似的推理可能适用于神经网络案例(这更难分析)。
从性能的角度来看,这确实是非常不必要的,训练集很大,但是使用 epoch 会很方便,例如:
[1] 给出了另一个原因,考虑到今天的计算机配置,这并不是那么相关:
对于任何随机梯度下降方法(包括小批量情况),对于估计器的效率而言,每个示例或小批量近似独立地采样是很重要的。因为随机访问内存(或者更糟糕的是,磁盘)是昂贵的,一个很好的近似,称为增量梯度(Bertsekas,2010),是以与它们在内存中的顺序相对应的固定顺序访问示例(或小批量)或磁盘(如果我们不是在每个示例仅访问一次的纯在线案例中,则在第二个时期以相同的顺序重复示例)。在这种情况下,如果首先以随机顺序放置示例或小批量(为了确保这种情况,首先打乱示例可能很有用),则更安全。如果每个时期都改变访问小批量的顺序,则可以观察到更快的收敛,如果训练集保存在计算机内存中,这可能是相当有效的。
[1] 本吉奥,约书亚。“基于梯度的深度架构训练的实用建议。 ”神经网络:交易技巧。施普林格柏林海德堡,2012. 437-478。
我有点不同意这显然无关紧要。假设有一百万个训练样本,我们抽取一千万个样本。
在 R 中,我们可以快速查看分布的样子
plot(dbinom(0:40, size = 10 * 1E6, prob = 1E-6), type = "h")
一些示例将被访问 20 次以上,而其中 1% 的示例将被访问 3 次或更少。如果仔细选择训练集来表示真实数据中示例的预期分布,这可能会对数据集的某些区域产生真正的影响——尤其是当您开始将数据分割成更小的组时。
考虑最近的案例,其中一位伊利诺伊州选民实际上被过度采样了 30 倍,并显着改变了模型对他的人口群体的估计(在较小程度上,对整个美国人口)。如果我们在阴天、景深较窄的情况下不小心对绿色背景拍摄的“Ruffed Grouse”图像进行过采样,而对其他类型的松鸡图像采样不足,则模型可能会将这些不相关的特征与类别标签相关联。分割数据的方法越多,这些子组就越多,发生这种错误的机会就越多。