【基础知识】深度学习中各种归一化方式详解
本文转载自 https://blog.csdn.net/qq_23981335/article/details/106572171
仅作记录学习~
总结
BN,LN,IN,GN,WS 从学术上解释差异:
- BatchNorm:batch方向做归一化,算NHW的均值,对小batchsize效果不好;BN主要缺点是对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布;
- LayerNorm:channel方向做归一化,算CHW的均值,主要对RNN作用明显;
- InstanceNorm:一个channel内做归一化,算H*W的均值,用在风格化迁移;因为在图像风格化中,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化。可以加速模型收敛,并且保持每个图像实例之间的独立。
- GroupNorm:将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值;这样与batchsize无关,不受其约束。
- SwitchableNorm:将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
- Weight Standardization:权重标准化,2019年约翰霍普金斯大学研究人员提出。
详细阐述
1. BatchNorm
torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
torch.nn.BatchNorm3d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
参数:
- num_features: 来自期望输入的特征数,该期望输入的大小为’batch_size × num_features [× width]’
- eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
- momentum: 动态均值和动态方差所使用的动量。默认为0.1。 affine: 布尔值,当设为true,给该层添加可学习的仿射变换参数。
- track_running_stats:布尔值,当设为true,记录训练过程中的均值和方差;
公式:
大部分深度网络通常都会使用 BN 层去加速训练和帮助模型更好收敛。虽然 BN 层非常实用,但从研究者的角度看,依然有一些非常显眼的缺点。比如
(1)我们非常缺乏对于 BN 层成功原因的理解;
(2)BN 层仅在 batch size 足够大时才有明显的效果,因此不能用在微批次的训练中。虽然现在已经有专门针对微批次训练设计的归一化方法(GN),但图 1 所示,它很难在大批次训练时媲美 BN 的效果。
2. GroupNorm
FAIR 团队的吴育昕和何恺明提出了组归一化(Group Normalization,简称 GN)的方法,GN 将信号通道分成一个个组别,并在每个组别内计算归一化的均值和方差,以进行归一化处理。GN 的计算与批量大小无关,而且在批次大小大幅变化时,精度依然稳定。通常来说,在使用 Batch Normalization(以下将简称 BN)时,采用小批次很难训练一个网络,而对于不使用批次的优化方法来说,效果很难媲美采用大批次BN时的训练结果。当使用 Group Normalization(以下将简称 GN),且 batch size 大小为 1 时,仅需要多写两行代码加入权重标准化方法,就能比肩甚至超越大批次BN时的训练效果。
torch.nn.GroupNorm(num_groups, num_channels, eps=1e-05, affine=True)
参数:
- num_groups:需要划分为的groups
- num_features: 来自期望输入的特征数,该期望输入的大小为’batch_size x num_features [x width]’
- eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
- momentum: 动态均值和动态方差所使用的动量。默认为0.1。
- affine: 布尔值,当设为true,给该层添加可学习的仿射变换参数。
实现公式:
tf代码如下:
3. InstanceNorm
torch.nn.InstanceNorm1d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
torch.nn.InstanceNorm2d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
torch.nn.InstanceNorm3d(num_features, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)
参数:
- num_features: 来自期望输入的特征数,该期望输入的大小为’batch_size x num_features [x width]’
- eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
- momentum: 动态均值和动态方差所使用的动量。默认为0.1。
- affine: 布尔值,当设为true,给该层添加可学习的仿射变换参数。
- track_running_stats:布尔值,当设为true,记录训练过程中的均值和方差;
实现公式:
4. LayerNorm
torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True)
参数:
- normalized_shape: 输入尺寸 [∗×normalized_shape[0]×normalized_shape[1]×…×normalized_shape[−1]]
- eps: 为保证数值稳定性(分母不能趋近或取0),给分母加上的值。默认为1e-5。
- elementwise_affine: 布尔值,当设为true,给该层添加可学习的仿射变换参数。
实现公式:
5. LocalResponseNorm
torch.nn.LocalResponseNorm(size, alpha=0.0001, beta=0.75, k=1.0)
参数:
- size:用于归一化的邻居通道数
- alpha:乘积因子,Default: 0.0001
- beta :指数,Default: 0.75
- k:附加因子,Default: 1
实现公式:
6. Weight Standardization
- 论文《Micro-Batch Training with Batch-ChannelNormalization and Weight Standardization》 JOURNAL OF LATEX CLASS FILES, VOL. 14, NO. 8, AUGUST
20151- 代码 Github/joe-siyuan-qiao / WeightStandardization
下图是在**网络前馈(青色)和反向传播(红色)**时,进行权重梯度标准化的计算表达式:
以卷积神经网络中的卷积核为例,Pytorch中传统的卷积模块为:
引入WS后的实现为:
# Pytorch
class Conv2d(nn.Conv2d):'''shape:input: (Batch_size, in_channels, H_in, W_in)output: ((Batch_size, out_channels, H_out, W_out))'''def __init__(self, in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1, bias=True):super(Conv2d, self).__init__(in_channels, out_channels, kernel_size, stride,padding, dilation, groups, bias)def forward(self, x):weight = self.weight #self.weight 的shape为(out_channels, in_channels, kernel_size_w, kernel_size_h)weight_mean = weight.mean(dim=1, keepdim=True).mean(dim=2,keepdim=True).mean(dim=3, keepdim=True)weight = weight - weight_meanstd = weight.view(weight.size(0), -1).std(dim=1).view(-1, 1, 1, 1) + 1e-5weight = weight / std.expand_as(weight)return F.conv2d(x, weight, self.bias, self.stride,self.padding, self.dilation, self.groups)
附录
个人理解和代码测试
下图是对BatchNorm, LayerNorm, InstanceNorm和GroupNorm四种Normalization方式的一个汇总(我个人感觉这个图看起来方便一些).
- 图中每一个正方体块表示一个数据(比如说这里一个正方体就是一个图像)
- 每一个正方体中的C, H, W分别表示channel(通道个数), height(图像的高), weight(图像的宽)
- 下图介绍了4中Norm的方式, 如Layer Norm中NHWC----->N111表示是将后面的三个进行标准化, 不与batchsize有关.
- 我们可以看到, 后面的LayerNorm, InstanceNorm和GroupNorm这三种方式都是和Batchsize是没有关系的。
下面我们使用一个(2, 2, 4)的数据来举一个例子, 我们可以将其看成有2个图像组成的单通道的图像,
(1)生成测试使用数据
我们首先生成测试使用的数据, 数据的大小为(2, 2, 4);
x_test = np.array([[[1,2,-1,1],[3,4,-2,2]],[[1,2,-1,1],[3,4,-2,2]]])
x_test = torch.from_numpy(x_test).float()
x_test
"""
tensor([[[ 1., 2., -1., 1.],[ 3., 4., -2., 2.]],[[ 1., 2., -1., 1.],[ 3., 4., -2., 2.]]])
"""
(2)测试LayerNorm与GroupNorm
关于这里的计算的细节, 会在后面的计算细节描述部分进行叙述. 这里就看一下如何使用Pytorch来进行计算, 和最终计算得到的结果。
LayerNorm就是对(2, 2, 4), 后面这一部分进行整个的标准化。可以理解为对整个图像进行标准化。
m = nn.LayerNorm(normalized_shape = [2,4])
output = m(x_test)
output
"""
tensor([[[-0.1348, 0.4045, -1.2136, -0.1348],[ 0.9439, 1.4832, -1.7529, 0.4045]],[[-0.1348, 0.4045, -1.2136, -0.1348],[ 0.9439, 1.4832, -1.7529, 0.4045]]], grad_fn=<AddcmulBackward>)
"""
当GroupNorm中group的数量是1的时候, 是与上面的LayerNorm是等价的.
# Separate 2 channels into 1 groups (equivalent with LayerNorm)
m = nn.GroupNorm(num_groups=1, num_channels=2, affine=False)
output = m(x_test)
output
"""
tensor([[[-0.1348, 0.4045, -1.2136, -0.1348],[ 0.9439, 1.4832, -1.7529, 0.4045]],[[-0.1348, 0.4045, -1.2136, -0.1348],[ 0.9439, 1.4832, -1.7529, 0.4045]]])
"""
(3)测试InstanceNorm和GroupNorm
InstanceNorm就是对(2, 2, 4), 标红的这一部分进行Norm。
m = nn.InstanceNorm1d(num_features=2)
output = m(x_test)
output
"""
tensor([[[ 0.2294, 1.1471, -1.6059, 0.2294],[ 0.5488, 0.9879, -1.6465, 0.1098]],[[ 0.2294, 1.1471, -1.6059, 0.2294],[ 0.5488, 0.9879, -1.6465, 0.1098]]])
"""
上面这种InstanceNorm等价于当GroupNorm时num_groups的数量等于num_channel的数量。
# Separate 2 channels into 2 groups (equivalent with InstanceNorm)
m = nn.GroupNorm(num_groups=2, num_channels=2, affine=False)
output = m(x_test)
output
"""
tensor([[[ 0.2294, 1.1471, -1.6059, 0.2294],[ 0.5488, 0.9879, -1.6465, 0.1098]],[[ 0.2294, 1.1471, -1.6059, 0.2294],[ 0.5488, 0.9879, -1.6465, 0.1098]]])
"""
(4)计算细节描述
我们看一下在上面的LayerNorm和InstanceNorm中的结果是如何计算出来的. 我们只看第一行第一列的数据1进行标准化的过程. 下面是详细的计算的过程(这里的计算结果与上面直接计算的结果是相同的)。
(5)每一种方式适合的场景
- batchNorm是在batch上,对小batchsize效果不好;
- layerNorm在通道方向上,主要对RNN作用明显;
- instanceNorm在图像像素上,用在风格化迁移;
- GroupNorm将channel分组,然后再做归一化, 在batchsize<16的时候, 可以使用这种归一化。
【基础知识】深度学习中各种归一化方式详解相关推荐
- 深度学习中的正则化技术详解
目录 基本概念 1. 参数范数惩罚 1.1 \(L^2\)正则化 1.2 \(L^1\)正则化 1.3 总结\(L^2\)与\(L^1\)正则化 2. 作为约束的范数惩罚 3. 欠约束问题 4. 数据 ...
- 深度学习中常用的激活函数详解及对比分析(sigmoid)
Sigmoid函数: 特性: 1.当变量值远离中心轴时,梯度几乎为0,在神经网络的反向传播过程中,链式求导导致经过sigmoid函数之后的梯度 很小,权重值更新较慢 2.计算机执行指数运算较慢 3.s ...
- 深度学习中的gelu激活函数详解
论文:gaussian error linear units (一).什么是激活函数? 激活函数的本质就是给网络模型增加非线性,也就是在wTx+bw^Tx+bwTx+b等线性变换后面加一个非线性变换, ...
- iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解
IIf 返回由逻辑测试确定的两个数值或字符串值之一. 语法 数字 IIf(Logical EXPression, Numeric Expression1, Numeric Expression2) 如 ...
- php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念
js里常用的如下 - phpStudy...
JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...
- 深度学习中的归一化方法简介(BN、LN、IN、GN)
文章目录 1. 协方差偏移 1.1 协方差偏移的概念 1.2 协方差偏移的影响 2. 归一化的通用框架与基本思想 3. 常见的归一化方法 3.1 Batch Nomalization 3.1.1 什么 ...
- 深度学习中的归一化方法总结(BN、LN、IN、GN、SN、PN、BGN、CBN、FRN、SaBN)
目录 概要 Batch Normalization(BN) (1)提出BN的原因 (2)BN的原理 (3)BN优点 (4)BN缺点 Instance Normalization(IN) (1)提出IN ...
- 深度学习 --- 径向基神经网络RBF详解
上一节我们基本上打开了深度学习的大门,其实下一步应该是卷积神经网络即CNN了,但是呢卷积神经网络的最后一层采用的是径向基神经网络,为了以后到CNN不用再费力气将RBF和保持CNN的整体性和连贯性,因此 ...
- 深度学习之---yolov1,v2,v3详解
(写在前面:如果你想 run 起来,立马想看看效果,那就直接跳转到最后一张,动手实践,看了结果再来往前看吧,开始吧······) 一.YOLOv1 简介 这里不再赘述,之前的我的一个 GitChat ...
最新文章
- JAVA min()_Java min()方法
- linux syslog用法
- KeDelayExecutionThread使用注意
- 大数据之“用户行为分析”
- Integer对象范围(-128-127)之间(Integer. valueOf()方法)
- 深入理解C#:编程技巧总结(二)
- 一文搞懂隐马尔可夫模型(HMM)
- html range样式修改,自定义(滑动条)input[type=range]样式
- exception EOleSysError in module HLServer.exe at 0009C451.问题解决
- android 拼图小游戏
- Android 10 使用PreferenceScreen的方法
- 大数据相关精品资料包分享
- engineercms整合mindoc
- 用户活跃、留存、流失,终于讲清楚了!
- Python3获取拉勾网招聘信息的方法实例
- 1000句英语经典口语(10)
- excel每页都显示标题的方法
- 用Python做数据分析之数据处理及数据提取
- Java读取excel表格
- 梅森数形如2 ​n ​​ −1的素数称为梅森数(Mersenne Number)。例如2 ​2 ​​ −1=3、2 ​3 ​​ −1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了2 ​3
热门文章
- 2018ICPC焦作站 B - Ultraman vs. Aodzilla and Bodzilla(贪心)
- 学习分享:RNN(持续更新)
- Spatial-Spectral Transformer for Hyperspectral Image Classification
- 程序员在技术之外,还要掌握一个技能——自我营销能力
- java画好看坦克_java绘图,画坦克
- 合成孔径雷达影像变化检测研究进展
- lua学习笔记---作用域
- 从项目的一个 panic 说起:Go 中 Sync 包的分析应用
- GoldenGate的安全配置
- 神经网络(四)-vanishing gradient problem