乐趣区

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

1. 归一化根底知识点

1.1 归一化作用

归一化是一种数据处理形式,能将数据通过解决后限度在某个固定范畴内。

归一化存在两种模式,

  • 一种是在通常状况下,将数解决为 [0, 1] 之间的小数,其目标是为了在随后的数据处理过程中更便捷 。例如,在图像处理中,就会将图像从 [0, 255] 归一化到 [0, 1] 之间,这样既不会扭转图像自身的信息贮存,又可减速后续的网络解决。
  • 其余状况下,也可将数据处理到 [-1, 1] 之间,或其余的固定范畴内。另一种是通过归一化将有量纲表达式变成无穷纲表达式。

那么什么是量纲,又为什么须要将有量纲转化为无穷纲呢?具体举一个例子。当咱们在做对房价的预测时,收集到的数据中,如屋宇的面积、房间的数量、到地铁站的间隔、住宅左近的空气质量等,都是量纲,而他们对应的量纲单位别离为平方米、个数、米、AQI 等。这些量纲单位的不同,导致数据之间不具备可比性。同时,对于不同的量纲,数据的数量级大小也是不同的,比方屋宇到地铁站的间隔能够是上千米,而屋宇的房间数量个别只有几个。通过归一化解决后,不仅能够打消量纲的影响,也可将各数据归一化至同一量级,从而解决数据间的可比性问题

  • 归一化能够将有量纲转化为无穷纲,同时将数据归一化至同一量级,解决数据间的可比性问题。在回归模型中,自变量的量纲不统一会导致回归系数无奈解读或谬误解读。在 KNN、Kmeans 等须要进行间隔计算的算法中,量纲的量级不同可能会导致领有较大量级的特色在进行间隔计算时占主导地位,从而影响学习后果。
  • 数据归一化后,寻求最优解的过程会变得平缓,能够更疾速的收敛到最优解。详解请参见 3. 为什么归一化能进步求解最优解的速度。

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

咱们提到一个对房价进行预测的例子,假如自变量只有房子到地铁站的间隔 x1 和房子内房间的个数 x2,因变量为房价,预测公式和损失函数别离为

$$\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=\left(1000\theta_1+3\theta_2-y_{label}\right)^2$$

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

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

当数据通过归一化后,$$x_1^{‘}=\frac{1000-0}{5000-0}=0.2,x_2^{‘}=\frac{3-0}{10-0}=0.3,$$, 那么损失函数的公式能够写为:

$$J(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^{‘}=\dfrac{x-min(x)}{max(x)-min(x)}\quad\quad$$

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

1.3.2 Mean normalization:

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

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

$$x^{‘}=\dfrac{x-\mu}{\sigma}$$

归一化后的数据范畴为实数集,其中 μ、σ 别离为样本数据的均值和标准差。

1.3.4 非线性归一化:

  • 对数归一化:
    $$x^{‘}=\dfrac{\lg x}{\lg max(x)}$$
  • 反正切函数归一化:

$$x^{‘}=\arctan(x)*\dfrac{2}{\pi}\quad$$

归一化后的数据范畴为 [-1, 1]

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

$$x^{‘}=\dfrac{x}{10^{j}}$$

归一化后的数据范畴为 [-1, 1],j 为使 $$max(|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^{‘}=\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 神经网络预测性能会呈现重大偏差。如果更改为应用层归一化,就能够无效的防止这个问题。

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

$$\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 层的神经网络,第一层的导数 $$F_1’=\prod_{i=1}^{H}f_i’*O_i’$$,那么对于 $$f_i’*O_i’$$ 恒大于 1 的状况,如 $$f_i’*O_i’=2$$ 的状况,使得后果指数回升,产生梯度爆炸,对于 $$f_i’*O_i’$$ 恒小于 1,如 $$f_i’*O_i’=0.25$$ 导致后果指数降落,产生梯度隐没的景象,底层神经元梯度简直为 0。采纳归一化算法后,能够使得 f_i’*O_i’$$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)$$ 的数据,在 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.

本文参加了 SegmentFault 思否写作挑战赛,欢送正在浏览的你也退出。

退出移动版