首页 > 其他分享 >LayerNorm 等其他归一化

LayerNorm 等其他归一化

时间:2023-12-18 17:58:44浏览次数:34  
标签:方差 LN 均值 batch Batch 其他 归一化 LayerNorm

LayerNorm 等其他归一化

目录

总览

BatchNorm:沿batch方向上,对 (N、H、W) 做归一化,保留通道C的维度

  • 适用于CNN
  • 对小batchsize效果不好;BN主要缺点是对batchsize的大小比较敏感
  • 由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布

LayerNorm:沿channel方向上,对 (C、H、W) 做归一化,保留通道N的维度

  • 适用序列模型,如:RNN
  • 不适应输入变化很大的数据,大Batch较差

InstanceNorm:在图像像素上,对 (H、W) 做归一化

  • 优点:适用图像风格迁移,因为生成结果主要依赖于某个图像实例,
  • HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
  • 不适应通道之间的相关性较强数据

GroupNorm:将channel分组,对 (C/G、H、W) 做归一化,在不同的Batch Size下具有较大的稳定性

  • 优点:不同Batch Size下具有较大的稳定性
  • 缺点:在大Batch 下性能略差于BN

其他归一化方式

Switchable Normalization(SN,2018年):将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层

Positional Normalization(PN,2019年):提出了位置归一化算法来计算生成网络沿信道维数的统计量;

Batch Group Normalization(BGN,2020年)解决Batch Size退化和饱和的问题;

img

Batch Norm

image.png
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

num_features:	来自期望输入的特征数,该期望输入的大小为’batch_size x num_features [x width]’
eps: 			为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
momentum: 		动态均值和动态方差所使用的动量。默认为0.1。
affine: 		布尔值,当设为true,给该层添加可学习的仿射变换参数。
track_running_stats:布尔值,当设为true,记录训练过程中的均值和方差;

Layer Norm

Layer Normalization的思想与Batch Normalization非常类似,只是Batch Normalization是在每个神经元对一个mini batch大小的样本进行规范化,而Layer Normalization则是在每一层对单个样本的所有神经元节点进行规范化,即C,W,H维度求均值方差进行归一化(当前层一共会求batch size个均值和方差,每个batch size分别规范化)。 LN 不需要批训练,在单条数据内部就能归一化。

论文链接:https://arxiv.org/abs/1607.06450

torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True, device=None, dtype=None)

normalized_shape: 	输入尺寸
[∗×normalized_shape[0]×normalized_shape[1]×…×normalized_shape[−1]]
eps: 				为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
elementwise_affine: 布尔值,当设为true,给该层添加可学习的仿射变换参数。

计算过程

  • 沿着 batch 方向计算每个通道 (C, H, W) 的均值 \(\mu\) 和方差 $ \sigma $

  • 做归一化

  • 引入缩放和平移变量 计算最后的归一化数值 (平移和缩放)

image.png

其中前一项是归一化过程。分母中的 $ \epsilon $ 是一个非常小的数,作用是防止数值计算不稳定。 \(\gamma\) 和 $\beta $ 是仿射参数,将归一化后的数据再次放缩得到新的数据, \(\gamma\) 可以理解为标准差, $\beta $ 可以理解为均值,它们两个一般是可学习的。可以发现,, \(\gamma\) 和 , $\beta $ 是LayerNorm层仅有的可学习参数。

LN优缺点

  • LN针对单个训练样本进行,不依赖于其他数据,可以避免BN中受mini-batch数据分布的影响的问题。

  • LayerNorm中 没有batch的概念,所以不会像BatchNorm那样跟踪统计全局的均值方差,因此train()和eval()对LayerNorm没有影响。

  • LN特别适合处理变长数据,因为是对channel维度做操作(这里指NLP中的hidden维度),和句子长度和batch大小无关

用法上的差异

  • nn.BatchNorm2d(num_features)中的num_features一般是输入数据的第2维(从1开始数),BatchNorm中weight和bias与num_features一致。

  • nn.LayerNorm(normalized_shape)中的 normalized_shape是最后的几维,LayerNorm中weight和bias的shape就是传入的normalized_shape。

  • 输出维度不同,BN 输出维度为C, LN输出维度为 N

transformer 为什么使用 layer norm

  • 测试集中出现比训练集更长的数据,tranformer支持任意长度输入
  • 长短不一的情况下,足够的batch_size的数据,文本数据较图像数据的分布差异更大
  • 可能原因:批归一化会破坏向量的位置信息

Instance Norma, IN

对一个特征图的所有通道做归一化

Group Norma, GN

