Answers:
分批或随机梯度下降的适用性实际上取决于预期的误差流形。
批梯度下降使用整个数据集计算梯度。这对于凸的或相对平滑的误差流形非常有用。在这种情况下,我们在某种程度上直接朝着局部或全局的最佳解决方案迈进。此外,在退火率下降的情况下,批次梯度下降最终将在吸引池中找到最小值。
随机梯度下降(SGD)使用单个样本计算梯度。实际上,SGD的大多数应用实际上都使用了几个样本的小批量,原因将在稍后解释。对于具有很多局部最大值/最小值的误差流形,SGD效果很好(我想不是很好,但是比批梯度下降更好)。在这种情况下,使用减少的样本数计算出的有点嘈杂的梯度会使模型脱离局部最小值,从而进入一个更理想的区域。单个样本确实很吵,而迷你批处理往往会平均消除一些噪声。因此,当使用小批量处理时,可减少加扰量。当小批量的大小足够小,可以避免一些较差的局部最小值,但又足够大而不会达到平衡时,则达到了良好的平衡 避免全局最小值或性能较好的局部最小值。(顺便说一句,这是假定最佳极小值具有更大更深的吸引力,因此更容易陷入。)
SGD的优点之一是计算速度快得多。大型数据集通常无法保存在RAM中,这会使矢量化效率大大降低。相反,必须加载,处理每个样本或一批样本,并存储结果等。另一方面,通常将Minibatch SGD故意制造得足够小以使其易于计算。
通常,通过执行SGD的更多迭代来利用此计算优势,比传统的批处理梯度下降执行更多的步骤。通常,这会导致生成的模型非常接近通过批次梯度下降找到的模型,甚至更好。
我喜欢思考SGD的工作方式,是想像我有一个点代表我的输入分布。我的模型正在尝试学习输入分布。输入分布周围是一个阴影区域,代表我可以采样的所有可能的迷你批的输入分布。通常可以合理地假设最小批量输入分布与真实输入分布非常接近。在所有步骤中,批次梯度下降均采用最陡峭的路线来达到真实的输入分布。另一方面,SGD在阴影区域内选择一个随机点,并向该点采取最陡峭的路线。但是,在每次迭代中,它都会选择一个新点。所有这些步骤的平均值通常会很好地逼近真实输入分布。
正如其他答案所暗示的那样,使用SGD的主要原因是为了减少梯度的计算成本,同时在对多个迷你批次或样本进行平均时仍可以在很大程度上维持梯度方向-这无疑有助于使您达到局部最小值。
这背后的数学原理是,成本函数的“真实”梯度(泛化误差或无限大样本集的梯度)是对真实数据生成分布的梯度的期望;在一批样本上计算出的实际梯度始终是具有经验数据分布的真实梯度的近似值。
首先,由于批量大小较小而减少了计算需求,因此minibatch使得一些学习上的问题从技术上难以解决到可以解决。
其次,批量大小的减少不一定意味着梯度精度的降低。训练样本有很多噪音,离群值或偏差。随机采样的小批处理可能比原始的完整批处理更好(或不更糟)反映真实数据生成分布。如果小批量梯度更新的一些迭代为您提供了更好的估计,则总体而言,一个历元的平均结果可能比从整个批次计算的梯度更好。
第三,minibatch不仅有助于处理令人不快的数据样本,而且还有助于处理具有许多局部最小值的令人不快的成本函数。正如Jason_L_Bens所提到的,有时误差流形可能更容易将规则梯度捕获到局部最小值中,而更难于捕获用minibatch计算的临时随机梯度。
最后,通过梯度下降,您不会一步一步达到全局最小值,而是在错误歧管上进行迭代。渐变在很大程度上只给您迭代的方向。使用minibatch,可以更快地进行迭代。在许多情况下,迭代次数越多,可以达到的效果就越好。您并不真正在乎所有天气,这在全球乃至局部都是最佳的。您只想找到一个合理的模型,为您带来可接受的泛化错误。Minibatch使这更容易。
如果您仔细阅读Ian Goodfellow等人的著作《深度学习》,您可能会对此主题进行很好的讨论。
对我而言,批处理梯度类似于精益梯度。在稀薄梯度中,选择批次大小,以便应更新的每个参数在批次中也独立(但不一定正交)变化。例如,如果批次包含10个实验,10行,则有可能形成独立列。10行可独立但非正交地更新512个参数。