【问题标题】:Does batch normalisation work with a small batch size?批量标准化是否适用于小批量?
【发布时间】:2019-11-13 12:45:23
【问题描述】:

我正在使用批量大小为 10 的批量标准化进行面部检测,我想知道删除批量规范层或保留它们是否更好。 如果删除它们更好,我可以使用什么来代替?

【问题讨论】:

    标签: machine-learning computer-vision pytorch


    【解决方案1】:

    这个问题取决于几件事,首先是你的神经网络的深度。当有很多隐藏层时,批量标准化对于增加数据的训练很有用。它可以减少训练模型和 hep 规范数据所需的 epoch 数。通过标准化网络的输入,您可以降低追逐“移动目标”的风险,这意味着您的学习算法并没有达到应有的最佳性能。

    如果您有深度神经网络,我的建议是在您的代码中包含批量标准化层。提醒一下,您可能还应该在您的图层中包含一些 Dropout。

    如果这有帮助,请告诉我!

    【讨论】:

    • proposal network 不是很深(3 到 4 层),但其余的网络很深(6 到 9 层)。对于proposal network,我觉得去掉batch norm后训练过程变慢了,但结果更合理(误报更少)(这只是一种感觉,经过13K次迭代)
    • 我知道深度网络在没有批量规范的情况下学习效果很差。但我担心用小批量进行规范化会弄乱隐藏的表示
    • @hhoomn 在使用批量标准化时,批量大小确实会影响准确性,这意味着我理解您对小批量标准化的关注。不过,几乎所有涉及批量大小的 ML 问题都是这种情况,因为更大的批量大小会导致数据的更完整表示。我会增加您的批量大小,使其不会太小,并将批量标准化过程留在您的代码中。由于批次较大,每个 epoch 的运行时间会更长,但整体准确度应该会随着 epoch 的减少而增加。
    • 我的 GPU 内存并不总是允许更大的批处理大小,我在个人计算机上运行代码。有时我必须运行代码,每批只有两个样本(尤其是关于 GAN)虽然我的问题涉及 5 到 32 左右的批量大小
    • @hhoomn 你的数据集有多大?对于我使用的 ML 方法,我通常能够在我的 CPU 上运行它们,只是非常非常缓慢。
    【解决方案2】:

    是的,它适用于较小的尺寸,即使您设置的最小尺寸也适用。

    诀窍是 bach 大小也增加了正则化效果,而不仅仅是批量范数。 我给你看几张照片:

    我们在同一尺度上跟踪 bach 损失。左侧是没有批规范层的模块(黑色),右侧是具有批规范层的模块。 请注意,即使对于 bs=10,正则化效果也很明显。

    当我们设置bs=64 时,批量损失正则化非常明显。请注意,y 的比例始终为 [0, 4]

    我的考试纯粹是在 nn.BatchNorm1d(10, affine=False) 上,没有可学习的参数 gammabetawb

    这就是为什么当批量大小较小时,使用 BatchNorm 层是有意义的。

    【讨论】:

    • 我不确定这是一个已解决的问题。我知道在像 RetinaNet 这样的对象检测模型中,它们经常冻结批规范层,因为它们一次只能对 1 或 2 个图像进行操作。这是一个例子,但我还记得在 Facebook 的 Detectron 存储库中看到过这个:github.com/yhenon/pytorch-retinanet/issues/24
    • 问题是批量大小为 10,PyTorch 批处理规范通常可以工作。如果batch size比较小,可以试试现在很流行的Layer norm,甚至可以试试running batch norm
    猜你喜欢
    • 2020-02-25
    • 2020-04-26
    • 1970-01-01
    • 2018-04-09
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多