Batch Normalization你到底在干嘛

1,166 阅读2分钟

Norm

目前已知的Normalization的方法有4种,对于输入数据为N,C,(H*W),其中第一种最为常见

  • Batch Norm:对每一个批次(N个tensor)的每个通道分别计算均值mean和方差var,如[10,4,9] 最终输出是[0,1,2,3]这样的1*4的tensor
  • Layer Norm:对于每一个tensor的所有channels进行均值和方差计算
  • Instance Norm:对于每个tensor的每个channels分别计算
  • Group Norm:引用了group的概念,比如BGR表示一个组 --不常见

BatchNorm

中文翻译成批规范化,是在深度学习中普遍使用的一种技术,通常用于解决多层神经网络中间层的协方差偏移(Internal Covariate Shift)问题,类似于网络输入进行零均值化和方差归一化的操作,不过是在中间层的输入中操作而已,具体原理不累述了,见[2-4]的描述即可。

注意到这里的最后一步也称之为仿射(affine),引入这一步的目的主要是设计一个通道,使得输出output至少能够回到输入input的状态(当γ=1,β=0时)使得BN的引入至少不至于降低模型的表现,这是深度网络设计的一个套路。
好了,这里我们记住了,在BN中,一共有这四个参数我们要考虑的:

  • γ,β:分别是仿射中的\mathrm{weight}\mathrm{bias},在pytorch中用weight和bias表示。
  • \mu_{\mathcal{B}}\sigma_{\mathcal{B}}^2:和上面的参数不同,这两个是根据输入的batch的统计特性计算的,严格来说不算是“学习”到的参数,不过对于整个计算是很重要的。在pytorch中,用running_mean和running_var表示.

到目前为止都很好李姐,但是对于二维多batch情况的图像数据,到底怎么操作呢??

我们假设在网络中间经过某些卷积操作之后的输出的feature map的尺寸为3×3×2×2
3为batch的大小,3为channel的数目,2×2为feature map的长宽

上图中,batch size一共是3, 对于每一个batch的feature map的size是3×2×2
对于所有batch中的同一个channel的元素进行求均值与方差,比如上图,对于所有的batch,都拿出来最后一个channel,一共有3×4=12个元素

mean = (f1+f2+f3)/12 \  (f1:x_1...x_4;f2:x_5...x_8;f3:x_9...)
\sigma^2 = \sum_{i=1}^{12}(x_i-mean)

注意此处x_i和上面的公式的不是一个

blog.csdn.net/Haiqiang199… www.cnblogs.com/leebxo/p/10…

另外附上几个blog:
www.zhihu.com/question/38…
blog.csdn.net/whitesilenc…
blog.csdn.net/hjimce/arti…