为啥要 Normalization呢,想想当初为啥要对权值初始化:
数据尺度的变大变小,从而导致梯度逐渐增大
这里是为了解决ICS问题(即数据尺度/分布异常,导致训练困难)
Batch Normalization:
mini-batch是指64或者128或者256
BN一般在激活函数之前,对数据次数进行规范
scale与shift又称为affine transform,增强模型的容纳能力
_BatchNorm是基类,主要有5个参数
训练状态:mean和var需要重新估计,根据batch改变;
测试状态:采用当前统计信息,mean与std是固定的
注意:running_mean不是一个mini-batch得到的均值,是考虑了前一次的mean;running_var也是如此
weight与bias是通过学习得到的参数
数据格式输入
输入进BN中的数据维度:BCH*W, 在B这个维度上进行计算mean,var,weight,bias的,每个特征维度上都要计算一次这四个值。
总结:
在BN中会进行:
包含四个参数:mean, var, weight(即gamma), bias(即beta)
这四个参数是通过特征维度计算而来,每个一个特征维度会通过上图的计算得到这4个参数。在计算mean和var的时候,采用指数加权平均(不仅考虑此batch计算得来的,还要考虑之前数据信息),而weight(即gamma)和bias(即beta)是可学习参数(模型自己学习)。