6.5 Batch Normalization

在训练神经网络时,往往需要标准化(normalization)输入数据,使得网络的训练更加快速和有效。

然而SGD(随机梯度下降)等学习算法会在训练中不断改变网络的参数,隐藏层的激活值的分布会因此发生变化,而这一种变化就称为内协变量偏移(Internal Covariate Shift,ICS)。

为了解决ICS问题,批标准化(Batch Normalization)固定激活函数的输入变量的均值和方差,使得网络的训练更快。

除了加速训练这一优势,Batch Normalization还具备其他功能:

①应用了Batch Normalization的神经网络在反向传播中有着非常好的梯度流

这样,神经网络对权重的初值和尺度依赖减少,能够使用更高的学习率,还降低了不收敛的风险。

②Batch Normalization还具有正则化的作用,Dropout也就不再需要了。

③Batch Normalization让深度神经网络使用饱和非线性函数成为可能。

一、Batch Normalization的实现方式

Batch Normalization在训练时,用当前训练批次的数据单独的估计每一激活值 x⁽ᴷ⁾  的均值和方差。为了方便,我们接下来只关注某一个激活值 x⁽ᴷ⁾ ,并将 k 省略掉,现定义当前批次为具有 m 个激活值的 β:

β = Xi (i=1,...,m)

首先,计算当前批次激活值的均值和方差:

然后用计算好的均值 \mu _{\beta } 和 方差 δ_β ² 标准化这一批次的激活值 x_{i},得到\hat{x}_{i} ,为了避免除0,\epsilon 被设置为一个非常小的数字,在PyTorch中,默认设置为 le - 5:

这样,我们就固定了当前批次 β 的分布,使得其服从均值为0、方差为1的高斯分布

但是标准化有可能会降低模型的表达能力,因为网络中的某些隐藏层很有可能就是需要输入数据是非标准化分布的,所以Batch Normalization对标准化的变量 x_{i} 加了一步防射变化

  y _{i} = y\hat{x}_{i} + β

添加的两个参数 y 和 β 用于恢复网络的表示能力,它们和网络原本的权重一起训练。

在PyTorch中,β 初始化为0,而 y 则从均匀分布随机采样。当时,标准化的激活值则完全恢复成原始值,这完全由训练中的网络自行决定。

训练完毕后,y 和 β 作为中间状态被保存下来。

在PyTorch的实现中,Batch Normalization在训练时还会计算移动平均化的均值和方差

running_mean = (1 - momentum)· running_mean + momentum · \mu _{\beta }

running_var = (1-momentum)· running_var + momentum ·  δ_β ²

momentum默认为0.1,running_mean 和 running_var在训练完毕后保留,用于模型验证。

Batch Normalization在训练完毕后,保留了两个参数 β 和 y,以及两个变量running_mean和running_var。

在模型做验证时,做如下变换:

二、Batch Normalization的使用方法

在PyTorch中,nn.BatchNorm1d 提供了Batch Normalization的实现,同样地,它也被当作神经网络中的层使用。

它有两个十分关键的参数

num_features确定特征的数量

affine决定Batch Normalization是否使用仿射映射

1、代码示例:

(1)实例化一个BatchNorm1d对象,它接收特征数量 num_features = 5 的数据,所以模型的两个中间变量 running_mean 和 running_var 就会被初始化为5维的向量,用于统计移动平均化的均值和方差。

(2)输出这两个变量的数据,可以很直观地看到它们的初始化方式

(3)从标准高斯分布采样了一些数据然后提供给Batch Normalization层。

(4)输出变化后的 running_mean 和 running_var,可以发现它们的数值发生了一些变化但是基本维持了标准高斯分布的均值方差数值。

(5)验证了如果我们将模型设置为eval模式,这两个变量不会发生任何变化

输出:

上面代码(1)设置了affine = False,也就是不对标准化后的数据采用仿射变化,关于仿射变换的两个参数  β 和 y 在 BatchNorm1d 中称为 weight 和 bias。

代码(2)输出了这两个变量,显然因为我们关闭了仿射变化,所以这两个变量被设置为None

2、代码示例

下面设置 affine = True,然后输出 m_affine.weight、m_affine.bias,可以看到,y 从均匀分布      U(0,1)随机采样,而 β 被初始化为0。

输出:

应当注意,m_affine.weight 和 m_affine.bias的类型均为Parameter

也就是说它们和线性模型的权重是一种类型,参与模型的训练,而running_mean 和 running_var 的类型为Tensor,这样的变量在PyTorch中称为buffer。

buffer不影响模型的训练,仅作为中间变量更新和保存。

四、代码

import torch
from torch import nnm = nn.BatchNorm1d(num_features=5,affine=False)
print("BEFORE:")
print("running_mean:",m.running_mean)
print("running_var:",m.running_var)for _ in range(100):input = torch.randn(20,5)output= m(input)print("AFTER:")
print("running_mean:",m.running_mean)
print("running_var:",m.running_var)m.eval()
for _ in range(100):input = torch.randn(20,5)output = m(input)print("EVAL:")
print("running_mean:",m.running_mean)
print("running_var:",m.running_var)#########################################print("no affine,gamma:",m.weight)
print("no affine,beta:",m.bias)m_affine = nn.BatchNorm1d(num_features=5,affine=True)
print("")
print("with affine,gamma:",m_affine.weight,type(m_affine.weight))
print("with affine,beta:",m_affine.bias,type(m_affine.bias))

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

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

