批量归一化(BatchNormalization)是深度学习领域的重大突破之一,也是近年来研究者讨论的热点话题之一。BatchNormalization是一种广泛采用的技术,可以使训练更快、更稳定,已成为深度学习领域最有影响力的方法之一。但是,它仍然有一些问题需要注意。为什么要使用批量归一化?什么是批量归一化?在训练深度学习模型的过程中,当我们更新之前的权重时,每个中间激活层的输出分布在每次迭代中都会发生变化。这种现象称为内部协变偏移(ICS)。为了防止这种情况发生,所有的分布都需要被纠正。简单地说,如果遇到一些分布偏移,我们不应该偏移它们以帮助梯度优化和防止梯度消失,这将有助于我们的神经网络更快地训练。因此,减少这种ICS是推动批量归一化发展的关键原则。工作原理批量归一化通过减去批量的经验平均值除以经验标准差来归一化前一个输出层的输出。这将有助于数据看起来像高斯分布。其中mu和sigma_square分别是批次均值和批次方差。我们根据两个可学习参数γ和β学习新的均值和协方差。VGG-16网络中间卷积层的特征分布输出优势我将列举一些使用批量归一化的好处,但我不会详细介绍,因为这将是大量的文章。更快收敛。降低了初始权重的重要性。对超参数的鲁棒性。泛化需要较少的数据。BatchNormalization的问题回到本文的动机,在许多情况下,BatchNormalization可能会影响性能或根本不起作用。小批量的不稳定性如上所述,批量归一化层必须计算均值和方差,以便对整个批次的先前输出进行归一化。ResNet-50的批量归一化验证错误上面是ResNet-50的验证错误图。如果保持batchsize为32,那么最终的验证误差会在23左右,随着batchsize的减小,误差会不断减小(batchsize不能为1,因为它本身就是均值)。损失差异很大(大约10%)。如果小批量是个问题,为什么我们不使用更大的批量呢?实际上,我们不能在每种情况下都使用更大的批量大小。在进行微调时,我们不能使用大批量以避免大梯度伤害我们的模型。在分布式训练中,大批量最终将作为一组小批量分布在实例中。导致训练时间增加。NVIDIA和卡内基梅隆大学进行的实验表明,“即使批量归一化不是计算密集型的,但收敛所需的迭代总数减少了。每次迭代的时间可能会显着增加”,并且随着批量大小的增加,训练时间可能进一步增加。使用TitanXPascal在ImageNet上的ResNet-50训练时间分布正如您所看到的,批量归一化消耗了总训练时间的1/4。原因是批量归一化需要对输入数据进行两次迭代:一次用于计算批量统计信息,另一次用于对输出进行归一化。在测试/推理阶段不稳定例如,考虑一个真实的应用程序:“对象检测”。在训练目标检测器时,我们通常使用大批量(默认情况下,YOLOv4和Faster-RCNN都使用批量大小=64进行训练)。但是在将这些深度学习模型投入生产后,这些模型并不像训练时那样有效。这是因为他们接受了大批量训练,而实时他们得到的批量大小等于1,因为它必须处理每一帧。如前所述,当使用batchsize为1时,它本身就是均值,因此归一化层将无法有效处理所谓的“internalcovariantshift”。在线学习的缺点与批量学习相比,在线学习是一种学习技术,它通过按顺序(单独地或通过称为小批量的小组)提供数据实例来逐步训练系统。每个学习步骤都快速且成本低廉,因此系统可以在新数据到达时动态学习。典型的在线学习管道,由于依赖外部数据源,数据可以单独或批量到达。由于每次迭代中批量大小的变化,它不能很好地泛化到输入数据的规模和移位,最终影响性能。不适用于递归神经网络在卷积神经网络中,虽然批量归一化可以显着提高训练速度和泛化能力,但事实证明它们很难应用于递归架构。批量归一化可以应用于RNN堆栈之间,其中归一化“垂直”应用(即应用于每个RNN的输出),但不能“水平”应用(即在时间步之间),因为重复的Rescaling会导致梯度爆炸。备选方案在无法进行批量归一化的情况下,有几种备选方案:层归一化。实例规范化。组归一化(+权重归一化)。同步批归一化。最后,虽然batchnormalization是深度学习发展中的一个里程碑技术,但是它仍然存在一些问题,这说明归一化技术还有改进的空间。
