【深度学习】批归一化(Batch Normalization)

Batch Normalization(BN)是深度神经网络训练的一种技巧,由Google于2015年提出,不仅加速模型收敛,还缓解深层网络的梯度弥散问题。本文详细介绍了BN的原理、作用及在卷积神经网络中的应用。

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

来源:https://www.cnblogs.com/skyfsm/p/8453498.html
https://blog.youkuaiyun.com/bingo_csdn_/article/details/79393354

一、简介

BN是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中“梯度弥散(特征分布较散)”的问题,从而使得训练深层网络模型更加容易和稳定。所以目前BN已经成为几乎所有卷积神经网络的标配技巧了。
从字面意思看来Batch Normalization(简称BN)就是对每一批数据进行归一化,确实如此,对于训练中某一个batch的数据{x1,x2,…,xn},注意这个数据是可以输入也可以是网络中间的某一层输出。在BN出现之前,我们的归一化操作一般都在数据输入层,对输入的数据进行求均值以及求方差做归一化,但是BN的出现打破了这一个规定,我们可以在网络中任意一层进行归一化处理,因为我们现在所用的优化方法大多都是min-batch SGD,所以我们的归一化操作就成为Batch Normalization。

二、BN作用

1.特征分布对神经网络训练的作用

在神经网络的训练过程中,我们一般会将输入样本特征进行归一化处理,使数据变为均值为0,标准差为1的分布或者范围在0~1的分布。因为当我们没有将数据进行归一化的话,由于样本特征分布较散,可能会导致神经网络学习速度缓慢甚至难以学习。
用2维特征的样本做例子。如下两个图
左图 在这里插入图片描述
左图中样本特征的分布为椭圆,当用梯度下降法进行优化学习时,其优化过程将会比较曲折,需要经过好久才能到达最优点;
右图中样本特征的分布为比较正的圆,当用梯度下降法进行优化学习时,其有过的梯度方向将往比较正确的方向走,训练比较快就到达最优点。
因此一个比较好的特征分布将会使神经网络训练速度加快,甚至训练效果更好。

2.BN的作用

但是我们以前在神经网络训练中,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。要知道,虽然我们对输入数据进行了归一化处理,但是输入数据经过 σ ( W X + b ) σ(WX+b) σ(WX+b)这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。
这种在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)。BN在神经网络训练中会有以下一些作用:

  • 加快训练速度
  • 可以省去dropout,L1, L2等正则化处理方法
  • 提高模型训练精度

三、BN的原理

BN可以作为神经网络的一层,放在激活函数(如Relu)之前。BN的算法流程如下图:
在这里插入图片描述

  1. 求每一个小批量训练数据的均值
  2. 求每一个小批量训练数据的方差
  3. 使用求得的均值和方差对该批次的训练数据做归一化,获得0-1分布。其中 ε ε ε是为了避免除数为0时所使用的微小正数。
  4. 尺度变换和偏移:将 x i x_i xi乘以 γ γ γ调整数值大小,再加上 β β β增加偏移后得到 y i y_i yi,这里的 γ γ γ是尺度因子, β β β是平移因子。这一步是BN的精髓,由于归一化后的 x i x_i xi基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,我们引入两个新的参数: γ , β γ,β γ,β γ γ γ β β β是在训练时网络自己学习得到的。

四、BN到底解决了什么

一个标准的归一化步骤就是减均值除方差,那这种归一化操作有什么作用呢?我们观察下图
在这里插入图片描述
在这里插入图片描述
a中左图是没有经过任何处理的输入数据,曲线是sigmoid函数,如果数据在梯度很小的区域,那么学习率就会很慢甚至陷入长时间的停滞。减均值除方差后,数据就被移到中心区域如右图所示,对于大多数激活函数而言,这个区域的梯度都是最大的或者是有梯度的(比如ReLU),这可以看做是一种对抗梯度消失的有效手段。对于一层如此,如果对于每一层数据都那么做的话,数据的分布总是在随着变化敏感的区域,相当于不用考虑数据分布变化了,这样训练起来更有效率。

那么为什么要有第4步,不是仅使用减均值除方差操作就能获得目的效果吗?我们思考一个问题,减均值除方差得到的分布是正态分布,我们能否认为正态分布就是最好或最能体现我们训练样本的特征分布呢?不能,比如数据本身就很不对称(不符合正态分布),或者激活函数未必是对方差为1的数据最好的效果,比如Sigmoid激活函数,在-1~1之间的梯度变化不大,那么非线性变换的作用就不能很好的体现,换言之就是,减均值除方差操作后可能会削弱网络的性能!针对该情况,在前面三步之后加入第4步完成真正的batch normalization。

BN的本质就是利用优化变一下方差大小和均值位置,使得新的分布更切合数据的真实分布,保证模型的非线性表达能力。BN的极端的情况就是这两个参数等于mini-batch的均值和方差,那么经过batch normalization之后的数据和输入完全一样,当然一般的情况是不同的。

五、预测时均值和方差怎么求?

