#深入理解# BN LN IN GN几种标准化的区别

首先说明一下这 Batch Normalization Layer Normalization Instance Normalization Group Normalization都是标准化过程,
在这里我也说一下我对标准化的个人理解:
对数据进行标准化首先是减去均值,让数据以0为中心进行波动;
然后除以标准差使数据的标准差为1,本质上是让数据残差的均值为1,波动均值为1

归一化和标准化

这里先简单说明一下归一化和标准化的区别:

归一化:数据线性映射到0-1之间,无量纲化(可以忽略单位对计算的影响),使不同量纲的数据具有可比性
标准化:常用的方法是z-score标准化,经过处理后的数据均值为0,标准差为1
从公式可知,标准化和归一化两者都是对样本进行平移缩放
详细分析请参考我的这篇文章->#浅析# tensorflow中的批标准化

简述

在这里插入图片描述
上边这张图显示了四种标准化的方向,其中C轴表示通道,N轴表示Batch中的样本序号,H、W轴可以认为是图像样本中的宽和高
这里还要简单说明一下,如果标准化时忽略了某些维度,那么标准化之后的数据还会保留这些维度之间的信息;这样说可能有些绕,以BN为例,BN对在每一个通道内进行标准化,忽略了像素位置、batch中的样本序号,因此BN就保留了上述这些维度上数据的关联,而同时却丢失了通道之间的数据联系,因为是对每个通道进行的标准化,因此通道之间的关联自然就丢失了

Batch Normalization

在这里插入图片描述

BN过程:

在CNN网络中,每层网络的的输出都有多个 feature map(通道),而每个feathre map 又是由多个像素点组成;在进行BN时,算法会将一个batch中所有样本的所有feature map按feature map的序号划分为N(N=feature map)组,然后对这N组内的所有像素点进行N次标准化,

BN层的作用

  1. 加快网络的训练和收敛的速度
  2. 控制梯度爆炸防止梯度消失
  3. 防止过拟合

分析:
(1)加快收敛速度
在深度神经网络中中,如果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练,而如果把每层的数据都在转换在均值为零,方差为1 的状态下,这样每层数据的分布都是一样的训练会比较容易收敛。
(2)防止梯度爆炸和梯度消失
以sigmoid函数为例,sigmoid函数使得输出在[0,1]之间,实际上当x过大或者过小,经过sigmoid函数后输出范围就会变得很小,而且反向传播时的梯度也会非常小,从而导致梯度消失,同时也会导致网络学习速率过慢;同时由于网络的前端比后端求梯度需要进行更多次的求导运算,最终会出现网络后端一直学习,而前端几乎不学习的情况。
Batch Normalization (BN) 通常被添加在每一个全连接和激励函数之间,使数据在进入激活函数之前集中分布在0值附近,大部分激活函数输入在0周围时输出会有加大变化,下图能够很好的解释这个问题
在这里插入图片描述
梯度爆炸:
第一层偏移量的梯度=激活层斜率1x权值1x激活层斜率2x…激活层斜率(n-1)x权值(n-1)x激活层斜率n,假如激活层斜率均为最大值0.25,所有层的权值为100,这样梯度就会指数增加。(使用bn层后权值的更新也不会很大)

(3)BN算法防止过拟合
在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。

BN在测试和训练时上有何不同?

  • 训练时,BN层每次都会用每个Batch内数据的均值和标准差对Batch内的样本进行标准化;同时会通过滑动平均的方式不断更新训练集上全局均值和方差并保存
  • 测试时,用保存好的训练集上的均值和方差对测试集上的每个数据进行标准化

BN放在什么位置?

其实BN一般放在激活函数之前或之后,其实这两种效果差别不大,但是当激活函数使用 sigmoid 或是 tanh时,将BN放在激活函数之前能够防止输入激活函数的值过大或者过小,从而防止梯度消失的情况出现

Layer Normalization

在这里插入图片描述

Layer Normalization 是对一个样本中的所有数据进行标准化;因为RNN一般用来处理序列数据,大部分序列类型的数据样本长度往往存在较大差异,如果使用BN处理就会出现某些通道没有某些样本数据的问题,即使使用特定字符填充,也会造成某些通道分布不均匀的问题

Instance Normalization

在这里插入图片描述

Instance Normalization是对一个样本中的每一个通道进行单独的标准化操作,一般用于风格化迁移,但如果特征图可以用到通道之间的相关性,那么就不建议使用它做Instance Normalization处理

Group Normalization

