一、前言
归一化和标准化都是一种数据变换的方式,将原始的一列数据变换到某个范围。
二、归一化
2.1 线性归一化
归一化(Normalization),将数据固定到某个区间,通常为[0,1]。几种常见的归一化方式如下所示:
(1) Min-Max Normalization:
X
i
′
=
X
i
−
X
m
i
n
X
m
a
x
−
X
m
i
n
X_{i}^{'}=\frac{X_i-X_{min}}{X_{max}-X_{min}}
Xi′=Xmax−XminXi−Xmin
(2) 平均归一化:
X
i
′
=
(
X
i
−
μ
)
X
m
a
x
−
X
m
i
n
X_{i}^{'}=\frac{(X_{i}-\mu)}{X_{max}-X_{min}}
Xi′=Xmax−Xmin(Xi−μ),其中
μ
=
m
e
a
n
(
X
)
\mu=mean(X)
μ=mean(X)
(3) 转化为比例的归一化:
X
i
′
=
X
i
s
u
m
(
X
)
X_{i}^{'}=\frac{X_i}{sum(X)}
Xi′=sum(X)Xi
备注:当有新数据加入时,可能导致
X
m
a
x
X_{max}
Xmax和
X
m
i
n
X_{min}
Xmin会发生变化,需要重新定义。
2.2 非线性归一化
(1) 对数函数转换:
y
=
l
o
g
10
(
x
)
y=log10(x)
y=log10(x)
(2) 反正切函数转换:
y
=
a
r
c
t
a
n
(
x
)
∗
(
2
/
π
)
y=arctan(x)*(2/\pi)
y=arctan(x)∗(2/π)
备注:非线性归一化经常用在数据分化比较大的场景,有些数值很大,有些数值较小。通过一些数学函数,将原始值进行映射。该方法包括log、指数,正切等。需要根据数据的分布情况,决定非线性函数的曲线,比如
l
o
g
2
(
x
)
log2(x)
log2(x)或
l
o
g
10
(
x
)
log10(x)
log10(x)。
备注:归一化不改变数据的原始分布
归一化的作用: 将某个特征的值映射到[0,1]之间,消除量纲对最终结果的影响,使不同的特征具有可比性,使得原本可能分布相差较大的特征对模型有相同权重的影响,提升模型的收敛速度,深度学习中数据归一化可以防止模型梯度爆炸。
三、标准化
(1) Z-score标准化(标准差标准化)
X
i
′
=
(
X
i
−
μ
)
σ
X_{i}^{'}=\frac{(X_{i}-\mu)}{\sigma}
Xi′=σ(Xi−μ) 其中,
μ
\mu
μ为数据
X
X
X的均值,
σ
\sigma
σ为数据X的标准差。
(2) 去中心化
X
i
′
=
(
X
i
−
μ
)
X_{i}^{'}=(X_{i}-\mu)
Xi′=(Xi−μ)
四、pytorch的BN层
BN层计算公式,如下图所示。
其中,
γ
\gamma
γ和
β
\beta
β为可学习的参数。
BN层的输出Y与输入X之间的关系是:Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta,此不赘言。其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias),训练时通过反向传播更新;而running_mean、running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。所以在训练阶段,running_mean和running_var在每次前向时更新一次;在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。
五、参考资料
1、归一化、标准化、零均值化的作用及区别
2、Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
3、pytorch中BN层的注意事项
4、归一化/标准化/去中心化