本文转载自 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.1 \(L^2\)正则化 1.2 \(L^1\)正则化 1.3 总结\(L^2\)与\(L^1\)正则化 2. 作为约束的范数惩罚 3. 欠约束问题 4. 数据 ...

  2. 深度学习中常用的激活函数详解及对比分析(sigmoid)

    Sigmoid函数: 特性: 1.当变量值远离中心轴时,梯度几乎为0,在神经网络的反向传播过程中,链式求导导致经过sigmoid函数之后的梯度 很小,权重值更新较慢 2.计算机执行指数运算较慢 3.s ...

  3. 深度学习中的gelu激活函数详解

    论文:gaussian error linear units (一).什么是激活函数? 激活函数的本质就是给网络模型增加非线性,也就是在wTx+bw^Tx+bwTx+b等线性变换后面加一个非线性变换, ...

  4. iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解

    IIf 返回由逻辑测试确定的两个数值或字符串值之一. 语法 数字 IIf(Logical EXPression, Numeric Expression1, Numeric Expression2) 如 ...

  5. php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念 js里常用的如下 - phpStudy...

    JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...

  6. 深度学习中的归一化方法简介(BN、LN、IN、GN)

    文章目录 1. 协方差偏移 1.1 协方差偏移的概念 1.2 协方差偏移的影响 2. 归一化的通用框架与基本思想 3. 常见的归一化方法 3.1 Batch Nomalization 3.1.1 什么 ...

  7. 深度学习中的归一化方法总结(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 ...

  8. 深度学习 --- 径向基神经网络RBF详解

    上一节我们基本上打开了深度学习的大门,其实下一步应该是卷积神经网络即CNN了,但是呢卷积神经网络的最后一层采用的是径向基神经网络,为了以后到CNN不用再费力气将RBF和保持CNN的整体性和连贯性,因此 ...

  9. 深度学习之---yolov1,v2,v3详解

    (写在前面:如果你想 run 起来,立马想看看效果,那就直接跳转到最后一张,动手实践,看了结果再来往前看吧,开始吧······) 一.YOLOv1 简介 这里不再赘述,之前的我的一个 GitChat ...

最新文章

  1. JAVA min()_Java min()方法
  2. linux syslog用法
  3. KeDelayExecutionThread使用注意
  4. 大数据之“用户行为分析”
  5. Integer对象范围(-128-127)之间(Integer. valueOf()方法)
  6. 深入理解C#:编程技巧总结(二)
  7. 一文搞懂隐马尔可夫模型(HMM)
  8. html range样式修改,自定义(滑动条)input[type=range]样式
  9. exception EOleSysError in module HLServer.exe at 0009C451.问题解决
  10. android 拼图小游戏
  11. Android 10 使用PreferenceScreen的方法
  12. 大数据相关精品资料包分享
  13. engineercms整合mindoc
  14. 用户活跃、留存、流失,终于讲清楚了!
  15. Python3获取拉勾网招聘信息的方法实例
  16. 1000句英语经典口语(10)
  17. excel每页都显示标题的方法
  18. 用Python做数据分析之数据处理及数据提取
  19. Java读取excel表格
  20. 梅森数形如2 ​n ​​ −1的素数称为梅森数(Mersenne Number)。例如2 ​2 ​​ −1=3、2 ​3 ​​ −1=7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了2 ​3

热门文章

  1. 2018ICPC焦作站 B - Ultraman vs. Aodzilla and Bodzilla(贪心)
  2. 学习分享:RNN(持续更新)
  3. Spatial-Spectral Transformer for Hyperspectral Image Classification
  4. 程序员在技术之外,还要掌握一个技能——自我营销能力
  5. java画好看坦克_java绘图,画坦克
  6. 合成孔径雷达影像变化检测研究进展
  7. lua学习笔记---作用域
  8. 从项目的一个 panic 说起:Go 中 Sync 包的分析应用
  9. GoldenGate的安全配置
  10. 神经网络(四)-vanishing gradient problem