批量归一化(Batch normalization)

批量归一化是一种用于加速深度学习模型训练的技术,通过对每层数据进行标准化处理,减少内部协变量转移,提高网络训练速度。它涉及计算批量数据的均值和方差,然后使用可学习的参数γ和β进行尺度变换。批量归一化通常应用于激活函数之前,可以视为网络的额外层,同时起到正则化的作用,防止过拟合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是批量归一化?

  批量归一化是指对某一层的某一个批量数据进行归一化处理。方法是计算这个批量的均值和方差,利用如下公式处理批量数据:

x i + 1 = γ x i − μ B σ B + β {x_{i+1}}^ = \gamma \frac{{{x_i} - {\mu _B}}}{{{\sigma _B}}} + \beta xi+1=γσBxiμB+β
  其中 x i + 1 {x_{i+1}} xi+1表示批归一化之后的数据, μ B {\mu _B} μB表示这个批量样本的均值, σ B {\sigma _B} σB表示样本方差。可以看到,批量归一化在我们熟知的归一化的基础上对数据做了拉伸和偏移(即参数 γ \gamma γ和参数 β \beta β),这也是批量归一化的灵魂。
  如果仅仅是把数据做归一化使其符合高斯分布,虽然可以让网络训练更快,但某种程度上会限制网络的学习能力(把数据分布限制住了),而加入这两个参数后,相当于对数据做了尺度变换,这使得数据的分布可以更加自由(但是总体上依然大致符合高斯分布,戴着镣铐跳舞),而且这两个参数是可学习的,因此可以把批量归一化这个操作视为网络的一层,即BN层。
  对于图像数据,批量归一化是在通道维进行的。稍微有点难以理解,举例说明:例如,一批64x32x256x256的数据,其均值和方差是在通道维求出的1x32x1x1的张量。单看每一个通道,把每个像素点当做样本,一个通道对应着64x256x256个像素数据,在通道维求均值也就是求这个通道对应的64x256x256个像素值的均值。得到的结果自然是1x32x1x1的张量。求出均值后每个像素点都带入上述公式计算批量归一化后的结果。

为什么需要批量归一化?

  层数较深的网络一般来说收敛较慢,训练起来非常困难。最大的原因是:反向传播计算梯度时,越靠近输出的层更容易收敛,越靠近数据的层收敛会很慢。而靠近数据的网络层的参数稍微一改变,靠近输出的网络参数又需要重新更新,导致网络收敛慢,本质上是因为浅层和深层收敛不同步。
  收敛不同步的原因是:深层网络参数的梯度一般比较大(链式法则求导,越靠近输出求导时连乘的偏导项越少),参数更新比较快;浅层网络参数的梯度一般很小(链式法则求导,越靠近数据端求导时连乘的偏导项越多,而偏导数一般比较小;那么偏导项越多,梯度值越小),非常容易出现梯度消失的问题,参数更新慢。

批量归一化如何起作用?

  李沐老师给出的直觉上的解释是:让小批量的数据分布都近似符合正态分布,这样网络学起来更快(好吧没懂)。我个人的理解是,如果极端一点,在原本网络的每一层后面都加一层批量归一化层,那么每一层的数据分布大致都是一样的,这样网络学起来自然快;但问题是不能这样做,这会极大限制住网络的学习能力,因此BN层的数量应该酌情添加。 作者的解释是:BN可以减小训练时数据内部协变量的转移(O.o)。
  还有一种说法是:BN实际上是在每一个小批量加入了噪声,理由是小批量的均值与方差可以认为是随机的。因为每一个小批量的数据量相对整个数据集来说是很小的,它的均值和方差代表不了整个数据集的均值和方差,具有很大的随机性,因此不同小批量的均值方差差异很大,视为随机噪声。向网络添加随机噪声是可以一定程度上缓解过拟合的,因此BN也被视为一种正则化的手段。

总结与注意事项

  • 两个可学习的参数 γ \gamma γ β \beta β
  • 作用在全连接层和卷积层的输出,激活函数之前。
  • 也可以作用在全连接层和卷积层的输入。
  • 对于全连接层,作用在特征的维度上。
  • 对于卷积层,作用在通道维。
### 批量归一化的作用与原理 批量归一化Batch Normalization, BN)旨在解决深层神经网络训练过程中遇到的内部协变量偏移(Internal Covariate Shift)问题。通过使每一层输入数据分布保持相对稳定,从而加速模型收敛并提高性能[^1]。 #### 原理说明 BN的核心在于对每个批次(batch)内的特征进行标准化处理,即调整各维度上的均值接近0、方差趋近于1。具体操作如下: - 对于给定的一批样本\( \{x_1,x_2,...,x_m\} \),先计算这批样本关于某个特定神经元输出的整体均值μ和标准差σ; \[ μ_B=\frac {1}{m}\sum_{i=1}^{m}x_i,\quad σ_B^2=\frac {1}{m}\sum _{i=1}^{m}(x_i−μ_B)^2 \] - 接着利用上述统计信息对该批内所有样例执行线性转换: \[ y_i = \gamma (\frac{x_i - μ_B }{\sqrt{{σ}_B ^2+\epsilon}})+β \] 其中γ(缩放参数), β (位移参数) 是两个可学习参数; ε是一个很小常数用于防止除零错误[^3]。 此过程不仅实现了feature scaling的效果,还允许后续层次更好地适应前一层的变化模式,减少了因权重更新引起的数据分布变动带来的负面影响[^2]。 #### 应用场景 在深度学习领域中,BN广泛应用于各种类型的卷积神经网络(CNNs)以及循环神经网络(RNNs)结构里。特别是在图像识别任务方面表现出色,能够有效提升分类准确性的同时加快收敛速度。此外,在自然语言处理(NLP)等领域也有成功案例报道[^4]。 ```python import torch.nn as nn model = nn.Sequential( nn.Conv2d(in_channels=3, out_channels=64, kernel_size=(3, 3)), nn.BatchNorm2d(num_features=64), ... ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值