Norm方法学习

Batch Normalization是google团队在2015年论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的。通过该方法能够加速网络的收敛并提升准确率。
Batch Normalization的目的:使整个训练样本集feature map满足均值为0,方差为1的分布规律。【在图像输入的时候进行预处理会使得前面部分的网络接收到满足某一分布的特征矩阵】
理论上:计算出整个训练集的fm进行标准化处理,但是这样工作量很大。→针对batch进行处理,可以知道batch越大效果越好。
在训练过程中要去不断的计算每个batch的均值和方差,并使用移动平均(moving average)的方法记录统计的均值和方差,在训练完后我们可以近似认为所统计的均值和方差就等于整个训练集的均值和方差。然后在我们验证以及预测过程中,就使用统计得到的均值和方差进行标准化处理。
计算的feature map每个维度(channel)的均值和方差。
https://img-blog.csdnimg.cn/20200221215813522.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NTQxMDk3,size_16,color_FFFFFF,t_70

https://img-blog.csdnimg.cn/20200226145423805.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NTQxMDk3,size_16,color_FFFFFF,t_70

在视觉领域,其实最常用的还是BN,但BN也有缺点,通常需要比较大的Batch Size。
Group Normalization
batch size的大小对GN并没有影响,所以当batch size设置较小时,可以采用GN
和batch_size无关,我们直接看对于一个样本的情况。假设某层输出得到x,沿channel方向均分成num_groups份,也是对每一份求均值和方差。

池化

pooling的结果是使得特征减少,参数减少,但pooling的目的并不仅在于此。
pooling目的是为了保持某种不变性(旋转、平移、伸缩等)
常用的有mean-pooling,max-pooling,Stochastic-pooling:
mean-pooling,正向传播对邻域内特征点只求平均,优缺点:能很好的保留背景,但容易使得图片变模糊。反向传播特征值根据领域大小被平均,然后传给每个索引位置
max-pooling,正向传播对邻域内特征点取最大并记住最大值的索引位置,以方便反向传播能更好的保留纹理信息。反向传播:将特征值填充到正向传播中,值最大的索引位置,其他位置补0。
Stochastic-pooling:只需对feature map中的元素按照其概率值大小随机选择,即元素值大的被选中的概率也大。接着按照概率值来随机选择,一般情况概率大的,容易被选择到,比如选择到了概率值为0.3的时候,那么(1,2,3,4)池化之后的值为3。使用stochastic pooling时(即test过程),其推理过程也很简单,对矩阵区域求加权平均即可,比如上面图中,池化输出值为:1×0.1+2×0.2+3×0.3+4×0.4=3。在反向传播求导时,只需保留前向传播已经记录被选中节点的位置的值,其它值都为0,

global average pooling(全局平均池化):全局平均池化一般是用来替换全连接层。在分类网络中,全连接层几乎成了标配,在最后几层,feature maps会被reshape成向量,接着对这个向量做乘法,最终降低其维度,然后输入到softmax层中得到对应的每个类别的得分,过多的全连接层,不仅会使得网络参数变多,也会产生过拟合现象,针对过拟合现象,全连接层一般会搭配dropout操作。而全局平均池化则直接把整幅feature maps(它的个数等于类别个数)进行平均池化,然后输入到softmax层中得到对应的每个类别的得分。