归一化/标准化
目录一、前言二、归一化 2.1 线性归一化 2.2 非线性归一化三、标准化四、pytorch的BN层五、参考资料一、前言 归一化和标准化都是一种数据变换的方式,将原始的一列数据变换到某个范围。二、归一化 2.1 线性归一化 归一化(Normalization),将数据固定到某个区间,通常为[0,1]。几种常见的归一化方式如下所示: (1) Min-Max Normali
一、前言
归一化和标准化都是一种数据变换的方式,将原始的一列数据变换到某个范围。
二、归一化
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、归一化/标准化/去中心化
更多推荐

所有评论(0)