我试图理解torch.nn.LayerNorm
在nlp模型中是如何工作的。假设输入数据是一批单词序列的嵌入:
batch_size, seq_size, dim = 2, 3, 4
embedding = torch.randn(batch_size, seq_size, dim)
print("x: ", embedding)
layer_norm = torch.nn.LayerNorm(dim)
print("y: ", layer_norm(embedding))
# outputs:
"""
x: tensor([[[ 0.5909, 0.1326, 0.8100, 0.7631],
[ 0.5831, -1.7923, -0.1453, -0.6882],
[ 1.1280, 1.6121, -1.2383, 0.2150]],
[[-0.2128, -0.5246, -0.0511, 0.2798],
[ 0.8254, 1.2262, -0.0252, -1.9972],
[-0.6092, -0.4709, -0.8038, -1.2711]]])
y: tensor([[[ 0.0626, -1.6495, 0.8810, 0.7060],
[ 1.2621, -1.4789, 0.4216, -0.2048],
[ 0.6437, 1.0897, -1.5360, -0.1973]],
[[-0.2950, -1.3698, 0.2621, 1.4027],
[ 0.6585, 0.9811, -0.0262, -1.6134],
[ 0.5934, 1.0505, -0.0497, -1.5942]]],
grad_fn=<NativeLayerNormBackward0>)
"""
根据document's description,我的理解是平均值和标准差是由每个样本的所有嵌入值计算的,所以我尝试手动计算y[0, 0, :]
:
mean = torch.mean(embedding[0, :, :])
std = torch.std(embedding[0, :, :])
print((embedding[0, 0, :] - mean) / std)
它给出的是tensor([ 0.4310, -0.0319, 0.6523, 0.6050])
,这不是正确的输出,我想知道计算y[0, 0, :]
的正确方法是什么?
1条答案
按热度按时间kpbwa7wx1#
正如我所看到的,平均值和标准差是在
(batch_size, seq_size, embedding_dim)
形状的每个样本的所有嵌入值上计算的。但在您的情况下,通过torch.mean(embedding[0, :, :])
和标准差,每个批次而不是每个样本有一个单一的平均值。在
torch.nn.LayerNorm
中使用elementwise_affine = False
,在没有grad属性的情况下也会产生相同的结果。在这里可以找到一个类似的问题和答案,即layer Normalization in pytorch?。代码
输出
自定义层定额实施示例
输出