pytorch LayerNorm参数详解,计算过程

目录

说明

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就可以了。

你可能感兴趣的:(pytorch,批归一化,深度学习,python,深度学习)