相关文章

VTK对属性参数的设置,以及用vtkFieldData存储属性数据的方法

数据集的属性(属性数据)是与数据集结构相关联的。而数据集又是建立在点和单元的基础上,所以数据属性很自然地是与点和单元相关联。即每个点或每个单元都有与其对应的数据属性。 数据属性的值称为属性数据。属性数据一般设置为一些有实际意义的…

学生宿舍智能控电柜安装调试技术

学生宿舍智能控电柜安装调试石家庄光大远通电器有限公司宿舍控电限电管理系统是一种用于管理学生宿舍用电的智能系统,主要功能包括: 1.实时监控和控制:该系统能够实时监测和记录宿舍的用电情况,包括电器使用情况、电量消耗等。管理人员可以通过电脑或手机…

探索酷开科技独特魅力|加入酷开会员让观影之旅更畅快|酷开系统

你是否渴望一场震撼心灵的观影之旅?不妨走进酷开系统的世界,徜徉在剧集的海洋,满足无限观影的渴望!还在担心剧荒吗?还在为无聊的周末发愁吗酷开系统为你赶走无聊,它拥有海量的影视资源,4大片库、…

nginx详解(持续更新)

nginx定义 nginx安装 nginx目录 程序相关命令 服务相关命令 虚拟主机(server) 路由匹配(location) 代理(proxy_pass) 正向代理 反向代理 负载均衡(upstream) 负载均衡策略 动静分…

C++ 简单模拟实现 STL 中的 list 与 queue

目录 一,list 1, list 的节点与迭代器 2,list 的数据结构、一些简单的功能、构造函数 3,list 的对元素操作 4,C 11 的一些功能 5,完整代码: 二,queue 一,list std…

开源 OLAP 及其在不同场景下的需求

目录 一、开源 OLAP 综述 二、OLAP场景思考 2.1 面向客户的报表 2.2 面向经营的报表 2.3 末端运营分析 2.4 用户画像 2.5 订单分析 2.6 OLAP技术需求思考 三、开源数据湖/流式数仓解决方案 3.1 离线数仓体系——Lambda架构 3.2 实时数据湖解决方案 3.3 实时分析解决…

Java毕业设计-基于springboot开发的校园台球厅人员与设备管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的校园台球厅人…

Linux-1.常见指令以及权限理解

目录 本节目标 使用 XShell 远程登录 Linux 关于 Linux 桌面 下载安装 XShell 查看 Linux 主机 ip 使用 XShell 登陆主机 XShell 下的复制粘贴 Linux下基本指令 登录Linux服务器 新建多用户 全屏 1.快速认识5~6个命令 2.详细谈论课件的所有指令 01. ls 指令 02…

初识redis(一)

前言 引用的是这本书的原话 Redis[1]是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列…

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查 关系数据库 关系对象数据库(ORM) 应用偏好数据库 分布式数据库 关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。HarmonyOS关系型…

Pandas与Jupyter Notebook的完美结合【第153篇—数据分析】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行数据分析:Pandas与Jupyter Notebook的完美结合 在数据科学和分析…

职场口才提升之道

职场口才提升之道 在职场中,口才的重要性不言而喻。无论是与同事沟通协作,还是向上级汇报工作,亦或是与客户洽谈业务,都需要具备良好的口才能力。一个出色的职场人,除了拥有扎实的专业技能外,还应具备出色…

web自动化测试系列-selenium的安装和运行(一)

目录 web自动化系列之如何安装selenium 1.web自动化中的三大亮点技术 2.web自动化能解决什么问题 ? 3.为什么是selenium ? 4.selenium特点 5.selenium安装 6.下载浏览器及驱动 7.测试代码 web自动化系列之如何安装selenium web自动化 ,一个老生…

【C++】vector介绍

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. vector的介绍3. Member functions3.1 (constructor)3.2 (destructor) 4. Capacity4.1 resize4.2 reserve4.3 shrink_to_fit 5. vector 增删查改5.1 push_back5.2 insert5.3 pop_back5.4 find5.5 erase 1. 前…

【C++】模板与泛型编程

文章目录 1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 4. 非类型模板参数5. 模板的特化5.1 概念5.2 函数模板特化5.3 全特化5.4 偏特化5.5 类模板…

Docker 搭建Redis集群

目录 1. 3主3从架构说明 2. 3主3从Redis集群配置 2.1关闭防火墙启动docker后台服务 2.2 新建6个docker容器实例 2.3 进去任意一台redis容器,为6台机器构建集群关系 2.4 进去6381,查看集群状态 3. 主从容错切换迁移 3.1 数据读写存储 3.1.1 查看…

【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

java switch用法

满足那个条件,就从那个入口进入,没有break就继续(是这样设计的,需要自己加break;),一般都是要加break的。 switch (表达式) 表达式只能是【整型、char、String.】 import java.util.Scanner;public class…

微服务day07 -- ES集群

4.集群 单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点 单点故障问题:将分片数…

Review(一)

🌈个人主页:Rookie Maker 🔥 系列专栏:Rookie review 🏆🏆关注博主,随时获取更多关于IT的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x1f601…