【发布时间】:2019-07-11 06:29:36
【问题描述】:
在设计网络时,应该在哪里拼接规范化?例如。如果你有一个堆叠的 Transformer 或 Attention 网络,那么在你有一个密集层之后的任何时间进行归一化是否有意义?
【问题讨论】:
标签: neural-network deep-learning pytorch
在设计网络时,应该在哪里拼接规范化?例如。如果你有一个堆叠的 Transformer 或 Attention 网络,那么在你有一个密集层之后的任何时间进行归一化是否有意义?
【问题讨论】:
标签: neural-network deep-learning pytorch
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)
【讨论】: