深度学习笔记(三):BatchNorm(BN)层

本文深入探讨了Batch Normalization(BN)层的原理及其实现。从深度学习背景出发,介绍了BN层如何解决深层网络训练不稳定的问题,通过标准化输入数据,加速网络收敛并提升性能。文章详细解释了BN层在训练和测试阶段的计算过程,以及ScaleandShift技巧如何增强BN层的表达能力。

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


学习记录:

  深度学习笔记(一):卷积层+激活函数+池化层+全连接层
  深度学习笔记(二):激活函数总结
  深度学习笔记(三):BatchNorm(BN)层
  深度学习笔记(四):梯度下降法与局部最优解
  深度学习笔记(五):欠拟合、过拟合


   防止过拟合(一):正则化
   防止过拟合(二):Dropout
   防止过拟合(三):数据增强


一、背景

  卷积神经网络的出现,网络参数量大大减低,使得几十层的深层网络成为可能。然而,在残差网络出现之前,网络的加深使得网络训练变得非常不稳定,甚至出现网络长时间不更新或者不收敛的情形,同时网络对超参数比较敏感,超参数的微量扰动也会导致网络的训练轨迹完全改变。

二、提出

  2015 年,Google 研究人员Sergey Ioffe等提出了一种参数标准化(Normalize)的手段,并基于参数标准化设计了 Batch Nomalization(简称 BatchNorm或 BN)层 。BN层提出后:
(1)使得网络的超参数的设定更加自由,比如更大的学习率,更随意的网络初始化等,同时网络的收敛速度更快,性能也更好。
(2)广泛地应用在各种深度网络模型上,卷积层、BN 层,ReLU 层、池化层一度成为网络模型的标配单元,通过堆叠 Conv-BN-ReLU-Pooling 方式往往可以获得不错的模型性能。

三、原理

  网络层的输入x分布相近,并且分布在较小范围内时(如 0 附近),更有利于函数的迭代优化。那么如何保证输入x的分布相近呢?
数据标准化可以实现此目的,通过数据标准化操作可以将数据x映射 x ^ \widehat{x} x
在这里插入图片描述
  其中 μ r \mu_r μr δ r 2 \delta_r^2 δr2来自统计的所有数据x的均值和方差, ϵ \epsilon ϵ是为防止出现除 0的错误而设置的较小数,比如 ϵ = 1 e − 8 \epsilon=1e-8 ϵ=1e8
  很容易很看出来:上面的公式表示的是正太分布。也就是说,通过上面的公式计算,可以将原本随机分布的输入数据x,转化成按正太分布分布的数据 x ^ \widehat{x} x ,从而使得输入网络的数据分布较近,有利于网络的迭代优化。

四、计算

  要使得原本的输入x映射到正太分布的 x ^ \widehat{x} x ,就需要分别计算出 μ r \mu_r μr δ r 2 \delta_r^2 δr2的值,然后带入下面公式,完成转换。
(1)训练阶段
  通过统计可以得到Batch组数据的均值 μ B \mu_B μB和方差 δ B 2 \delta_B^2 δB2,计算公式如下:
在这里插入图片描述
  其中,m为Batch样本数。在实际应用过程中, μ B \mu_B μB δ B 2 \delta_B^2 δB2近似于 μ r \mu_r μr δ r 2 \delta_r^2 δr2。计算时,可直接用 μ B \mu_B μB δ B 2 \delta_B^2 δB2代替。
  因此,在训练阶段,通过下面公式标准化输入:
在这里插入图片描述
(2)测试阶段
  在测试阶段, μ B \mu_B μB δ B 2 \delta_B^2 δB2计算原理和训练阶段相同。需要注意的是,这里的 x i x_i xi是测试集的数据,m是测试集一次输入的batch数。
  因此,在测试阶段,通过下面公式标准化输入:
在这里插入图片描述
注意:测试阶段也进行标准化,并不是为了去优化训练,只是为了和训练解阶段保持一致,这样得到的测试结果才有意义。

五、Scale and Shift

  上述的标准化运算并没有引入额外的待优化变量, μ B \mu_B μB δ B 2 \delta_B^2 δB2 均由统计得到,不需要参与梯度更新。实际上,为了提高 BN 层的表达能力,BN 层作者引入了“scale and shift”技巧,将 x ^ \widehat{x} x 变量再次映射变换:
在这里插入图片描述
  其中 γ \gamma γ参数实现对标准化后的 x ^ \widehat{x} x 再次进行缩放, β \beta β参数实现对标准化的 x ^ \widehat{x} x 进行平移。不同的是, γ \gamma γ β \beta β参数均由反向传播算法自动优化,实现网络层“按需”缩放平移数据的分布的目的。
于是,在测试阶段,标准化公式与缩放平移结合变为:
在这里插入图片描述

六、BN层实现

  在 TensorFlow 中,通过 layers.BatchNormalization()类可以非常方便地实现 BN 层:

# 插入BN层
layers.BatchNormalization()
### ResNet50模型学习笔记概述 ResNet50是一种深度残差网络,属于ResNet系列的一部分。该模型通过引入残差块解决了深神经网络中的梯度消失和退化问题[^1]。 #### 模型架构特点 ResNet50采用了特殊的Bottleneck结构作为其基本构建单元,这种设计使得即使在网络非常深的情况下也能有效传播梯度并保持良好的性能表现[^2]。具体来说: - 输入图像尺寸通常设定为\(224 \times 224\)像素,并且具有个颜色通道。 - 经过一系列卷积操作以及多个阶段的Bottleneck模块处理之后,最终特征图会被压缩到\((2048, 1, 1)\)的形式。 - 接下来是一个全连接用于分类任务,它将上述高维向量映射至指定数量的目标类别上。 #### 关键技术组件 为了提高训练效率与准确性,ResNet50还集成了如下重要机制: - **Batch Normalization (BN)**:应用于每一之前来标准化激活值分布,从而加快收敛速度并且有助于缓解内部协变量偏移现象[^5]。 - **跳跃连接(Skip Connections)**:允许信息绕过多传递,在一定程度上克服了传统CNN难以优化极深次的问题。 ```python import torch.nn as nn class Bottleneck(nn.Module): expansion = 4 def __init__(self, inplanes, planes, stride=1, downsample=None): super(Bottleneck, self).__init__() self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) self.bn1 = nn.BatchNorm2d(planes) self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(planes) self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1, bias=False) self.bn3 = nn.BatchNorm2d(planes * self.expansion) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride def forward(self, x): residual = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) out = self.relu(out) out = self.conv3(out) out = self.bn3(out) if self.downsample is not None: residual = self.downsample(x) out += residual out = self.relu(out) return out ```
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI 菌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值