卷积神经网络(CNN)中的批量归一化层(Batch Normalization Layer)

        批量归一化层(BatchNorm层),或简称为批量归一化(Batch Normalization),是深度学习中常用的一种技术,旨在加速神经网络的训练并提高收敛速度。

一、基本思想

        为了让数据在训练过程中保持同一分布,在神经网络的中间层(隐藏层)的一层或多层上进行批量归一化。对于每一个小批次数据(mini-batch),计算该batch的均值与方差,在将线性计算结果送入激活函数之前,先对计算结果进行批量归一化处理,即减均值、除标准差,保证计算结果符合均值为0、方差为1的标准正态分布,然后再将计算结果作为激活函数的输入值进行计算。这样可以使得网络中间层的输入保持相对稳定,有助于解决训练过程中的梯度消失或梯度爆炸问题。

        批量归一化的本质:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的标准正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域

    一般而言,将数据转化为均值为0、方差为1的分布这一过程被称为标准化(Standardization),而归一化(Normalization)一般指的是将一列数据变化到某个固定区间(范围)中。

二、了解几个概念

        1. 批次(batch)

        神经网络处理数据,不是一个数据一个数据的处理,而是一次输入很大一个批次,比如99张图片,输入之后,再划分很多个批次,一次处理一个批次。

图1 神经网络中多批次数据输入

        2. 均值与方差

        在训练过程中,分批次训练,划分batch和batch_size,计算每一个批次(batch)的对应位置的均值和方差。如计算一个批次中所有图片的每一个位置的元素的均值与方差,一张图片有多少个元素,就有多少个均值与方差。最后得到的均值和方差是用向量的形式表现的。

图2 小批次中的计算机过程

        例:一个batch有3个输入,每个输入是一个长度为4的向量

图3 归一化的均值计算

三、若干归一化要解决的问题

        为什么要进行批量归一化,主要是在神经网络训练过程中,存在以下问题:

        1. 协变量偏移

        在机器学习中,一般假设模型输入数据的分布是稳定的,若是模型输入数据的分布发生变化,这种现象被称为协变量偏移(covariate shift);模型的训练集和测试集的分布不一致,也属于协变量偏移现象;同理,在一个复杂的机器学习系统中,也会要求系统的各个子模块在训练过程中输入分布是稳定的,若是不满足,则称为内部协变量偏移(internal covariate shift,ICS)。

图4 训练集和测试集的分布不一致导致的协变量偏移问题

        2. 梯度消失问题

        经过神经网络中多层的变换,很可能使得后面层的输入数据变得过大或过小,从而掉进激活函数(例如Sigmoid、Tanh)的饱和区。

图5 Sigmoid函数存在梯度消失问题

        饱和区的梯度随x的变化y的变化很不明显,即会产生梯度消失问题,进而导致学习过程停止。为防止这个问题,我们希望,数据落入激活函数中间的非饱和区。为了降低内部协变量偏移所带来的负面影响,在训练过程中一般会采用非饱和型激活函数(ReLU)、精细的网络参数初始化,保守的学习率,但这不仅会使得网络的学习速度太慢,还会使得最终效果特别依赖于网络的初始化。

        3. 梯度爆炸问题

        梯度爆炸(Gradient Explosion)指的是在反向传播过程中,梯度值变得非常大,超出了网络的处理范围,从而导致权重更新变得不稳定甚至不收敛的现象。

图6 梯度爆炸问题

        4. 过拟合问题

四、归一化的数学表达

        对全连接层做批量归一化时。通常将批量归一化层置于全连接层中的仿射变换和激活函数之间。设全连接层的输入为u,权重参数和偏差参数分别为W和b,则批量归一化输入必由仿射变换x=Wu+b得到。

