当前位置: 首页 > news >正文

深入理解批量归一化(BN):原理、缺陷与跨小批量归一化(CBN)

在训练深度神经网络时,批量归一化(Batch Normalization,简称BN)是一种常用且有效的技术,它帮助解决了深度学习中训练过程中的梯度消失、梯度爆炸和训练不稳定等。然而,BN也有一些局限性,特别是在处理小批量数据推理阶段时。因此,跨小批量归一化(Cross-Batch Normalization,CBN)作为一种新的方法被提出,旨在克服BN的一些缺点。

本文将详细介绍BN的原理、其在小批量训练中的缺陷,并介绍如何通过CBN解决这些问题,帮助读者更好地理解这些技术。


目录

一、批量归一化(BN)是什么?

1.1 什么是批量归一化?

1.2 批量归一化在卷积神经网络中的应用

1.3 BN的计算步骤

1.3.1 计算均值和方差

1.3.3缩放和平移

1.4 BN的优点

二、批量归一化(BN)存在的缺陷

2.1 小批量训练时的问题

2.2 推理阶段的问题

2.3 对批量大小的敏感性

三、跨小批量归一化(CBN):解决BN缺陷的创新方法

3.1 BN vs CBN 的关键区别

3.2 CBN 的工作原理

3.3 CBN 的优缺点

优点:

缺点:

4. CBN 的实现(PyTorch 示例)

5. 总结


一、批量归一化(BN)是什么?

1.1 什么是批量归一化?

批量归一化(BN)是一种在神经网络的训练过程中对每一层输入进行标准化的技术。具体来说,BN对每一层的输入数据进行 均值为0、方差为1 的归一化处理,从而消除了数据分布的变化(即内部协变量偏移)。BN的核心目标是加速网络训练过程,并提高网络的稳定性。

简而言之,BN就是将每层的输入数据进行标准化处理,使其具有相同的尺度,这样可以避免某些层的输出值过大或过小,从而加速训练的收敛。

1.2 批量归一化在卷积神经网络中的应用

在卷积神经网络(CNN)中,BN通常应用于每一层卷积操作的输出,即特征图。卷积神经网络中的特征图是卷积层生成的二维或三维数据,BN会对这些数据进行标准化处理。

假设网络输入的是一个张量,形状为 \mathbf{X} \in \mathbb{R}^{N \times C \times H \times W},其中:

  • N 是批量大小(batch size),即一次训练中输入的样本数量,
  • C 是卷积层输出的通道数(channels),通常表示颜色通道(RGB)或者卷积层提取的特征数量,
  • H 和 W 是特征图的高度(height)和宽度(width)。

1.3 BN的计算步骤

BN的计算过程可以分为三个步骤:计算均值、计算方差、进行标准化。

1.3.1 计算均值和方差

对于每个通道(channel),BN会计算该通道下所有像素点的均值和方差。假设输入数据 \mathbf{X} 的形状为 N \times C \times H \times W,其中 N 为批量大小,C 为通道数,H 和 W 为特征图的高度和宽度。那么对每个通道 c,BN计算的是该通道内所有像素点的均值(\mu_c)和方差(\sigma_c^2)。

均值:对每个通道的所有像素计算均值

\mu_c = \frac{1}{N \times H \times W} \sum_{i=1}^{N} \sum_{j=1}^{H} \sum_{k=1}^{W} x_{i, c, j, k}

这里,x_{i, c, j, k} 是第 i 个样本在第 c 个通道上,位置 (j, k) 的像素值。

方差:对每个通道的所有像素计算方差(方差反映了像素值的离散程度)

\sigma_c^2 = \frac{1}{N \times H \times W} \sum_{i=1}^{N} \sum_{j=1}^{H} \sum_{k=1}^{W} (x_{i, c, j, k} - \mu_c)^2\\ =\frac{1}{N \times H \times W} \sum_{i=1}^{N} \sum_{j=1}^{H} \sum_{k=1}^{W}x_{i, c, j, k}^2- \mu_c^2

上诉推导由公式:\sigma^2 = Var(X)=E(X^2)-(E(X))^2的公式推导而来

1.3.2 标准化

计算得到均值和方差后,我们将每个像素的值进行标准化处理,使得其符合零均值和单位方差:

\hat{x}_{i, c, j, k} = \frac{x_{i, c, j, k} - \mu_c}{\sqrt{\sigma_c^2 + \epsilon}}

其中,\epsilon 是一个非常小的常数,防止除零错误。

1.3.3缩放和平移

为了让标准化后的输出数据保持其原本的分布,BN引入了可学习的参数 \gamma_c(缩放因子)和 \beta_c(平移因子):

y_{i, c, j, k} = \gamma_c \hat{x}_{i, c, j, k} + \beta_c

这里,\gamma_c\beta_c 是每个通道的可学习参数,用来恢复输出的表达能力。

