我一直在深入研究批处理规范在PyTorch中是如何工作的,并注意到下面的代码:
torch.manual_seed(0)
# With Learnable Parameters
m = nn.BatchNorm2d(1)
# Without Learnable Parameters
#m = nn.BatchNorm2d(1, affine=False)
input = torch.randn(2, 1, 2, 2)
output = m(input)
#print(input)
print(output)
下面的输出之和不等于1:
tensor([[[[-0.1461, -0.0348],
[ 0.4644, -0.0339]]],
[[[ 0.6359, -0.0718],
[-1.1104, 0.2967]]]], grad_fn=<NativeBatchNormBackward>)
它的总和为0,我猜这是因为批处理范数使平均值为0(除非添加了比例和平移参数)。批处理归一化不是应该在批处理中每个通道产生一个分布吗?
1条答案
按热度按时间mi7gmzs61#
我想你把
BatchNorm
和Softmax
搞混了。为了回答您在评论中提出的问题,归一化不会改变分布-它只是将其以0为中心,单位方差为0。
例如,如果数据来自均匀分布,则在标准化之后它保持均匀,尽管具有不同的统计量。
例如,以下面的分布为例:
归一化后,分布如下所示:
请注意,总体分布的形状和每个桶中的样本数是完全相同的--变化的是分布的平均值(即中心)。尽管视觉上不明显,但可以检查新的归一化值(图的X轴),并看到方差约为1。
这正是
BatchNorm
所做的,X轴是批处理中的每个例子。对于其他类型的范数,用于归一化的维度会发生变化(例如,从LayerNorm
中的批处理维度到特征维度),但效果基本相同。现在让我们看看
Softmax
对分布的影响,将softmax
应用于分布,得到下面的图:正如您所看到的,
softmax
实际上在点上创建了一个概率分布,这意味着,它给出了假设每个点都从高斯分布中采样的可能性(高斯部分在理论上很重要,因为它是softmax表达式中e
的来源)。相比之下,简单地将Y轴缩放为样本数并不会产生 * 高斯 * 假设-它只是从给定点创建一个分布。由于此分布之外的任何点的概率都将为0,因此它对泛化没有用处。因此,使用softmax而不是简单地从样本点创建概率。