繁体   English   中英

pytorch 中的层标准化

[英]Layer normalization in pytorch

我正在尝试测试 PyTorch 的层规范化 function。

但我不知道为什么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归一化, pytorch 层范数的结果始终为[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])

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

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

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

关于你的第二个问题

并且,对于 n*2 归一化,pytorch 层范数的结果始终为[1.0, -1.0]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM