Transformer中的layer norm(包含代码解释)
https://blog.csdn.net/weixin_42596778/article/details/134848578
layerNorm的代码实现:
import torch # 1.使用torch的layer norm来进行操作,然后看一下ln后的矩阵是什么样子 # 创建了一个2*3*4的随机矩阵 batch_size, seq_size, dim = 2, 3, 4 embedding = torch.randn(batch_size, seq_size, dim) print("embedding:", embedding) # 创建一个LayerNorm层 layer_norm = torch.nn.LayerNorm(dim, elementwise_affine=False) # 进行LayerNorm操作 print("layer_norm: ", layer_norm(embedding)) # 2.自己手动来对最后一个维度进行计算,如果和上面的结果一样,说明layernorm的计算和我们的计算是一样的 eps: float = 0.00001 # 计算了embedding张量在最后一个维度上的均值,并将结果存储在变量mean中。 # dim=(-1):这个参数指定了要在哪个维度上计算均值。在这里,-1表示最后一个维度,所以这个函数会计算embedding张量在最后一个维度上的均值。 mean = torch.mean(embedding[:, :, :], dim=(-1), keepdim=True) print("mean:", mean) # 计算了embedding张量在最后一个维度上的方差,并将结果存储在变量var中 var = torch.square(embedding[:, :, :] - mean).mean(dim=(-1), keepdim=True) print("var", var) # 对嵌入张量embedding进行标准化(或称为归一化)的操作 # torch.sqrt(var + eps),这部分代码首先计算了方差张量var的平方根,然后加上一个非常小的常数eps(通常用于防止除以零的错误)。这个操作是缩放的一部分,它根据数据的方差来调整数据的大小 print("y_custom: ", (embedding[:, :, :] - mean) / torch.sqrt(var + eps))
如上,自己实现的layerNorm和 torch.nn.LayerNorm的 实现结果一致;