在这里插入图片描述
Group Normalization (GN)是 Layer Normalizaiton 和 Instance Normalization 标准化的折中做法,GN算法将一个样本的的通道划分为多个group,然后在对每一个group进行标准化
以CNN训练图像为例,使用多个卷积核对图像进行卷积会得到多个feature map,但这些feature map,并不一定都是相互独立的,某些feature map 之间可能存在某些联系,这时使用IN算法对每一个feature map做标准化无疑会丢失这些关联,而为了某些feature map之间的联系而使用LN算法对整个样本进行标准化又会占用大量内存资源,造成不必要的浪费;
GN算法首先将相互关联的feature map组合成一个group 然后再这个group上进行标准化,这样保留了通道之间的关联,又节省了资源
同时解决的batch_size过小 BN效果较差的问题(仅在单样本内部做标准化,与batch内的其他样本无关)

Switchable Normalization

Switchable Normalization将 BN、LN、IN 结合,赋予权重,让网络自己去学习归一化层应该使用什么方法,但训练复杂这里不做赘述

参考文章:

  1. 一文搞懂Batch Normalization,Layer/Instance/Group Norm
  2. 如何进行 batch normalization 2d 的计算?

以下是几种标准化的原始论文:

  1. Batch Normalization
  2. Layer Normalizaiton
  3. Instance Normalization
  4. Group Normalization
  5. Switchable Normalization
