归一化层(BN/LN/IN/GN)
归一化层
1. 内部协变量偏移(Internal Covariate Shift)
- 深层神经网络中,由于前输出为后节点输入,使用梯度下降更新参数进而改变 前一层输出,会导致后续的 输入分布 在每层之间发生较大的变化。
- 这种现象称为 内部协变量偏移(Internal Covariate Shift)。越深的层,其偏移的越明显。
- 简单理解可以为“高层大厦底部发生了微小偏移,楼层越高,偏移越严重”。
2. 解决问题的方法
- 本质:使得每一层的输入分布在 训练过程 保持一致。
2.1 批量归一化(Batch Normalization,BN)
- 某层的计算公式,表示为第
层的净输入为 ,神经元的输出为 ,其中 。
- 要解决内部协变量偏移问题,需要使
的分布一致。一般使用标准归一化,将净输入 的每一维都归一到标准正态分布。
- 那么均值期望和方差哪里来?
按批次或者样本数量去求。给定一个包含 个样本的小批量样本集合,第 层神经元的净输入 的均值和方差为:
- 对净输入的标准归一化会使得其取值集中在0附近,如果使用sigmoid型函数时,这个取值区间刚好接近线性变换区间,减弱了神经网络的非线性性质,因此,为了使得归一化不对网络的表示能力造成负面影响,我们可以通过一个附加的缩放和平移变换改变取值区间。
- 其中
和 分别代表缩放和平移的参数向量,当 , 时, 。 - 批量归一化可以看作是一个特殊的神经层,加在每一层非线性激活函数之前,即
2.1.1 BN 的优势
- 解决“internal covariate shift”的问题。
和 的作用:- γ 和 β 作为调整参数,既可以统一分布,同时也可以保持原输入,提升模型的容纳能力(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 模型方面特别成功。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本