【问题标题】:Layer normalization in pytorchpytorch中的层规范化
【发布时间】:2021-05-23 03:35:45
【问题描述】:

我正在尝试测试 PyTorch 的层归一化功能。

但我不知道为什么 b[0] 和 result 这里有不同的值

我是不是做错了什么?

import numpy as np
import torch
import torch.nn as nn

a = torch.randn(1, 5)

m = nn.LayerNorm(a.size()[1:], elementwise_affine= False)

b = m(a)

结果:

input: a[0] = tensor([-1.3549, 0.3857,  0.1110, -0.8456, 0.1486])

output: b[0] = tensor([-1.5561, 1.0386,  0.6291, -0.7967, 0.6851])
mean = torch.mean(a[0])
var = torch.var(a[0])
result = (a[0]-mean)/(torch.sqrt(var+1e-5))

结果:

result = tensor([-1.3918, 0.9289, 0.5627, -0.7126, 0.6128])

而且,对于n*2 normalization,pytorch layer norm的结果总是[1.0 , -1.0](或[-1.0, 1.0])。我不明白为什么。如果您有任何提示,请告诉我

a = torch.randn(1, 2)

m = nn.LayerNorm(a.size()[1:], elementwise_affine= False)

b = m(a)

结果:

b = tensor([-1.0000, 1.0000])

【问题讨论】:

    标签: python pytorch normalization normalize


    【解决方案1】:

    要计算方差,请使用torch.var(a[0], unbiased=False)。然后你会得到同样的结果。默认情况下,pytorch 计算方差的无偏估计。

    【讨论】:

      【解决方案2】:

      对于您的第一个问题,正如@Theodor 所说,您需要在计算方差时使用unbiased=False unbiased。

      仅当您想探索更多时:由于您的输入大小为 5,方差的无偏估计将是有偏估计的 5/4 = 1.25 倍。因为无偏估计在分母中使用N-1 而不是N。因此,您生成的每个result 的值都是sqrt(4/5) = 0.8944 乘以b[0] 的值。

      关于您的第二个问题

      而且,对于 n*2 normalization ,pytorch layer norm的结果总是[1.0 , -1.0]

      这是合理的。假设只有两个元素是ab。因此,均值将是 (a+b)/2 和方差 ((a-b)^2)/4。因此,归一化结果将是[((a-b)/2) / (sqrt(variance)) ((b-a)/2) / (sqrt(variance))],本质上是[1, -1][-1, 1],具体取决于a > ba < b

      【讨论】:

        猜你喜欢
        • 2020-02-10
        • 2021-07-17
        • 2020-01-04
        • 2022-09-28
        • 2020-01-16
        • 2020-05-06
        • 2021-04-13
        • 2021-10-04
        • 2021-05-22
        相关资源
        最近更新 更多