BN(batch normalization)详解

1. 公式

normalization过程

这里写图片描述

整个过程:batch均值 -> 方差 -> 标准化(正太化)-> 尺度和偏差变换 -> 训练过程更新$\gamma$和$\beta$

反向传播参数更新的方法

这里写图片描述

2. 解决的问题

解决问题:解决梯度消失和梯度爆炸问题,同时加快训练。

原理:以sigmoid为激活函数为例

这里写图片描述

当陷入两端之后,会造成梯度消失,BN将数据限制在0.5左右的线性区,解决了梯度消失的问题。同理,使用Relu激活函数,当正方向很大时,梯度爆炸,负方向时,梯度消失。

3. BN使用方法

BN层一般用在conv层后,activation前

应用步骤:

这里写图片描述

训练的时候,是根据输入的每一批数据来计算均值和方差,测试的时候,输入平均值和方差是整体测试集的,每层BN的平均值和方差是训练时记录的滑动平均值

pytorch中具体记录和更新均值和方差参考:https://blog.csdn.net/ecnu_lzj/article/details/104203604

由此联想到dropout:假设drop_out的keep_prob为0.8,也就是80%概率保存神经元,1-80%概率丢掉神经元,那么测试的时候需要每个神经元乘以keep_prob。参考http://www.360doc.com/content/18/1203/22/54525756_799102767.shtml

4. 其他Nomalization方法:

:为什么要做归一化处理?

:神经网络学习过程的本质就是为了学习数据分布,如果我们没有做归一化处理,那么每一批次训练数据的分布不一样,从大的方向上看,神经网络则需要在这多个分布中找到平衡点,从小的方向上看,由于每层网络输入数据分布在不断变化,这也会导致每层网络在找平衡点,显然,神经网络就很难收敛了。当然,如果我们只是对输入的数据进行归一化处理(比如将输入的图像除以255,将其归到0到1之间),只能保证输入层数据分布是一样的,并不能保证每层网络输入数据分布是一样的,所以也需要在神经网络的中间层加入归一化处理。

BN、LN、IN和GN这四个归一化的计算流程几乎是一样的,可以分为四步

  1. 计算出均值

  2. 计算出方差

  3. 归一化处理到均值为0,方差为1

  4. 变化重构,恢复出这一层网络所要学到的分布

Layer Normalizaiton:

  • LN的计算就是把每个CHW单独拿出来归一化处理,不受batchsize 的影响;

  • 常用在RNN网络,但如果输入的特征区别很大,那么就不建议使用它做归一化处理;

Instance Normalization

  • IN的计算就是把每个HW单独拿出来归一化处理,不受通道和batchsize 的影响;

  • 常用在风格化迁移,但如果特征图可以用到通道之间的相关性,那么就不建议使用它做归一化处理;

Group Normalizatio

  • GN的计算就是把先把通道C分成G组,然后把每个gHW单独拿出来归一化处理,最后把G组归一化之后的数据合并成CHW;

  • GN介于LN和IN之间,当然可以说LN和IN就是GN的特列,比如G的大小为1或者为C;

Switchable Normalization

  • 将 BN、LN、IN 结合,赋予权重,让网络自己去学习归一化层应该使用什么方法;
  • 集合上述方法,但训练复杂;

参考

https://blog.csdn.net/weixin_43937316/article/details/99573134

https://blog.csdn.net/u013289254/article/details/99690730 五种归一化方法

https://blog.csdn.net/ecnu_lzj/article/details/104203604 pytorch-BN

http://www.360doc.com/content/18/1203/22/54525756_799102767.shtml dropout