Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

批量归一化(BN)通过减少神经网络内部的协变量漂移来加速训练过程。BN在训练时利用小批量统计进行归一化,同时引入缩放和平移参数以保持表达能力。这有助于缓解梯度消失问题,允许使用更大学习率,甚至在某些情况下可以去除dropout和减少L2正则化。实验表明,加入BN后的网络训练稳定性提高,输出激活分布更稳定。

Background

Covariance shift
——when the input distribution to a learning system changes, it is said to experience covariance shift.

当这种现象发生在多层神经网络之间时,即前面层参数的改变,使得后面层的输入分布发生改变时,就叫Internal covariance shift


这里写图片描述

前面层的参数变化会影响当前层的输入分布,缺点有二:
1.大大减慢当前层的参数学习速度(当前层也是一个learning system,一旦其输入的分布改变,就要调整参数来适应这种分布);
2.若使用sigmoid激活函数,当前层的输入可能会处于sigmoid函数的非线性饱和区域,进而导致梯度消失现象。在BN出现以前,通常采用ReLU(x)=max(0,x)激活函数或使用较小的learning rate来解决这个问题。

因此我们想到,如果前面层的输出activation(即当前层的输入input)的分布是一定的呢?那样就会减少下一层输入陷入sigmoid饱和非线性区域的可能,梯度不再容易消失,从而加快训练速度。

Whitening

对某一层的输出activations进行白化操作(零均值、单位方差、去相关),可以使得这些activations的分布保持恒定,从而减小internal covarian

### Batch NormalizationBN)原理 Batch Normalization 由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出,旨在解决深度神经网络训练过程中的内部协变量偏移(Internal Covariate Shift)问题。内部协变量偏移指的是在训练过程中,随着前一层参数的更新,每一层输入的分布会发生变化,这使得后续层需要不断适应新的输入分布,从而导致训练速度变慢。 BN 的核心思想是对每一批次的输入数据进行归一化处理,使得输入数据的均值为 0,方差为 1。对于一个输入的 mini - batch 数据 $x = \{x_1, x_2, \cdots, x_m\}$,BN 的计算步骤如下: 1. 计算 mini - batch 的均值 $\mu_B$: $\mu_B=\frac{1}{m}\sum_{i = 1}^{m}x_i$ 2. 计算 mini - batch 的方差 $\sigma_B^2$: $\sigma_B^2=\frac{1}{m}\sum_{i = 1}^{m}(x_i - \mu_B)^2$ 3. 对输入数据进行归一化: $\hat{x}_i=\frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}}$,其中 $\epsilon$ 是一个很小的常数,用于防止分母为 0。 4. 引入可学习的参数 $\gamma$ 和 $\beta$ 进行缩放和平移: $y_i=\gamma\hat{x}_i+\beta$ 通过这种方式,BN 不仅将输入数据归一化到标准正态分布,还通过可学习的参数 $\gamma$ 和 $\beta$ 让模型能够根据自身需求调整数据的分布,增强了模型的表达能力。 ### Batch Normalization 在 YOLOv2 中的应用 YOLOv2 是一种目标检测算法,在其网络结构中引入了 Batch Normalization 带来了多方面的好处: - **加速训练**:由于 BN 解决了内部协变量偏移问题,使得网络在训练过程中每一层的输入分布更加稳定,减少了后续层对输入分布变化的适应过程,从而加快了训练速度。在 YOLOv2 中,使用 BN 后可以显著减少训练所需的迭代次数。 - **提高模型泛化能力**:BN 具有一定的正则化作用,它在一定程度上减少了模型对特定训练数据的依赖,降低了过拟合的风险。在 YOLOv2 中,使用 BN 可以提高模型在不同数据集和场景下的检测性能。 - **去除 Dropout**:在 YOLOv2 中,由于 BN 的正则化效果,模型不再需要使用 Dropout 来防止过拟合。Dropout 是一种随机丢弃神经元的正则化方法,而 BN 通过对数据分布的调整达到了类似的效果,并且避免了 Dropout 在训练和测试阶段不同处理方式带来的问题。 以下是一个简单的 PyTorch 代码示例,展示了如何在神经网络中使用 Batch Normalization: ```python import torch import torch.nn as nn # 定义一个简单的卷积神经网络,包含 BN 层 class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1) self.bn1 = nn.BatchNorm2d(16) self.relu = nn.ReLU() def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu(x) return x # 创建模型实例 model = SimpleCNN() # 生成随机输入数据 input_data = torch.randn(1, 3, 32, 32) # 前向传播 output = model(input_data) print(output.shape) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值