Normalization 正则化在wikipedia上的解释是,使得某个东西更加正规和正常化的一个过程。深度学习中,正则化使用十分广泛,通常网络通过修改loss,添加参数的正则项,对参数的分布进行控制;或是在数据预处理阶段,对数据进行正则化操作。正则化操作通常指的是将数据大小范围缩放到[0,1]之间。

对数据集的正则化操作

Normalization is useful when your data has varying scales and the algorithm you are using does not make assumptions about the distribution of your data, such as k-nearest neighbors and artificial neural networks.

正则化使用场景是数据特征范围差异大,且数据的分布未知。

对于一般的数据集来说,我们不需要对其进行正则化操作。但如果数据集不同特征的数据范围相差过大时,我们需要对其进行正则化操作。因为数据范围大的数据,其波动对精度的影响很大,而数据范围小的特征,数据波动的影响不会有这么大,这样造成了结果精度无法提升。因此需要对数据进行正则化操作。使得数据局限在一个固定的范围内。

正则项

我们知道,当一个网络与数据过度拟合,这个网络能够很好的反应训练数据,但是它的泛化性能也会大大下降。为了避免这种过拟合现象,做法通常有:

  1. 削减特征的数量(难以确定哪些特征是需要丢弃的)
  2. 减少特征的参数,控制参数的分布,即使用正则项方法

正则项的目的是为了对参数进行控制,包括:

  1. 实现参数的稀疏化,即某些参数为0。参数的稀疏化能够自动对数据的特征进行筛选,过滤掉一些不需要的特征,同时起到简化模型的作用,避免过拟合。
  2. 最小化正则项能够尽量保持参数较小,参数小的好处在于计算方便,且在网络求导的过程中,产生的导数通常比较小,结果比较稳定。

范数 (norm)

在线性代数领域中,范数是一个函数,它为向量空间中的每个向量分配严格正长度或大小 。

L0 范数:指向量空间中非0向量的个数

无穷范数:指所有向量中欧式距离的最大值作为无穷范数

参数正则项

L0正则项:模型参数中,不为0的参数的个数

​ L0正则化通过最小化不为0的参数的个数,以达到参数稀疏化的目的,使得模型自动选择特征。在使用时,由于L0正则项是一个NP hard问题,L1是L0的最优凸优化,因此通常用L1来代替L0。

L1正则项:各个模型参数的绝对值之和

​ 最小化L1正则项能够将模型的参数变小,沿着0的方向靠近,降低网络的模型复杂度。添加L1正则项后方程如下:
$$
L = L_0 + \frac{\lambda}{n}\sum_{w}|W|
$$
L2 正则项:各个参数的平方和再开根号。

​ 最小化L2正则项可以使得参数变小接近于0,当参数不会变成0(可以看下面的图来理解),因此L2将选择更多的特征,权重比较小,避免过拟合。方程如下:
$$
C=C_{0}+\frac{\lambda}{2 n} \sum_{w} w^{2}
$$
lasso回归与岭参数

L1正则化又称为losso回归,将L1正则项作为loss的惩罚函数。L2正则项又称为岭参数。同样可以将L2正则项作为公式的约束项。可以画图如下,其中等值线为原始的Loss,L1为正方形(绝对值),L2为一个圈(平方根)。可以看出来,图中的交点满足条件的点,因此可以看出L1正则项可以得到更多的稀疏解。

标准化操作(standardization)

Standardization is useful when your data has varying scales and the algorithm you are using does make assumptions about your data having a Gaussian distribution, such as linear regression, logistic regression and linear discriminant analysis.

标准化使用场景是数据特征范围差异大,假设数据服从高斯分布。

将数据标准化是指将数据rescale,使得数据的 $mean = 0,\sigma = 1$。数据的标准化操作如下:
$$
z=\frac{x-\mu}{\sigma}
$$
标准化操作对于很多机器学习的算法,在网络训练上有着很重要的作用。例如对于梯度下降法来说,处于中心(mean = 0)范围的数据,中心权重的参数更新将会加快。对于一些loss而言(MSE),利用欧式距离作为网络优化的目标,因此标准化操作是很重要的。

Batch Normalization(批量标准化)

其步骤如下,对一个batch中的数据进行标准化后,并学习$r,\beta$ 两个参数,对得到标准化后的值进行一个偏移,得到最终的结果:

当进来一个batch的时候,具体的做法是,在数据输入到下一层神经元激活函数之前,计算整个batch的mean,variance,偏移后最终得到下一层的输入。

为什么要加入Batch Normalization层?

由于深层网络的输入,经过多层神经网络层的作用后发生偏移(ReLu激活函数输出均大于0,因此整体输出的mean将往大于0的方向偏移)。导致网络训练难以收敛,落入梯度饱和区导致梯度消失等问题。BN层重新通过将数据拉回N(0,1)的正态分布上,是的输入值落入激活函数梯度敏感的区域,避免梯度消失,加速网络的训练。(输入变小也有助于降低模型计算复杂度)。

但是仅仅做到这一步还不行,由于我们引入非线性的激活函数,使得网络能够学到一些非线性的性质。我们通过BN将输出拉回到N(0,1)分布上,削弱了激活函数的非线性部分的作用。因此BN通过学习两个参数$\gamma, \beta$ 来对输出做一个scale和shit操作。恢复学习到的非线性部分知识。最终得到的$y_i$ 在正态分布和非线性性质中做了一个trade off。

Batch Normalization的作用

  1. batch normalization极大的提升了网络训练的速度
  2. 每次BN都将网络的输出控制在一个范围内,近似于符合正态分布,能够起到正则项的作用
  3. 对参数的初始化要求降低,调参变得简单

layer normalization

layer normalization 正则化的方向是沿着feature的方向对CHW归一化,batch normalization 正则化的方向是以sample为单位,对NHW做归一化。