正如其他答案所暗示的那样,使用 SGD 的主要原因是降低梯度的计算成本,同时在对许多小批量或样本进行平均时仍然在很大程度上保持梯度方向——这肯定有助于达到局部最小值。
- 为什么小批量有效。
这背后的数学原理是,成本函数的“真实”梯度(泛化误差或无限大样本集的梯度)是梯度对真实数据生成分布的期望;在一批样本上计算的实际梯度的真实梯度的近似值。
gpdatag^p^datag^=Ep^data(∂J(θ)∂θ)
给定所有数据样本,批量梯度下降可以为您带来可能的“最佳”梯度,但它不是“真正的”梯度。较小的批次(即小批次)可能不如完整批次的最佳,但它们都是近似值 - 单样本小批次 (SGD) 也是如此。
假设一个 minibatch 中个样本之间没有相关性是真实梯度的无偏估计。具有不同小批量大小的估计值的(平方)标准误差与小批量的大小成反比。即
mg^(m)SE(g^(n))SE(g^(m))=mn−−−√
即,标准误差的减少是样本量增加的平方根。这意味着,如果 minibatch 很小,学习率也必须很小,以便在大方差上实现稳定性。当样本不独立时,无偏估计的性质不再保持。如果样本的排序不够随机,这需要您在训练之前对样本进行洗牌。
- 为什么 minibatch 可能会更好。
首先,minibatch 使得一些学习问题从技术上难以处理变得易于处理,因为较小的批量减少了计算需求。
其次,减小批量大小并不一定意味着梯度精度降低。许多训练样本有很多噪声、异常值或偏差。随机抽样的 minibatch 可能比原始的完整批次更好(或不差)反映真实数据生成分布。如果小批量梯度更新的一些迭代可以为您提供更好的估计,那么总体而言,一个时期的平均结果可能比从整批计算的梯度更好。
第三,小批量不仅有助于处理令人不快的数据样本,还有助于处理具有许多局部最小值的令人不快的成本函数。正如 Jason_L_Bens 所提到的,有时误差流形可能更容易将常规梯度捕获到局部最小值中,而更难以捕获使用 minibatch 计算的临时随机梯度。
最后,使用梯度下降,您不会一步达到全局最小值,而是在误差流形上进行迭代。梯度在很大程度上只给你迭代的方向。使用 minibatch,您可以更快地迭代。在许多情况下,迭代次数越多,您可以达到的点就越好。您并不真正关心该点在全球甚至本地是最佳的。你只想达到一个合理的模型,给你带来可接受的泛化错误。Minibatch 使这更容易。
如果您仔细阅读,您可能会发现 Ian Goodfellow 等人的《深度学习》一书对此主题进行了很好的讨论。