BN(Batch Normalization) 原理与使用过程详解

论文名字:Batch Normalization: Accelerating Deep Network Training by  Reducing Internal Covariate Shift

论文地址:https://arxiv.org/abs/1502.03167

      BN被广泛应用于深度学习的各个地方,由于在实习过程中需要修改网络,修改的网络在训练过程中无法收敛,就添加了BN层进去来替换掉LRN层,网络可以收敛。现在就讲一下Batch Normalization的工作原理。

BN层和卷积层,池化层一样都是一个网络层。

首先我们根据论文来介绍一下BN层的优点。

1)加快训练速度,这样我们就可以使用较大的学习率来训练网络。

2)提高网络的泛化能力。

3)BN层本质上是一个归一化网络层,可以替代局部响应归一化层(LRN层)。

4)可以打乱样本训练顺序(这样就不可能出现同一张照片被多次选择用来训练)论文中提到可以提高1%的精度。

下面我们就讲一下BN层是如何实现的:

从论文中给出的伪代码可以看出来BN层的计算流程是:

1.计算样本均值。

2.计算样本方差。

3.样本数据标准化处理。

4.进行平移和缩放处理。引入了γ和β两个参数。来训练γ和β两个参数。引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。

下面我们讨论一下样本是如何得到的

Batch Normalization顾名思义,mini-batch就是我们每次训练的Batch_size。

从上图卷积过程可以得出一张5*5的图片经过卷积核3*3的卷积之后得到一张3*3的特征图。特征图就会包含了9个特征值,这9个特征值就是我们上面所提到的样本。假设我们的batch-size设为m,那么就会有m*9个特征值传到BN层里面作为样本来训练参数γ和β。

在网络训练中以batch-size作为最小单位来不断迭代。每当有新的batch-size进入到网络里面就会产生新的γ和β。也就是说我们训练过程中要生成  图片总量/batch-size 组参数。

图像卷积的过程中,通常是使用多个卷积核,得到多张特征图,对于多个的卷积核需要保存多个的γ与β。

BN层的整体流程如下图:

输入:待进入激活函数的变量 
输出: 
1.这里的K,在卷积网络中可以看作是卷积核个数,如网络中第n层有64个卷积核,就需要计算64次。 
   需要注意,在正向传播时,会使用γ与β使得BN层输出与输入一样。 
2.在反向传播时利用γ与β求得梯度从而改变训练权值(变量)。 
3.通过不断迭代直到训练结束,求得关于不同层的γ与β。
4.不断遍历训练集中的图片,取出每个batch_size中的γ与β,最后统计每层BN的γ与β各自的和除以图片数量得到平均直,并对其    做无偏估计直作为每一层的E[x]与Var[x]。 
5.在预测的正向传播时,对测试数据求取γ与β,并使用该层的E[x]与Var[x],通过图中11:所表示的公式计算BN层输出。 
注意,在预测时,BN层的输出已经被改变,所以BN层在预测的作用体现在此处。

 

参考文献:Batch Normalization: Accelerating Deep Network Training by  Reducing Internal Covariate Shift

https://blog.youkuaiyun.com/fate_fjh/article/details/53375881

https://blog.youkuaiyun.com/hjimce/article/details/50866313

03-24
<think>嗯,用户想了解BNBatch Normalization)和ReLU的关系或用法。首先,我需要回忆这两个概念的基本定义和作用。Batch Normalization是用来标准化每一的输入,加速训练并减少对初始化的敏感。而ReLU是一个激活函数,用于引入非线性。 接下来,我需要考虑它们的结合使用方式。通常,在神经网络中,BN会放在全连接或卷积之后,激活函数之前还是之后呢?根据常见的做法,比如在ResNet中,BN通常是在卷积之后,激活函数之前。不过,有时候也会有不同的顺序,比如先ReLU再BN。这时候可能需要解释不同的顺序对模型的影响。 然后,用户可能想知道为什么这两个组件经常一起使用。比如,BN标准化后的数据输入到ReLU,可以避免激活函数的输入偏移,减少Dead ReLU的问题,因为标准化后大部分值会在0附近,负数会被ReLU置零,正数部分线性通过。这样结合可以提升训练的稳定性和速度。 另外,需要提到一些实际应用中的例子,比如ResNet结构,引用中的SEW ResNet可能用到了这些技术。比如引用2提到SEW ResNet的脉冲率和初始化相关,可能涉及到BN和激活函数的使用。虽然引用4讨论了激活量化的敏感性,比如ReLU6和ReLU的区别,这可能和BN后的数据范围有关,因为BN后的数据分布更稳定,适合量化。 还要注意用户的引用资料,比如引用4提到量化时使用ReLU6,这可能和BN的输出范围有关,因为ReLU6限制输出在0-6,有助于量化时的数值稳定性。而BN可能帮助将数据调整到合适的范围内,减少量化误差。 此外,用户的问题可能涉及到训练中的挑战,如引用5提到的训练神经网络的困难,BN和ReLU的结合使用可以缓解这些问题,比如加速收敛,减少梯度消失等问题。 最后,生成相关问题需要考虑用户可能的后续疑问,比如顺序调换的影响,如何防止Dead ReLU,BN和ReLU在量化中的作用等。需要确保问题覆盖理论和应用面,帮助用户深入理解。</think>### Batch NormalizationReLU的关系及用法 #### 1. **功能互补:标准化非线性激活** - **Batch Normalization (BN)**:对每一的输入进行标准化(均值为0、方差为1),加速训练收敛并减少对参数初始化的敏感性[^3]。数学表示为: $$ \hat{x} = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} $$ 其中$\mu$和$\sigma^2$是当前批次的均值和方差。 - **ReLU**:通过$f(x) = \max(0, x)$引入非线性,解决梯度消失问题并稀疏化激活。 #### 2. **典型顺序:BN -> ReLU** 在大多数现代架构(如ResNet[^2])中,BN通常放置在卷积(或全连接)**之后**、ReLU激活**之前**: ```python # 示例代码结构 x = Conv2D(x) x = BatchNorm(x) x = ReLU(x) ``` **原因**: - BN的标准化使输入ReLU的数据集中在0附近,减少“Dead ReLU”现象(即神经元永久性失活)。 - ReLU对正值区间的线性特性可保留BN的归一化效果[^4]。 #### 3. **反向传播中的协同作用** - BN通过调整梯度方向减少内部协变量偏移(Internal Covariate Shift),使ReLU的梯度更稳定。 - ReLU的梯度为0或1,结合BN的缩放参数($\gamma$和$\beta$),可动态调整激活分布[^1]。 #### 4. **特殊场景变体** - **顺序调换**:某些场景下(如轻量级网络)会采用ReLU -> BN,但需注意初始化方式对梯度的影响。 - **ReLU6**:在量化场景中,ReLU6($f(x) = \min(\max(0, x), 6)$)BN结合可限制激活值范围,提升整数计算的稳定性。 #### 5. **实际应用效果** - 实验表明,BN + ReLU的组合可使训练速度提升30%以上[^1]。 - 在脉冲神经网络(SNN)中,BNReLU的等效设计(如SEW ResNet)可优化脉冲发放率[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值