浅谈深度学习中的不同归一化层

引言

目前,深度学习已经彻底改变了自然语言处理、计算机视觉、机器人等许多子领域。深度学习当然涉及训练精心设计的深度神经网络,并且各种设计决策会影响这些深度网络的训练机制。其中一些设计决策包括

  • 网络中要使用的网络层类型,例如卷积层、线性层、循环层等,以及我们的网络应该有多少层?
  • 我们应该使用什么样的归一化层?
  • 正确的优化损失函数应该是什么?

这些设计决策主要取决于我们试图解决的基本任务,并且需要更深入地了解我们手头的不同选项。在这篇博文中,我将重点讨论第二点“深度学习中的不同归一化层”。概括地说,我将涵盖以下方法。

  • 批量归一化 (Batch Normalization)
  • 权重归一化 (Weight Normalization)
  • 层归一化 (Layer Normalization)
  • 组标准化 (Group Normalization)
  • 权重标准化 (Weight Standarization)

批量归一化 (BN)

批量归一化专注于标准化任何特定层的输入(即来自先前层的激活)。标准化输入意味着网络中任何层的输入应具有大约为零的均值和单位方差。从数学上来说,BN 层通过减去当前 mini-batch 中的输入均值并除以标准差来变换当前 mini-batch 中的每个输入。

但每一层不需要期望输入具有零均值和单位方差,相反,模型可能在使用其他均值和方差时表现更好。因此BN层还引入了两个可学习的参数 γ γ γ β β β

整个图层操作如下。它接受输入 x i x_i xi 并将其转换为 y i y_i yi,如下表所述。

在这里插入图片描述
问题是BN如何帮助NN训练?直观上,在梯度下降中,网络根据任意层的当前输入计算梯度,并在梯度指示的方向上减少权重。但由于各层是一个接一个地堆叠的,由于前一层的权重略有更新,任何特定层的输入数据分布变化太大,因此当前梯度可能会为网络产生次优信号。但 BN 将输入数据的分布限制在网络中的任何特定层(即前一层的激活),这有助于网络为权重更新产生更好的梯度。因此,BN 经常提供非常稳定和加速的培训制度。

然而,以下是批量归一化的一些缺点。

  • BN 在每次训练迭代中计算批量统计数据(小批量均值和方差),因此在训练时需要更大的批量大小,以便能够有效地逼近小批量的总体均值和方差。这使得 BN 更难训练网络用于对象检测、语义分割等应用,因为它们通常使用高输入分辨率(通常大至 1024x 2048),并且较大批量的训练在计算上不可行。
  • BN 不能很好地与 RNN 配合使用。问题是 RNN 与之前的时间戳有循环连接,并且需要为 BN 层中的每个时间步设置单独的 β 和 γ,这反而会增加额外的复杂性,并使 BN 与 RNN 一起使用变得更加困难。
  • 不同的训练和测试计算:在测试(或推理)期间,BN 层不会计算测试数据小批量的均值和方差(上面算法表中的步骤 1 和 2),而是使用根据训练数据计算出的固定均值和方差。这在使用 BN 时需要谨慎,并会带来额外的复杂性。在 pytorch 中,model.eval() 确保在评估模型中设置模型,因此 BN 层利用它来使用根据训练数据预先计算的固定均值和方差。

权重归一化 (WN)

由于Batch Normalization的缺点,T. Saliman和P. Kingma提出了Weight Normalization。他们的想法是将长度与权重向量的方向解耦,从而重新参数化网络以加速训练。

重新参数化对于权重归一化意味着什么?

权重归一化论文的作者建议使用两个参数 g(权重向量的长度)和 v(权重向量的方向)权重向量)代替 w 进行梯度下降,方法如下。
在这里插入图片描述
权重归一化与批量归一化类似,可以加快训练速度,并且与 BN 不同,它也适用于 RNN。但与批归一化相比,使用权重归一化训练深度网络的稳定性明显较差,因此在实践中并未广泛使用。

层归一化 (LN)

受批量归一化结果的启发,Geoffrey Hinton 等人。提出了层归一化,它沿着特征方向而不是小批量方向对激活进行归一化。这通过消除对批次的依赖克服了 BN 的缺点,并且也更容易应用于 RNN。

本质上,层归一化将激活的每个特征归一化为零均值和单位方差。

组归一化 (GN)

与层归一化类似,组归一化也是沿特征方向应用,但与 LN 不同的是,它将特征分为一定的组,并分别对每个组进行归一化。在实践中,组标准化比层标准化表现更好,其参数num_groups被调整为超参数。

如果您觉得 BN、LN、GN 令人困惑,下图非常准确地总结了它们。给定形状(N、C、H、W)的激活,BN 标准化 N 方向,LN 和 GN 标准化 C 方向,但 GN 另外将 C 通道分组并单独标准化各组。

在这里插入图片描述
接下来让我们了解什么是权重标准化。

权重标准化 (WS)

权重标准化正在将任何层的权重转换为具有零均值和单位方差。该层可以是卷积层、RNN 层或线性层等。对于任何具有形状(N,*)的给定层,其中 * 表示 1 个或多个维度,权重标准化,沿 * 维度变换权重。