<think>嗯,我现在要详细了解一下深度学习中的各种归一化方法及其原理。用户需要理解底层原理和具体实现,所以我得先回忆一下常见的归一化技术,比如批归一化(Batch Normalization)、层归一化(Layer Normalization)、实例归一化(Instance Normalization)、组归一化(Group Normalization)等等。可能还有其他的,比如权重归一化或者谱归一化,不过这些可能不是同一类的,需要区分清楚。 首先,批归一化(BN)应该是最经典的。我记得BN是在训练过程中对每个小批量数据进行归一化,也就是对每个神经元的输入进行标准化,使其均值0,方差1,然后通过可学习的参数缩放和平移。这样做的好处是可以减少内部协变量偏移,加速训练,允许更大的学习率,还有一定的正则化效果。不过具体实现的时候,BN在训练和测试阶段是不一样的,测试阶段使用的是移动平均的均值和方差。这部分需要详细解释。 然后是层归一化(LN),它跟BN不同,是针对单个样本的所有神经元进行归一化。也就是说,在同一个层内,对同一个样本的所有激活值计算均值和方差,然后应用缩放和偏移。LN不依赖于批量大小,所以在小批量或者动态批量情况下表现更好,比如在RNN中常用。不过它的原理和BN有什么本质区别呢?可能是在归一化的维度上不同,BN是在批处理和其他维度(比如通道、高、宽)上进行归一化,而LN是在通道、高、宽之外的维度,比如特征维度? 接下来是实例归一化(IN),它主要用于生成对抗网络或者风格迁移任务。IN是对每个样本的每个通道单独进行归一化,也就是在(H,W)维度上计算均值和方差。这样做的目的是保持每个实例的独立性,可能有助于保留实例的样式信息。比如在风格迁移中,保留内容的结构但改变风格,IN可以更好地规范化每个样本的样式。 组归一化(GN)则是将通道分成若干组,对每个样本的每个组进行归一化。GN在批量较小时效果比BN好,因为BN在批量很小时性能下降,而GN不依赖批量大小。例如在目标检测或视频处理中,可能因为内存限制只能使用小批量,这时候GN更合适。组归一化的分组策略如何影响性能呢?可能更多的组数让归一化更细致,但计算量也会增加。 另外,还有权重归一化(Weight Normalization)和谱归一化(Spectral Normalization)。权重归一化是通过对权重向量进行重参数化,将其分解为方向和幅度,这样可以加速训练收敛。谱归一化则主要用于GAN中,通过约束权重矩阵的谱范数来稳定训练,防止判别器过强。不过用户可能更关注的是输入或激活的归一化,所以可能需要先重点讲前面几种。 现在需要理清楚这些归一化方法各自适用的场景、数学公式以及实现方式。比如BN的公式是对每个通道在N、H、W维度上计算均值和方差,而LN是在C、H、W维度上。需要明确各个方法在张量上的操作维度。 对于具体实现,每个归一化方法在框架中的实现可能不同,但大体步骤都是计算统计量,归一化,然后缩放和平移。例如在PyTorch中,这些归一化层都有对应的实现,如torch.nn.BatchNorm2d、LayerNorm等,它们的参数和输入形状有关。 可能还需要比较不同归一化的优缺点。比如BN的问题在于对批量大小的依赖,当批量很小时,估计的均值和方差不准确,影响效果。而LNINGN则不受批量大小的影响。另外,BN在卷积网络中使用时,是按通道进行的,即每个通道有自己的均值和方差参数,而LN可能是在所有通道上计算统计量? 比如对于四维张量(N, C, H, W),BN是在每个通道上,对N、H、W这三个维度计算均值和方差,得到C个均值和方差。而LN则是在每个样本上,对C、H、W这三个维度计算均值和方差,得到N个均值和方差。这样LN的参数数量可能与BN不同,比如缩放参数如果是每个通道的话,BN的缩放参数是C个,而LN可能也是C个?或者LN的缩放参数是针对整个层的特征? 可能这里需要更仔细的数学公式来区分。例如,对于BN,假设输入为x,形状是(N, C, H, W),那么对于每个通道c,计算该通道在所有样本、所有空间位置的均值μ_c和方差σ_c²。归一化后的x是 (x - μ_c)/sqrt(σ_c² + ε),然后乘以γ_c和β_c,每个通道有自己的γ和β。 而LN则是对每个样本n,计算该样本所有通道和空间位置的均值μ_n和方差σ_n²。归一化后的x是 (x - μ_n)/sqrt(σ_n² + ε),然后乘以γ和β。不过这里γ和β的维度可能与输入有关,比如如果LN应用于最后的特征维度,可能γ和β的长度是C*H*W?或者在图像处理中,如果使用LN,通常可能是在通道维度上进行归一化,比如对每个样本的每个通道的H和W进行归一化?或者可能LN在图像中的使用较少,而更多用于NLP中的Transformer,这时候特征维度是不同的。 这部分可能需要查阅资料确认。例如,在Transformer中,LN通常应用于每个样本的特征向量,即在最后一个维度上计算均值和方差。例如,输入的形状是(batch_size, seq_length, d_model),LN会在每个样本的每个位置上(即对d_model维度)计算均值和方差,所以对于每个位置的特征向量进行归一化。而在图像处理中,LN可能对每个样本的所有元素(C、H、W)计算均值和方差,即归一化的维度是CHW。这时候γ和β的参数数量是C*H*W,但这样可能参数过多,所以实际中可能LN在图像中的使用可能需要调整,或者有不同的实现方式。 可能用户提到的归一化方法主要是BNLNINGN,需要分别详细解释它们的数学原理、操作维度、适用场景、具体实现以及优缺点。此外,可能还需要提到它们如何影响梯度流,为什么能加速训练,以及正则化效果是如何产生的(比如BN在训练时由于小批量的噪声带来的随机性,类似于Dropout的效果)。 在具体实现上,比如在PyTorch中,BN的实现会维护一个running_mean和running_var,通过动量更新,而训练和测试时的模式不同。其他归一化方法可能不需要维护全局统计量,比如LNINGN在测试时和训练时的计算方式相同,因为它们不依赖于批量统计。 另外,可能需要注意归一化的位置,比如是在激活函数之前还是之后。通常BN是在卷积层之后、激活函数之前应用,但有些研究也探讨不同的位置带来的影响。 总结起来,我需要分步骤介绍每个归一化方法,包括: 1. 方法名称(如批归一化) 2. 提出背景(解决什么问题) 3. 数学公式及操作维度 4. 训练和测试阶段的差异(如有) 5. 具体实现方式(如参数数量,在框架中的使用) 6. 优缺点及适用场景 这样用户能逐步理解各个归一化的原理和应用。同时,需要确保公式的格式正确,使用$$...$$和$...$,并且用中文清晰解释。</think>以下是深度学习中的主要归一化方法及其原理的详细说明,按结构分层解析: --- ### 一、批归一化(Batch Normalization, BN#### 1. **提出背景** - 解决**内部协变量偏移**(每层输入分布随训练变化),加速训练并允许更大的学习率。 #### 2. **数学原理** - 对每个**通道**的输入进行归一化(针对卷积网络): $$ \mu_c = \frac{1}{NHW}\sum_{n=1}^N \sum_{h=1}^H \sum_{w=1}^W x_{n,c,h,w} $$ $$ \sigma_c^2 = \frac{1}{NHW}\sum_{n=1}^N \sum_{h=1}^H \sum_{w=1}^W (x_{n,c,h,w} - \mu_c)^2 $$ $$ \hat{x}_{n,c,h,w} = \frac{x_{n,c,h,w} - \mu_c}{\sqrt{\sigma_c^2 + \epsilon}} $$ $$ y_{n,c,h,w} = \gamma_c \hat{x}_{n,c,h,w} + \beta_c $$ - $\gamma_c$和$\beta_c$为可学习的缩放和偏移参数。 #### 3. **实现细节** - **训练阶段**:计算当前批量的均值和方差。 - **测试阶段**:使用训练时累积的移动平均统计量。 - **参数数量**:每通道一对$\gamma$和$\beta$,共$2C$个参数。 #### 4. **优缺点** - **优点**:加速训练、缓解梯度消失/爆炸、轻微正则化。 - **缺点**:依赖批量大小(小批量效果差),不适用于动态网络(如RNN)。 --- ### 二、层归一化(Layer Normalization, LN#### 1. **提出背景** - 解决BN对批量大小的依赖,适用于RNN和Transformer。 #### 2. **数学原理** - 对每个**样本**的所有特征进行归一化: $$ \mu_n = \frac{1}{CHW}\sum_{c=1}^C \sum_{h=1}^H \sum_{w=1}^W x_{n,c,h,w} $$ $$ \sigma_n^2 = \frac{1}{CHW}\sum_{c=1}^C \sum_{h=1}^H \sum_{w=1}^W (x_{n,c,h,w} - \mu_n)^2 $$ $$ \hat{x}_{n,c,h,w} = \frac{x_{n,c,h,w} - \mu_n}{\sqrt{\sigma_n^2 + \epsilon}} $$ $$ y_{n,c,h,w} = \gamma \hat{x}_{n,c,h,w} + \beta $$ - $\gamma$和$\beta$为整个层的参数。 #### 3. **实现细节** - 训练和测试逻辑一致,无需存储统计量。 - **参数数量**:每层一对$\gamma$和$\beta$,共2个参数。 #### 4. **优缺点** - **优点**:独立于批量大小,适合序列模型。 - **缺点**:对卷积网络效果弱于BN。 --- ### 三、实例归一化(Instance Normalization, IN#### 1. **提出背景** - 用于图像生成任务(如风格迁移),保持实例间独立性。 #### 2. **数学原理** - 对每个**样本的每个通道**单独归一化: $$ \mu_{n,c} = \frac{1}{HW}\sum_{h=1}^H \sum_{w=1}^W x_{n,c,h,w} $$ $$ \sigma_{n,c}^2 = \frac{1}{HW}\sum_{h=1}^H \sum_{w=1}^W (x_{n,c,h,w} - \mu_{n,c})^2 $$ $$ \hat{x}_{n,c,h,w} = \frac{x_{n,c,h,w} - \mu_{n,c}}{\sqrt{\sigma_{n,c}^2 + \epsilon}} $$ $$ y_{n,c,h,w} = \gamma_c \hat{x}_{n,c,h,w} + \beta_c $$ #### 3. **实现细节** - 参数数量与BN相同($2C$个参数)。 #### 4. **优缺点** - **优点**:保留实例的样式信息。 - **缺点**:不适用于分类任务。 --- ### 四、组归一化(Group Normalization, GN#### 1. **提出背景** - 在小批量场景下替代BN(如目标检测)。 #### 2. **数学原理** - 将通道分为$G$组,每组单独归一化: $$ \mu_{n,g} = \frac{1}{(C/G)HW}\sum_{c \in g} \sum_{h=1}^H \sum_{w=1}^W x_{n,c,h,w} $$ $$ \sigma_{n,g}^2 = \frac{1}{(C/G)HW}\sum_{c \in g} \sum_{h=1}^H \sum_{w=1}^W (x_{n,c,h,w} - \mu_{n,g})^2 $$ $$ \hat{x}_{n,c,h,w} = \frac{x_{n,c,h,w} - \mu_{n,g}}{\sqrt{\sigma_{n,g}^2 + \epsilon}} $$ $$ y_{n,c,h,w} = \gamma_c \hat{x}_{n,c,h,w} + \beta_c $$ #### 3. **实现细节** - 分组数$G$为超参数(通常设为32)。 #### 4. **优缺点** - **优点**:在小批量下表现稳定。 - **缺点**:需手动调参分组数。 --- ### 五、其他归一化 1. **权重归一化(Weight Normalization)** - 对权重矩阵重参数化:$w = \frac{g}{\|v\|}v$,加速收敛。 2. **谱归一化(Spectral Normalization)** - 约束权重矩阵的谱范数,用于稳定GAN训练。 --- ### 六、对比总结 | 方法 | 归一化维度 | 适用场景 | 依赖批量大小 | |------------|-----------------------|------------------------|--------------| | Batch Norm | (N, H, W) | 卷积网络 | 是 | | Layer Norm | (C, H, W) | RNN/Transformer | 否 | | Instance | (H, W) | 图像生成 | 否 | | Group Norm | 通道分组 | 小批量任务(如检测) | 否 | --- ### 七、核心作用 1. **稳定训练**:通过约束输入分布,缓解梯度异常。 2. **加速收敛**:允许更大学习率。 3. **轻微正则化**:噪声来自小批量统计(如BN)。 代码实现(以PyTorch为例): ```python # BN(卷积网络) bn = nn.BatchNorm2d(num_features=C) # LN(Transformer) ln = nn.LayerNorm(normalized_shape=d_model) # GN(目标检测) gn = nn.GroupNorm(num_groups=G, num_channels=C) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

energy_百分百

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值