最近,许多深层架构使用“批处理规范化”进行培训。
什么是“批量标准化”?它从数学上做什么?它在哪些方面有助于培训过程?
如何在培训期间使用批处理规范化?是否在模型中插入了一个特殊的层?我需要在每一层之前正常化,还是只需要一次?
假设我用批量规范化进行训练。这会影响我的测试时间模型吗?我是否应该用“部署”网络中的其他/等效层/操作来替换批处理规范化?
关于批处理规范化的这个问题只涉及这个问题的一部分,我的目标是并希望得到一个更详细的答案。更具体地说,我想知道批量规范化培训如何影响测试时间预测,即“部署”网络和网络的测试阶段。
发布于 2016-12-21 19:02:07
批处理规范化是针对可能遭受有害漂移的层。数学上很简单:找到每个分量的均值和方差,然后应用标准变换将所有值转换为相应的Z-分数:减去平均值,再除以标准差。这确保了组件范围非常相似,以便每个组件都有机会影响培训三角洲(在后端)。
如果您正在使用网络进行纯测试(没有进一步的培训),那么只需删除这些层,它们已经完成了他们的工作。如果您在测试/预测/分类时进行培训,那么将它们放在适当的位置;这些操作将不会损害您的结果,而且几乎不会减慢前向计算的速度。
至于卡菲的细节,卡菲并没有什么特别之处。计算是一个基本的统计过程,对于任何框架都是相同的代数。当然,对于支持向量和矩阵数学的硬件也会有一些优化,但是这些优化包括简单地利用芯片的内置操作。
对评论的回应
如果你能负担得起一些额外的训练时间,是的,你会想要在每一层正常化。在实践中,减少插入次数--比如说,每隔1到3次--就可以正常工作。
您可以在部署中忽略这些,因为它们已经完成了它们的工作:当没有反向传播时,就没有权重漂移。另外,当模型在每个批处理中只处理一个实例时,Z-得分总是0:每个输入都是批的平均值(即整个批处理)。
发布于 2016-12-22 01:51:01
作为剪枝回答的补充,在测试过程中,批归一化层将使用来自不同训练迭代的平均mean/variance/scale/shift值来规范其输入(减去均值并除以标准差)。
而最初的谷歌的批量标准化文件只说它应该是一种移动平均法,但是没有提供更详尽的解释。caffe和tensorflow都使用指数移动平均法。
根据我的经验,就验证精度而言,简单移动平均法通常比指数移动平均法更好(也许它需要更多的实验)。作为比较,您可以参考这里(与BVLC/caffe中的batch norm层相比,我尝试了channel_wise_bn_layer中的两种移动平均方法实现)。
发布于 2021-04-01 14:53:32
批归一化解决了一个称为“内部协变量转移”的问题。要理解为什么会有帮助,你需要首先了解什么是协变量转移。
“协变量”只是输入“功能”的另一个名称,通常写为X。协变量移位意味着特征在培训/测试数据的不同部分中的分布是不同的,从而打破了大多数ML中使用的i.i.d假设。这个问题经常出现在医疗数据中(您有来自一个年龄组的培训样本,但是您希望对来自另一个年龄组的东西进行分类),或者金融(由于市场条件的变化)。
“内部协变量转移”是指在神经网络中发生的协变量转移,即从(例如)第2层到第3层。这是因为,随着网络学习和权重的更新,网络中特定层的输出分布发生变化。这迫使更高的层适应这种漂移,这减慢了学习速度。
BN有助于使网络中间层之间的数据看起来像白化的数据,这意味着您可以使用更高的学习速度。因为BN有正规化的效果,它也意味着你可以经常删除辍学(这是有帮助的,因为辍学通常会减缓训练)。
https://stackoverflow.com/questions/41269570
复制相似问题