如何进行 batch normalization 2d 的计算?

Batch Noramlization 基本算是深度学习的标准配置了。
原文链接

在看文章时,关于如何计算有一点疑惑。
在这里插入图片描述
虽然就是上面这个公式,但是这个均值和方差到底是啥,或许有人和我一样还是有一点疑惑。

准确来说,这个均值和方差的维度是什么?

以二维batch Normalization 为例,结合 pytorch 程序,本文说一下相关内容。

pytorch的 Batch Normalization 官网

具体来说,输入是一个4维tensor,N,C,H,WN, C, H, W 分别表示 batch size, channels,Height,Width。
那么对应的,均值的维度就是 CC.

我们必须要解释一下 这个均值的 CC 维度到底是什么意思。
Batch Noramlization 是想让输入满足同一个分布, 那么是让输入的什么特征满足同一分布呢?这么说有点晕,可以这么理解,这里我就只说正确答案了。那就是让每张图片的相同通道的所有像素值的均值和方差相同。比如我们有两张图片(都为3通道),我们现在只说R通道,我们希望第一张图片的R通道的均值 和 第二张图片R通道的均值相同,方差同理

这样我们也就知道了实际运行过程中均值是如何计算的,可以有两种方法,把所有图片的相同通道的值相加,然后求平均数,也可以先求出每一个图片此通道的均值,然后再求所有图片此通道均值的均值。

以上也就解释了为什么batch Normalization在 batch size较小的时候会出现的问题,我们可以考虑当batch size就是1的时候,batch Normalization就没有意义了,不发挥什么作用,因为这时就相当于对一张图片的某通道归一化(当然,这也有一定作用,不会使某些数过大或过小,从而导致梯度饱和)。

以上问题也就引发了很多其他的Normalization方法,比如当batch size较小时我们怎么办?

回过头来,我们注意到,所谓的batch normalization 2d是对很多二维矩阵求一个均值和方差,请在脑中想象分别取出每一张图片的R通道 并 叠放在一起,然后对这所有元素求均值和方差。当我们图片是3通道的时候,我们就会有3个均值和方差。

再把通道扩展到feature maps, batch Normalization 就是希望处理相同分布的feature。

从以上分析中,我还想再说一句,那就是batch Normalization 不只是为抑制梯度饱和,而是为了使每一个卷积处理相同的分布。毕竟,如果只是为了抑制梯度饱和,我们只需要对每一次输入都做一次归一化(仅对一张图片)。因此,batch normalization 叫做 批归一化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章