(BN)批量归一化全面解析

一、背景意义

本篇博文主要讲解2015年深度学习领域非常棒的一篇文献:《Batch Normalization: Accelerating Deep Network Training by  Reducing Internal Covariate Shift》,这个算法目前已经被大量的应用,最新的文献算法很多都会引用这个算法,进行网络训练,可见其强大之处非同一般啊,采用这个方法网络的训练速度快到惊人啊,感觉训练速度是以前的十倍以上,再也不用担心自己这破电脑每次运行一下,训练一下都要跑个两三天的时间。另外这篇文献跟空间变换网络《Spatial Transformer Networks》的思想神似啊,都是一个变换网络层。

近年来深度学习捷报连连、声名鹊起,随机梯度下降成了训练深度网络的主流方法。尽管随机梯度下降法对于训练深度网络简单高效,但是它有个毛病,就是需要我们人为的去选择参数,比如学习率、参数初始化、权重衰减系数、Drop out比例等。这些参数的选择对训练结果至关重要,以至于我们很多时间都浪费在这些的调参上。那么学完这篇文献之后,你可以不需要那么刻意的慢慢调整参数。BN算法(Batch Normalization)其强大之处如下:

(1)你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性;

(2)你再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;

(3)再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;

(4)可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度,这句话我也是百思不得其解啊)。

开始讲解算法前,先来思考一个问题:我们知道在神经网络训练开始前,都要对输入数据做一个归一化处理,那么具体为什么需要归一化呢?归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。

对于深度网络的训练是一个复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。

我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal  Covariate Shift”。Paper所提出的算法,就是要解决在训练过程中,中间层数据分布发生改变的情况,于是就有了Batch  Normalization,这个牛逼算法的诞生。

 

二、初识BN(Batch  Normalization)

1、BN概述

就像激活函数层、卷积层、全连接层、池化层一样,BN(Batch Normalization)也属于网络的一层。在前面我们提到网络除了输出层外,其它层因为低层网络在训练的时候更新了参数,而引起后面层输入数据分布的变化。这个时候我们可能就会想,如果在每一层输入的时候,再加个预处理操作那该有多好啊,比如网络第三层输入数据X3(X3表示网络第三层的输入数据)把它归一化至:均值0、方差为1,然后再输入第三层计算,这样我们就可以解决前面所提到的“Internal Covariate Shift”的问题了。

而事实上,paper的算法本质原理就是这样࿱

<think>好的,我需要回答用户关于空间批量归一化(Spatial Batch Normalization)的实现与原理的问题。首先,我需要回顾Batch Normalization的基础知识,因为Spatial BN是其扩展。根据引用[2]和[4],标准BN是在每个神经元的激活输入上,按batch进行归一化,处理的是全连接层或卷积层后的每个特征通道的标量数据。 接下来,Spatial BN主要应用于卷积神经网络。卷积层的输出是四维张量(batch, channels, height, width),常规BN会对每个通道的所有元素进行归一化。但Spatial BN可能在这里有不同的处理方式?需要确认具体操作。根据引用[1],不同归一化方法如Layer Norm、Group Norm等处理维度不同,而Spatial BN可能在空间维度上保留更多信息。 查阅资料,标准BN在卷积层中,对每个通道的整个batch和空间位置(HxW)计算均值和方差,然后归一化。这实际上就是Spatial Batch Normalization,因为它在空间维度上展开。可能用户提到的“spatial”是指保留空间信息,而实现上和常规BN在卷积层的应用一致。 引用[5]提到MXNet转ONNX时遇到spatial属性错误,可能涉及框架实现差异。例如,某些框架可能在BN层中保留spatial参数,但ONNX不支持。因此,在实现时需注意参数兼容性。 总结,Spatial BN的原理与标准BN相同,但在卷积网络中,归一化统计量计算覆盖了空间维度,保持通道独立性。实现时,对于四维输入,沿(N,H,W)轴计算均值和方差,每个通道单独处理。代码示例可展示如何计算,并引用相关文献如[2][4]中的公式。</think>### 空间批量归一化(Spatial Batch Normalization)的实现与原理 #### 1. **核心原理** 空间批量归一化(Spatial BN)是标准批量归一化(Batch Normalization, BN)在卷积神经网络中的扩展。其核心思想是**对卷积层的特征图(Feature Map)进行归一化**,具体步骤如下: - **输入数据维度**:卷积层输出为四维张量 $(\text{Batch}, \text{Channels}, \text{Height}, \text{Width})$。 - **统计量计算**:对每个通道(Channel)单独计算均值和方差,但统计范围覆盖整个 Batch 和所有空间位置(Height × Width)。即: $$ \mu_c = \frac{1}{B \cdot H \cdot W} \sum_{b=1}^B \sum_{h=1}^H \sum_{w=1}^W x_{b,c,h,w} $$ $$ \sigma_c^2 = \frac{1}{B \cdot H \cdot W} \sum_{b=1}^B \sum_{h=1}^H \sum_{w=1}^W (x_{b,c,h,w} - \mu_c)^2 $$ 其中 $c$ 为通道索引[^2][^4]。 - **归一化与变换**:对每个通道进行缩放和平移,引入可学习参数 $\gamma_c$ 和 $\beta_c$: $$ \hat{x}_{b,c,h,w} = \gamma_c \cdot \frac{x_{b,c,h,w} - \mu_c}{\sqrt{\sigma_c^2 + \epsilon}} + \beta_c $$ 其中 $\epsilon$ 是为数值稳定性添加的小常数。 #### 2. **实现方法** 在代码中,Spatial BN 的实现需注意以下步骤: 1. **沿特定维度计算统计量**:对四维输入,沿 Batch、Height、Width 维度计算均值和方差。 2. **训练与推理模式分离**: - **训练阶段**:使用当前 Batch 的统计量,并更新全局移动平均(用于推理)。 - **推理阶段**:使用训练时累积的全局均值和方差[^2]。 **PyTorch 示例**: ```python import torch.nn as nn # 定义Spatial BN层(对Channels数=64的卷积层输出归一化) spatial_bn = nn.BatchNorm2d(num_features=64) # 前向传播 input_tensor = torch.randn(32, 64, 128, 128) # (Batch, Channels, H, W) output = spatial_bn(input_tensor) ``` #### 3. **与标准BN的区别** - **标准BN**:适用于全连接层,对每个特征(标量)独立归一化。 - **Spatial BN**:针对卷积层,保留通道独立性,同时在空间维度(H, W)上展开统计,避免破坏卷积的局部相关性[^1]。 #### 4. **注意事项** - **框架兼容性**:部分框架(如 MXNet)可能对 `spatial` 参数支持不完整,转换到 ONNX 时需检查属性兼容性[^5]。 - **小批量问题**:当 Batch Size 较小时,统计量估计不准确,可考虑使用 Group Normalization 替代。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值