深度学习的归一化方法


  本次介绍一下各种归一化方法,包括 BatchNorm、LayerNorm、InstanceNorm、GroupNorm

在这里插入图片描述

  • BatchNorm:batch 方向做归一化;
  • LayerNorm:channel 方向做归一化;
  • InstanceNorm:一个 channel 内做归一化;
  • GroupNorm:将 channel 方向分组,然后每个组内做归一化;

1 为什么使用 Normalization?

  当使用梯度下降时,数据的特征分布会发生变化,为了保证数据特征分布的稳定性,则会使用归一化操作,将数据转换为均值为1、方差为0,从而加速模型的收敛速度、减少梯度消失的问题、使训练过程更加平稳。

2 BatchNorm vs. LayerNorm

适用场景

  在 CNN 中一般采用 BatchNorm,而在 Transformer 中一般采用 LayerNorm。
  BN 在 mini-batch 较小的情况下不太适用,BN 是对整个 mini-batch 的样本统计均值和方差,当训练样本数很少时无法反映全局的统计分布信息;
  BN 无法应用于 RNN,不同句子的长度不一样,对所有的样本统计均值是无意义的;
  LN 特别适合处理变长数据,对 channel 维度(即 NLP 中的 hidden 维度) 做操作,与句子长度和 batch size 无关,因此 Transformer 一般使用的是 Layer Normalization。

工作原理

先来看看二者的公式:
B N : y i = x i − μ B σ B 2 + ϵ ∗ γ + β L N : y i = x i − μ L σ L 2 + ϵ ∗ γ + β BN: \quad y_{i} = \frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}} * \gamma + \beta \quad \quad \quad LN: \quad y_{i} = \frac{x_i-\mu_L}{\sqrt{\sigma_L^2+\epsilon}} * \gamma + \beta BN:yi=σB2+ϵ xiμBγ+βLN:yi=σL2+ϵ xiμLγ+β
都是将输入特征转换为均值为1,方差为0的数据,不同在于
在这里插入图片描述
BN 是对不同样本的同一特征做归一化,即在每个维度上统计所有样本的均值和方差;
LN 是对每个样本的所有特征做归一化,不受样本数量的限制,即在每个样本上统计所有维度的均值和方差;
所以 BN 在每个维度上分布是稳定的,LN 在每个样本的分布是稳定的。

3 GroupNorm

  上面提到了 BN 在 mini-batch 较小的情况下不太适用,而 GN 便解决了 BN 对 batch size 依赖的影响。
  GN 将通道分组,计算每组的均值和方差,进行归一化操作。GN 的计算与 batch size 无关。通过文章第一张图可以看出,GN 和 LN 相似。

### 归一化的定义与作用 归一化是一种用于调整数据分布的技术,在深度学习中广泛应用于优化模型性能和加速收敛过程。通过归一化,可以减少特征之间的量纲差异,从而改善梯度下降的效果并缓解梯度消失或爆炸的问题[^1]。 具体来说,归一化的主要目标是将每一层的输入标准化到一个相对稳定的范围,使得网络能够更高效地学习权重参数。这种方法不仅有助于提高训练速度,还能增强模型的泛化能力[^2]。 --- ### 常见的归一化方法及其技术实现 #### 1. **批量归一化 (Batch Normalization, BN)** 批量归一化是最常用的归一化技术之一,它通过对每一批次的数据进行均值和方差计算来规范化激活值。其核心思想是在神经网络的中间层引入额外的操作,以稳定隐藏单元的分布特性[^3]。 以下是批量归一化的典型实现方式: ```python import tensorflow as tf model = tf.keras.models.Sequential([ tf.keras.layers.Dense(64), tf.keras.layers.BatchNormalization(), # 添加 BatchNorm 层 tf.keras.layers.Activation('relu'), tf.keras.layers.Dense(10, activation='softmax') ]) ``` 在实际应用中,BN 的优点包括但不限于以下几个方面: - 减少对初始化条件的高度依赖; - 提高超参数调节的空间灵活性; - 支持更高的学习率设置而不易发散。 然而需要注意的是,当批次大小较小,BN 可能会因为统计估计不准确而导致性能下降。 --- #### 2. **层归一化 (Layer Normalization, LN)** 不同于 BN 需要基于整个 mini-batch 来估算统计数据,LN 是针对单一样本的所有维度执行归一化操作。因此即使 batch size 很小甚至等于 1,LN 依然有效果。 下面是一个简单的 PyTorch 实现例子: ```python import torch.nn as nn ln_layer = nn.LayerNorm(normalized_shape=hidden_size) output = ln_layer(input_tensor) ``` 相比 BN,LN 更适合于序列建模任务(如 RNN 或 Transformer),因为它不会受到不同间步之间样本间关系的影响。 --- #### 3. **实例归一化 (Instance Normalization, IN)** IN 主要在图像风格迁移领域得到广泛应用。它的特点是分别独立地对每个样本中的每一个通道做归一化处理,而忽略空间位置上的关联性。 代码片段如下所示: ```python from torchvision import models in_layer = models.instancenorm2d(num_features=channel_count) result = in_layer(feature_map) ``` 这种策略特别适用于保留局部纹理信息的同改变全局样式属性的任务场景下表现优异。 --- #### 4. **组归一化 (Group Normalization, GN)** GN 将通道划分为若干小组,并在各组内部完成类似的归一化进程。这种方式综合考虑了效率与表达力两方面的平衡点,既不像 IN 那样极端又避免了像 LN 和 BN 对硬件资源需求较高的缺点。 下面是 TensorFlow 中的一个简单示例: ```python gn_layer = tfa.layers.GroupNormalization(groups=8) normalized_output = gn_layer(inputs) ``` GN 特别适配那些无法提供充足 batch size 的情况或者 GPU/TPU 计算设备受限的情形。 --- ### 应用场景分析 不同的归一化技术适应特定的应用环境: - 如果正在构建卷积神经网络(CNNs),并且拥有较大的 batch sizes,则可以选择使用 **Batch Norm**。 - 当面对自然语言处理(NLP)问题或是其他涉及长序列结构的数据,推荐采用 **Layer Norm**。 - 图像生成类项目通常倾向于利用 **Instance Norm** 达成艺术效果转换目的。 - 资源有限条件下开发复杂架构则可尝试运用 **Group Norm** 解决部分挑战。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值