包含三个层:
- Local Response Normalization (LRN) - performs a kind of “lateral inhibition” by normalizing over local input regions.
- Mean Variance Normalization (MVN) - performs contrast normalization / instance normalization.
- Batch Normalization - performs normalization over mini-batches.
1)LRN :局部响应归一化
例子:
layers {name: "norm1"type: LRNbottom: "pool1"top: "norm1"lrn_param {local_size: 5alpha: 0.0001beta: 0.75}
}
paramter:
message LRNParameter {optional uint32 local_size = 1 [default = 5];optional float alpha = 2 [default = 1.];optional float beta = 3 [default = 0.75];enum NormRegion {ACROSS_CHANNELS = 0;WITHIN_CHANNEL = 1;}optional NormRegion norm_region = 4 [default = ACROSS_CHANNELS];optional float k = 5 [default = 1.];enum Engine {DEFAULT = 0;CAFFE = 1;CUDNN = 2;}optional Engine engine = 6 [default = DEFAULT];
}
此层是对一个输入的局部区域进行归一化,达到“侧抑制”的效果。可去搜索AlexNet或GoogLenet,里面就用到了这个功能
参数:全部为可选,没有必须
local_size: 默认为5。如果是跨通道LRN,则表示求和的通道数;如果是在通道内LRN,则表示求和的正方形区域长度。
alpha: 默认为1,归一化公式中的参数。
beta: 默认为5,归一化公式中的参数。
norm_region:
默认为ACROSS_CHANNELS。有两个选择,ACROSS_CHANNELS表示在相邻的通道间求和归一化。WITHIN_CHANNEL表示在一个通道内部特定的区域内进行求和归一化。与前面的local_size参数对应
背景知识:
为什么要归一化,归一化目的是什么?
(1)为了后面数据处理的方便,归一化的确可以避免一些不必要的数值问题。
(2)为了程序运行时收敛加快。 下面图解。
(3)同一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是应用层面的需求。
(4)避免神经元饱和。啥意思?就是当神经元的激活在接近0或者1时会饱和,在这些区域,梯度几乎为0,这样,在反向传播过程中,局部梯度就会接近0,这会有效地“杀死”梯度。
(5)保证输出数据中数值小的不被吞食。
例子:
假设 w1 的范围在 [-10,10],而w2的范围在[-100,100],梯度每次都前进1单位,那么在w1方向上每次相当于前进了 1/20,而在w2上只相当于 1/200!某种意义上来说,在w2上前进的步长更小一些,而w1在搜索过程中会比w2“走”得更快。这样会导致,在搜索过程中更偏向于w1的方向。走出了“L”形状,或者成为“之”字形。
归一化有哪些方法? (常用1、2)
1、min-max标准化(Min-Max Normalization)
也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 – 1]之间。转换函数如下:
y=(x?min)/(max?min)
其中max为样本数据的最大值,min为样本数据的最小值。这种方法有个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。
2、Z-score标准化方法
这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:
y=(x?μ)/σ
其中 μ为所有样本数据的均值,σ为所有样本数据的标准差。
3、Z-scores 简单化
模型如下:
y=1/(1+x)
x越大证明y 越小,这样就可以把很大的数规范在[0-1]之间了。
4、对数函数转换
y=lg(x),其中lg即以10为底的对数
5、反余切函数转换
y=atan(x)*2/PI
RN即对一个输入的局部区域进行归一化,应用成功的实例: AlexNet 或GoogLenet。
其实本质上是一样的,神经网络即时发现潜在的“数据分布规律”的工具,所以要求训练数据和测试数据具有相同的数据分布,如果不一样,那么发现的规律就没用,即网络的泛化能力不行。呵呵。
在训练大量的练数据过程中,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。即,通过归一化,我们就可以在一个标准下找“规律”了。
上面这一段话是引用别人的话,我觉得讲的不太清楚,但可以参考一下
2)Mean Variance Normalization (MVN)
parameter:
message MVNParameter {// This parameter can be set to false to normalize mean onlyoptional bool normalize_variance = 1 [default = true];// This parameter can be set to true to perform DNN-like MVNoptional bool across_channels = 2 [default = false];// Epsilon for not dividing by zero while normalizing varianceoptional float eps = 3 [default = 1e-9];
}
。。。额,这个我也不懂,带后续补充吧
3)batch norm layer
例子
layer {name: "conv1_2_3x3/bn"type: "BN"bottom: "conv1_2_3x3"top: "conv1_2_3x3"param {lr_mult: 1decay_mult: 0}param {lr_mult: 1decay_mult: 0}param {lr_mult: 0decay_mult: 0}param {lr_mult: 0decay_mult: 0}bn_param {slope_filler {type: "constant"value: 1}bias_filler {type: "constant"value: 0}frozen: truemomentum: 0.95}
}
here is the list of advantage of using batch norm:
1 Improves gradient flow,used on very deep models
2 Allow highter learning rates
3 Reduce dependency on initialization
4 give some kind of regularization(even make dropout less important but keep using it)
5 As a rule of thumb if you use Dropout + batch norm you don’t need L2 regularization
basically force your activations (Conv,FC ouputs) to be unit standard deviation and zero mean.
To each learning batch of data we apply the following normalization.
The output of the batch norm layer, has the γ,β are parameters. Those parameters will be learned to best represent your activations. Those parameters allows a learnable (scale and shift) factor