Pytorch LayerNorm 的平均值和 std div 在推理时不固定

问题描述 投票:0回答:1

我正在努力在 torch.LayerNorm 之后重新创建输入。据我所知,LayerNorm 的平均值和标准差在推理阶段是固定的。因此,我认为我可以提取这些因素并从 LayerNorm 输出重新创建原始输入。

我已经成功提取了权重和偏差,它们不一定与均值和标准差相同,因为 LayerNorm 有自己的权重和偏差参数。我的权重和偏差参数融合了各种因素,但它们成功地从 LayerNorm 输出重新创建了原始输入。

但是,当我将这些提取的权重和偏差参数应用到另一个输入张量并期望 LayerNorm 以与之前的输入相同的方式工作时,我获得了完全不同的输出。我假设 LayerNorm 计算了第二个输入的新平均值和标准差值,从而导致了差异。但我很困惑为什么 LayerNorm 计算第二个输入的平均值和标准差;它们在推理过程中应该保持固定。 下面是我的代码

layer = layer().eval()
with torch.inference_mode():
    out = layer(input_data)

w = torch.zeros(len(out[0, :, 0]))
b = torch.zeros(len(out[0, :, 0]))

for i in range(len(out[0, :, 0])):
    w[i] = (input_data[0, i, 0] - input_data[0, i, 10]) / (out[0, i, 0] - out[0, i, 10])
    b[i] = (input_data[0, i, 0] * out[0, i, 10] - input_data[0, i, 10] * out[0, i, 0]) / (out[0, i, 10] - out[0, i, 0])

for i1 in range(len(input_remade[0, :, 0])):
    input_remade[0, i1, :] = out[0, i1, :] * w[i1] + b[i1]
print(torch.sum(input_remade - input_data))


input_data2 = torch.randn(1, 577, 768)
input_remade2 = torch.randn(1, 577, 768)
with torch.inference_mode():
    out2 = layer(input_data2)

for i1 in range(len(input_remade2[0, :, 0])):
    input_remade2[0, i1, :] = out2[0, i1, :] * w[i1] + b[i1]
print(torch.sum(input_remade2 - input_data2))

w1 = torch.zeros(len(out2[0, :, 0]))
b1 = torch.zeros(len(out2[0, :, 0]))

for i in range(len(out2[0, :, 0])):
    w1[i] = (input_data2[0, i, 0] - input_data2[0, i, 10]) / (out2[0, i, 0] - out2[0, i, 10])
    b1[i] = (input_data2[0, i, 0] * out2[0, i, 10] - input_data2[0, i, 10] * out2[0, i, 0]) / (out2[0, i, 10] - out2[0, i, 0])

for i1 in range(len(input_remade2[0, :, 0])):
    input_remade2[0, i1, :] = out2[0, i1, :] * w1[i1] + b1[i1]
print(torch.sum(input_remade2 - input_data2))
tensor(-0.0061)
tensor(1280.9966)
tensor(0.0014)

或者有什么方法可以从 LayerNorm 层中提取固定均值和标准差?

deep-learning pytorch normalization transformer-model inference
1个回答
0
投票

来自 pytorch 文档:https://pytorch.org/docs/stable/ generated/torch.nn.LayerNorm.html

该层使用根据训练和评估模式下的输入数据计算的统计数据。

E[x] 和 Var[x] 在每个输入张量上计算。 只有 γ 和 β 在训练时是固定的。

因此,您所观察到的是正确且预期的行为。

© www.soinside.com 2019 - 2024. All rights reserved.