pytorch 为什么批量规格化图层的总和不为1?

qojgxg4l  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(134)

我一直在深入研究批处理规范在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(除非添加了比例和平移参数)。批处理归一化不是应该在批处理中每个通道产生一个分布吗?

mi7gmzs6

mi7gmzs61#

我想你把BatchNormSoftmax搞混了。
为了回答您在评论中提出的问题,归一化不会改变分布-它只是将其以0为中心,单位方差为0。
例如,如果数据来自均匀分布,则在标准化之后它保持均匀,尽管具有不同的统计量。
例如,以下面的分布为例:

归一化后,分布如下所示:

请注意,总体分布的形状和每个桶中的样本数是完全相同的--变化的是分布的平均值(即中心)。尽管视觉上不明显,但可以检查新的归一化值(图的X轴),并看到方差约为1。
这正是BatchNorm所做的,X轴是批处理中的每个例子。对于其他类型的范数,用于归一化的维度会发生变化(例如,从LayerNorm中的批处理维度到特征维度),但效果基本相同。

  • 如果您需要概率,只需将每个条柱的大小除以样本数(缩放Y轴而不是X轴)!这将得到形状完全相同的图形,X轴值与原始图形相同,Y轴值缩放以表示概率!*

现在让我们看看Softmax对分布的影响,将softmax应用于分布,得到下面的图:

正如您所看到的,softmax实际上在点上创建了一个概率分布,这意味着,它给出了假设每个点都从高斯分布中采样的可能性(高斯部分在理论上很重要,因为它是softmax表达式中e的来源)。
相比之下,简单地将Y轴缩放为样本数并不会产生 * 高斯 * 假设-它只是从给定点创建一个分布。由于此分布之外的任何点的概率都将为0,因此它对泛化没有用处。因此,使用softmax而不是简单地从样本点创建概率。

相关问题