参考资料:https://mp.weixin.qq.com/s?__biz=MzU3NDgxMzI0Mw==&mid=2247504259&idx=3&sn=bcd5af6172a5dd77d29e9d5f15362078&chksm=fd2e34d7ca59bdc11ed2d8663916452293ab4abdc0352b2f5c4bcbedec2b37d6b99202271b55&mpshare=1&scene=23&srcid=0906cyLWvgWjuadxKIKlTGXu&sharer_sharetime=1662446273232&sharer_shareid=bcbe8052c9f6a58a15c33177a853b9d8#rd
-
normalization 标准化
-
1.Normalization的背景
1.1.独立同分布与白化
-
独立同分布,即independent and identically distributed,简称为 i.i.d.指随机过程中,任何时刻的取值都为随机变量,如果这些随机变量服从同一分布,并且互相独立,那么这些随机变量是独立同分布。
-
独立同分布的数据可以简化常规机器学习模型的训练、提升机器学习模型的预测能力
-
-
白化,即whitening,是一个重要的数据预处理步骤。白化最典型的方法就是PCA。白化一般包含两个目的:
-
(1)去除特征之间的相关性 —> 独立;
-
(2)使得所有特征具有相同的均值和方差—> 同分布。
-
1.2.深度学习中的 Internal Covariate Shift
1.2.1.概念理解
什么是Covariate Shift?
深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新,导致深度神经网络模型的训练很困难。
Convariate,协变量,在实验的设计中,协变量是一个独立变量(解释变量),不为实验者所操纵,但仍影响实验结果
机器学习中有一个经典假设:源空间和目标空间的数据分布是一致的(训练集和测试集的分布是一致的)。而实际上模型的输入和输出的联合分布在训练数据和测试数据之间是不同的,这称为dataset shift。dataset shift的一种简明情况就是Covariate Shift(协变量变化)仅输入分布发生变化,而在给定输入的输出条件分布保持不变。也即,源空间和目标空间有概率是一致的,但是其边缘概率不同。
什么是Internal Covariate Shift?
Internal Covariate Shift(内部协变量偏移),也叫ICS。可以理解为,在多层网络训练中,后面层次的神经网络接受到的节点受到前面层次的网络参数变化导致该层输入数据的分布发生了变化。泛指,在多层数据网络中各层之间参数变化引起的数据分布发生变化的现象。
1.2.2.ICS导致的问题
简单来说,就是使得每个神经元的输入数据不再是“独立同分布”了。
其一,上层参数需要不断适应新的输入数据分布,降低学习速度。
其二,下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
其三,每层的更新都会影响到其它层,因此每层的参数更新策略都要尽可能谨慎
2.Normalization的通用框架与基本思想
如何解决ICS的导致的输入数据不再满足独立同分布的问题?
理论上就是对每一层数据都做“白化”操作。基本思想:在将 x 送给神经元之前,先对其做平移和伸缩变换, 将 x 的分布规范化成在固定区间范围的标准分布
通用的变换框架如下所示:
(1) μ是平移参数(shift parameter), σ是缩放参数(scale parameter)。通过这两个参数进行 shift 和 scale 变换:
得到的数据符合均值为 0、方差为1的标准分布。
(2) b是再平移参数(re-shift parameter), g是再缩放参数(re-scale parameter)。将 上一步得到的 进一步变换为:
最终得到的数据符合均值为b、方差为g²的分布
-
第一步的变换将输入数据限制到了一个全局统一的确定范围(均值为 0、方差为 1)。下层神经元可能很努力地在学习,但不论其如何变化,其输出的结果在交给上层神经元进行处理之前,将被粗暴地重新调整到这一固定范围,因此我们要进行(2),保证模型的表达能力不会因为规范性而下降。
-
(2)中的参数都是可以学习的,这使得Normalization可以充分尊重底层的学习结果,还保证获取了非线性的表达能力
-
第一步的规范化会将几乎所有数据映射到激活函数的非饱和区(线性区),仅利用到了线性变化能力,从而降低了神经网络的表达能力。而进行再变换,则可以将数据从线性区变换到非线性区,恢复模型的表达能力。
-
-
(2)中的参数很容易通过梯度下降进行学习,简化神经网络的训练。
3.主流Normalization方法梳理
Normalization的通用公式
3.1.Batch Normalization —— 纵向规范化
Batch Normalization由google在2015年提出。它的规范性是针对单个神经元进行,利用网络训练时的一个mini-batch的数据来计算该神经元Xi的均值方差。
其中,M是mini-batch的大小。
-
BN的纵向规范化的纵向,是相对于神经元的水平排列来的。
-
BN的标准公式计算为element-wise的
-
BN适用的场景:每一个mini-batch比较大,数据分布比较接近
-
BN独立的规范化每一个输入维度Xi,但规范化的参数是一个mini-batch的一阶统计量和二阶统计量(求均值的那个括号里有几个随机变量,就是几阶)。
-
这就要求 每一个 mini-batch 的统计量是整体统计量的近似估计,或者说每一个 mini-batch 彼此之间,以及和整体数据,都应该是近似同分布的。
-
分布差距较小的 mini-batch 可以看做是为规范化操作和模型训练引入了噪声,可以增加模型的鲁棒性
-
但如果每个 mini-batch的原始分布差别很大,那么不同 mini-batch 的数据将会进行不一样的数据变换,这就增加了模型训练的难度
-
-
BN不适用于动态的网络结构和RNN网络
-
因为BN在运行过程中要统计每个mini-batch的一阶。二阶统计量
-
3.2.Layer Normalization —— 横向规范化
-
出发点是解决BN的不足。
-
LN是一种横向的规范化,它考虑了一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入。
其中,i枚举了该层所有的输入神经元,对应到标准公式中,四大参数 μ, σ, b, g 均为标量(BN中是向量),所有输入共享一个规范化变换。
-
LN 针对单个训练样本进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题
-
场景:可以用于 小mini-batch场景、动态网络场景和 RNN,特别是自然语言处理领域。
-
LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
-
不同输入特征不属于相似的类别的情况下,LN的处理可能会降低模型的表达能力。
3.3 Weight Normalization —— 参数规范化
将通用框架
经过规范化之后的y 作为输入送到下一个神经元,应用以 w 为参数的fw(·) 函数定义的变换。最普遍的变换是线性变换,即
-
WN,将规范化应用于线性变换函数的权重 w ,区别于BN 和 LN 均将规范化应用于输入的特征数据 x
-
具体而言,WN 提出的方案是,将权重向量w分解为向量方向
和向量模 g 两部分:
其中 v 是与 w同维度的向量, ||v||是欧氏范数,因此
是单位向量,决定了 w 的方向;g 是标量,决定了 w 的长度。由于 ||w||=|g| ,因此这一权重分解的方式将权重向量的欧氏范数进行了固定,从而实现了正则化的效果。
-
推导:
对照一下通用框架:
我们只需令:
就完美地对号入座了!
-
BN 和 LN 是用输入的特征数据的方差对输入数据进行 scale,而 WN 则是用 神经元的权重的欧氏范式对输入数据进行 scale。虽然在原始方法中分别进行的是特征数据规范化和参数的规范化,但本质上都实现了对数据的规范化,只是用于 scale 的参数来源不同。
-
WN规范化只是对数据进行了 scale,而没有进行 shift,因为我们简单地令 μ=0。但事实上,这里留下了与 BN 或者 LN 相结合的余地——那就是利用 BN 或者 LN 的方法来计算输入数据的均值 μ 。
-
WN 的规范化不直接使用输入数据的统计量,因此避免了 BN 过于依赖 mini-batch 的不足,以及 LN 每层唯一转换器的限制,同时也可以用于动态网络结构。
3.4 Cosine Normalization —— 余弦规范化
神经元的经典变换
-
对公式中的 · 作规范化
-
向量点积是衡量两个向量相似度的方法之一,我们考虑其他的相似度衡量方法:夹角余弦就是其中之一!而且,夹角余弦是有[-1, 1] 的确定的取值范围
-
Cosine Normalization ,它们不处理权重向量w ,也不处理特征数据向量 x ,就改了一下线性变换的函数:
其中 θ 是 w 和 x 的夹角。所有的数据就都是 [-1, 1] 区间范围之内的了
-
CN 与 WN 还是很相似的。我们看到上式中,分子还是 图片 和 图片 的内积,而分母则可以看做用 w 和 x 二者的模之积进行规范化。对比一下 WN 的公式:
一定程度上可以理解为,WN 用 权重的模 ||v|| 对输入向量进行 scale,而 CN 在此基础上用输入向量的模 ||x|| 对输入向量进行了进一步的 scale.
-
CN 通过用余弦计算代替内积计算实现了规范化,去掉scale信息,可能导致表达能力的下降。
-
原始的内积计算,其几何意义是 输入向量在权重向量上的投影,既包含 二者的夹角信息,也包含 两个向量的scale信息。
4. 为什么Normalization会有效?
我们以下面这个简化的神经网络为例来分析。
4.1 Normalization 的权重伸缩不变性
权重伸缩不变性(weight scale invariance)指的是,当权重 w 按照常量 λ 进行伸缩时,得到的规范化后的值保持不变,即:
其中 W’ = λ W 。
上述规范化方法均有这一性质,这是因为,当权重 W 伸缩时,对应的均值和标准差均等比例伸缩,分子分母相抵。
权重伸缩不变性可以有效地提高反向传播的效率。
由于
因此,权重的伸缩变化不会影响反向梯度的 Jacobian 矩阵,因此也就对反向传播没有影响,避免了反向传播时因为权重过大或过小导致的梯度消失或梯度爆炸问题,从而加速了神经网络的训练。
权重伸缩不变性还具有参数正则化的效果,可以使用更高的学习率。
由于
因此,下层的权重值越大,其梯度就越小。这样,参数的变化就越稳定,相当于实现了参数正则化的效果,避免参数的大幅震荡,提高网络的泛化性能。
4.2 Normalization 的数据伸缩不变性
数据伸缩不变性(data scale invariance)指的是,当数据 X 按照常量 λ 进行伸缩时,得到的规范化后的值保持不变,即:
其中 X’ = λX 。
数据伸缩不变性仅对 BN、LN 和 CN 成立。因为这三者对输入数据进行规范化,因此当数据进行常量伸缩时,其均值和方差都会相应变化,分子分母互相抵消。而 WN 不具有这一性质。
数据伸缩不变性可以有效地减少梯度弥散,简化对学习率的选择。
对于某一层神经元
而言,展开可得
每一层神经元的输出依赖于底下各层的计算结果。如果没有正则化,当下层输入发生伸缩变化时,经过层层传递,可能会导致数据发生剧烈的膨胀或者弥散,从而也导致了反向计算时的梯度爆炸或梯度弥散。
加入 Normalization 之后,不论底层的数据如何变化,对于某一层神经元
而言,其输入
永远保持标准的分布,这就使得高层的训练更加简单。
从梯度的计算公式来看:
数据的伸缩变化也不会影响到对该层的权重参数更新,使得训练过程更加鲁棒,简化了对学习率的选择。