下面是在 pytorch 中实现 2D 卷积层权重标准化的示例代码。

class Conv2d(nn.Conv2d):
  def __init__(self, in_channels, out_channels, kernel, **kwargs):
    super().__init__(in_channels, out_channels, kernel, **kwargs)
  
  def forward(self, x):        
    weight = self.weight
    weight_mean = weight.mean(dim=(1,2,3), keepdim=True)
    std = weight.std(dim=(1,2,3) + 1e-5
    weight = (weight - weight_mean)/ std
    return F.conv2d(x, weight, self.bias, self.stride, self.padding, self.dilation, self.groups)

基本思想是仅在前向传递期间变换权重并相应地计算激活。 Pytorch 将立即处理向后传递。类似地,它也可以应用于线性层。

最近,Siyun Qiao等人在他们的论文“Micro-Batch Training with Batch-Channel Normalization and Weight Standardization”中介绍了权重标准化,并发现当组归一化与权重标准化混合时,可以即使批量大小小至 1,其性能也优于或与 BN 相当。如下图所示,作者在 Imagenet 分类和 MS COCO 目标检测任务上训练了 GN、BN、GN+WS 与 Resnet50 和 Resnet101 的组合,发现:即使批量比 BN 使用的小得多,GN+WS 的性能始终优于 BN 版本。这在语义分割、实例分割等密集预测任务中引起了人们的关注,由于内存限制,这些任务通常无法使用较大的批量大小进行训练。

在这里插入图片描述
总之,模型中的归一化层通常有助于加速和稳定学习过程。如果大批量训练不是问题并且网络没有任何循环连接,则可以使用批量归一化。对于较小批量或复杂层(例如 LSTM、GRU)的训练,可以尝试使用权重标准化进行组标准化,而不是批量标准化。

需要注意的一件重要事情是,在实践中,归一化层用于 Linear/Conv/RNN 层和 ReLU 非线性(或双曲正切等)之间,以便当激活达到非线性激活函数时,激活同样以零为中心。这可能会避免由于错误的随机初始化而永远不会被激活的死亡神经元,因此可以改善训练。

以下是本文使用的参考文献列表:

  • Ioffe, Sergey, and Christian Szegedy. “Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift.” arXiv preprint arXiv:1502.03167 (2015).
  • Salimans, Tim, and Durk P. Kingma. “Weight normalization: A simple reparameterization to accelerate training of deep neural networks.” Advances in neural information processing systems 29 (2016): 901-909.
  • Ba, Jimmy Lei, Jamie Ryan Kiros, and Geoffrey E. Hinton. “Layer normalization.” arXiv preprint arXiv:1607.06450 (2016).
  • Qiao, Siyuan, et al. “Weight standardization.” arXiv preprint arXiv:1903.10520 (2019)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AudioGPT 语音技术全覆盖:语音识别、增强、分离、风格迁移等 | 开源日报 No.114

stevearc/oil.nvim Stars: 1.7k License: MIT oil.nvim 是一个类似于 vim-vinegar 的文件浏览器,允许您像普通 Neovim 缓冲区一样编辑文件系统。其主要功能包括支持常见插件管理器、通过适配器抽象进行所有文件系统交互以及提供 API 来执行各种操作。该项目的关键…

LLM之RAG实战(五)| 高级RAG 01:使用小块检索,小块所属的大块喂给LLM,可以提高RAG性能

RAG(Retrieval Augmented Generation,检索增强生成)系统从给定的知识库中检索相关信息,从而使其能够生成事实信息、上下文相关信息和特定领域的信息。然而,在有效检索相关信息和生成高质量响应方面,RAG面临…

redis:六、数据过期删除策略(惰性删除、定期删除)和基于redisson实现的分布式锁(看门狗机制、主从一致性)和面试模板

数据过期删除策略 Redis的过期删除策略:惰性删除 定期删除两种策略进行配合使用 惰性删除 惰性删除:设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就…

119. 杨辉三角 II

描述 : 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和 题目 : LeetCode 119. 杨辉三角 II : 119. 杨辉三角 II 分析 : 这道题用二维数组来做 . 解析 : class Solution {pub…

Jmeter接口测试断言

一、响应断言 对服务器的响应接口进行断言校验,来判断接口测试得到的接口返回值是否正确。 二、添加断言 1、apply to: 通常发出一个请求只触发一个请求,所以勾选“main sampie only”就可以;若发一个请求可以触发多个服务器请…

选择排序、快速排序和插入排序

1. 选择排序 xuanze_sort.c #include<stdio.h> #include<stdlib.h>//选择排序void xuanze_sort(int arr[],int sz){//正着for(int i0;i<sz;i){//外层循环从第一个数据开始依次作为基准数据for(int j i1;j<sz;j){//int j i1 因为第一个数据作为了基准数据&…

如何使用 C++ 开发 Redis 模块

在本文中&#xff0c;我将总结 Tair 在使用 C 开发 Redis 模块时遇到的一些问题&#xff0c;并将其提炼为最佳实践。目的是为 Redis 模块的用户和开发人员提供帮助。其中一些最佳实践也可以应用于 C 编程语言和其他编程语言。 介绍 从 Redis 5.0 开始&#xff0c;支持模块插件…

Unity中URP下的顶点偏移

文章目录 前言一、实现思路二、实现URP下的顶点偏移1、在顶点着色器中使用正弦函数&#xff0c;实现左右摇摆的效果2、在正弦函数的传入参数中&#xff0c;加入一个扰度值&#xff0c;实现不规则的顶点偏移3、修改正弦函数的振幅 A&#xff0c;让我们的偏移程度合适4、修改正弦…

【玩转 TableAgent 数据智能分析】股票交易数据分析+预测

文章目录 一、什么是TableAgent二、TableAgent 的特点三、实践前言四、实践准备4.1 打开官网4.2 注册账号4.3 界面介绍4.4 数据准备 五、确认分析需求六、TableAgent体验七、分析结果解读八、总结&展望 一、什么是TableAgent TableAgent是一款面向企业用户的智能数据分析工…

Redis——多级缓存

JVM进程缓存 为了演示多级缓存&#xff0c;这里先导入一个商品管理的案例&#xff0c;其中包含商品的CRUD功能。将来会给查询商品添加多级缓存。 导入Demo数据 1.安装mysql 后期做数据同步需要用到MySQL的主从功能&#xff0c;所以需要在虚拟机中&#xff0c;利用Docker来运…

C++ Qt 开发:ListWidget列表框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍ListWidget列表框组件的常用方法及灵活运用。…

【网络安全】-Linux操作系统基础

文章目录 Linux操作系统目录结构Linux命令格式Linux文件和目录操作命令Linux用户和用户组操作命令Linux查看和操作文件内容命令Linux文件压缩和解压缩命令Linux网络管理命令Linux磁盘管理和系统状态命令Linux安全加固总结 Linux是一个强大的操作系统&#xff0c;广泛用于服务器…

C# WPF上位机开发(进度条操作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 软件上面如果一个操作比较缓慢&#xff0c;或者说需要很长的时间&#xff0c;那么这个时候最好添加一个进度条&#xff0c;提示一下当前任务的进展…

通过层进行高效学习:探索深度神经网络中的层次稀疏表示

一、介绍 深度学习中的层次稀疏表示是人工智能领域日益重要的研究领域。本文将探讨分层稀疏表示的概念、它们在深度学习中的意义、应用、挑战和未来方向。 最大限度地提高人工智能的效率和性能&#xff1a;深度学习系统中分层稀疏表示的力量。 二、理解层次稀疏表示 分层稀疏表…

【MATLAB】数据拟合第11期-基于粒子群迭代的拟合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于粒子群迭代的拟合算法是一种优化技术&#xff0c;它基于粒子群优化算法&#xff08;PSO&#xff09;的基本思想。该算法通过群体中个体之间的协作和信息共享来寻找最优解。 在基于粒…

探索拉普拉斯算子:计算机视觉中用于边缘检测和图像分析的关键工具

一、介绍 拉普拉斯算子是 n 维欧几里得空间中的二阶微分算子&#xff0c;表示为 ∇。它是函数梯度的发散度。在图像处理的上下文中&#xff0c;该运算符应用于图像的强度函数&#xff0c;可以将其视为每个像素具有强度值的二维信号。拉普拉斯算子是计算机视觉领域的关键工具&am…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十五:基础数据模块相关功能实现

一、本章内容 本章使用已实现的公共组件实现系统管理中的基础数据中的验证码管理、消息管理等功能。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址: 基于VUE3+Layui从头搭建通用后台管理系统合集-验证码功能实现 3.2 西瓜…

不做数据采集,不碰行业应用,专注数字孪生PaaS平台,飞渡科技三轮融资成功秘诀

12月15日&#xff0c;飞渡科技在北京举行2023年度投资人媒体见面会&#xff0c;全面分享其产品技术理念与融资之路。北京大兴经开区党委书记、管委会主任常学智、大兴经开区副总经理梁萌、北京和聚百川投资管理有限公司&#xff08;以下简称“和聚百川”&#xff09;投资总监严…

pytorch实现DCP暗通道先验去雾算法及其onnx导出

pytorch实现DCP暗通道先验去雾算法及其onnx导出 简介实现ONNX导出导出测试 简介 最近在做图像去雾&#xff0c;于是在Pytorch上复现了一下dcp算法。暗通道先验去雾算法是大神何恺明2009年发表在CVPR上的一篇论文&#xff0c;还获得了当年的CVPR最佳论文。 实现 具体原理就不…

麻雀规则设计器maquerule

规则设计器 1、应用场景 目前市场上主要的规则引擎中都可以动态解析脚本语言&#xff0c;比如javascript,drools,aviator。这些语言解析在业务上可以两种方式&#xff0c;一种是开发人员直接把相应的脚本写好&#xff0c;跟随程序一起交付&#xff1b; 第二种就是现场的人员可…