当前位置: 首页 > news >正文

【AI知识点】批归一化(Batch Normalization)

更多AI知识点总结见我的专栏:【AI知识点】
AI论文精读、项目和一些个人思考见我另一专栏:【AI修炼之路】
有什么问题、批评和建议都非常欢迎交流,三人行必有我师焉😁

批归一化(Batch Normalization,BN) 是一种用于加速神经网络训练并提高模型稳定性的方法,通过在每一层对神经网络中的激活值进行标准化,使得每一层的输入保持在一个稳定的分布中,从而缓解梯度消失和梯度爆炸的问题,并加快训练过程。


1. 为什么需要批归一化?

在神经网络训练过程中,尤其是深度神经网络,层与层之间的参数不断更新,这导致网络中的每一层的输入分布会发生变化。这种现象被称为内部协变量偏移(Internal Covariate Shift)。它会导致训练变得更加困难,因为每一层的输入分布不稳定,会使得模型需要不断适应新的数据分布,从而影响模型的训练速度。

为了解决这个问题,批归一化被引入。批归一化通过将每一层的激活值标准化为均值为 0、方差为 1 的分布,使得每一层的输入数据保持相对稳定的分布,从而使得网络可以更快地学习和收敛。


2. 批归一化的基本步骤

批归一化的过程主要包括以下几个步骤:

  1. 计算批次的均值
    对于每一层的输入(例如激活值) x x x,计算其在当前 mini-batch 中的均值:
    μ B = 1 m ∑ i = 1 m x i \mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i μB=m1i=1mxi
    其中 m m m 是 mini-batch 的样本数量, x i x_i xi 是第 i i i 个样本的输入。

  2. 计算批次的方差
    接下来计算 mini-batch 中输入的方差:
    σ B 2 = 1 m ∑ i = 1 m ( x i − μ B ) 2 \sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2 σB2=m1i=1m(xiμB)2

  3. 对输入进行标准化
    使用批次均值 μ B \mu_B μB 和方差 σ B 2 \sigma_B^2 σB2 对每个输入 x i x_i xi 进行标准化处理:
    x ^ i = x i − μ B σ B 2 + ϵ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} x^i=σB2+ϵ xiμB
    其中, ϵ \epsilon ϵ 是一个很小的常数,用来避免除以零的情况。

  4. 尺度变换和偏移
    为了保持网络的表达能力,批归一化还会引入可学习的参数 γ \gamma γ β \beta β,用于对标准化后的结果进行线性变换:
    y i = γ x ^ i + β y_i = \gamma \hat{x}_i + \beta yi=γx^i+β
    其中, γ \gamma γ 是缩放参数, β \beta β 是偏移参数。这一步保证了即使数据经过归一化后,网络仍然能够恢复原始的表示能力。


3. 批归一化的整体公式

结合上面几步,批归一化的整体公式可以表示为:
y i = γ ⋅ x i − μ B σ B 2 + ϵ + β y_i = \gamma \cdot \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} + \beta yi=γσB2+ϵ xiμB+β

在这个公式中, x i x_i xi 是神经网络层中的输入, μ B \mu_B μB σ B 2 \sigma_B^2 σB2 是当前 mini-batch 的均值和方差, γ \gamma γ β \beta β 是可学习的参数,而 ϵ \epsilon ϵ 是一个防止除零的小常数。


4. 批归一化的位置

下图展示了批归一化在神经网络中的位置

在这里插入图片描述
图片来源:https://medium.com/@abheerchrome/batch-normalization-explained-1e78f7eb1e8a

下图对比了批归一化网络(Batch Normalized Network)标准神经网络(Standard Network) 在前向传播过程中的区别。


图片来源:https://gradientscience.org/batchnorm/

  • x x x 是输入特征, W W W 是权重矩阵, y = W ⋅ x y = W \cdot x y=Wx 是通过神经网络层(隐藏层)计算得到的线性输出(也就是未经过激活函数的输出)。
  • 在标准网络中,这个 y y y 直接用于损失计算 L ^ \hat{\mathcal{L}} L^ (或者进入激活函数),但在批归一化网络中,会先对 y y y 进行标准化处理。批归一化后的值 z z z 再用于损失计算 L ^ \hat{\mathcal{L}} L^(或者进入激活函数)。