1.4 BN的优点

  • 加速训练:通过减少内部协变量偏移,BN让网络训练更加平稳,加快了收敛速度。
  • 提高稳定性:BN通过规范化每一层的输入数据,使得梯度更新更加平滑,从而减少了梯度爆炸和梯度消失的风险。
  • 具有正则化效果:由于每一层的输入数据被归一化,BN本身也具有一定的正则化效果,有时能够减少过拟合。

二、批量归一化(BN)存在的缺陷

虽然BN在训练过程中提供了很多好处,但它也有一些限制,特别是在以下两个方面:

2.1 小批量训练时的问题

BN的性能依赖于小批量中的统计数据(均值和方差)。如果批量大小非常小(例如,批量大小为1或几),那么计算得到的均值和方差可能并不稳定,这会导致训练的不稳定性。在这种情况下,BN的效果往往不如预期,甚至会影响训练的收敛速度。

2.2 推理阶段的问题

在推理阶段,我们通常使用 训练阶段 得到的均值和方差来归一化数据,因为推理时无法获取多个样本的小批量。然而,这种方法存在问题:训练和推理阶段使用的均值和方差可能不一致,尤其当推理数据与训练数据的分布有所不同时。这会导致网络性能在推理阶段下降。

2.3 对批量大小的敏感性

BN对批量大小非常敏感。较小的批量会导致统计不准确,较大的批量则增加计算开销。因此,BN在面对不同批量大小时并不总是最优的解决方案。

三、跨小批量归一化(CBN):解决BN缺陷的创新方法

为了解决BN在小批量训练和推理阶段的缺陷,跨小批量归一化(CBN)应运而生。CBN的目标是通过 跨多个小批量 计算全局的均值和方差,从而避免BN在小批量训练时统计不稳定的问题。

为了理解CBN是如何实现这一点的,我们需要明确以下几个关键概念和步骤:

3.1 BN vs CBN 的关键区别

在标准的 批量归一化(BN) 中,我们通常对每个小批量(batch)内部的均值和方差进行计算,并在每个批次(即每个小批量)上进行归一化处理。这样,每个批次的均值和方差都可能不同。问题是,当批次较小时,计算得到的均值和方差会存在较大误差,导致模型训练不稳定。

而在 跨小批量归一化(CBN) 中,目标是跨多个小批量数据来计算全局的均值和方差,避免每个小批量独立计算统计量带来的波动。具体来说,CBN可以跨多个批次计算全局均值和方差,从而确保训练过程中的统计量更加稳定。

3.2 CBN 的工作原理

在训练过程中,CBN通过以下方式获取跨小批量的统计值。

3.2.1跨多个小批量的数据积累

在标准的BN中,每个小批量都有自己的均值和方差。CBN则会跨多个小批量(或者多个批次)对均值和方差进行积累和计算,逐渐形成一个全局的均值和方差。

具体而言,CBN会通过以下步骤积累统计值:

  • 全局均值计算:每次处理一个小批量时,CBN会将该小批量的均值加入全局均值的计算。
  • 全局方差计算:类似地,CBN会将每个小批量的方差也加入到全局方差的计算中。

3.3.2更新统计值的方式

CBN的统计量(均值和方差)通常使用滑动平均或累积的方式进行更新。具体来说,CBN会通过更新公式来平滑计算全局的均值和方差,避免每个批次计算出的统计量波动过大。

例如,对于均值和方差的更新,CBN可以使用如下公式:

  • 均值更新公式

\mu_{\text{global}} = \frac{1}{t}\sum_{i=1}^{t}\mu_{i}

其中,\mu_{\text{global}} 是全局均值的当前值,\mu_{i} 是第 i 批量的均值,t 为当前批量的索引。

但是在实际运用中,我们会给上诉公司做简化处理:

\mu_{\text{global}} =\alpha \mu_{t-1} + (1-\alpha) \mu_{t}

其中α 是一个平滑因子(通常接近1,例如0.9或0.99),用于控制历史信息的影响。

  • 方差更新公式

\sigma_c^2 = \frac{1}{N \times H \times W} \sum_{i=1}^{N} \sum_{j=1}^{H} \sum_{k=1}^{W} (x_{i, c, j, k} - \mu_c)^2=\frac{1}{N \times H \times W} \sum_{i=1}^{N} \sum_{j=1}^{H} \sum_{k=1}^{W}x_{i, c, j, k}^2- \mu_c^2

上诉推导由公式:\sigma^2 = Var(X)=E(X^2)-(E(X))^2的公式推导而来

\sigma_{\text{global}}^{2} = \overline{E(X^2)}-\overline{(E(X))^2}=\frac{\sum_{i=1}^{N} \sum_{j=1}^{H} \sum_{k=1}^{W}\sum_{t=1}^{T}x_{i, c, j, k,t}^2}{N \times H \times W \times T} -\mu_{\text{global}}^{2}

这里的 \sigma_{\text{global}}^{2} 是全局方差的当前值,\mu_{\text{global}}^{2} 全局均值。

同理,我们在实际应用中简化如下公式:

\sigma_{\text{global}}^2 =\alpha \sigma _{t-1}^2 + (1-\alpha) \sigma_{t}^2'

其中α 是一个平滑因子(通常接近1,例如0.9或0.99),用于控制历史信息的影响。

3.2.3标准化使用全局统计量

训练过程中,每个小批量的输入都会使用 全局均值全局方差 来进行标准化,而不仅仅依赖当前小批量的统计量。具体而言,每次输入数据通过标准化公式:

\hat{x}_{i, c, j, k} = \frac{x_{i, c, j, k} - \mu_{\text{global}}}{\sqrt{\sigma_{\text{global}}^2 + \epsilon}}

其中,\mu_{\text{global}}\sigma_{\text{global}}^2 是跨多个小批量积累的全局均值和方差,\epsilon 是一个小常数,用于防止除零错误。

通过这种方式,CBN确保了所有小批量在训练过程中使用的是稳定的统计量。

3.3 CBN 的优缺点

优点:
  • 减少小批量训练的不稳定性:CBN通过跨多个小批量积累统计量,避免了单个小批量方差和均值的不准确,尤其在批量大小非常小的情况下,效果尤为明显。
  • 保持训练和推理阶段的一致性:CBN在训练阶段和推理阶段使用相同的全局均值和方差,从而避免了在推理时因为统计量差异而导致的性能下降。
缺点:
  • 计算开销增加:CBN需要跨多个小批量计算统计量,因此需要更多的内存和计算资源来保存历史统计值。
  • 需要更多的数据积累:为了准确地计算全局均值和方差,CBN通常需要积累较多的小批量数据,这可能会影响训练效率。

4. CBN 的实现(PyTorch 示例)

下面是一个简单的基于 PyTorch 实现的 CBN 类,它演示了如何跨多个批量计算均值和方差。

import torch
import torch.nn as nnclass CrossBatchNorm(nn.Module):def __init__(self, num_features, momentum=0.1):super(CrossBatchNorm, self).__init__()self.num_features = num_featuresself.momentum = momentum# 初始化全局均值和方差self.running_mean = torch.zeros(num_features)self.running_var = torch.ones(num_features)def forward(self, x):# 计算当前小批量的均值和方差mean = x.mean([0, 2, 3])  # 跨批量、行、列计算均值var = x.var([0, 2, 3], unbiased=False)  # 跨批量、行、列计算方差# 更新全局均值和方差self.running_mean = self.running_mean * self.momentum + mean * (1 - self.momentum)self.running_var = self.running_var * self.momentum + var * (1 - self.momentum)# 使用全局均值和方差进行标准化x_hat = (x - self.running_mean[None, :, None, None]) / torch.sqrt(self.running_var[None, :, None, None] + 1e-5)# 可学习的缩放和平移gamma = self.gamma if hasattr(self, 'gamma') else torch.ones_like(mean)beta = self.beta if hasattr(self, 'beta') else torch.zeros_like(mean)return gamma[None, :, None, None] * x_hat + beta[None, :, None, None]

5. 总结

跨小批量归一化(CBN) 通过跨多个小批量数据计算全局均值和方差,从而避免了单个小批量的统计量可能存在的误差。这种方法在处理小批量数据时特别有效,能够提供更稳定的训练过程,并保持训练和推理阶段的一致性。虽然这种方法增加了计算和内存开销,但它可以显著提高深度学习模型在特定情况下的表现,特别是在处理小批量数据时。


http://www.mrgr.cn/news/81285.html

相关文章:

  • 图像的方差介绍
  • 跟踪方案和小语法
  • 【test】git clone lfs问题记录
  • C++ 的大括号的用法合集
  • 【Leetcode 热题 100】124. 二叉树中的最大路径和
  • 一种简易的免杀绕过方法
  • 类设计者的核查表
  • 耗时半月,终于把牛客网上的软件测试面试八股文整理成了PDF合集(测试基础+linux+MySQL+接口测试+自动化测试+测试框架+jmeter测试+测试开发)
  • shiro权限校验demo
  • 高并发处理 --- Caffeine内存缓存库
  • 图解JVM整体结构、执行流程以及2种架构模型,你学会了吗?
  • 绕组识别标签规范
  • 【基于rust-wasm的前端页面转pdf组件和示例】
  • 蓝牙协议——音量控制
  • Django 管理命令中使用 `logging` 和 输出样式
  • 只谈C++11新特性 - 显式虚函数重写
  • docker 安装minio
  • es 中使用update 、create 、index的区别
  • MQTT协议在树莓派上的安全性和性能测试及其在物联网应用中的应用
  • Dubbo 3.x源码(28)—Dubbo服务发布导出源码(7)应用级服务接口元数据发布
  • 物理层知识要点
  • 论如何优雅地“扒“C代码的底裤 - 白盒审计笔记
  • JWT的生成和工作原理
  • 跟踪方案和小语法
  • leetcode 面试经典 150 题:螺旋矩阵
  • ffmpeg之显示一个yuv照片