1.归一化根底知识点

1.1 归一化作用

归一化是一种数据处理方式,能将数据经过处理后限制在某个固定规模内。

归一化存在两种方式,

  • 一种是在通常状况下,将数处理为 [0, 1] 之间的小数,其意图是为了在随后的数据处理进程中更快捷。例如,在图画处理中,就会将图画从 [0, 255] 归一化到 [0, 1]之间,这样既不会改动图画本身的信息贮存,又可加速后续的网络处理。
  • 其他状况下,也可将数据处理到 [-1, 1] 之间,或其他的固定规模内。另一种是经过归一化将有量纲表达式变成无量纲表达式。

那么什么是量纲,又为什么需求将有量纲转化为无量纲呢?详细举一个比方。当咱们在做对房价的猜测时,收集到的数据中,如房子的面积、房间的数量、到地铁站的间隔、住宅邻近的空气质量等,都是量纲,而他们对应的量纲单位别离为平方米、个数、米、AQI等。这些量纲单位的不同,导致数据之间不具有可比性。同时,关于不同的量纲,数据的数量级巨细也是不同的,比方房子到地铁站的间隔能够是上千米,而房子的房间数量一般只要几个。经过归一化处理后,不仅能够消除量纲的影响,也可将各数据归一化至同一量级,然后处理数据间的可比性问题

  • 归一化能够将有量纲转化为无量纲,同时将数据归一化至同一量级,处理数据间的可比性问题。在回归模型中,自变量的量纲不一致会导致回归系数无法解读或错误解读。在KNN、Kmeans等需求进行间隔核算的算法中,量纲的量级不同可能会导致具有较大量级的特征在进行间隔核算时占主导地位,然后影响学习成果。

  • 数据归一化后,寻求最优解的进程会变得平缓,能够更快速的收敛到最优解。详解请拜见3.为什么归一化能进步求解最优解的速度。

1.2 归一化进步求解最优解的速度

咱们说到一个对房价进行猜测的比方,假定自变量只要房子到地铁站的间隔x1和房子内房间的个数x2,因变量为房价,猜测公式和丢失函数别离为

y=1×1+2x2J=(1×1+2×2−ylabel)2\begin{array}{l}y=\theta_1x_1+\theta_2x_2\\ J=(\theta_1x_1+\theta_2x_2-y_{label})^2\end{array}

在未归一化时,房子到地铁站的间隔的取值在0~5000之间,而房间个数的取值规模仅为0~10。假定x1=1000,x2=3, 那么丢失函数的公式能够写为:

J=(10001+32−ylabel)2J=\left(1000\theta_1+3\theta_2-y_{label}\right)^2

可将该丢失函数寻求最优解进程可视化为下图:图1: 丢失函数的等高线,图1(左)为未归一化时,图1(右)为归一化

深度学习基础入门篇[七]:常用归一化算法、层次归一化算法、归一化和标准化区别于联系、应用案例场景分析。

在图1中,左图的红色椭圆代表归一化前的丢失函数等高线,蓝色线段代表梯度的更新,箭头的方向代表梯度更新的方向。寻求最优解的进程便是梯度更新的进程,其更新方向与登高线笔直。因为x1和 x2的量级相差过大,丢失函数的等高线呈现为一个瘦窄的椭圆。因而如图1(左)所示,瘦窄的椭圆形会使得梯度下降进程呈之字形呈现,导致梯度下降速度缓慢。

当数据经过归一化后,x1′=1000−05000−0=0.2,x2′=3−010−0=0.3,x_1^{‘}=\frac{1000-0}{5000-0}=0.2,x_2^{‘}=\frac{3-0}{10-0}=0.3,,那么丢失函数的公式能够写为:

J(x)=(0.21+0.32−ylabel)2J(x)=\left(0.2\theta_1+0.3\theta_2-y_{label}\right)^2

咱们能够看到,经过归一化后的数据归于同一量级,丢失函数的等高线呈现为一个矮胖的椭圆形(如图1(右)所示),求解最优解进程变得愈加敏捷且平缓,因而能够在经过梯度下降进行求解时获得更快的收敛。

1.3 归一化类型