5. 训练与测试时的区别

批归一化的行为在训练阶段测试阶段是不同的:

  • 训练阶段:每个 mini-batch 内的数据被标准化,使用 mini-batch 的均值和方差进行归一化。
  • 测试阶段:由于测试时无法使用 mini-batch 的均值和方差(因为测试是单独进行的),因此在训练过程中,通常会维护一个全局的均值和方差(通过对所有 mini-batch 的均值和方差进行指数加权平均计算得出)。在测试时,使用这个全局均值和方差进行归一化,而不是使用单个 mini-batch 的均值和方差。

6. 批归一化的优点

  • 加快收敛速度:批归一化能够稳定输入分布,从而加快模型的收敛速度。在实际应用中,批归一化常常使得模型在更少的迭代次数内达到同样甚至更好的效果。
  • 缓解梯度消失/爆炸问题:通过将数据标准化,批归一化可以有效防止梯度消失或梯度爆炸的问题,这对于训练深层神经网络尤其重要。
  • 允许使用更大的学习率:在梯度下降过程中,批归一化减少了权重更新的波动,因此可以使用更大的学习率,从而进一步加速模型的训练。
  • 一定的正则化效果:在一定程度上,批归一化对每个 mini-batch 的操作引入了噪声,这种噪声类似于 Dropout 的作用,能够减少模型过拟合。

7. 批归一化的缺点

  • 对小批量数据效果较差:批归一化依赖于 mini-batch 内的均值和方差。当 mini-batch 的大小较小时,均值和方差可能无法很好地代表整体数据分布,从而影响归一化效果。
  • 引入额外的计算开销:批归一化会增加额外的计算量,特别是在进行大量卷积操作或多层网络时,这可能会对训练时间造成一定影响。
  • 在某些模型中的表现不稳定:批归一化虽然通常提高了模型的稳定性,但在某些极端情况下,特别是序列模型(如 RNN)中,其表现可能不如其他正则化技术(如 Layer Normalization 和 Group Normalization)。

8. 批归一化和其变体的比较

图示

由于批归一化对小批量数据和序列模型效果不佳,一些变体技术被提出,下面这张图形象的解释了几种归一化方法的差别:

在这里插入图片描述

图片来源:https://arxiv.org/abs/1803.08494

这个图展示了四种不同的归一化方法在特征图张量上的操作方式。每个子图展示了一个三维的特征图张量,其中:

  • N 代表 batch 维度(样本数量);
  • C 代表通道(channel)维度,每个通道代表一个特征;
  • H, W 代表空间维度(即图像的高度和宽度)。

蓝色区域代表在归一化过程中使用相同均值和方差的像素点或区域,不同的归一化方法在归一化时对不同维度的数据进行标准化。

Batch Norm 批归一化

  • 批次内所有样本的单个通道上进行归一化。
  • 适用场景:适合大批量数据,适用于大多数神经网络模型,特别是在卷积神经网络(CNN)和全连接网络(FCN)中广泛使用。

Layer Norm 层归一化

  • 单个样本的所有通道上归一化。
  • 适用场景:适合变长序列模型。主要用于循环神经网络(RNN)、自注意力模型(如 Transformer)等序列模型。

Instance Norm 实例归一化

  • 单个样本的单个通道上归一化。
  • 适用场景:适合单样本输入的场景。主要用于图像生成任务,特别是在图像风格转换任务中效果较好。

Group Norm 组归一化

  • 单个样本的多个通道(按照通道分组)上归一化。
  • 适用场景:适合小批量数据。适用于卷积神经网络(CNN)中的小批量训练,以及 mini-batch 太小无法使用批归一化的情况。特别是在计算资源有限的情况下表现出色。

9. 批归一化的实际应用

在深度学习模型中,批归一化几乎已经成为标准组件之一。特别是在卷积神经网络(CNN)和全连接神经网络(FCNN)中,批归一化的使用能显著提高模型训练速度和性能。

