卷积神经网络中的批量归一化

90

我是卷积神经网络的新手,只知道特征图和卷积在图像上提取特征的想法。我希望了解有关在CNN中应用批归一化的详细信息。

我阅读了这篇论文https://arxiv.org/pdf/1502.03167v3.pdf,并且能够理解BN算法应用于数据,但最后他们提到在应用到CNN时需要进行轻微修改:

 

对于卷积层,我们还希望规范化遵守卷积属性-以便在同一特征图的不同位置的不同元素以相同方式进行规范化。为了实现这一点,我们联合规范化小批量中所有位置上的所有激活。在Alg. 1中,我们让B成为跨越小批量元素和空间位置的特征图中所有值的集合-因此对于大小为p×q的特征映射和大小为m的小批量,我们使用有效小批量大小 m' = |B| = m · pq。我们每个特征映射学习一对参数γ(k)和β(k),而不是每个激活学习一对参数。类似地,Alg. 2进行了修改,因此在推断期间,BN变换对给定特征图中的每个激活应用相同的线性变换。

当他们说"这样可以使同一特征图的不同位置上的不同元素以相同方式进行规范化"时,我完全感到困惑。

我知道什么是特征图,不同的元素是每个特征图中的权重。但是我无法理解位置或空间位置的含义。

我完全无法理解以下句子"在Alg. 1中,我们让B成为跨越小批量元素和空间位置的特征图中所有值的集合"

如果有人能详细说明并用更简单的术语解释给我就太好了。


请参阅 https://dev59.com/WlcO5IYBdhLWcg3wcRNk - Ketil Malde
4个回答

111
让我们从术语开始。请记住,卷积层的输出是一个四维张量[B,H,W,C],其中B是批处理大小,(H,W)特征图大小,C是通道数。索引(x,y),其中0 <= x < H0 <= y < W空间位置

通常的批归一化

现在,这里是如何以通常的方式应用批归一化的(伪代码):

# t is the incoming tensor of shape [B, H, W, C]
# mean and stddev are computed along 0 axis and have shape [H, W, C]
mean = mean(t, axis=0)
stddev = stddev(t, axis=0)
for i in 0..B-1:
  out[i,:,:,:] = norm(t[i,:,:,:], mean, stddev)

基本上,它计算 H*W*C 的平均值和标准差,并跨 B 个元素。您可能会注意到,不同空间位置的不同元素具有自己的均值和方差,并且仅收集 B 个值。

卷积层中的批量归一化

这种方法完全可行。但是卷积层具有特殊的属性:滤波器权重在输入图像中共享(您可以在此帖子中详细阅读)。因此,以相同方式规范化输出是合理的,使得每个输出值都采用不同位置的 B*H*W 值的平均值和方差。

在这种情况下,代码如下(再次是伪代码):

# t is still the incoming tensor of shape [B, H, W, C]
# but mean and stddev are computed along (0, 1, 2) axes and have just [C] shape
mean = mean(t, axis=(0, 1, 2))
stddev = stddev(t, axis=(0, 1, 2))
for i in 0..B-1, x in 0..H-1, y in 0..W-1:
  out[i,x,y,:] = norm(t[i,x,y,:], mean, stddev)

总共只有C个均值和标准差,每个值都是计算在B*H*W个数据上的。这就是所谓的“有效小批量”的含义:两者之间唯一不同的是轴选择(或者等价于“小批量选择”)。

2
很好的回答,但我认为你的意思是我们应该取B*H*W值的平均值和方差,而不是B*H*C值。请参考卷积层中的批量归一化后的第一段。无论如何,点赞。 - rayryeng
1
我们可不可以直接写成out [:,:,:,:] = norm(t[:,:,:,:], mean, stddev) 而不使用循环?平均值和方差是在整个批次上计算的,然后分别应用于批次中的每个元素,而不是一次性应用?@maxim - palimboa
1
关于卷积层的BN,可以在此处获取更多信息-https://arxiv.org/pdf/1502.03167.pdf中的3.2小节。要点是我们希望保留卷积属性(例如特征的空间平移不变性),因此平均值是在BxHxW轴上计算的。 - MonsieurBeilto
基本上,它计算的是 H*W*C 的意思:或者在第一种情况下只计算 B 的意思?以一个小例子为例:如果我们考虑 3x2x3 i/p,则 dim=(0) 上的平均值为 2x3。同样,在这里,BxHxWxC 的平均值将是形状为 HxWxC,并且将从该批次的每个输入中减去。请澄清。 - user2736738
通常的批量归一化不能应用于完全卷积网络,这是正确的吗?在每个批次中,我们可能会有不同的形状,这将需要任意数量的“gamma”和“beta”,这是不可能的。这样说对吗? - Vadym B.

