1、为什么要 Normalization
首先,在机器学习中,一般希望输入的数据是独立同分布的,独立即特征之间不相关,同分布即特征服从同一个分布。
然后,深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。
所以,如果输入数据不服从独立同分布,那么会出现以下几个问题:
- 上层参数需要不断适应新的输入数据分布,降低学习速度。
- 每层的更新都会影响到其它层。
Normalization 就是希望让数据服从某种分布。
2、Normalization 的基本思想
现在有一组输入向量:
X
=
{
x
1
,
x
2
,
⋯
,
x
d
}
X = \{x_1, x_2, \cdots , x_d\}
X={x1,x2,⋯,xd}
然后,我们将它变换,使其服从状态分布:
X
n
o
r
m
=
x
−
μ
σ
X_{norm} = \frac{x-\mu}{\sigma}
Xnorm=σx−μ
其中,
μ
\mu
μ 为原始数据样本的均值,
σ
\sigma
σ 为方差。
至此,我们得到了正太分布,不过,实际问题中,我们并不希望将数据都简单粗暴的调整成这样,我们想让它通过自己学习服从某种分布,所以,一般我们会再进一步得变换:
X
f
i
n
a
l
=
g
∗
X
n
o
r
m
+
b
X_{final} = g*X_{norm} + b
Xfinal=g∗Xnorm+b
这样,得到的数据服从均值为
b
b
b,方差为
g
2
g^2
g2 的分布,其中
g
g
g 和
b
b
b 是通过模型学出来的。
3、常用的Normalization
常用的Normalization有:Batch Normalization (BN)、Layer Normalization (LN)、Instance Normalization (IN)、Group Normalization (GN),他们从公式上看其实都是差不多,都是满足上述的基本思想,也就是**减去均值,除以标准差,再进行线性映射,他们实质的区别对施加的维度不同,**这里就不展开讲了。