批次(Batch)
在实际操作中,不是使用所有数据算出的Loss做微分,而是把所有的数据分为多个批次。每个批次的大小为一个B。

所有的批次(batch)都使用一遍称为一个周期(epoch)。
Shuffle:在每一个周期开始之前,会划分一次批次,每一个周期划分的批次都不相同(批次中的数据资料不相同)。
为什么训练时要使用批次

左边更新参数是较为稳定的,右边更新参数是曲折的。左边蓄力时间长但是威力较大,右边蓄力时间短但威力较小。
如果考虑平行运算,实际上左边的时间并不一定比右边长。
平行计算(即并行计算)是一种通过多个处理器或计算机同时处理同一问题不同部分的计算方式,以提高效率并解决复杂问题。但平行计算也有极限。

但是较大的批次会给训练带来较差的结果,曲折的更新会有利于训练。
因为训练数据不同,会得到有差异的Loss,在求梯度的时候,临界点的位置大概率不会重合,可以对模型进行更多次的训练调整,卡在某个临界点的概率较低。

在测试中小的批次也比大的批次表现更加出色

通常认为在多个局部最小值之间,变化率较低,变化幅度小的局部最小值为最优。
如果Trainting Loss曲线与Testing Loss的曲线不吻合,存在误差。变化幅度小的局部最小值会基本保持一致,而变化幅度大的局部最小值会发生较大的变化。

大的批次会更容易产生变化幅度大的局部最小值。

综上所述,批次大小是一个需要自行决定的超参数。 鱼和熊掌是有可能兼得的。
动能(Momentum)
假设误差曲面(Error surface)是一个真正的斜坡,而参数是一个球,将球从斜坡上滚下来,如果按照梯度下降(Gradient descent)的方法,参数球会在局部最小值处停止,而真正的物理世界中参数球会存在惯性,如果动量足够大,会继续向前走,不会被局部最小值困住。

每一次在移动参数时,不是只往梯度下降的反方向来移动参数,而是将梯度的反方向加上前一步移动的方向来调整参数。

所谓的加上Momentum,即在更新的时候,不仅只考虑当前的梯度,而是考虑过去所有梯度的综合