在训练时,我们会对同一批的数据的均值和方差进行求解,进而进行归一化操作。
但是对于预测时我们的均值和方差怎么求呢?
比如我们预测单个样本时,那还怎么求均值和方法呀!其实是这种样子的,对于预测阶段时所使用的均值和方差,其实也是来源于训练集。比如我们在模型训练时我们就记录下每个batch下的均值和方差,待训练完毕后,我们求整个训练样本的均值和方差期望值,作为我们进行预测时进行BN的的均值和方差:
在这里插入图片描述
最后测试阶段,BN的使用公式就是:
在这里插入图片描述
在这里插入图片描述
关于BN的使用位置,在CNN中一般应作用与非线性激活函数之前,s型函数s(x)的自变量x是经过BN处理后的结果。因此前向传导的计算公式就应该是:
在这里插入图片描述
其实因为偏置参数b经过BN层后其实是没有用的,最后也会被均值归一化,当然BN层后面还有个β参数作为偏置项,所以b这个参数就可以不用了。因此最后把BN层+激活函数层就变成了:
在这里插入图片描述

六、卷积神经网络CNN中的BN

注意前面写的都是对于一般情况,对于卷积神经网络有些许不同。
因为卷积神经网络的特征是对应到一整张特征响应图上的,所以做BN时也应以响应图为单位而不是按照各个维度。
比如在某一层,batch大小为m,响应图大小为w×h,则做BN的数据量为m×w×h。

BN在深层神经网络的作用非常明显:若神经网络训练时遇到收敛速度较慢,或者“梯度爆炸”等无法训练的情况发生时都可以尝试用BN来解决。同时,常规使用情况下同样可以加入BN来加速模型训练,甚至提升模型精度。

### 批量归一化深度学习中的作用及实现方法 批量归一化Batch Normalization,BN)是一种用于加速深度神经网络训练的技术,同时还能提高模型的稳定性和性能。它通过规范化每一层的输入,减少内部协变量偏移问题,从而使得网络更容易训练。 #### 1. 批量归一化的概念 批量归一化的核心思想是对每一批数据进行规范化处理,使每一层的输入分布更加稳定[^1]。具体来说,批量归一化通过调整和缩放每一层的激活值,使得这些值的均值接近于零,方差接近于一。这种规范化有助于缓解梯度消失和梯度爆炸的问题,同时允许使用更高的学习率进行训练。 #### 2. 批量归一化的作用 批量归一化的主要作用包括: - **加速训练**:通过减少内部协变量偏移,使得网络能够更快地收敛[^1]。 - **提高模型稳定性**:规范化后的输入分布更加稳定,减少了对初始化参数的敏感性[^3]。 - **正则化效果**:在训练过程中,每个小批次的数据被用来估计均值和方差,这引入了一定程度的噪声,起到了类似 Dropout 的正则化效果[^4]。 #### 3. 批量归一化的实现方法 批量归一化的实现通常分为两部分:训练阶段和预测阶段。 ##### 训练阶段 在训练阶段,批量归一化根据当前小批次数据计算均值和方差,并用它们对输入进行标准化。标准化后的结果会通过两个可学习参数 γ 和 β 进行缩放和平移,以恢复网络的表达能力。公式如下: \[ \mu_B = \frac{1}{m} \sum_{i=1}^m x_i, \quad \sigma_B^2 = \frac{1}{m} \sum_{i=1}^m (x_i - \mu_B)^2 \] \[ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}, \quad y_i = \gamma \hat{x}_i + \beta \] 其中,\( \mu_B \) 和 \( \sigma_B^2 \) 分别表示当前批次的均值和方差,\( \epsilon \) 是一个很小的数值,用于防止除以零。 ##### 预测阶段 在预测阶段,由于无法获得批次信息,批量归一化使用训练过程中累积的移动平均均值和方差来替代当前批次的均值和方差。这样可以确保预测阶段的输出更加稳定。 #### 4. 批量归一化的代码实现 以下是一个基于 PyTorch 的批量归一化实现示例: ```python import torch from torch import nn class BatchNorm(nn.Module): def __init__(self, num_features, eps=1e-5, momentum=0.1): super(BatchNorm, self).__init__() self.eps = eps self.momentum = momentum self.gamma = nn.Parameter(torch.ones(num_features)) self.beta = nn.Parameter(torch.zeros(num_features)) self.register_buffer('moving_mean', torch.zeros(num_features)) self.register_buffer('moving_var', torch.ones(num_features)) def forward(self, X): if self.training: if len(X.shape) == 2: # 全连接层 mean = X.mean(dim=0) var = ((X - mean) ** 2).mean(dim=0) elif len(X.shape) == 4: # 卷积层 mean = X.mean(dim=(0, 2, 3), keepdim=True) var = ((X - mean) ** 2).mean(dim=(0, 2, 3), keepdim=True) else: raise ValueError("Unsupported input shape") X_hat = (X - mean) / torch.sqrt(var + self.eps) self.moving_mean = self.moving_mean * self.momentum + mean * (1 - self.momentum) self.moving_var = self.moving_var * self.momentum + var * (1 - self.momentum) else: X_hat = (X - self.moving_mean) / torch.sqrt(self.moving_var + self.eps) Y = self.gamma * X_hat + self.beta return Y ``` #### 5. 批量归一化的应用 批量归一化广泛应用于各种深度学习模型中,例如卷积神经网络(CNN)、循环神经网络(RNN)以及 Vision Transformer(ViT)。在 CNN 中,批量归一化通常与卷积、激活和池化操作结合使用,以提升模型的鲁棒性和表现[^3]。在 ViT 中,批量归一化常用于自注意力机制之后,以稳定训练过程[^2]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值