常见的应用场景包括:

  • 图像分类:批归一化常用于卷积层之后,以保证卷积输出的稳定性,避免梯度爆炸。这种应用显著提高了像 ResNet、VGG 等经典图像分类模型的训练速度和准确性。
  • 生成对抗网络(GANs):GAN 模型中的 Generator 和 Discriminator 都需要稳定训练,批归一化能帮助平衡两者的训练。
  • 深度神经网络中的每一层:现代的神经网络模型几乎在每一层都使用批归一化。通常,批归一化会被放置在全连接层或卷积层之后,非线性激活函数之前。这种放置方式能最大程度地稳定激活值,防止模型在深度训练中失去学习能力。

10. 批归一化的总结

批归一化(Batch Normalization) 是一种重要的神经网络正则化方法,它通过标准化每一层的输入来加速神经网络的训练过程并提高模型的稳定性。其主要优势包括减少梯度消失和梯度爆炸、加快收敛速度,并提供一定的正则化效果,降低过拟合风险。批归一化在卷积神经网络和全连接神经网络中非常流行,几乎是现代深度学习模型中的标准组件。

相关文章:

【AI知识点】批归一化(Batch Normalization)

更多AI知识点总结见我的专栏:【AI知识点】 AI论文精读、项目和一些个人思考见我另一专栏:【AI修炼之路】 有什么问题、批评和建议都非常欢迎交流,三人行必有我师焉😁 批归一化(Batch Normalization,BN&…...

【低代码】前端低代码开发日记2:遇到的问题(1)双向绑定

在前期的快速迭代阶段,虽然界面有些杂乱,但整体功能尚能凑合运行。真正让人头疼的,还是接下来几个关键功能的实现。 遇到的问题 双向绑定 在Vue中,v-model提供了方便的双向绑定功能,它是modelValue属性和onUpdate:m…...

10.9作业

1、鼠标和键盘事件 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QMouseEvent>widget::widget(QWidget *parent): QWidget(parent), ui(new Ui::widget) {ui->setupUi(this);this->setWindowFlag(Qt::Fram…...

Go 语言中的错误和异常:设计理念与优势

Go 语言中的错误和异常&#xff1a;设计理念与优势 在软件开发中&#xff0c;错误处理是一个至关重要的环节。不同的编程语言对于错误和异常的处理方式各有不同。Go 语言将错误和异常进行了明确区分&#xff0c;这种设计理念带来了许多独特的优势。本文将深入探讨 Go 语言中错误…...

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用&#xff1a;是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络行为有关&#xff0c;记录了当前用户的状态 形式&#xff1a;keyvalue 例如&#xff1a;当我们登录某个账号后&#xff0c;服务器会在cookies进行记录 个人理解&#xf…...

IDEA下“File is read-only”可能原因及“找不到或无法加载主类”问题的解决

1.File is read-only”可能原因 写代码时想要修改这个静态变量的值&#xff0c;把这个语句注释掉&#xff0c;发现在这个文件中File is read-only无法编辑修改&#xff0c;于是想去掉这个状态 网上查看的解释大多是在File栏目或File->File Properties下可以找到Make File W…...

MySQL【知识改变命运】03

表的基本操作 1&#xff1a;查看所有表2&#xff1a;创建表3&#xff1a;查看表结构4&#xff1a;修改表5&#xff1a; 删除表 前言&#xff1a;我们先了解一个知识&#xff1a; MySQL安装后会有MySQL服务——管理多个库——每个库管理多个表——每个表管理多行数据——数据行由…...

【测试】BUG篇——BUG

bug的概念 定义&#xff1a;⼀个计算机bug指在计算机程序中存在的⼀个错误(error)、缺陷(flaw)、疏忽(mistake)或者故障(fault)&#xff0c;这些bug使程序⽆法正确的运⾏。Bug产⽣于程序的源代码或者程序设计阶段的疏忽或者错误。 准确的来说&#xff1a; 当且仅当规格说明&am…...

【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现

高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01; 本章是高阶数据结构笔记的第一篇文章&#xff0c;将分享二叉搜索树的进阶概念及其高效实现的相关知识&#xff0c;欢迎大家阅读&#xff01; &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f3…...

上传本地项目到GitHub远程仓库(极简洁操作版)

第一步&#xff1a;在GitHub创建一个空的仓库 第二步&#xff1a;将仓库克隆&#xff08;下载&#xff09;到本地 第三步&#xff1a;将你要上传的所有文件放到这个克隆的仓库文件夹中 第四步&#xff1a;通过git add .将待上传文件添加到暂存区 此时&#xff0c;可以通过git …...

在安卓中使用 `mobile-ffmpeg` 压缩后的视频,浏览器在线播放提示“没有找到支持的视频格式和 MIME 类型”的解决方案

在安卓中使用 mobile-ffmpeg 压缩后的视频&#xff0c;浏览器在线播放提示“没有找到支持的视频格式和 MIME 类型”的解决方案 你可能在安卓开发中使用了 mobile-ffmpeg 进行视频压缩&#xff0c;而当你尝试在浏览器中在线播放压缩后的视频时&#xff0c;看到提示&#xff1a;…...

C语言指针plus版练习

上期我们讲了进阶的指针&#xff0c;本期内容我们来强化一下上期学的内容 一、字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 1.1 分析题目 假设字符串为abcde&#xff0c;左旋一个以后就变成bcdea&#xff0c;就是把第一个字符移到一个新的变量里面&#…...

Kafka 快速入门

目录 介绍 KafKa 相关术语 ​编辑 Kafka的工作流程 生产者向kafka发送数据的流程 Kafka选择分区的模式 Kafka选择分区的模式 数据消费 kafka的文件存储机制 topic、partition和segment 存储和查找message的过程 数据写入过程 数据查找过程 注意事项 kafka管理UI …...

探索人们最喜爱的AI工具及其应用影响

探索人们最喜爱的AI工具及其应用影响 在科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正在改变我们的生活和工作方式。越来越多的人开始使用AI工具来提高效率、简化流程和推动创新。那么&#xff0c;在众多的AI工具中&#xff0c;哪些是人们最喜欢的…...

c语言位域详解

一、什么是位域 位域是一种可以让结构体的成员变量以位为单位进行存储和操作的特性。位域允许我们精确控制数据的存储方式&#xff0c;而不像普通的整型变量那样固定使用系统规定的字节大小。 通过位域&#xff0c;我们可以在一个整型数据中指定具体的位数来表示某些信息。比…...

如何修改Spring Boot内置容器默认端口

默认情况下&#xff0c;Spring Boot 应用程序在嵌入式 Tomcat 服务器上启动&#xff0c;并监听默认端口 8080。如果您需要将默认的嵌入式服务器端口更改为其他端口号&#xff0c;可以使用以下几种方法之一&#xff1a; 嵌入式服务器配置命令行参数属性文件 在代码里以编程方式…...

STM32自动下载电路分享及注意事项

文章目录 简介ISP下载启动配置 USB转串口芯片CH340C手动isp下载自动isp下载RTS、DTR电平变化分析注意事项 简介 在嵌入式开发中&#xff0c;使用STM32下载程序&#xff0c;可以通过仿真器下载&#xff0c;也可以通过串口下载。在stm32串口下载时&#xff0c;我们需要手动配置启…...

【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。

【深度学习基础模型】极限学习机&#xff08;Extreme Learning Machines, ELM&#xff09;详细理解并附实现代码。 【深度学习基础模型】极限学习机&#xff08;Extreme Learning Machines, ELM&#xff09;详细理解并附实现代码。 文章目录 【深度学习基础模型】极限学习机&a…...

把交换机的两个接口连接起来会怎么样?

当把交换机的两个接口连接起来时&#xff0c;可能会产生网络风暴&#xff0c;具体情况如下&#xff1a; 一、形成环路的过程 如果将交换机的两个端口直接连接&#xff0c;就会在网络中形成一个物理环路。例如&#xff0c;假设交换机有端口 A 和端口 B&#xff0c;用一根网线将…...

无人机陆空双模式。

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...