什么是Batch Normalization?

news2025/2/5 19:41:49

一、概念

        Batch Normalization是在2015年提出的数据归一化方法,主要用在深度神经网络中激活层之前。它的主要作用是加快模型训练时的收敛速度,使模型训练过程更加稳定,避免梯度爆炸或消失,并起到一定的正则化作用,有时甚至可以替代Dropout。

        BN可以应用于全连接层和卷积层,在非线性映射(激活函数)之前对数据进行规范化,使得结果的输出信号的各个维度均值为0,方差为1。这有助于网络的训练,特别是在梯度消失或爆炸的情况下

二、原理

        BN的核心思想是让每一层的输入保持一个稳定的分布,这样模型在训练时可以减少对输入分布变化的依赖,从而加速收敛并提升稳定性。具体来说,BN包含以下几个步骤:

1、计算小批量数据的均值和方差

         在每一层的输入特征图上,BN会在当前batch的数据上计算其均值和方差。

2、数据归一化

        BN对每一个样本的输出进行归一化处理,通过减去均值后再除以标准差,使得归一化后的输出数据具有零均值和单位方差的标准正态分布

3、缩放和平移

        直接归一化会限制模型的学习能力,因为归一化后的输出被严格限制在均值为0和方差为1的分布中。为了恢复模型的表达能力,BN引入了两个可学习的参数:缩放参数γ和偏移参数β,将归一化后的数据进行线性变换:

y_{i} = \gamma \frac{x_{i}- \mu_{B}}{\sqrt{\sigma^{2}_{B}+ \epsilon}} + \beta

        其中,\mu_{B}是均值;\sigma ^{2}_{B}是方差;\epsilon是一个极小值,用于防止分母为0;缩放参数γ和偏移参数β是可训练参数,参与整个网络的反向传播。

4、示例

        这里我们简单调用torch中的nn.BatchNorm1d来实现Batch Normalization。在torch中,训练模型时缩放参数γ和偏移参数β是自动更新的,不需要我们额外操作。

import torch
import torch.nn as nn

# 假设我们有一个输入张量x和一个batch_size
x = torch.randn(6, 10)  # 例如,10维的特征,6是批次大小
print(x)

# 实现Batch Normalization
batch_norm = nn.BatchNorm1d(10)  # 10是特征的维度
x_bn = batch_norm(x)
print(x_bn)

三、python应用

        这里,我们简单创建一个MLP,并对比BN前后的数据变化。

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

# 设置随机种子以确保结果可复现
torch.manual_seed(0)

# 创建一个简单的模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.linear = nn.Linear(100, 50)  # 一个线性层
        self.bn = nn.BatchNorm1d(50)  # Batch Normalization层

    def forward(self, x):
        x = self.linear(x)
        x = self.bn(x)
        return x

# 创建模型实例
model = SimpleModel()

# 生成模拟数据:100个样本,每个样本100个特征
x = torch.randn(100, 100, requires_grad=True)

# 前向传播,计算BN前的数据
x_linear = model.linear(x)
x_linear = x_linear.detach()

# 计算BN前的数据均值和方差
mean_before = x_linear.mean(dim=0)
var_before = x_linear.var(dim=0)

# 应用BN
x_bn = model(x)
x_bn = x_bn.detach()

# 计算BN后的数据均值和方差
mean_after = x_bn.mean(dim=0)
var_after = x_bn.var(dim=0)

# 绘制BN前后数据的分布
fig, ax = plt.subplots(2, 2, figsize=(12, 8))

# 绘制BN前的数据分布
ax[0, 0].hist(x_linear.detach().numpy().flatten(), bins=30, color='blue', alpha=0.7)
ax[0, 0].set_title('Before BN: Data Distribution')

# 绘制BN后的数据分布
ax[0, 1].hist(x_bn.detach().numpy().flatten(), bins=30, color='green', alpha=0.7)
ax[0, 1].set_title('After BN: Data Distribution')

# 绘制BN前的数据均值和方差
ax[1, 0].bar(range(50), var_before, color='blue', alpha=0.7)
ax[1, 0].set_title('Before BN: Variance per Feature')
ax[1, 0].set_xticks(range(0, 50, 5))

# 绘制BN后的数据均值和方差
ax[1, 1].bar(range(50), var_after, color='green', alpha=0.7)
ax[1, 1].set_title('After BN: Variance per Feature')
ax[1, 1].set_xticks(range(0, 50, 5))

plt.tight_layout()
plt.show()

# 打印BN前后的数据均值和方差
print(f"Mean before BN: {mean_before}")
print(f"Mean after BN: {mean_after}")
print(f"Variance before BN: {var_before}")
print(f"Variance after BN: {var_after}")

四、总结

        BN在模型架构搭建的过程中很常用,但也并不是必要的,例如我们在数据预处理的过程中就对数据进行了归一化的话,BN就显得不那么重要了。当然,加上BN在某些场景中也能够使得模型适应不同批次数据的分布变化,且一定程度可以减少内部协变量偏移。具体是否增加BN可以看加入之后是否提升了模型性能。

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

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

相关文章

【Linux】文件操作的艺术——从基础到精通

🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚前言:一切皆文件 📚一、C语言的文件接口 📖1.文件打…

谷歌流量怎么提升?

用好内容满足用户需求,谷歌流量的提升并非一蹴而就,尤其是行业差异会导致流量效果的巨大差距。无论你做哪个行业,谷歌流量的核心始终是内容,用户需要的是解决问题的信息。相比于花费精力追求热门词,注重内容的深度和实…

