精华内容
下载资源
问答
  • LayerNorm

    2021-01-14 10:42:22
    MXnet LayerNorm pytorch LayerNorm 说明 LayerNorm中不会像BatchNorm那样跟踪统计全局的均值方差,因此train()和eval()对LayerNorm没有影响。 LayerNorm参数 torch.nn.LayerNorm( normalized_shape: ...

    MXnet LayerNorm

    在这里插入图片描述

     

    pytorch LayerNorm

    说明

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

    LayerNorm参数

    torch.nn.LayerNorm(
            normalized_shape: Union[int, List[int], torch.Size],
            eps: float = 1e-05,
            elementwise_affine: bool = True)

    normalized_shape

    如果传入整数,比如4,则被看做只有一个整数的list,此时LayerNorm会对输入的最后一维进行归一化,这个int值需要和输入的最后一维一样大。

    • 假设此时输入的数据维度是[3, 4],则对3个长度为4的向量求均值方差,得到3个均值和3个方差,分别对这3行进行归一化(每一行的4个数字都是均值为0,方差为1);LayerNorm中的weight和bias也分别包含4个数字,重复使用3次,对每一行进行仿射变换(仿射变换即乘以weight中对应的数字后,然后加bias中对应的数字),并会在反向传播时得到学习。

    如果输入的是个list或者torch.Size,比如[3, 4]或torch.Size([3, 4]),则会对网络最后的两维进行归一化,且要求输入数据的最后两维尺寸也是[3, 4]。

    • 假设此时输入的数据维度也是[3, 4],首先对这12个数字求均值和方差,然后归一化这个12个数字;weight和bias也分别包含12个数字,分别对12个归一化后的数字进行仿射变换(仿射变换即乘以weight中对应的数字后,然后加bias中对应的数字),并会在反向传播时得到学习。
    • 假设此时输入的数据维度是[N, 3, 4],则对着N个[3,4]做和上述一样的操作,只是此时做仿射变换时,weight和bias被重复用了N次。
    • 假设此时输入的数据维度是[N, T, 3, 4],也是一样的,维度可以更多。

    注意:显然LayerNorm中weight和bias的shape就是传入的normalized_shape。

    eps

    归一化时加在分母上防止除零。

    elementwise_affine

    如果设为False,则LayerNorm层不含有任何可学习参数。

    如果设为True(默认是True)则会包含可学习参数weight和bias,用于仿射变换,即对输入数据归一化到均值0方差1后,乘以weight,即bias。

    LayerNorm前向传播(以normalized_shape为一个int举例)

    1. 如下所示输入数据的shape是(3, 4),此时normalized_shape传入4(输入维度最后一维的size),则沿着最后一维(沿着最后一维的意思就是对最后一维的数据进行操作)求E[x]Var[x],并用这两个结果把batch沿着最后一维归一化,使其均值为0,方差为1。归一化公式用到了eps(\epsilon),即y=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon }}
      tensor = torch.FloatTensor([[1, 2, 4, 1],
                                  [6, 3, 2, 4],
                                  [2, 4, 6, 1]])
      此时E[x]=[2.0, 3.75, 3.25]Var[y]_{biased}=[1.5000, 2.1875, 3.6875](有偏样本方差),归一化后的值如下,举例说明:第0行第2列的数字4,减去第0行的均值2.0等于2,然后除以\sqrt{1.5+\epsilon }=\sqrt{1.50001}=1.224749即2/1.224749≈1.6330。
      [[-0.8165,  0.0000,  1.6330, -0.8165],
       [ 1.5213, -0.5071, -1.1832,  0.1690],
       [-0.6509,  0.3906,  1.4321, -1.1717]]

     

    1. 如果elementwise_affine==True,则对归一化后的batch进行仿射变换,即乘以模块内部的weight(初值是[1., 1., 1., 1.])然后加上模块内部的bias(初值是[0., 0., 0., 0.]),这两个变量会在反向传播时得到更新。
    2. 如果elementwise_affine==False,则LayerNorm中不含有weightbias两个变量,只做归一化,不会进行仿射变换。

     

    内容部分来自 :https://blog.csdn.net/weixin_39228381/article/details/107939602

    展开全文
  • pytorch LayerNorm参数详解,计算过程

    万次阅读 多人点赞 2020-08-11 18:46:30
    LayerNorm中不会像BatchNorm那样跟踪统计全局的均值方差,因此train()和eval()对LayerNorm没有影响。 LayerNorm参数 torch.nn.LayerNorm( normalized_shape: Union[int, List[int], torch.Size], eps: float = ...

    目录

    说明

    LayerNorm参数

    normalized_shape

    eps

    elementwise_affine

    LayerNorm前向传播(以normalized_shape为一个int举例)

    总结


    说明

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

    LayerNorm参数

    torch.nn.LayerNorm(
            normalized_shape: Union[int, List[int], torch.Size],
            eps: float = 1e-05,
            elementwise_affine: bool = True)

    normalized_shape

    如果传入整数,比如4,则被看做只有一个整数的list,此时LayerNorm会对输入的最后一维进行归一化,这个int值需要和输入的最后一维一样大。

    • 假设此时输入的数据维度是[3, 4],则对3个长度为4的向量求均值方差,得到3个均值和3个方差,分别对这3行进行归一化(每一行的4个数字都是均值为0,方差为1);LayerNorm中的weight和bias也分别包含4个数字,重复使用3次,对每一行进行仿射变换(仿射变换即乘以weight中对应的数字后,然后加bias中对应的数字),并会在反向传播时得到学习。

    如果输入的是个list或者torch.Size,比如[3, 4]或torch.Size([3, 4]),则会对网络最后的两维进行归一化,且要求输入数据的最后两维尺寸也是[3, 4]。

    • 假设此时输入的数据维度也是[3, 4],首先对这12个数字求均值和方差,然后归一化这个12个数字;weight和bias也分别包含12个数字,分别对12个归一化后的数字进行仿射变换(仿射变换即乘以weight中对应的数字后,然后加bias中对应的数字),并会在反向传播时得到学习。
    • 假设此时输入的数据维度是[N, 3, 4],则对着N个[3,4]做和上述一样的操作,只是此时做仿射变换时,weight和bias被重复用了N次。
    • 假设此时输入的数据维度是[N, T, 3, 4],也是一样的,维度可以更多。

    注意:显然LayerNorm中weight和bias的shape就是传入的normalized_shape。

    eps

    归一化时加在分母上防止除零。

    elementwise_affine

    如果设为False,则LayerNorm层不含有任何可学习参数。

    如果设为True(默认是True)则会包含可学习参数weight和bias,用于仿射变换,即对输入数据归一化到均值0方差1后,乘以weight,即bias。

    LayerNorm前向传播(以normalized_shape为一个int举例)

    1. 如下所示输入数据的shape是(3, 4),此时normalized_shape传入4(输入维度最后一维的size),则沿着最后一维(沿着最后一维的意思就是对最后一维的数据进行操作)求E[x]Var[x],并用这两个结果把batch沿着最后一维归一化,使其均值为0,方差为1。归一化公式用到了eps(\epsilon),即y=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon }}
      tensor = torch.FloatTensor([[1, 2, 4, 1],
                                  [6, 3, 2, 4],
                                  [2, 4, 6, 1]])
      此时E[x]=[2.0, 3.75, 3.25]Var[y]_{biased}=[1.5000, 2.1875, 3.6875](有偏样本方差),归一化后的值如下,举例说明:第0行第2列的数字4,减去第0行的均值2.0等于2,然后除以\sqrt{1.5+\epsilon }=\sqrt{1.50001}=1.224749即2/1.224749≈1.6330。
      [[-0.8165,  0.0000,  1.6330, -0.8165],
       [ 1.5213, -0.5071, -1.1832,  0.1690],
       [-0.6509,  0.3906,  1.4321, -1.1717]]
    2. 如果elementwise_affine==True,则对归一化后的batch进行仿射变换,即乘以模块内部的weight(初值是[1., 1., 1., 1.])然后加上模块内部的bias(初值是[0., 0., 0., 0.]),这两个变量会在反向传播时得到更新。
    3. 如果elementwise_affine==False,则LayerNorm中不含有weightbias两个变量,只做归一化,不会进行仿射变换。

    总结

    在使用LayerNorm时,通常只需要指定normalized_shape就可以了。

    展开全文
  • BN,LN,IN,GN从学术化上...LayerNorm:channel方向做归一化,算CHW的均值 InstanceNorm:一个channel内做归一化,算H*W的均值 GroupNorm:将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值 ...

    BN,LN,IN,GN从学术化上解释差异:
    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结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。

    在这里插入图片描述

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

    实现公式:
    在这里插入图片描述

    2 GroupNorm

    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,给该层添加可学习的仿射变换参数。

    实现公式:
    在这里插入图片描述

    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

    实现公式:
    在这里插入图片描述

    参考:BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结

    展开全文
  • 网上已经很多博客对Batch NormLayer Norm展开解读,其中这篇博客(https://blog.csdn.net/qq_25737169/article/details/79048516)对Batch Norm的解读是比较好的,也得到了大家的认可;这篇博客...

           Normorlize和Normalization源于正态分布(Normal Distribution),也称为高斯分布(Gaussian Distribution)。因此,一般的Normalization方法是对输入的样本求得一个均值\mu,然后用均值\mu求得样本的方差\sigma ^{2},然后对输入的样本进行归一化,归一化的样本数据服从均值为\mu、方差\sigma ^{2}的正态分布。另外也有采用MinMaxScaler的方法对输入的样本进行归一化的,即把样本的数值通过线性投影到[0,1]范围中。而Batch Norm和Layer Norm一般采取前面这种方法对样本数据进行归一化。

           网上已经很多博客对Batch Norm和Layer Norm展开解读,本文将不会重点介绍其中的归一化方法,而是记录自己对这两种方法的一些理解和思考。如果您感兴趣,非常期待您的讨论。其中此博客对Batch Norm的解读是比较好的,也得到了大家的认可;而此博客对Layer Norm的解读也比较好。如果您对这两个Norm还没有什么了解的话建议优先阅读一下这两篇博客。

     

    一、基础术语的理解

    假设输入的图像shape记为[N, C, H, W]。那么C就是图像领域中的通道数,N是图片的个数,H和W是图像的尺寸。通道数也称之为特征图(Feature Map)。例如,在RGB这样的配色方案中,一张图片(64×64)的通道数为3,分别为红色通道、绿色通道和蓝色通道,每个通道的大小(即H×W)为64×64。如果有100张这样的图片,那么这些图片的shape就是[100, 3, 64, 64]。

     

    二、对于Group Normalization论文中的Figure 2的理解

           图中已经很形象直观地说明了这四种Norm方法的区别。有人认为(H,W)画成图中立方体的不好理解,其实不然,(H,W)是一个二维矩阵,但本质上可以把它拉成一个向量,例如,3×3的矩阵可以reshape成为1×9矩阵,但实际上已经和向量差不多了。也就是说,把(H,W)理解成为一个向量可能更加方便对这个图的理解。

           所以我认为Batch Norm就是利用单个通道呈现的多个样本实现Normalization,然后对Normalization做线性变换。而Layer Norm就是利用单个样本的多个通道实现Normalization。当然,这是在图像领域上的理解。

     

    三、对于Batch Norm实现的代码的疑问

           我在很多博文中看到下面的代码:

    def Batchnorm_simple_for_train(x, gamma, beta, bn_param):
    """
    param:x    : 输入数据,设shape(B,L)
    param:gama : 缩放因子  γ
    param:beta : 平移因子  β
    param:bn_param   : batchnorm所需要的一些参数
    	eps      : 接近0的数,防止分母出现0
    	momentum : 动量参数,一般为0.9, 0.99, 0.999
    	running_mean :滑动平均的方式计算新的均值,训练时计算,为测试数据做准备
    	running_var  : 滑动平均的方式计算新的方差,训练时计算,为测试数据做准备
    """
    	running_mean = bn_param['running_mean']  #shape = [B]
        running_var = bn_param['running_var']    #shape = [B]
    	results = 0. # 建立一个新的变量
        
    	x_mean=x.mean(axis=0)  # 计算x的均值
        x_var=x.var(axis=0)    # 计算方差
        x_normalized=(x-x_mean)/np.sqrt(x_var+eps)       # 归一化
        results = gamma * x_normalized + beta            # 缩放平移
    
        running_mean = momentum * running_mean + (1 - momentum) * x_mean
        running_var = momentum * running_var + (1 - momentum) * x_var
        
        #记录新的值
        bn_param['running_mean'] = running_mean
        bn_param['running_var'] = running_var 
        
    	return results , bn_param

            我很好奇,为什么会有像running_mean, running_var那样的变量,而在实现Batch Norm中的伪代码中没有体现。如果我只是对一组图片做一次Batch Norm,这样的变量是否是必需的呢?这个疑问,我一直找不到答案,希望朋友们看到能够在我的博客留言您的解答。我想尝试对Batch Norm和Layer Norm进行实现(单纯地实现,而不是用于训练),然后对比这两种方法的区别。但在实现的过程中,我不知道running_mean, running_var那样的变量是否为必须的。

     

    四、对于自然语言处理中的Layer Norm的理解

           在自然语言处理中,我们常常会遇到RNN,而基于RNN的模型,也一般会用到Layer Norm。那么用于做归一化的图像数据和序列数据,有什么不一样呢?我认为其中最大的不同之处就是序列数据的长度和图像数据的尺寸是不一样的,这里的不一样不是说序列是一维的、图像是二维的(揣摩一下实际上图像也可以从二维矩阵拉成一维向量),而是说这个一维的序列向量的长度是不一致的,有些长有些短,但是图像数据就不一样,经过对齐预处理后的图像数据,它们的尺寸都是一样的。序列长度的不一致,就说明RNN的深度不是固定的。

           既然Batch Norm和Layer Norm是可比的,那么它们就会有相同之处,那么同样对于输入的数据shape记为[N, C, H, W],我是这样理解这几个符号的意思的:其中N是序列样本的个数;C是一个序列的多个表示通道,比如一个通道用来描述词向量,一个通道用来描述独热编码(这个比如不是很好,个人理解);H和W则不适合用于表示文本数据,因为序列长度不是固定的。如下图所示。

           Batch Norm有两个缺点:一是当batch size很小时计算得到的均值和方差无法反映全局的统计分布导致效果变差,二是无法很好处理序列长度不一致的问题。有人认为,Layer Norm是一个独立于batch size的方法,所以无论样本数多少都不会影响参与Layer Norm计算的数据量,从而解决Batch Norm的两个问题。但是我有点小小的疑问,batch size与Layer Norm是如何独立的?如果batch size不一样,显然所得到的归一化结果肯定也会不一样,那为什么说它们是独立的呢?特别是在CNN模型中,如果我用了Layer Norm,难道真的无论样本数多少都不会影响参与Layer Norm计算的数据量吗?

     

    五、结束语

           Batch Norm和Layer Norm都是比较常用的Normalization方法,二者各有优缺点,没有绝对的好坏之分。根据大家的总结,当在CNN模型时,建议优先尝试使用Batch Norm,而在RNN模型时,建议优先使用Layer Norm。以上均是我的个人理解和疑问,不一定正确,如果您知道答案请大胆献言,我将感激不尽。

     

    展开全文
  • 通过MXnet理解LayerNorm,InstanceNorm

    千次阅读 2018-12-18 16:39:47
    LayerNorm: 可以看一下MXnet的函数定义: 使用函数LayerNorm: 使用公式计算: InstanceNorm 先看一下Mxnet的函数定义: 使用InstanceNorm计算: 使用公式计算: ...
  • 自Batch Norm出现之后,Layer Norm和Weight Norm作为Batch Norm的变体相继出现。最近又出来一个很”简单”的激活函数Selu,能够实现automatic rescale and shift。这些结构都是为了保证网络能够堆叠的更深的基本条件...
  • pytorch中BatchNorm、LayerNorm、InstanceNorm、GroupNorm区别 BN,LN,IN,GN从学术化上解释差异:BatchNorm:batch方向做归一化,算NHW的均值,对小batchsize效果不好;BN主要缺点是对batchsize的大小比较敏感...
  • 这一篇会将BatchNorm, LayerNorm, InstanceNorm和GroupNorm这四种Normailzation的技术一起进行比较和说明. 参考资料 Pytorch Normalization Layers(官方文档使用说明): Normalization layers Pytorch ...
  • LayerNorm:channel方向做归一化,算CHW的均值,主要对RNN作用明显; batch normalization对一个神经元的batch所有样本进行标准化,layer normalization对一个样本同一层所有神经元进行标准化,前者
  • 1. Batch Norm 深度学习的话尤其是在CV上都需要对数据做归一化,因为深度神经网络主要就是为了学习训练数据的分布,并在测试集上达到很好的泛化效果,但是,如果我们每一个batch...2. Layer Norm BN并不适用于RNN...
  • 主要就是了解一下pytorch中的使用layernorm这种归一化之后的数据变化,以及数据使用relu,prelu,leakyrelu之后的变化。 import torch import torch.nn as nn import torch.nn.functional as F class model(nn....
  • LayerNorm InstanceNorm GroupNorm SwitchableNorm AttentiveNorm 主要参考了这篇博客BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结,另外添加了Attent...
  • Batch NormLayer Norm

    2020-05-16 10:36:15
    batch norm: 每一batch的样本具有相同的均值和方差 我们在对数据训练之前会对数据集进行归一化,归一化的目的归一化的目的就是使得预处理的数据被限定在一定的范围内(比如[0,1]或者[-1,1]),从而消除奇异样本数据...
  • Transformer - layer norm

    2021-01-18 23:43:21
    Encoder structure 2. layer normalization: 什么是covariate shift? Covariate shift is the change in the distribution of the covariates specifically, that is, the ...batch norm vs layer nor.
  • BatchNorm和LayerNorm

    千次阅读 2020-03-17 23:29:39
    不适用于可变长序列的训练,如RNN 一、LayerNorm LayerNorm克服了以上BatchNorm的缺点,在特征维度进行归一化,对每个Batch有一个均值和方差,因此不依赖于batch大小,即使batch为1也能使用。 LayerNorm只是归一化的...
  • Solution: The current pytorch version I use is pytorch==0.3.1d Only if upgraded to pytorch==0.4.1, torch provides torch.nn.LayerNorm instance.
  • NotFoundError: Key bert_1/embeddings/LayerNorm/beta not found in checkpoint OutOfRangeError (see above for traceback): Read less bytes than requested NotFoundError: Key _CHECKPOINTABLE_OBJECT_...
  • Batch Norm x = torch.rand(5, 3, 5, 5) #batchsize=4 RGB图像 x1 = x.permute(1, 0, 2, 3).reshape(3, -1) # 对(N, H, W)计算均值方差 mean = x1.mean(dim=1).reshape(1, 3, 1, 1) # x1.mean(dim=1)后维度为(3,) ...
  • <div><p>W tensorflow/core/framework/op_kernel.cc:1502] OP_REQUIRES failed at save_restore_v2_ops.cc:184 : Not found: Key bert/embeddings/LayerNorm/beta/AdamWeightDecayOptimizer not found in checkpoint...
  • BN主要缺点是对batchsize的大小比较敏感,由于每次计算均值和方差是在一个batch上,所以如果batchsize太小,则计算的均值、方差不足以代表整个数据分布LayerNorm:channel方向做归一化,算CHW的均值,主要对RNN作用...
  • 本文主要分析各种norm化方法,包括batch norm, group norm, instance norm,等,用的最多的肯定是batch norm,后续凯明何大佬又提出了gropu norm,但是其实在cv里面还没有真正的普及,尤其是在工业界部署上面,用...
  • 1.综述 在入门深度学习时就深度学习中的一些概念做了一些介绍,但随着学习的不断深入,一些网络优化...归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Nor
  • 参考文章 ... BatchNorm是在batch方向(每个batch的列方向)进行归一化: import torch.nn as nn import torch if __name__ == '__main__': norm = nn.BatchNo.
  • 背景 最近在做视频方向,处理的是时序特征,就想着能不能用Batch Normalization来做视频特征BN层?...Layer Normalization (LN) 的一个优势是不需要批训练,在单条数据内部就能归一化。 对于RNN等时

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,144
精华内容 6,057
关键字:

layernorm