图7 全连接层结构

        激活函数(sigmoid)为\sigma,设批量归一化的运算符为BN。那么,使用批量归一化的全连接层的输出为\sigma(BN(x))。u是由多个小批量batch组成,其中一个batch由m个样本组成,仿射变换的输出为一个新的batchB=\left \{ \right.x^{(1)},\cdots , x^{(m)}\left. \right \}B正是批量归一化层的输入,中任意样本x^{(i)}\in \mathbb{R}^{d},1<i<m,批量归一化层的输出y^{(i)}同样是d维向量。

        归一化层的输出y^{(i)}由以下几步求得。

        1. 求小批量B的均值\mu _{B}和方差\sigma _{B}^{2}

        其中的平方计算是按元素求平方。

        2. 标准化和归一化。

        (1)标准化。使用按元素开方和按元素除法的方法对x^{(i)}进行标准化。

        这里\epsilon >0是一个很小的常数,保证分母大于0。

        (2)归一化。在上面标准化的基础上,批量归一化层引入了两个可以学习的模型参数,缩放(scale)参数\gamma和偏移(shift)参数\beta。这两个参数和x^{(i)}形状相同,皆为d维向量。

        3. 计算批量归一化层的输出y^{(i)},参数\gamma和参数\betax^{(i)}分别做按元素乘法(符号⊙)和加法计算:

        至此,我们得到了x^{(i)}的批量归一化的输出y^{(i)}

        注意:当\gamma=\sqrt{\sigma _{B}^{2}+\epsilon }\beta=\mu _{B},可学习的拉伸和偏移两个参数对归一化操作无益,即学出的模型可以不使用批量归一化。

、工作流程

        批量归一化可以看作是在每一层输入和上一层输出之间加入了一个新的计算层,对数据的分布进行额外的约束,来解决以上问题。

        在训练过程中,批量归一化会对每个神经元(卷积核中的一个通道)的激活输入进行如下变换,具体实现步骤如下:

  1. 计算批量均值与方差:对于给定的小批量数据,计算其特征的均值与方差。
  2. 归一化:使用计算出的均值和方差对小批量数据中的每个特征进行归一化处理,确保输出的均值接近0,方差接近1。
  3. 缩放与偏移:引入缩放因子(γ)和偏移因子(β)两个可学习的参数,这两个参数是在训练过程中学习得到的,归一化后的数据会通过这两个参数进行缩放和偏移,允许模型恢复可能被归一化操作去除的有用特征。

        其算法流程如图所示:

图8 归一化算法流程

        在模型推理或测试时,均值和方差不再针对每个小批量实时计算,而是使用整个训练集的移动平均值。

、作用与优势

        1. 加速训练收敛:通过减小内部协变量偏移(Internal Covariate Shift),使得输入分布更加稳定,从而可以使用更高的学习率,加速训练收敛速度,减少训练时间,加速神经网络的训练过程。

        2. 提高稳定性:批量归一化有助于控制梯度的变化范围,防止梯度爆炸或消失,从而提高训练的稳定性。

        3. 提高模型性能:稳定的输入数据分布有助于模型学习到更加鲁棒的特征表示,从而提高模型的性能。

        4. 减少过拟合:BatchNorm层也可以被看作一种正则化方法,因为它可以减少模型的过拟合风险。

        5. 减少对权重初始化的依赖和敏感性:使得网络对权重初始化的依赖减小,简化了超参数的选择。即使初始化不是最优的,模型也能较好地收敛。

、注意事项

        在使用BatchNorm层时,需要注意选择合适的小批量大小(Batch Size),过小或过大的小批量都可能影响BatchNorm层的效果。BatchNorm层通常位于卷积层或全连接层之后,激活函数之前。但也有一些变种将BatchNorm层放在激活函数之后。在训练过程中,BatchNorm层会维护均值和方差的指数移动平均,以供推理阶段使用。因此,在训练结束后,需要保存这些移动平均值作为模型的一部分。

、应用场景

        批量归一化在神经网络中广泛应用,特别是在卷积神经网络(CNN)和全连接网络(FCN)中。当神经网络各层的输入数据分布发生变化时,例如训练过程中每个批次的数据分布不一致,这种情况下适合使用批量归一化来稳定网络的训练。

        而在深度学习框架中,BatchNorm层通常作为一层(如BatchNorm层)来实现,可以轻松地集成到神经网络模型中。在训练阶段,BatchNorm层会根据小批量的统计信息来规范化输入数据;在推理(测试)阶段,BatchNorm层则使用训练过程中计算得到的移动平均均值和方差来规范化输入数据。

、PyTorch实现

        在PyTorch中,可以通过nn.BatchNorm1d、nn.BatchNorm2d和nn.BatchNorm3d等类来实现一维、二维和三维的批量归一化。以下是一个简单的示例,展示了如何在全连接神经网络中使用批量归一化:

pythonimport torchimport torch.nn as nnimport torch.optim as optimclass SimpleNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(input_size, hidden_size)self.bn1 = nn.BatchNorm1d(hidden_size)self.relu = nn.ReLU()self.fc2 = nn.Linear(hidden_size, output_size)def forward(self, x):out = self.fc1(x)out = self.bn1(out)out = self.relu(out)out = self.fc2(out)return out# 定义模型、损失函数和优化器model = SimpleNN(input_size=20, hidden_size=50, output_size=10)criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)# 模拟训练过程for epoch in range(100):inputs = torch.randn(32, 20)  # 小批量数据labels = torch.randint(0, 10, (32,))  # 标签# 前向传播outputs = model(inputs)loss = criterion(outputs, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()

        在这个示例中,nn.BatchNorm1d用于对隐藏层的输出进行批量归一化,从而提高训练效率和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端速通(CSS)

1.CSS介绍 1.什么是CSS? CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用于控制网页的外观和布局的样式表语言。它与HTML&#xff08;超文本标记语言&#xff09;紧密配合&#xff0c;负责页面元素的样式定义&#xff0c;如字体、颜色、尺…

webkit浏览器内核编译(2024年11月份版本)

webkit浏览器内核编译 本文详细介绍了如何安装和配置Webkit的编译环境和工具的安装&#xff0c;以及在Windows上编译和运行WebKit浏览器引擎的过程&#xff0c;包括安装依赖、设置环境变量、生成解决方案并最终运行附带的MiniBrowser示例。 一、WebKit简介 WebKit 是一个开源的…

SQL注入--理论--堆叠注入

什么是堆叠注入&#xff1f; 在SQL语句操作的时候&#xff0c;每个语句都是以分号;标志结尾的。 在我们注入的过程中&#xff0c;通过使用多个分号同时进行多个SQL语句的注入&#xff0c;就是堆叠注入。 例如&#xff1a; ?inject1;handler 1919810931114514 open;handler 1…

鸿蒙操作系统(HarmonyOS)

鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司开发的一款面向未来的全场景智慧生活操作系统。它旨在为不同设备的智能化、互联与协同提供统一的语言。鸿蒙提出的基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;是其核心竞争力之一。这一理念不仅使得…

C++趣味编程玩转物联网:用树莓派Pico实现一位数码管动态显示

七段数码管是一种经典的电子显示器件&#xff0c;广泛应用于数字时钟、电子仪表等设备。本文将通过树莓派Pico开发板&#xff0c;介绍如何用C代码控制一位七段数码管显示数字。作为一个嵌入式开发项目&#xff0c;这不仅是初学者理解数码管工作原理的好机会&#xff0c;也是C开…

本机上装好的ubuntu 全部的开发软件 如何备份以后移到另一台电脑上 还不会出现引导错误?

在Ubuntu系统上备份和迁移所有开发软件&#xff0c;可以按照以下步骤进行&#xff1a; 步骤 1: 备份已安装的软件列表 你可以使用dpkg命令来生成已安装软件的列表&#xff0c;并将其保存到一个文件中&#xff1a; dpkg --get-selections > installed_packages.txtDiffCop…

【Cesium】--viewer,entity,dataSource

viewer&#xff0c;entity&#xff0c;dataSource的关系 viewer.entities.add({}) 通过viwer.entities.add()直接加载的entity&#xff0c;默认是在viewer.entities(即viewer.dataSourceDisplay.defaultDataSource.entities)中&#xff0c;不会加载在viewer.dataSource中。 w…

Paddle Inference部署推理(三)

三&#xff1a;Paddle Inference推理 导出模型 Paddle Inference支持使用飞桨静态图模型进行推理&#xff0c;您可以通过以下两种方式获取静态图模型&#xff1a; &#xff08;1&#xff09;飞桨框架导出推理模型 飞桨框架在训练模型过程中&#xff0c;会在本地存储最终训练…

【国产MCU系列】-GD32F470-内部集成电路总线接口(I2C)

内部集成电路总线接口(I2C) 文章目录 内部集成电路总线接口(I2C)1、GD32F4的I2C模块介绍2、I2C控制器寄存器列表3、I2C工作模式3.1 I2C通讯流程3.2 主机模式发送数据流程3.3 主机模式数据接收流程3.4 DMA模式下数据传输4、I2C控制器相关API介绍5、I2C使用示例5.1 I2C主机模…

