深度学习基础知识-Batch Normalization(BN)超详细解析
一、背景和问题定义
在深层神经网络(Deep Neural Networks, DNNs)中,层与层之间的输入分布会随着参数更新不断发生变化,这种现象被称为内部协变量偏移(Internal Covariate Shift)。具体来说,由于网络层逐层堆叠,各层参数的更新可能会导致前一层的输出分布发生变化,进而影响到下一层的输入分布。这种变化在训练过程中会造成以下几个问题:
- 不稳定的梯度传播:随着层数的加深,输出的分布在层与层之间逐渐偏离原始的分布,使得梯度变得不稳定,从而导致梯度消失或梯度爆炸等问题。
- 训练收敛速度变慢:当每一层的输入分布不稳定时,模型的参数更新会变得难以适应这种分布的变化,导致训练收敛速度减慢,甚至可能无法有效收敛。
- 超参数选择复杂:内部协变量偏移导致模型对学习率、初始化方法、正则化参数等超参数变得极其敏感,调参难度较大。
内部协变量偏移是一种层间输入分布的不断变化问题。其根本原因在于随着模型参数的迭代更新,不同层的输入(即前层的输出)分布会不断改变,特别是在深层神经网络中,叠加的误差会随着层数的增加逐步放大,导致训练过程不稳定。BN 正是通过在每一层应用归一化来抑制这种现象,以确保模型在训练过程中不会因输入分布的变化而陷入梯度消失或爆炸的困境。
BN核心思想是让每一层的输入保持一个稳定的分布,这样模型在训练时可以减少对输入分布变化的依赖,从而加速收敛并提升稳定性。
二、BN的核心思想与数学原理
Batch Normalization 主要分为以下几个步骤来完成输入数据的标准化。
1. Mini-Batch 均值和方差计算
在每一层的输入特征图上,BN会在 mini-batch 的数据上计算其均值和方差。假设当前的 mini-batch 样本为 {x1,x2,…,xm},则对于每一个神经元的输出 xi(这里的 xi 是每个样本在这一层的输出特征)计算均值和方差:
-
均值 μ:
其中 m 表示 mini-batch 的样本数。
-
方差 σ2:
这些 mini-batch 层面的均值和方差用于将数据归一化。
2. 数据归一化
BN 对每一个样本的输出进行归一化处理,通过减去均值后再除以标准差,使得归一化后的输出数据具有零均值和单位方差的标准正态分布。
归一化过程如下:
其中 ϵ 是一个极小值(例如10^{-5}),用于防止分母为零,确保计算的稳定性。
3. 缩放和平移(Scale and Shift)
直接归一化会使得模型的学习能力受到一定限制,因为归一化后的输出被严格限制在均值为 0 和方差为 1 的分布中。为了恢复模型的表达能力,BN 引入了两个可学习的参数:缩放参数 γ 和偏移参数 β,将归一化后的数据进行线性变换:
其中:
- γ控制归一化后的数据分布的尺度(scale)。
- β控制归一化后的数据分布的平移(shift)。
最终输出 yi 保留了归一化带来的优势,同时通过 γ 和 β 恢复模型的表达能力。
4. BN的输出公式
BN 层的完整输出公式为:
5.BN 的反向传播推导
在训练深度神经网络的过程中,BN 层通过链式法则参与反向传播,影响梯度计算。对于 BN 层的每个参数(均值、方差、缩放参数 γ 和偏移参数 β),反向传播过程中的梯度会通过以下步骤计算:
- 对均值 μ 的梯度:由于均值是 mini-batch 中所有样本的平均值,因此对均值的梯度涉及到对每个样本的梯度求和。
- 对方差 σ2 的梯度:在均值的梯度计算之后,方差的梯度可以通过对每个样本归一化结果与均值的偏离程度进行二次求和计算。
- 对缩放参数 γ 和偏移参数 β 的梯度:这两个参数是可学习的,因此它们的梯度会直接来自于 mini-batch 归一化输出结果的梯度,简单而言,γ 的梯度等于归一化后的输入乘上输出梯度,β 的梯度为输出梯度的和。
通过这套反向传播计算,BN 能够自适应地调节均值和方差,使得模型在多次迭代过程中能动态适应输入分布的微小变化。
三、BN的实现步骤
- 在 mini-batch 上计算均值和方差。
- 对 mini-batch 的数据进行标准化,使得标准化后的数据符合零均值和单位方差的分布。
- 引入可学习的参数 γ 和 β,通过线性变换来恢复模型的表达能力。
- 将标准化后的数据重新缩放和平移,得到输出。
四、BN的作用和优势
1. 减少内部协变量偏移
BN 的归一化操作将每层的输入分布限制在一个稳定的范围内,减少了各层之间的协变量偏移,使得模型能够在深层网络中保持输入数据分布的稳定性,从而有效加速训练。
2. 加速训练和提高收敛性
由于每一层的输入分布被稳定化,模型在训练时可以采用更高的学习率,同时 BN 也具有一定的正则化效果,使得模型更容易收敛。此外,BN 在一定程度上减轻了深度模型对参数初始化的敏感性,即使权重初始化较为随意,经过 BN 层后数据分布也能被重新调整到合理范围,从而加快收敛速度。
3. 增加泛化能力,减少过拟合
BN 在每个 mini-batch 上动态计算均值和方差,这一过程中引入了随机性,具有一定的正则化效果,可以减少模型的过拟合。通常,采用 BN 的模型在不使用其他正则化方法(例如 dropout)的情况下也能够获得较好的泛化效果。
4. 减小模型对超参数的敏感性
通过将输入分布标准化,BN 减少了模型对学习率、权重初始化和网络深度的敏感性。这样可以简化网络的超参数调优过程,减轻调参的工作量。
5. 提高梯度传播的稳定性
BN 通过稳定每层的输入分布,确保了梯度的数值稳定性,减少梯度消失和爆炸的风险。这对于训练深层神经网络尤为重要,因为在没有 BN 的情况下,梯度可能在反向传播时逐渐消失或爆炸,导致模型难以有效训练。
五、训练与推理的不同处理方式
BN在训练和推理阶段的处理方式有所不同,这是因为推理阶段不能依赖 mini-batch 上的动态均值和方差计算:
- 训练阶段:在每个 mini-batch 上实时计算均值和方差,进行归一化和再缩放。这一过程能更好地适应输入数据的变化。
- 推理阶段:在推理阶段使用的是训练过程中累积的全局均值和方差,通常通过滑动平均在训练阶段累计。这种处理方式确保推理时的稳定性,并避免动态计算对模型性能的影响。
六、Batch Normalization 的改进方法
1. Layer Normalization (LN)
Layer Normalization(层归一化)针对小 batch size 训练场景提出,它在每个单一样本上计算均值和方差,而非在 mini-batch 上,特别适用于 RNN 等时序模型。LN 可以有效解决 RNN 中的输入分布偏移问题,但在 CNN 中效果不如 BN 明显,因为 CNN 的数据具有更强的空间结构性,使用 LN 会破坏特征图的空间一致性。
2. Instance Normalization (IN)
Instance Normalization(实例归一化)主要用于风格迁移任务中。IN 仅在每个样本的每个通道上进行归一化,忽略了 batch 维度上的信息,适合图像生成任务,尤其是图像风格迁移中的应用。
3. Group Normalization (GN)
Group Normalization(组归一化)是针对小 batch size 训练而设计的另一种方法。GN 将每个特征通道划分为若干组,并在组内进行归一化,从而在小 batch size 条件下仍然获得较好的效果。GN 不依赖于 batch 的大小,因此在批次数据量较小时表现优越。
4. Switchable Normalization (SN)
Switchable Normalization(可切换归一化)是一种动态选择不同归一化方法的策略。SN 根据任务的需求在 BN、LN 和 IN 之间切换,选择合适的归一化操作来提高模型性能。这种动态切换机制通过在训练过程中学习不同归一化方法的权重,从而找到最优的归一化组合。
5. Batch-Instance Normalization (BIN)
Batch-Instance Normalization(批量-实例归一化)结合了 BN 和 IN 的优势。通过同时对 mini-batch 和每个样本进行归一化,BIN 在小 batch size 训练中仍能获得较好的泛化效果,适用于某些生成任务和图像处理任务。
七、BN的局限性
尽管 BN 为深度学习模型带来了显著的训练稳定性提升,但也存在一定的局限性:
1. 对小 batch size 的敏感性
BN 的归一化操作基于 mini-batch 的均值和方差,当 batch size 较小时,均值和方差的估计会变得不稳定,导致 BN 效果变差。为此,通常会使用大于 16 的 batch size 或改用 Layer Normalization(LN)、Instance Normalization(IN)和 Group Normalization(GN)等替代方法。
2. 在循环神经网络(RNN)中的应用效果有限
BN 在循环神经网络中效果不如在卷积神经网络中显著。这是因为 RNN 的数据序列特性较强,batch 内不同样本在时间上的依赖性会影响均值和方差的稳定性。
3. 推理阶段计算成本较高
在推理时,BN 需要使用训练阶段积累的均值和方差进行归一化操作,这增加了额外的计算成本。特别是对推理速度要求较高的应用场景,BN 可能会成为计算瓶颈。
八、Batch Normalization 在不同神经网络中的应用
BN 在不同类型的神经网络中表现有所差异,这与不同网络架构对数据归一化的需求和特性相关。
1. 卷积神经网络(CNN)
在卷积神经网络中,BN 是常用的标准化方法之一。在 CNN 中,BN 操作通常位于卷积层之后和激活函数之前,因为在卷积层之后立即进行归一化有助于保持每个通道的特征分布稳定,从而保证特征图中的空间结构不会因激活函数造成的非线性变化而失真。
2. 全连接神经网络(FCN)
在全连接神经网络中,BN 的使用较为直接。在每一个隐藏层的输出中,直接进行批量归一化操作,即可在各层之间实现有效的输入分布稳定化。BN 的引入显著减少了全连接网络中参数初始化和学习率选择的敏感性,训练收敛速度得到了大幅提升。
3. 循环神经网络(RNN)
在 RNN 中,BN 的应用效果相对有限,因为 RNN 中的数据具有时序相关性,即不同时间步的输入具有一定的依赖性,传统的 BN 操作难以捕捉这种时序特性。针对 RNN 的 BN 变体,诸如层归一化(Layer Normalization) 和实例归一化(Instance Normalization)等更适合处理时序数据。此外,BN 在 RNN 中的使用通常仅限于输入和输出部分的标准化,而非在每个时间步都进行归一化处理。
4. 生成对抗网络(GAN)
在 GAN 中,BN 被广泛应用于生成器和判别器网络中。生成器使用 BN 可以避免梯度消失并提升训练稳定性,而判别器使用 BN 能帮助网络在不同的输入分布之间保持稳定性,尤其是在 GAN 的训练过程中,由于生成样本的不断变化,使得判别器的输入分布也会变化,BN 有助于减轻这种影响。
九、总结
Batch Normalization 通过动态调整神经网络每一层的输入数据分布,有效解决了深度学习中的内部协变量偏移问题。BN 的引入不仅提高了训练效率和模型的稳定性,还在一定程度上提升了模型的泛化能力。
相关文章:

深度学习基础知识-Batch Normalization(BN)超详细解析
一、背景和问题定义 在深层神经网络(Deep Neural Networks, DNNs)中,层与层之间的输入分布会随着参数更新不断发生变化,这种现象被称为内部协变量偏移(Internal Covariate Shift)。具体来说,由…...

基于单片机的燃气报警阀门系统
本设计基于单片机的燃气报警阀门系统,燃气报警阀门系统采用STM32主控制器为核心芯片,外围电路由燃气传感器、OLED液晶显示模块、按键模块、蜂鸣器报警模块、电磁阀以及SIM800模块等模块组成。燃气传感器模块负责采集燃气浓度数据,采集完成由S…...
watch与computed的区别、运用的场景
computed和watch都是响应式数据变化的重要机制,但它们在功能、使用场景和性能表现上有显著的区别。 主要区别 功能和用途 1、computed:计算属性,用于基于其他数据属性进行计算,并返回一个结果。它具有缓存机制,只有当…...

【ESP32+MicroPython】开发环境部署
本教程将指导你如何在Visual Studio Code(VSCode)中设置ESP32的MicroPython开发环境。我们将涵盖从安装Python到烧录MicroPython固件的整个过程,以及如何配置VSCode以便与ESP32进行交互。 准备工作 安装Python 确保你的计算机上安装了Pyth…...

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/143388189 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Ground…...