Group Normalization(GN) 则是提出的一种 BN 的替代方法,Group Normalization 将 channel 分成 num_groups组,每组包含channel / num_groups通道,则feature map变为(N, G, C//G, H, W),然后计算每组 (C//G, H, W)维度平均值和标准差,这样就与batch size无关。

GB的计算与Batch Size无关,因此对于高精度图片小BatchSize的情况也是非常稳定的

GN是为了解决BN对较小的mini-batch size效果差的问题。GN适用于占用显存比较大的任务,例如图像分割。对这类任务,可能 batch size 只能是个位数

GN的主要思想:在 channel 方向 group,然后每个 group 内做 Norm,计算 的均值和方差,这样就与batch size无关,不受其约束。

BN LN IN GN的区别

BN: 这个就是对Batch维度进行计算。所以假设5个100通道的特征图的话,5个batch中每一个通道就会计算出来一个均值方差,最后计算出100个均值方差。

LN: 对一个特征图的所有通道做归一化。5个10通道的特征图,LN会给出5个均值方差;

IN: 仅仅对每一个图片的每一个通道最归一化。也就是说,对 H,W 维度做归一化。假设一个特征图有10个通道,那么就会得到10个均值和10个方差;要是一个batch有5个样本,每个样本有10个通道,那么IN总共会计算出50个均值方差;

GN: 这个是介于LN和IN之间的一种方法。假设Group分成2个,那么10个通道就会被分成5和5两组。然后5个10通道特征图会计算出10个均值方差。

参考资料:

https://www.cnblogs.com/lxp-never/p/11566064.html#blogTitle0 非常详细

https://blog.csdn.net/qq_43426908/article/details/123119919 计算图解

https://mp.weixin.qq.com/s/lTwaTEAVjfOODg-w1Nb8tA

深度学习中的归一化方法总结(BN、LN、IN、GN、SN、PN、BGN、CBN、FRN、SaBN)

https://blog.csdn.net/liuxiao214/article/details/81037416 主要公式实现

标签:方差,LN,均值,batch,Batch,其他,归一化,LayerNorm
From: https://www.cnblogs.com/tian777/p/17911800.html

相关文章

  • 其他
    1mtk启动debuglog以及启动页面 amstart-ncom.debug.loggerui/com.debug.loggerui.MainActivityambroadcast-acom.debug.loggerui.ADB_CMD-ecmd_namestop--eicmd_target127--receiver-foreground--receiver-include-background这个是把所有log都关掉ambroa......
  • go语言window|mac|linux下交叉编译其他平台的软件包
    go语言window|mac|linux下交叉编译其他平台的软件包注意:go1.17发现直接使用set是不起作用的,必须要使用goenv-w来设置一、设置编译环境,需要发布哪个平台Window下1、设置Linux编译环境SETCGO_ENABLED=0setGOARCH=amd64setGOOS=linux2、设置Mac编译环境goenv-wCGO_ENA......
  • 机器学习-线性回归-样本归一化处理-05
    目录1.为什么要对样本进行归一化2.归一化的方式一最大最小值3.归一化的方式二标准归一化1.为什么要对样本进行归一化样本之间的数量级是千差万别有量纲的例如:theta1>>theta2数值小的theta2反而能快速的收敛数值大的theta1收敛较慢出现theta2等待theta......
  • 其他word转化为PDF的方式
    将Word文档转换为PDF格式,除了使用COM自动化外,还有其他一些方法可以在Java中实现。这些方法通常更加可靠和跨平台。以下是一些常用的方法:1.使用ApachePOI和ApachePDFBox这种方法涉及使用ApachePOI库读取Word文档,然后使用ApachePDFBox库将内容写入PDF。这适用......
  • 韩国网费比其他国家贵10倍?—— 因网费太高,直播平台 Twitch 宣布2024年2月退出韩国市场
    看新闻,说直播平台Twitch因为韩国的网费太贵宣布退出韩国,这个新闻给我看纳闷了,从来么有听说过哪个视频或直播公司因为网费贵而关停,这个估计是这种原因关停的第一家吧,于是比较好奇。 相关:https://www.ali213.net/news/html/2023-12/800437.htmlhttps://baijiahao.baidu.com/s?......
  • 十、RabbitMQ其他知识点
    一、幂等性1、概念2、消息重复消费3、解决思路4、消费端的幂等性保障5、唯一ID+指纹码机制Redis原子性(推荐)二、优先级队列1、使用场景2、如何添加3、实战4、测试结果三、惰性队列1、使用场景2、两种模式3、内存开销对比......
  • 【MySQL】回收普通用户对其他库的查询权限,普通用户只能看见自己的表
    如何解决已回收权限的普通用户对其他库的查看权限?正常来说,普通用户自己创建的数据库表的权限无法被回收,如果用户曾经被授权过所有权限,取消权限后,依然可以看见其他库。其原因就是被授予了grantoption权限,需要手动取消"WITHGRANTOPTION"是MySQL中的一个选项,用于将授予权限给其......
  • 填补表格文件日期列中缺少的天数并用0填充该行其他数据:Python
      本文介绍基于Python语言,读取一个不同的行表示不同的日期的.csv格式文件,将其中缺失的日期数值加以填补;并用0值对这些缺失日期对应的数据加以填充的方法。  首先,我们明确一下本文的需求。现在有一个.csv格式文件,其第一列表示日期,用2021001这样的格式记录每一天的日期;其后面几......
  • 为什么要做ERP集成?ERP系统如何与其他业务应用程序集成
    什么是ERP集成?ERP集成是指将企业资源计划(Enterprise Resource Planning,ERP)系统与其他软件应用或业务流程进行无缝连接和整合的过程。ERP系统通常涵盖企业内部的各种功能模块,如财务、供应链管理、生产制造、销售和人力资源等。ETL集成能够将这些功能模块与其他业务系统(如客户关系......
  • 类中创建其他类耦合度高原因
    在面向对象编程中,耦合是指一个类与其他类之间的依赖关系。耦合度高意味着一个类的行为或状态发生变化时,可能会对其他类产生显著的影响,甚至可能需要修改其他类的代码。当在一个类中创建其他类时,这种做法通常被称为嵌套类或内部类。嵌套类能够直接访问其外部类的成员(包括私有成员),因......