【问题标题】:When to use layernorm/batch norm?何时使用 layernorm/batch norm?
【发布时间】:2019-07-11 06:29:36
【问题描述】:

在设计网络时,应该在哪里拼接规范化?例如。如果你有一个堆叠的 Transformer 或 Attention 网络,那么在你有一个密集层之后的任何时间进行归一化是否有意义?

【问题讨论】:

    标签: neural-network deep-learning pytorch


    【解决方案1】:

    original paper 试图解释的是使用 Batch Normalization 减少过度拟合。

    在设计网络时应该在哪里拼接归一化?

    在输入上尽早设置标准化。不平衡的输入极值会导致不稳定。

    虽然如果您对输出进行标准化,这不会阻止输入再次导致不稳定。

    这是解释 BN 做什么的小代码:

    import torch
    import torch.nn as nn
    
    m = nn.BatchNorm1d(100, affine=False)
    input = 1000*torch.randn(3, 100)
    print(input)
    output = m(input)
    print(output)
    print(output.mean()) # should be ~ 0
    print(output.std()) # should be ~ 1
    

    在拥有密集层之后的任何时间进行归一化是否有意义

    是的,您可以这样做,因为矩阵乘法可能会导致产生极端情况。此外,在卷积层之后,因为这些也是矩阵乘法,与密集 (nn.Linear) 层相比,类似但强度较低。例如,如果您打印重新发送的模型,您会看到每次在 conv 层之后都设置了批量规范,如下所示:

    (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
    (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    

    要打印完整的 resnet,您可以使用:

    import torchvision.models as models
    r = models.resnet18()
    print(r)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2021-01-02
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多