DAY21|二叉树Part08|LeetCode: 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
目录 LeetCode: 669. 修剪二叉搜索树 基本思路 C代码 LeetCode: 108.将有序数组转换为二叉搜索树 基本思路 C代码 LeetCode: 538.把二叉搜索树转换为累加树 基本思路 C代码 LeetCode: 669. 修剪二叉搜索树 力扣代码链接 文字讲解:LeetCode: 669. 修剪二叉搜…...

在gitlab,把新分支替换成master分支
1、备份master分支,可以打tag 2、删除master分支 正常情况下,master分支不允许删除,需要做两个操作才能删除 a、变更项目默认分支为非master分支,可以先随便选择 b、取消master为非保护分支 操作了上述两步,就可以删…...
使用 Spring Boot 集成 Thymeleaf 和 Flying Saucer 实现 PDF 导出
在 Spring Boot 项目中,生成 PDF 报表或发票是常见需求。本文将介绍如何使用 Spring Boot 集成 Thymeleaf 模板引擎和 Flying Saucer 实现 PDF 导出,并提供详细的代码实现和常见问题解决方案。 目录 一、项目依赖二、创建 Thymeleaf 模板三、创建 PDF 生…...

web——upload1——攻防世界
第一次做木马题目,有点懵逼,浮现一下做题思路 可以上传一个文件,通过学习学习到了一句话木马 一句话木马: 利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过中国菜刀chopper.exe即可…...