1.3.1 Min-max normalization (Rescaling):

x′=x−min(x)max(x)−min(x)x^{‘}=\dfrac{x-min(x)}{max(x)-min(x)}\quad\quad

归一化后的数据规模为 [0, 1],其间 min(x)、max(x)别离求样本数据的最小值和最大值。

1.3.2 Mean normalization:

x′=x−mean(x)max(x)−min(x)x^{‘}=\dfrac{x-mean(x)}{max(x)-min(x)}\quad\text{}

1.3.3 Z-score normalization (Standardization):标准化

x′=x−x^{‘}=\dfrac{x-\mu}{\sigma}

归一化后的数据规模为实数集,其间 、别离为样本数据的均值和标准差。

1.3.4 非线性归一化:

  • 对数归一化: x′=lg⁡xlg⁡max(x)x^{‘}=\dfrac{\lg x}{\lg max(x)}

  • 横竖切函数归一化:

x′=arctan⁡(x)∗2x^{‘}=\arctan(x)*\dfrac{2}{\pi}\quad

归一化后的数据规模为 [-1, 1]

  • 小数定标标准化(Demical Point Normalization):

x′=x10jx^{‘}=\dfrac{x}{10^{j}}

归一化后的数据规模为 [-1, 1],j为使max(∣x′∣)<1max(|x’|)<1的最小整数。

1.4 不同归一化的运用条件

  1. Min-max归一化和mean归一化适合在最大最小值明确不变的状况下运用,比方图画处理时,灰度值限定在 [0, 255] 的规模内,就能够用min-max归一化将其处理到[0, 1]之间。在最大最小值不明确时,每当有新数据参加,都可能会改动最大或最小值,导致归一化成果不安稳,后续运用作用也不安稳。同时,数据需求相对安稳,假如有过大或过小的异常值存在,min-max归一化和mean归一化的作用也不会很好。假如对处理后的数据规模有严格要求,也应运用min-max归一化或mean归一化。

  2. Z-score归一化也可称为标准化,经过处理的数据呈均值为0,标准差为1的散布。在数据存在异常值、最大最小值不固定的状况下,能够运用标准化。标准化会改动数据的状况散布,但不会改动散布的品种。特别地,神经网络中经常会运用到z-score归一化,针对这一点,咱们将在后续的文章中进行详细的介绍。

  3. 非线性归一化通常被用在数据分化程度较大的场景,有时需求经过一些数学函数对原始值进行映射,如对数、横竖切等。

在查找材料的时候,我看到许多文章都提出了:“在分类、聚类算法中,需求运用间隔来衡量相似性的时候,z-score归一化也便是标准化的作用比归一化要好,可是关于这个观点并没有给出足够的技术支持。因而,我选取了KNN分类网络查找了相关论文,在论文Comparative Analysis of KNN Algorithm using Various Normalization Techniques [1] 中,在K值不同的状况下,关于相同的数据别离进行min-max归一化和z-score归一化,得到的成果如下图所示:图2: 关于不同的K值,相同数据集不同归一化方式下的猜测精确度

深度学习基础入门篇[七]:常用归一化算法、层次归一化算法、归一化和标准化区别于联系、应用案例场景分析。

由此能够看到,至少关于KNN分类问题,z-score归一化和min-max归一化的挑选会受到数据集、K值的影响,关于其他的分类和聚类算法,哪一种归一化的办法更好仍有待验证。最好的挑选办法便是进行试验,挑选在当前试验条件下,能够使模型精度更高的一种。

1.5 归一化和标准化的联络与区别

谈到归一化和标准化可能会存在一些概念的混杂,咱们都知道归一化是指normalization,标准化是指standardization,但依据wiki上对feature scaling办法的定义,standardization其实便是z-score normalization,也便是说标准化其实是归一化的一种,而一般状况下,咱们会把z-score归一化称为标准化,把min-max归一化简称为归一化。在下文中,咱们也是用标准化指代z-score归一化,并运用归一化指代min-max归一化。

其实,归一化和标准化在实质上都是一种线性改换。在4.归一化类型中,咱们说到了归一化和标准化的公式,关于归一化的公式,在数据给定的状况下,能够令a=max(x)−min(x)、b=min(x),则归一化的公式可变形为:

x′=x−ba=xa−ba=xa−cx^{‘}=\dfrac{x-b}{a}=\dfrac{x}{a}-\dfrac{b}{a}=\dfrac{x}{a}-c

标准化的公式与变形后的归一化相似,其间的和在数据给定的状况下,能够看作常数。因而,标准化的变形与归一化的相似,都可看作对x按比例a进行缩放,再进行c个单位的平移。由此可见,归一化和标准化的实质都是一种线性改换,他们都不会因为对数据的处理而改动数据的原始数值排序。

那么归一化和标准化又有什么区别呢?

  • 归一化不会改动数据的状况散布,但标准化会改动数据的状况散布;

  • 归一化会将数据限定在一个详细的规模内,如 [0, 1],但标准化不会,标准化只会将数据处理为均值为0,标准差为1。

References:【1】Comparative Analysis of KNN Algorithm using Various Normalization Techniques;Amit Pandey,Achin Jain.

2. 层归一化

神经网络的学习进程实质上是在学习数据的散布,假如没有进行归一化的处理,那么每一批次的练习数据的散布是不相同的,

  • 从大的方向上来看,神经网络则需求在这多个散布傍边找到平衡点,
  • 从小的方向上来看 ,因为每层的网络输入数据散布在不断地变化 ,那么会导致每层网络都在找平衡点,明显网络就变得难以收敛 。 当然咱们能够对输入数据进行归一化处理(例如对输入图画除以255),但这也仅能保证输入层的数据散布是相同的,并不能保证每层网络输入数据散布是相同的,所以在网络的中间咱们也是需求参加归一化的处理。

归一化定义:数据标准化(Normalization),也称为归一化,归一化便是将需求处理的数据在经过某种算法经过处理后,将其限定在需求的必定的规模内

2.1 层归一化产生原因

  • 一般的批归一化(Batch Normalization,BN)算法对mini-batch数据集过分依赖,无法运用到在线学习使命中(此时mini-batch数据集包括的样例个数为1),在递归神经网络(Recurrent neural network,RNN)中BN的作用也不明显 ;
  • RNN多用于自然语言处理使命,网络在不同练习周期内输入的语句,语句长度往往不同,在RNN中运用BN时,在不同时间周期运用mini-batch数据集的巨细都需求不同,核算杂乱,而且假如一个测试语句比练习集中的任何一个语句都长,在测试阶段RNN神经网络猜测功能会呈现严峻误差。假如更改为运用层归一化,就能够有用的避免这个问题。

层归一化:经过核算在一个练习样本上某一层所有的神经元的均值和方差来对神经元进行归一化。

←1H∑i=1Hxi←1H∑i=1H(xi−D)2+⋮y=f(g(x−)+b)\mu\leftarrow\dfrac{1}{H}\sum_{i=1}^{H}x_i\\ \sigma\leftarrow\sqrt{\dfrac{1}{H}\sum_{i=1}^{H}(x_i-\mu_D)^2+\epsilon}\\ \vdots\\ y=f(\dfrac{g}{\sigma}(x-\mu)+b)

相关参数意义:

  • x : 该层神经元的向量表示

  • H : 层中隐藏神经元个数

  • : 增加较小的值到方差中以避免除零

  • g: 再缩放参数(可练习),新数据以g2为方差

  • b: 再平移参数(可练习),新数据以b为误差

  • f:激活函数

算法作用

  1. 加速网络的练习收敛速度 在深度神经网络中,假如每层的数据散布都不相同,将会导致网络非常难以收敛和练习(如总述所说难以在多种数据散布中找到平衡点),而每层数据的散布都相同的状况,练习时的收敛速度将会大幅度提高。