运输层3——TCP协议(重点!!!)

目录 一、TCP协议的特点 二、TCP连接 三、TCP的可靠传输(重点!!!) 1、停止等待协议 (1)无差错情况 (2)出现差错 (3)确认分组丢失 和 确认分…

LeetCode题练习与总结:排列硬币--441

一、题目描述 你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。 给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。 示例 1: 输…

数据查找文件夹里Excel、Word文件

我经常需要处理大量的Excel文件,为了解决查找数据时的困扰,我编写了一个小工具。这个工具可以搜索文件夹下的所有Excel文件,只需输入你想查找的字符串,它就会告诉你该字符串出现在哪个Excel文件的哪个表格中。 下载地址&#xff…

每天下午16:20达梦数据库干什么?

家里有达梦的朋友注意了,如果您用的是试用版,那么通常1年后数据库就不允许使用了,这是因为缺少正式许可,通常保存在 $DM_HOME/bin/dm.key 文件中 这个1年的时间从软件发布日期算,例如:从官方网站下载的 dm…

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable

解决方法: 1、先测量pcf8563电源电压,是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间,未初始化,非法,芯片门槛电压检测配置不合理。使用hwclock命令写入一次,即可解决。 hwclock -f /dev/…

SpringBoot 整合 Avro 与 Kafka

优质博文:IT-BLOG-CN 【需求】:生产者发送数据至 kafka 序列化使用 Avro,消费者通过 Avro 进行反序列化,并将数据通过 MyBatisPlus 存入数据库。 一、环境介绍 【1】Apache Avro 1.8;【2】Spring Kafka 1.2&#xf…

【leetcode100】矩阵置零

1、题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 2、初始思路 2…

进程状态的学习

进程状态就是 task_struct 内的一个整数 状态间是可以进行转化的 运行: 每一个框都是进程的task_struct,都有唯一的pcb和pid来标识它的唯一性 让CPU选择一个进程去运行,本质是选择一个进程的PCB去运行,task_struct里一定有内存指…

PDF版地形图矢量出现的问题

项目描述:已建风电场道路测绘项目,收集到的数据为PDF版本的地形图,图上标注了项目竣工时期的现状,之后项目对施工区域进行了复垦恢复地貌,现阶段需要准确的知道实际复垦修复之后的道路及其它临时用地的面积 解决方法&…

Ubuntu20.04离线安装全教程(包括DellR940重置Raid 5、安装Ubuntu、设置root、安装nvidia英伟达显卡驱动及设置防火墙白名单)

本文记录重装Ubuntu20.04的所有记录,从服务器磁盘阵列重新排列、Ubuntu 20.04系统安装、配置root权限、安装Nvidia显卡驱动以及设置防火墙白名单的全部操作。 每一部分参考的博客的出处会放置于段落末尾,表示感谢! 一、重置服务器磁盘阵列&…

华为新手机和支付宝碰一下 带来更便捷支付体验

支付正在变的更简单。 11月26日,华为新品发布会引起众多关注。发布会上,华为常务董事余承东专门提到,华为Mate 70和Mate X6折叠屏手机的“独门支付秘技”——“碰一下”,并且表示经过华为和支付宝的共同优化,使用“碰…

手机中的核心SOC是什么?

大家好,我是山羊君Goat。 常常听说CPU,中央处理器等等的,它是一个电脑或单片机系统的核心,但是对于SOC可能相比于CPU了解的人没有那么广泛。 所以SOC是什么? SOC全称是System on Chip,就是片上系统&#…

理解字母形状,从而获得含义

英文字母,都是象形符号,所以,理解其形象,所象之形,是一项重要的工作,和非常有意义事情。也是我们快速记住大量单词,将单词从底层逻辑开始理清,融会贯通扩展记忆容量的重要办法之一。…

新型大语言模型的预训练与后训练范式,阿里Qwen

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

爬虫专栏第一篇:深入探索爬虫世界:基础原理、类型特点与规范要点全解析

本专栏会对爬虫进行从0开始的讲解,每一步都十分的细致,如果你感兴趣希望多多点赞收藏关注支持 简介:文章对爬虫展开多方面剖析。起始于爬虫的基本概念,即依特定规则在网络抓取信息的程序或脚本,在搜索引擎信息提取上作用显著。阐述其于大数据背景下可助力获取并处理分析数…

LocalDateTime序列化(跟redis有关)

使用过 没成功,序列化后是[2024 11 10 17 22 20]差不多是这样, 反序列化后就是: [ 2024 11 10.... ] 可能是我漏了什么 这是序列化后的: 反序列化后: 方法(加序列化和反序列化注解)&…

UE5 打包报错 Unknown structure 的解决方法

在虚幻引擎5.5 打包报错如下: UATHelper: 打包 (Windows): LogInit: Display: LogProperty: Error: FStructProperty::Serialize Loading: Property ‘StructProperty /Game/Components/HitReactionComponent/Blueprints/BI_ReactionInterface.BI_ReactionInterface…

webrtc ios h264 硬编解码

webrtc ios h264 硬编解码 一 ios 系统支持 从ios8开始,苹果公司开放了硬解码和硬编码API(即 VideoToolbox.framework API) 二 主要api 1 主要解码函数 VTDecompressionSessionCreate // 创建解码 session VTDecompressionSession…