nginx 搭建网站
1.查看防火墙状态systemctl status firewalld 2.getenforce 3.安装nginx yum install nginx -y 4.网站信息 echo "welcome to yinchuankejixuanyuan" > /usr/share/nginx/html/index.html 5.查看命令状态 nginx -t 6.重启 systemctl restart nginx...

Java基础-Java中的常用类(上)
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 String类 创建字符串 字符串长度 连接字符串 创建格式化字符串 String 方法 System类 常用方法 方…...
气压仪器智能打气泵方案芯片SIC8833
智能打气泵方案最开始是机械式的开发,后来慢慢地演变成由一个气缸、压力传感器和主控芯片的开发的PCBA方案,它具备小体积、智能数显、预设胎压、动态测量、精准压力检测以及过充过放等功能。 其方案设计原理是利用主控芯片和压力传感器的组合设计&#x…...
软件测试(系统测试)的定位和专业:完善产品;专业;非助手;自动化
软件测试(系统测试)的定位 在研发流程的后端,测试并非无中生有的创举,而是从既有基础(即“1”)出发,致力于推动产品向更高层次(即从“1”到“100”)的跃升与完善。在这一…...

2024 CSS保姆级教程四
CSS中的动画 CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块 即指元素从一种样式逐渐过渡为另一种样式的过程 常见的动画效果有很多,如平移、旋转、缩放等等&#…...

PostgreSQL技术内幕17:PG分区表
文章目录 0.简介1.概念介绍2.分区表技术产生的背景3.分区类型及使用方式4.实现原理4.1 分区表创建4.2 分区表查询4.3 分区表写入4.4 分区表删除 0.简介 本文主要介绍PG中分区表的概念,产生分区表技术的原因,使用方式和其内部实现原理,旨在能…...

群控系统服务端开发模式-应用开发-上传工厂开发
现在的文件、图片等上传基本都在使用oss存储。而现在常用的oss存储有阿里云、腾讯云、七牛云、华为云等,但是用的最多的还是前三种。而我主要封装的是本地存储、阿里云存储、腾讯云存储、七牛云存储。废话不多说,直接上传设计图及说明,就一目…...

【Docker系列】指定系统平台拉取 openjdk:8 镜像
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

语音识别:docker部署FunASR以及springboot集成funasr
内容摘选自: https://github.com/modelscope/FunASR/blob/main/runtime/docs/SDK_advanced_guide_offline_zh.md FunASR FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD…...

Rust项目结构
文章目录 一、module模块1.文件内的module 二、模块化项目结构1.关于module2.各个模块之间互相引用 三、推荐项目结构1.实例 参考 一、module模块 1.文件内的module 关键字:mod 引入模块中的方法 usemod名字:方法名usemod名字.*写全路径 二、模块化项…...

计算并联电阻的阻值
计算并联电阻的阻值 C语言代码C代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 对于阻值为r1和r2的电阻,其并联电阻阻值公式计算如下: R1/(1/r11/r2) 输入 两个电阻阻抗大小,浮…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

PydanticAI快速入门示例
参考链接:https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...