归一化层
1. 内部协变量偏移(Internal Covariate Shift)
- 深层神经网络中,由于前输出为后节点输入,使用梯度下降更新参数进而改变 前一层输出,会导致后续的 输入分布 在每层之间发生较大的变化。
- 这种现象称为 内部协变量偏移(Internal Covariate Shift)。越深的层,其偏移的越明显。
- 简单理解可以为“高层大厦底部发生了微小偏移,楼层越高,偏移越严重”。
2. 解决问题的方法
- 本质:使得每一层的输入分布在 训练过程 保持一致。
2.1 批量归一化(Batch Normalization,BN)
- 某层的计算公式,表示为第 \(l\) 层的净输入为 \(z^{(l)}\),神经元的输出为 \(a^{(l)}\) ,其中 \(z^{(l)}=Wa^{(l-1)}+b\) 。
- 要解决内部协变量偏移问题,需要使 \(z^{(l)}\) 的分布一致。一般使用标准归一化,将净输入 \(z^{(l)}\) 的每一维都归一到标准正态分布。
- 那么均值期望和方差哪里来?
按批次或者样本数量去求。给定一个包含 \(K\) 个样本的小批量样本集合,第 \(l\) 层神经元的净输入 的均值和方差为:
- 对净输入的标准归一化会使得其取值集中在0附近,如果使用sigmoid型函数时,这个取值区间刚好接近线性变换区间,减弱了神经网络的非线性性质,因此,为了使得归一化不对网络的表示能力造成负面影响,我们可以通过一个附加的缩放和平移变换改变取值区间。
- 其中\(\gamma\)和\(\beta\)分别代表缩放和平移的参数向量,当\(\gamma =\sqrt{\sigma _{\left( l \right)}^{2}}\), \(\beta =\mu _{\left( l \right)}\)时, \(\bar{z}^{\left( l \right)}=z^{\left( l \right)}\)。
- 批量归一化可以看作是一个特殊的神经层,加在每一层非线性激活函数之前,即
2.1.1 BN 的优势
- 解决“internal covariate shift”的问题。
- \(\gamma\) 和 \(\beta\) 的作用:
- γ 和 β 作为调整参数,既可以统一分布,同时也可以保持原输入,提升模型的容纳能力(capacity)。
- 如果是 sigmoid 函数,BN后的分布在0-1之间,在接近0的地方趋于线性,通过 γ 和 β 可以自动调整输入分布,使得其非线性能力不至于减弱。
- 如果为 ReLU 函数,意味着将有一半的激活函数无法使用,那么通过 β 可以进行调整参与激活的数据的比例,防止 dead-Relu 问题。
- 可以控制数据的分布范围,避免了梯度消失和爆炸。
- 降低权重初始化的困难。
- BN 可以起到和 dropout 一样的正则化效果,一般全连接层用dropout,卷积层用 BN。
2.2 层归一化(Layer Normalization,LN)
- LN的思路和BN相似,只不过归一化的整体选取不同。
- F为特征轴,N为样本轴,C为通道轴,左为LN, 右为BN。
- 看出 BN 是 N 和 F 上归一化,LN 是 C 和 F 上归一化。
- 如果结合到时间序列预测 [N, C, F] 对应 [batch_size, seq_len, hidden_dim],即总时间步长上进行归一化。
- 何时要用 LN?
BN 是按照样本数计算归一化统计量。- 所以当样本数很少时,其均值和方差便不能反映全局的统计分布息,效果会变得很差。
- 在一些场景中,比如说硬件资源受限,在线学习等场景,BN是非常不适用的。
- 其次像 RNN 这种类型的网络,每个bacth的样本长度可能不一样长度,所以 BN 再次不能代表全体,转换到每层去处理的 LN 更合理一些。
2.3 其他归一化(IN/GN)比较
- 这里的 W*H 就是之前的 F 轴。
- 其实思路都一样,只不过是归一化的部分不同。
- 四种归一化比较:
- BN:batch方向做归一化,计算NHW的
- FN:channel方向做归一化,计算CHW的
- InstanceNorm:一个channel内做归一化,计算H*W的
- GroupNorm:先将channel方向分group,然后每个group内做归一化,计算(C//G)HW的
- GN 与 LN 和 IN 有关,LN 和 IN 在 RNN 系列 或 GAN 模型方面特别成功。