操控梯度爆破和避免梯度消失 咱们常用的梯度传递的方式是由深层神经元往浅层传播,假如用f′i和O′i别离表示第i层对应的激活层导数和输出导数,那么关于H层的神经网络,第一层的导数F1′=∏i=1Hfi′∗Oi′F_1’=\prod_{i=1}^{H}f_i’*O_i’,那么关于fi′∗Oi′f_i’*O_i’恒大于1的状况,如fi′∗Oi′=2f_i’*O_i’=2的状况,使得成果指数上升,产生梯度爆破,关于fi′∗Oi′f_i’*O_i’恒小于1,如fi′∗Oi′=0.25f_i’*O_i’=0.25导致成果指数下降,产生梯度消失的现象,底层神经元梯度几乎为0。采用归一化算法后,能够使得f_i’*O_i’fi′∗Oi′f_i’*O_i’的成果不会太大也不会太小,有利于操控梯度的传播。

在飞桨结构事例如下:

paddle.nn.LayerNorm(normalized_shape, epsilon=1e-05, weight_attr=None, bias_attr=None, name=None);

该接口用于构建 LayerNorm 类的一个可调用目标

中心参数的意义:

  • normalized_shape (int|list|tuple) – 期望对哪些维度进行改换。假如是一个整数,会将最后一个维度进行规范化。

  • epsilon (float, 可选) – 对应-为了数值安稳加在分母上的值。默认值:1e-05

2.2 运用事例

import paddle
import numpy as np
np.random.seed(123)
x_data = np.random.random(size=(2, 2, 2, 3)).astype('float32')
x = paddle.to_tensor(x_data)
layer_norm = paddle.nn.LayerNorm(x_data.shape[1:])
layer_norm_out = layer_norm(x)
print(layer_norm_out)
# input
# Tensor(shape=[2, 2, 2, 3], dtype=float32, place=CPUPlace, stop_gradient=True,
#        [[[[0.69646919, 0.28613934, 0.22685145],
#           [0.55131477, 0.71946895, 0.42310646]],
#          [[0.98076421, 0.68482971, 0.48093191],
#           [0.39211753, 0.34317800, 0.72904968]]],
#         [[[0.43857226, 0.05967790, 0.39804426],
#           [0.73799539, 0.18249173, 0.17545176]],
#          [[0.53155136, 0.53182757, 0.63440096],
#           [0.84943181, 0.72445530, 0.61102349]]]])
# output:
# Tensor(shape=[2, 2, 2, 3], dtype=float32, place=CPUPlace, stop_gradient=True,
#        [[[[ 0.71878898, -1.20117974, -1.47859287],
#           [ 0.03959895,  0.82640684, -0.56029880]],
#          [[ 2.04902983,  0.66432685, -0.28972855],
#           [-0.70529866, -0.93429095,  0.87123591]]],
#         [[[-0.21512909, -1.81323946, -0.38606915],
#           [ 1.04778552, -1.29523218, -1.32492554]],
#          [[ 0.17704056,  0.17820556,  0.61084229],
#           [ 1.51780486,  0.99067575,  0.51224011]]]])

关于一般的图片练习集格局为(N,C,H,W)(N,C,H,W)的数据,在LN改换中,咱们对后三个维度进行归一化。因而实例的输入shape便是后三维x_data.shape[1:]。也便是咱们固定了以每张图片为单位,对每张图片的所有通道的像素值统一进行了Z-score归一化。

2.3运用场景

层归一化在递归神经网络RNN中的作用是受益最大的,它的体现优于批归一化,特别是在动态长序列和小批量的使命傍边 。例如在论文Layer Normalization所说到的以下使命傍边:

  1. 图画与语言的顺序嵌入(Order embedding of images and language)

  2. 教机器阅览和了解(Teaching machines to read and comprehend)

  3. Skip-thought向量(Skip-thought vectors)

  4. 运用DRAW对二值化的MNIST进行建模(Modeling binarized MNIST using DRAW)

  5. 手写序列生成(Handwriting sequence generation)

  6. 摆放不变MNIST(Permutation invariant MNIST)

可是,研讨标明,因为在卷积神经网络中,LN会破坏卷积所学习到的特征,致使模型无法收敛,而关于BN算法,根据不同数据的状况,同一特征归一化得到的数据更不简单丢失信息,所以在LN和BN都能够运用的场景,BN的体现通常要更好。

文献:Ba J L , Kiros J R , Hinton G E . Layer Normalization[J]. 2016.