什么是批归一化Batch Normalization
训练神经网络的时候,如果只对输入层数据进行归一化处理,当数据经过wx+b这样的矩阵乘法以及非线性运算之后,其数据分布很可能会被改变,随着层数越来越深,数据分布变化越来越大,为了让激活函数的输入层更合理分布,所以我们考虑在网络的中间层也进行归一化,这就是BN
Batch Normalization的流程
设定上一层的输出结果是X=
x
1
,
x
2
.
.
.
,
x
m
x_1,x_2...,x_m
x1,x2...,xm,
第一步 计算上一层输出的均值:
常量
u
β
=
(
x
1
+
x
2
+
.
.
.
+
x
m
)
/
m
u_{\beta}=(x_1+x_2+...+x_m)/m
uβ=(x1+x2+...+xm)/m;其中m是batch size大小
第二步 计算上一层输出数据的标准差:
常量
σ
β
2
=
∑
i
=
1
m
(
x
i
−
u
β
)
2
/
m
{\sigma}^2_{\beta}={\sum}_{i=1}^m(x_i-u_{\beta})^2/m
σβ2=∑i=1m(xi−uβ)2/m
第三步 进行标准差标准化
x
‘
=
x
−
u
β
σ
2
+
ϵ
x^{`} = \frac{x-u_{\beta}}{\sigma^2+\epsilon}
x‘=σ2+ϵx−uβ 其中
ϵ
\epsilon
ϵ是一个微小常数,只是为了让分母不等于0 。
第四步 重构x。得到每一层新的输入分布
y
=
γ
∗
x
‘
+
β
y=\gamma*x^` + \beta
y=γ∗x‘+β,其中 学习的参数是
γ
,
β
{\gamma},{\beta}
γ,β.
上述是训练过程的批归一化,但是在测试过程中,基本只有一个测试样本,此时
u
β
u_\beta
uβ是从计算的所有批次batch 的
u
β
u_\beta
uβ加起来平均得到的,而标准差
σ
β
2
{\sigma}^2_{\beta}
σβ2是根据每个批次
σ
β
2
{\sigma}^2_{\beta}
σβ2的无偏估计得到的。所以当模型训练完毕的时候,测试阶段需要的参数也已经固定了。
其中固定的均值和方差就是
E
[
x
]
=
E
B
[
u
β
]
E[x]=E_B[u_\beta]
E[x]=EB[uβ]
V
a
r
[
x
]
=
m
m
−
1
E
B
[
σ
2
]
Var[x]=\frac{m}{m-1}E_B[\sigma^2]
Var[x]=m−1mEB[σ2]
测试时候,输入的分布就是
x
‘
=
x
−
E
[
x
]
V
a
r
[
x
]
+
ϵ
x^`=\frac{x-E[x]}{\sqrt{}Var[x]+\epsilon}
x‘=Var[x]+ϵx−E[x]
每一层的分布就变成
批归一化BN的优点
1是为了加快模型训练
2是每一层的归一化避免了梯度消失或者梯度爆炸
3是关于BN能否解决过拟合的问题,这个问题网上讨论很多,我认为一种比较好的解答如下:个人认为BN不能解决过拟合,根据paper中的实验来说,是无法阻止过拟合的。但是BN可以在某些情况下对过拟合有抑制作用,使得过拟合在更多的 train epoch之后才出现。不能解决但是能缓解。
BN的核心思想不是为了防止梯度消失或者是防止过拟合,其核心思想是通过系统参数搜索空间进行约束来增加系统鲁棒性,这种约束压缩了搜索空间,约束也改善了系统的结构合理性,这会带来一些列的性能改善,比如加速收敛、保证梯度、缓解过拟合等等,这也是为什么很多模型使用BN就不用dropout了。
归一化的意义
训练归一化的意义,缓解深层网络的梯度弥散问题,加快模型训练。
那么在深度学习模型中,越深的层数据分布变化的越剧烈,导致之前底层学习到的参数很难适应当前的数据分布。这样会导致
1 训练速度变慢;
2 前一层的剧烈变化可能导致后一层陷入饱和区,提前结束训练;
3层与层之间相互影响,优化很难进行。
常见的两种归一化
第一种 线性归一化
x
‘
=
x
−
m
i
n
(
x
)
m
a
x
(
x
)
−
m
i
n
(
x
)
x^`=\frac{x-min(x)}{max(x)-min(x)}
x‘=max(x)−min(x)x−min(x)
第二种 标准差标准化
x
‘
=
x
−
u
σ
x^`=\frac{x-u}{\sigma}
x‘=σx−u
标准差标准化让处理后的数据符合标准正态分布,也就是均值0,标准差1