10
一些关于Maxim回答的澄清。 在Keras中,指定的轴是通道轴,这让我感到困惑,因为在卷积网络中每个通道被认为是不同的“特征”,所以对所有通道进行归一化是没有意义的。即通过所有通道进行归一化相当于将卧室数量与平方英尺数归一化(来自Andrew的ML课程的多元回归示例)。这通常不是你想要的-你需要对每个特征单独进行归一化。即您将所有示例中的卧室数量归一化为mu = 0和std = 1,将所有示例中的平方英尺归一化为mu = 0和std = 1。
这就是为什么你需要C个均值和标准差,因为你需要每个通道/特征的均值和标准差。
经过检查和测试后,我意识到问题所在:这里存在一些混淆/误解。在Keras中指定的轴实际上是不参与计算的轴。也就是说,除了由该参数指定的轴之外的每个轴上取平均值。这很令人困惑,因为这与NumPy的工作方式完全相反,在NumPy中,指定的轴是进行操作的轴(例如np.mean,np.std等)。
我实际上构建了一个只有BN的玩具模型,然后手动计算了BN-对3个第一维[m,n_W,n_H]上的所有均值和标准差进行计算,得到n_C个结果,并且使用广播计算了(X-mu)/ std并获得了与Keras结果相同的结果。
希望这能帮助任何感到困惑的人。

太好了,谢谢!因此,在卷积通道之后正确应用批量归一化是指定与卷积的输出特征对应的轴,而不是通道?但是,然后相同的均值和标准差将用于对同一输出特征的不同通道进行归一化。目前还不确定这是否是批量归一化原始论文中所描述的内容(关于将其应用于卷积网络的部分)。 - akuz
我刚刚阅读了有关Keras BatchNormalisation的文档。批量归一化论文建议使用统计数据(均值和标准差)对卷积输出中相同输出特征位置的所有位置进行归一化。如果我们将轴设置为对应于输出通道,则应该可以做到正确的事情。(我想是这样的。) - akuz

3

我只有70%的把握,如果说不清楚,请在扣分之前修改或提出意见。

关于位置空间位置:它们指的是图像或特征图中像素的位置。 特征图类似于稀疏修改版本的图像,其中表示概念。

关于以便来自同一特征图不同位置的不同元素以同样的方式进行标准化:一些规范化算法是局部的,因此它们依赖于其紧密周围(位置),而不是在图像中相距很远的物体。 它们可能意味着每个像素都像集合的元素一样被处理,独立于其直接特殊周围的位置。

关于在Alg.1中,我们让B是迷你批次和空间位置的所有特征图中的所有值的集合:他们获得了每个迷你批次中每个训练示例的所有值的平面列表,并且这个列表结合了特征图上的所有元素,无论它们的位置如何。


只是想通过一个例子来澄清我的想法。因此,如果我们有10个大小为5x5的特征图和20个小批量大小,那么我们是否尝试单独规范化每个特征图?因此,新的小批量大小= 20 * 25。(25是因为特征图的大小为5x5)。我不确定是否应该使用其自己的均值和方差来规范化单个特征图,还是所有10个特征图的均值和方差相同。如果是后者,新的更新后的小批量大小将是多少? - akshata bhat
经过一段时间的思考,我想说我认为你是正确的。批归一化论文也表明这应该在卷积层之后进行,所以没问题。 - akuz

1
首先,我们需要明确的是,卷积核的深度由前一个特征图的通道数决定,而该层中卷积核的数量确定了下一个特征图(即下一层)的通道数。
其次,我们应该明确每个卷积核(通常是三维的)只会在下一层生成一个通道的特征图。
第三,我们应该尝试接受这样一个想法:在上一层滑动时,生成的特征图中的每个点(不考虑它们的位置)都是由同一个卷积核生成的。因此,它们可以被看作是由该卷积核生成的分布,并且它们可以被看作是随机变量的样本。然后,它们应该被平均以获得均值,然后再获得方差。(这并不是严格的,只是帮助理解)
这就是他们所说的“使同一特征图中不同位置的元素以相同的方式进行归一化”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接