详解深度学习Batchnorm

本文介绍了BatchNorm在深度学习中的重要性,主要是为了解决Internal Covariate Shift问题,加速训练并提高模型稳定性。通过引入可学习的γ和β参数,实现数据归一化的同时保留学习到的特征。BatchNorm在训练和测试阶段的操作区别也进行了说明。

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

陈伟@航天科技智慧城市研究院
chenwei@ascs.tech

Batchnorm是深度网络中经常用到的加速神经网络训练,加速收敛速度及稳定性的算法,可以说是目前深度网络必不可少的一部分。

为什么Batchnorm

  • 机器学习领域有个很重要的假设:IID独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。那BatchNorm的作用是什么呢?BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
  • 深度学习的话尤其是在CV上都需要对数据做归一化,因为深度神经网络主要就是为了学习训练数据的分布,并在测试集上达到很好的泛化效果,但是,如果我们每一个batch输入的数据都具有不同的分布,显然会给网络的训练带来困难。另一方面,数据经过一层层网络计算后,其数据分布也在发生着变化,此现象称为Internal Covariate Shift,接下来会详细解释,会给下一层的网络学习带来困难。batchnorm直译过来就是批规范化,就是为了解决这个分布变化问题。
  • Internal Covariate Shift :此术语是google小组在论文Batch Normalizatoin 中提出来的,其主要描述的是:训练深度网络的时候经常发生训练困难的问题,因为,每一次参数迭代更新后,上一层网络的输出数据经过这一层网络计算后,数据的分布会发生变化,为下一层网络的学习带来困难(神经网络本来就是要学习数据的分布,要是分布一直在变,学习就很难了),此现象称之为Internal Covariate Shift。之前的解决方案就是使用较小的学习率,和小心的初始化参数,对数据做白化处理,但是显然治标不治本。
  • covariate shift:Internal Covariate Shift 和Covariate Shift具有相似性,但并不是一个东西,前者发生在神经网络的内部,所以是Internal,后者发生在输入数据上。Covariate Shift主要描述的是由于训练数据和测试数据存在分布的差异性,给网络的泛化性和训练速度带来了影响,我们经常使用的方法是做归一化或者白化。想要直观感受的话,看下图:
    image

举个简单线性分类栗子,假设我们的数据分布如a所示,参数初始化一般是0均值,和较小的方差,此时拟合的y=wx+b
如b图中的橘色线,经过多次迭代后,达到紫色线,此时具有很好的分类效果,但是如果我们将其归一化到0点附近,显然会加快训练速度,如此我们更进一步的通过变换拉大数据之间的相对差异性,那么就更容易区分了。

  • Covariate Shift 就是描述的输入数据分布不一致的现象,对数据做归一化当然可以加快训练速度,能对数据做去相关性,突出它们之间的分布相对差异就更好了。Batchnorm做到了,前文已说过,Batchnorm是归一化的一种手段,极限来说,这种方式会减小图像之间的绝对差异,突出相对差异,加快训练速度。所以说,并不是在深度学习的所有领域都可以使用BatchNorm。

Batchnorm的原理

为了降低Internal Covariate Shift带来的影响,其实只要进行归一化就可以的。比如,我们把network每一层的输出都整为方差为1,均值为0的正态分布,这样看起来是可以解决问题,但是想想,network好不容易学习到的数据特征,被你这样

### 深度学习中归一化操作详解 #### 归一化的定义与作用 归一化是一种常见的预处理方法,在深度学习模型训练过程中用于调整输入特征的分布,使得不同维度的数据具有相似的比例范围。这有助于加速梯度下降过程并提高数值稳定性[^1]。 #### 批量归一化(Batch Normalization) 批量归一化通过减少内部协变量偏移来加快深层网络训练速度。具体来说,对于每一层中的激活函数前向传播阶段应用如下变换: \[ y = \frac{x-\mu_B}{\sqrt{\sigma^2_B+\epsilon}}*\gamma+\beta \] 其中 \(x\) 表示当前mini-batch内的某个样本;\(y\) 是经过标准化之后的新值;\(\mu_B,\sigma^2_B\) 分别代表该批次内所有样例均值和方差;而\(\gamma ,\beta\) 则是用来缩放和平移的标准正态分布输出,它们作为额外的学习参数被引入到算法框架之中以便于后续优化求解时能够更好地适应实际应用场景需求[^3]。 ```python import torch.nn as nn model = nn.Sequential( ... nn.BatchNorm2d(num_features), ... ) ``` 上述代码展示了如何利用 PyTorch 库快速构建含有 BN 层结构的卷积神经元组(CNN),只需指定 `num_features` 参数即可完成相应配置工作。 #### 实现细节 在实践中,当执行反向传播更新权重之前会先计算整个 mini-batch 的统计信息 (mean & variance), 并据此对各节点上的局部误差信号做适当修正; 同时为了保证测试期间也能获得稳定表现, 训练结束后通常还会采用全局累积估计的方式代替即时采样的 batch-wise 统计量参与预测流程[^4]。 #### 可训练参数的作用 γ(伽马) 和 β(贝塔) 是两个可训练参数,主要是在一定程度上恢复数据本身的表达能力,对规范化后的数据进行线性处理。这样可以确保即使进行了归一化操作,原始数据的重要特性也不会丢失太多,从而保持良好的表征性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值