拆分降采样与归一化(LN和BN)
拆分降采样:在ConvNeXt网络中使用一个步长为2的 2×2 卷积插入到不同的步骤之间,而且在降采样前后各加入了一个LN(一种归一化设计,这些归一化用来保持模型的稳定性)
为什么要进行归一化呢?
我们以BN为例
(1)在深度神经网络训练的过程中,通常以输入网络的每一个mini-batch进行训练,这样每个batch具有不同的分布,使模型训练起来特别困难。
(2)Internal Covariate Shift (ICS) 问题:在训练的过程中,激活函数会改变各层数据的分布,随着网络的加深,这种改变(差异)会越来越大,使模型训练起来特别困难,收敛速度很慢,会出现梯度消失的问题。
BN的主要思想:针对每个神经元,使数据在进入激活函数之前,沿着通道计算每个batch的均值、方差,‘强迫’数据保持均值为0,方差为1的正态分布,避免发生梯度消失。具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 … 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值(注意是除以 N×H×W 而不是单纯除以 N,最后得到的是一个代表这个 batch 第1个通道平均值的数字,而不是一个 H×W 的矩阵)。求通道 1 的方差也是同理。对所有通道都施加一遍这个操作,就得到了所有通道的均值和方差。
BN是在batch上,对N、H、W做归一化,而保留通道 C 的维度。BN对较小的batch size效果不好。BN适用于固定深度的前向神经网络,如CNN,不适用于RNN;
LN在通道方向上,对C、H、W归一化,主要对RNN效果明显;
1、BN在单独的层级之间使用比较方便,比如CNN。而RNN层数不定,直接用BN不太方便,需要对每一层(每个time step)做BN,并保留每一层的mean和variance。由于RNN输入不定长(time step长度不定),会有validation 或 test的 time step 比 train 里面的任何数据都长,造成mean和variance不存在的情况。
2、BN会引入噪声(因为是mini batch而不是整个training),对噪声敏感的方法(如RL)不太适用。
BN(Batch Normalization)并不适用于RNN等动态网络和batch size较小的时候效果不好。
Layer Normalization(LN) 的提出有效的解决BN的这两个问题。
LN和BN不同点是归一化的维度是互相垂直的。
LayerNorm实际就是对隐含层做层归一化,即对某一层的所有神经元的输入进行归一化。(每hidden_size个数求平均/方差)
1、在training 和 inference 时没有区别,只需要对当前隐藏层计算mean and variance,不需要保 存每层的moving average mean and variance。
2、不受batch size限制,可通过online learning的方式一条一条的输入训练数据。
3、LN可以方便的在RNN中使用。