什么是Spring IOC和Spring AOP?

IOC就是控制反转&#xff0c;控制反转就是对组件对象控制权的转移&#xff0c;从程序代码本身转移到了外部容器。它把由程序代码直接操控的对象的调用权交给容器&#xff0c;通过容器实现对象组件的管理和装配。 Srping IOC负责创建对象&#xff0c;管理对象&#xff0c;装配对…

非交换几何与黎曼ζ函数:数学中的一场革命性对话

非交换几何与黎曼ζ函数&#xff1a;数学中的一场革命性对话 非交换几何&#xff08;Noncommutative Geometry, NCG&#xff09;是数学的一个分支领域&#xff0c;它将经典的几何概念扩展到非交换代数的框架中。非交换代数是一种结合代数&#xff0c;其中乘积不是交换性的&…

【CSP CCF记录】201803-1第13次认证 跳一跳

题目 样例输入 1 1 2 2 2 1 1 2 2 0 样例输出 22 思路 没有技术含量的一道题&#xff0c;解题的关键是理解游戏规则。用state标记跳跃状态&#xff0c;以下是对游戏规则的分析&#xff1a; 1. state1&#xff0c;跳到方块上但没跳到中心&#xff0c;得1分 2. state2&#xf…

ALSA(2) ---- DMA实践

DMA实践 本篇文章主要是学习alsa高级音频框架总结而来&#xff0c;ALSA的Platform侧ADMA&#xff0c;学习总结而来&#xff0c;adma驱动来源于telechips产商805x芯片&#xff1b; ADMA物理拓扑图 ADMA物理拓扑图如上&#xff0c;RX和TX ADMA是接收和发送控制器&#xff0c;Ar…

【机器学习】——卷积与循环的交响曲:神经网络模型在现代科技中的协奏

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

c++(入门)

1. 引用 引用的定义 引用是另一个变量的别名&#xff0c;它在声明时必须被初始化&#xff0c;并且一旦初始化后&#xff0c;它就始终引用那个变量。 引用的语法 引用的声明方式是在变量名前加上&符号。 引用的特点 引用必须在声明时初始化。引用一旦初始化后&#x…

stm32内部高速晶振打开作为主时钟

首先建议你别这么干&#xff0c;因为内部晶振特别容易受温度等外界影响&#xff0c;很容易卡死或堵死程序 我是因为没画外部晶振电路&#xff0c;所以只能开内部晶振来作为时钟 适用于stm32f103系列 把下面的代码换掉源文件里的时钟源配置 /* 开启HSI 即内部晶振时钟 */RCC…

Nginx防御机制

文章目录 1.访问控制1.1基于 IP 的访问限制1.2基于用户认证的访问控制 2.防止 DDoS 攻击2.1连接数限制2.2请求速率限制 3.缓存机制3.1内容缓存 4.安全协议与加密4.1SSL/TLS 加密4.2HTTP/2 支持 5.防 SQL 注入和 XSS 攻击5.1输入验证与过滤 6.防盗链6.1基于 Nginx 的防盗链配置方…

lua除法bug

故事背景&#xff0c;新来了一个数值&#xff0c;要改公式。神奇的一幕出现了&#xff0c;公式算出一个非常大的数。排查是lua有一个除法bug,1除以大数得到一个非常大的数。 function div(a, b)return tonumber(string.format("%.2f", a/b)) end print(1/73003) pri…

代码管理之Gitlab

文章目录 Git基础概述场景本地修改未提交&#xff0c;拉取远程代码修改提交本地&#xff0c;远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区&#xff1a;本地电脑上看到的目录&#xff1b; repository 本地仓库&#xff1a;就是工作区中隐…

嵌入式系统应用-LVGL的应用-智能时钟 part 3

智能时钟 part 3 6 光强传感器6.1 光敏电阻介绍6.2 电路图介绍 7 ADC模块7.1 ADC模块介绍7.2 adc 转化流程7.3 规则通道和注入通道7.4 DMA 搬运7.5 TIM触发ADC和DMA搬运数据的原理 8 代码8.1 配置头文件8.2 初始化ADC 和DMA8.3 创建线程读取 值8.4 演示效果 由于丢失温湿度传感…