批量归一化和层归一化
样本特征由于来源和度量单位的不同导致尺度存在较大差异,这对于尺度敏感模型会使得优化方向被尺度较大的特征所主导。对样本进行预处理,将各个维度的特征转换到相同的取值区间,并消除特征之间的相关性,才能获得较理想的结果。
归一化(Normalization) 方法泛指把数据特征转换为相同尺度的方法,比如把数据特征映射到[0, 1]或[−1, 1]区间内,或者映射为服从均值为0、方差为1的标准正态分布。
- 尺度不变性(Scale Invariance): 如果一个机器学习算法在缩放全部或部分特征后不影响其学习和预测,那么称其具有尺度不变性,否则为尺度敏感的。线性分类器是尺度不变的,而最近邻分类器就是尺度敏感的。
- 理论上看,神经网络应该具有尺度不变性,其可以通过调节内部参数来适应不同特征的尺度,但是这会增加训练难度。
(a)、(b)分别是未归一化数据和归一化数据在训练中的等高线图。在使用梯度下降法的寻优过程中,(a)所示的原始数据尺度不同,其在大多数位置上的梯度方向并不是最优的搜索方向,会导致需要很多次迭代才能收敛;采用(b)所示的归一化后数据,每一步的梯度方向都近似指向最小值,训练效率大幅提高。
1、归一化方法
1.1 最大最小归一化(Min-Max Normalization)
通过缩放将每一个特征的取值范围归一到[0,1]或[-1,1]之间。假设由
N
N
N 个样本
{
x
(
n
)
}
n
=
1
N
\left \{ x^{(n)} \right \} _{n=1}^{N}
{x(n)}n=1N ,对于每一特征维度
x
x
x ,归一化后的特征为:
x
^
(
n
)
=
x
(
n
)
−
min
n
(
x
(
n
)
)
max
n
(
x
(
n
)
)
−
min
n
(
x
(
n
)
)
,
\hat{x}^{(n)}=\frac{x^{(n)}-\min _{n}\left(x^{(n)}\right)}{\max _{n}\left(x^{(n)}\right)-\min _{n}\left(x^{(n)}\right)},
x^(n)=maxn(x(n))−minn(x(n))x(n)−minn(x(n)),
其中,
m
i
n
(
x
)
min(x)
min(x) 和
m
a
x
(
x
)
max(x)
max(x) 分别是特征
x
x
x 在所有样本上的最大值和最小值。
1.2 标准化(Standardization)
标准化也叫Z值归一化(Z-Score Normalization) ,将每一个维度特征都调整为均值为0,方差为1。假设有N个样本
{
x
(
n
)
}
n
=
1
N
\left \{ x^{(n)} \right \} _{n=1}^{N}
{x(n)}n=1N ,对于每一维度特征先计算其均值和方差:
μ
=
1
N
∑
n
=
1
N
x
(
n
)
σ
2
=
1
N
∑
n
=
1
N
(
x
(
n
)
−
μ
)
2
\begin{aligned} \mu & =\frac{1}{N} \sum_{n=1}^{N} x^{(n)} \\ \sigma^{2} & =\frac{1}{N} \sum_{n=1}^{N}\left(x^{(n)}-\mu\right)^{2} \end{aligned}
μσ2=N1n=1∑Nx(n)=N1n=1∑N(x(n)−μ)2
然后,再将特征
x
(
n
)
x^{(n)}
x(n) 减去均值,并处以标准差,得到新的特征值
x
^
(
n
)
\hat{x} ^{(n)}
x^(n) :
x
^
(
n
)
=
x
(
n
)
−
μ
σ
\hat{x}^{(n)}=\frac{x^{(n)}-\mu}{\sigma}
x^(n)=σx(n)−μ
1.3 白化(Whitening)
用来降低输入数据特征之间的冗余性。输入数据经过白化处理后,特征之间相关性较低,并且所有特征具有相同的方差。白化的一个主要实现方式是使用主成分分析(Principal Component Analysis,PCA) 方法去除掉各个成分之间的相关性。
2、批量归一化
批量归一化(Batch Normalization, BN) 方法是一种有效的逐层归一化方法,可以对神经网络中的任意中间层进行归一化操作,其提出动机是为了解决内部协方差漂移问题,但是后来的研究者发现其主要优点是归一化会使得更平滑的优化地形。
对于一个深度神经网络,令其
l
l
l 层的净输入为
z
(
l
)
\boldsymbol{z}^{(l)}
z(l) ,神经元的输出为
a
(
l
)
\boldsymbol{a}^{(l)}
a(l) ,即:
a
(
l
)
=
f
(
z
(
l
)
)
=
f
(
W
a
(
l
−
1
)
+
b
)
\boldsymbol{a}^{(l)}=f\left(\boldsymbol{z}^{(l)}\right)=f\left(\boldsymbol{W} \boldsymbol{a}^{(l-1)}+\boldsymbol{b}\right)
a(l)=f(z(l))=f(Wa(l−1)+b)
其中
f
(
⋅
)
f\left(·\right)
f(⋅) 是激活函数,
W
\boldsymbol W
W 和
b
\boldsymbol b
b 是可学习的参数。
为了提高优化效率,就要使得净输入 z ( l ) \boldsymbol z^{(l)} z(l) 的分布一致,比如都归一化到标准正态分布。虽然归一化操作也可以应用在输入 a ( l − 1 ) \boldsymbol a^{(l-1)} a(l−1) 上,但归一化 z ( l ) \boldsymbol z^{(l)} z(l)更加有利于优化。因此,在实践中归一化操作一般应用在仿射变换 W a ( l − 1 ) + b \boldsymbol W\boldsymbol a^{(l-1)}+\boldsymbol b Wa(l−1)+b 之后、激活函数之前。
一般使用标准化将净输入
z
(
l
)
\boldsymbol z^{(l)}
z(l) 的每一维都归一到标准正态分布。
z
^
(
l
)
=
z
(
l
)
−
E
[
z
(
l
)
]
var
(
z
(
l
)
)
+
ϵ
\hat{\boldsymbol{z}}^{(l)}=\frac{\boldsymbol{z}^{(l)}-\mathbb{E}\left[\boldsymbol{z}^{(l)}\right]}{\sqrt{\operatorname{var}\left(\boldsymbol{z}^{(l)}\right)+\epsilon}}
z^(l)=var(z(l))+ϵz(l)−E[z(l)]
其中,
E
[
z
(
l
)
]
\mathbb{E}\left[\boldsymbol{z}^{(l)}\right]
E[z(l)] 和
var
(
z
(
l
)
)
\operatorname{var}\left(\boldsymbol{z}^{(l)}\right)
var(z(l)) 是指当前参数下,
z
(
l
)
\boldsymbol z^{(l)}
z(l) 的每一维在整个训练集上的期望和方差。对于小批量随机梯度下降而言,准确计算
z
(
l
)
\boldsymbol z^{(l)}
z(l) 的期望和方差是不可行的,因此
z
(
l
)
\boldsymbol z^{(l)}
z(l) 的期望和方差通常使用当前小批量样本集的均值和方差近似估计。
给定一个包含
K
K
K个样本的小批量样本集合,第
l
l
l 层神经元的净输入
z
(
1
,
l
)
\boldsymbol z^{(1,l)}
z(1,l),···,
z
(
K
,
l
)
\boldsymbol z^{(K,l)}
z(K,l) 的均值和方差为:
μ
B
=
1
K
∑
k
=
1
K
z
(
k
,
l
)
σ
B
2
=
1
K
∑
k
=
1
K
(
z
(
k
,
l
)
−
μ
B
)
⊙
(
z
(
k
,
l
)
−
μ
B
)
\begin{aligned} \boldsymbol{\mu}_{\mathcal{B}} & =\frac{1}{K} \sum_{k=1}^{K} \boldsymbol{z}^{(k, l)} \\ \sigma_{\mathcal{B}}^{2} & =\frac{1}{K} \sum_{k=1}^{K}\left(\boldsymbol{z}^{(k, l)}-\boldsymbol{\mu}_{\mathcal{B}}\right) \odot\left(\boldsymbol{z}^{(k, l)}-\boldsymbol{\mu}_{\mathcal{B}}\right) \end{aligned}
μBσB2=K1k=1∑Kz(k,l)=K1k=1∑K(z(k,l)−μB)⊙(z(k,l)−μB)
对净输入
z
(
l
)
\boldsymbol z^{(l)}
z(l)的标准归一化会使得其取值集中到0附近,如果使用Sigmoid型激活函数时,这个取值区间刚好是接近线性变换的区间,减弱了神经网络学习非线性特征的能力。
因此,为了使得归一化不对网络的表达能力造成负面印象,可以通过一个附加的缩放和平移变换改变取值区间。
z
^
(
l
)
=
z
(
l
)
−
μ
B
σ
B
2
+
ϵ
⊙
γ
+
β
≜
B
N
γ
,
β
(
z
(
l
)
)
\begin{aligned} \hat{\boldsymbol{z}}^{(l)} & =\frac{\boldsymbol{z}^{(l)}-\boldsymbol{\mu}_{\mathcal{B}}}{\sqrt{\sigma_{\mathcal{B}}^{2}+\epsilon}} \odot \boldsymbol{\gamma}+\boldsymbol{\beta} \\ & \triangleq \mathrm{BN}_{\boldsymbol{\gamma}, \boldsymbol{\beta}}\left(\boldsymbol{z}^{(l)}\right) \end{aligned}
z^(l)=σB2+ϵz(l)−μB⊙γ+β≜BNγ,β(z(l))
其中
γ
\boldsymbol \gamma
γ和
μ
\boldsymbol \mu
μ分别表示缩放和平移的参数向量,从最保守的角度来看,可以通过标准归一化的逆变换来使得归一化后的变量还原为原来的值,即当
γ
=
σ
B
2
\boldsymbol \gamma=\sqrt{\boldsymbol\sigma_{\mathcal{B}}^{2}}
γ=σB2,
β
=
μ
B
\boldsymbol \beta=\boldsymbol\mu_{\mathcal B}
β=μB时,
z
^
(
l
)
=
z
(
l
)
\hat{\boldsymbol z}^{(l)}=\boldsymbol z^{(l)}
z^(l)=z(l)。
每次小批量样本的均值 μ B \boldsymbol \mu_{\mathcal B} μB和方差 σ B 2 \boldsymbol \sigma_{\mathcal B}^{2} σB2是净输入 z ( l ) \boldsymbol z^{(l)} z(l)的函数,而不是常量,因此在计算梯度时需要考虑 μ B \boldsymbol \mu_{\mathcal B} μB和 σ B 2 \boldsymbol \sigma_{\mathcal B}^{2} σB2的影响。当训练完成时,用整个数据集上的均值 μ \boldsymbol \mu μ和方差 σ \boldsymbol \sigma σ来分别代替每次小批量样本的均值 μ B \boldsymbol \mu_{\mathcal B} μB和方差 σ B 2 \boldsymbol \sigma_{\mathcal B}^{2} σB2。
3、层归一化
批量归一化是对一个中间层的单个神经元进行归一化操作,因此要求小批量的数量不能太小,否则难以计算单个神经元的统计信息。此外,如果一个神经元的净输入的分布在神经网络中是动态变化的比如循环神经网络,那么就无法应用批量归一化操作。
层归一化(Layer Normalization)是和批量归一化非常类似的方法,和批量归一化不同的是,层归一化是对一个中间层的所有神经元进行归一化。对于一个深度神经网络,令第
l
\boldsymbol l
l层神经元的净输入为
z
(
l
)
\boldsymbol z^{(l)}
z(l),其均值和方差为:
μ
(
l
)
=
1
M
l
∑
i
=
1
M
l
z
i
(
l
)
σ
(
l
)
2
=
1
M
l
∑
i
=
1
M
l
(
z
i
(
l
)
−
μ
(
l
)
)
2
\begin{aligned} \mu^{(l)} & =\frac{1}{M_{l}} \sum_{i=1}^{M_{l}} z_{i}^{(l)} \\ \sigma^{(l)^{2}} & =\frac{1}{M_{l}} \sum_{i=1}^{M_{l}}\left(z_{i}^{(l)}-\mu^{(l)}\right)^{2} \end{aligned}
μ(l)σ(l)2=Ml1i=1∑Mlzi(l)=Ml1i=1∑Ml(zi(l)−μ(l))2
其中
M
l
M_{l}
Ml为第
l
l
l层神经元的数量。
层归一化定义为:
z
^
(
l
)
=
z
(
l
)
−
μ
(
l
)
σ
(
l
)
2
+
ϵ
⊙
γ
+
β
≜
L
N
γ
,
β
(
z
(
l
)
)
\begin{aligned} \hat{\boldsymbol{z}}^{(l)} & =\frac{\boldsymbol{z}^{(l)}-\mu^{(l)}}{\sqrt{\sigma^{(l)^{2}}+\epsilon}} \odot \boldsymbol{\gamma}+\boldsymbol{\beta} \\ & \triangleq \mathrm{LN}_{\gamma, \beta}\left(\boldsymbol{z}^{(l)}\right) \end{aligned}
z^(l)=σ(l)2+ϵz(l)−μ(l)⊙γ+β≜LNγ,β(z(l))
其中,
γ
\boldsymbol \gamma
γ和
β
\boldsymbol \beta
β分别表示缩放和平移的参数向量,和
z
(
l
)
\boldsymbol z^{(l)}
z(l)维度相同。
4、批量归一化和层归一化的区别
批量归一化针对不同数据之间的单个神经元(不同特征维度)进行归一化操作,层归一化针对单个训练数据在某一层所有神经元上的归一化。