【深度学习基础】归一化,白化,

在深度学习中的归一化也分很多种:

  • 一种是在预处理阶段的对输入数据的归一化处理
  • 另外一种就是在网络中的各种归一化处理,例如:BN, GN,LN,IN 等常见的归一化处理

数据输入阶段的归一化

预处理阶段的归一化,也就是整个网络数据输入的归一化,进一步细分也可以分成两种(这里以图像的像素举例):

  • img/255.0:最终结果在 [0, 1] 之间
  • img/127.5 - 1:最终结果在 [-1, 1] 之间

归一化后数值落在哪个区间对后续的训练有什么影响呢?

  • 什么时候对数据进行 [0,1] 归一化,什么时候 [-1,1] 归一化,二者分别在什么场景?
  • Should input images be normalized to -1 to 1 or 0 to 1

[0, 1] 和 [-1, 1] 哪个更好

里面大家的回答其实没有一个定论:

  • 由激活函数决定? 如果为了使用 relu 激活函数而将数据都归一化到 [0, 1] 区间内,那么 relu 激活函数的非线性就完全丢失了,何况现在的网络都会在 relu 激活函数之前加上一个 BN 层,将 relu 接受的输入有一半期望变负的。但是,在训练的初期,因为 relu 的截断作用,确实负值几乎对梯度的更新没有什么帮助(这也是使用 leaky relu 激活函数代替 relu 计算函数的原因),但是即便这些负值在当前层被 relu 截断,但是还是能通过 shortcut 传播到后面的层中,这也是为什么 resnet 这么有效的原因之一。
  • 和实际物理意义相关? 其实并没有什么关系,网络其实不知道你的输入的具体物理意义是像素,情感还是别的。

但是上面有几个答案都提到了归一化到 [-1, 1] 是一种更为推荐的归一化方式。

原因如下:为了缓解梯度消失或者是梯度爆炸,我们需要一种巧妙的方式来初始化我们的网络权重,其中有两种有效的初始化方式:

  • Glorot initialization(也叫 Xavier initialization)
  • He initialization(何凯明大佬提出的)

为了推导他们的初始化方法,他们在开始做了一些假设,其中之一就是:输入的数据均值为 0

标准化,中心化,归一化的差别

而在 cs231n 的笔记中:

There are two common ways of achieving this normalization. One is to divide each dimension by its standard deviation, once it has been zero-centered: (X /= np.std(X, axis = 0)). Another form of this preprocessing normalizes each dimension so that the min and max along the dimension is -1 and 1 respectively. It only makes sense to apply this preprocessing if you have a reason to believe that different input features have different scales (or units), but they should be of approximately equal importance to the learning algorithm.

第一种是标准化,在中心化的均值为 0 的基础上,标准差也要调整为 1 。也就是所谓的 z-cross 标准化,公式如下: x ∗ = x − μ σ x^* = \frac{x-\mu}{\sigma} x=σxμ其中 μ \mu μ 是均值, σ \sigma σ 是标准差,最后获得的结果 x ∗ x^* x 就是符合均值为 0, 标准差为 1 的分布。

第二种是归一化,将数据归一化到[-1, 1] 这个区间内,但是上面也提到了什么时候会使用这种归一化:只要当不同的输入特征有着不同尺度或者单位(量纲),但是对于后续的学习来说,他们的重要性一致的时候。也就是这种归一化是会无视量纲的,只考虑极值。

既然都聊了了标准化和归一化,那就顺便把中心化也聊一下吧。中心化,中心化只是在标准化的基础上少了一步,就是只要减去均值,但是不需要去除标准差。

当然,除了对图像的像素值进行归一化,在目标检测的 YOLO 家族中,我们也会对目标框的坐标和宽高进行归一化处理。

白化(whitening)

白化,其实也可以叫球化,这是一种非常形象的说法,类似将不同的数据集都捏成球状。

最大的作用:去除冗余信息

【深度学习基础】归一化,白化,_第1张图片
首先要明白一个概念,白化的对象既可以是一张单独的图片,这样,因为相邻像素的信息是关联的,所以也就意味着冗余信息的存在,对一张图片进行白化操作是可行的,从一个更高的层次,类似一个数据集,里面有 m 张图片,每张图片有 n 种特征,这些特征之间也是包含冗余信息的,所以,对一个数据集进行白化操作也是可以的。

其实白化的操作很简单,前几步都是和 PCA 一样的:

  1. 计算协方差矩阵( Σ = 1 m X ~ X ~ T \Sigma = \frac{1}{m}\widetilde{\mathbf{X} } \widetilde{\mathbf{X} } ^T Σ=m1X X T
  2. 对协方差矩阵进行 SVD 奇异值分解( Σ = U Λ V T \Sigma = \mathbf{U}\mathbf{\Lambda}\mathbf{V}^T Σ=VT
  3. 根据特征矩阵进行旋转( X r o t a t e = U T X \mathbf{X_{rotate}} =\mathbf{U}^T \mathbf{X} Xrotate=UTX
  4. 除以每个特征对应的标准差( X w h i t e n i n g = Λ − 1 2 U T X \mathbf{X_{whitening}} =\mathbf{\Lambda}^{-\frac{1}{2}}\mathbf{U}^T \mathbf{X} Xwhitening=Λ21UTX

值得注意得是在 SVD 奇异值分解的时候, Λ \mathbf{\Lambda} Λ 是个奇异值组成的对角阵,其中对角线上的值都是奇异值 λ i \lambda_i λi σ i = λ i \sigma_i=\sqrt{\lambda_i} σi=λi , 也就是标准差可以通过奇异值计算获得。

PCA 和白化其实很接近,就是最后一步的处理不太一样,PCA 在得到特征矩阵之后,选取最大的 N 个特征,然后根据这些特征基(特征向量)进行旋转,得到 X P C A = X r o t a t e _ N X_{\mathbf{PCA}} = \mathbf{X_{rotate\_N}} XPCA=Xrotate_N,而白化是保留全部的特征,旋转之后,再对 X r o t a t e \mathbf{X_{rotate}} Xrotate 进行标准化(除以标准差)

批归一化(Batch Normalization)

之前写过一篇文章关于 BN 的,但是主要是讲 BN 和梯度爆炸和梯度消失的关系的。在这里就详细的讲一下 BN。

虽然它叫 批归一化,但是实际上,如果相比这个名字,叫它 批标准化 可能更加合适。为什么呢?首先,当特征经过 BN 层之后,并不会被截断到 [0, 1] 或者 [-1, 1] 区间之内。具体我们可以通过公式来看:

你可能感兴趣的:(深度学习,人工智能,算法,机器学习,yolo,deep,learning)