nn.layerNorm原理探究与实验

前言

上文nn.BatchNorm2d原理探究与实验说到 bn主要还是用于CV。而NLP领域一般使用LayerNorm。本节,我们就来探究LayerNorm。

LayerNorm根据Pytorch官方的文档来看,与BatchNorm的公式一样,区别在于操作的是样本维度。
y i = x i − x ˉ σ 2 + ϵ × γ + β y_i = \frac{x_i-\bar{x}}{\sqrt{\sigma^{2}} + \epsilon} \times \gamma + \beta yi=σ2 +ϵxixˉ×γ+β
其中, x i x_i xi 是之前的元素, x ˉ \bar{x} xˉ 是hidden_dim维度上的均值, σ \sigma σ 是hidden_dim 维度上的标准差, ϵ \epsilon ϵ 是一个系数因子, (有点类似于拉普拉斯平滑,防止分母为0?but I’m not sure), 默认为 1 0 − 5 10^{-5} 105, 很小的一个数。 γ \gamma γ 是layerNorm层的weight参数, β \beta β是layerNorm层的bias参数。



例子

import torch

# [batch_size, seqlen, hidden_dim]
# x = torch.randn(2, 3, 4)
x = torch.tensor([[[0.8611,  0.1719,  0.8301, -1.2535],
                        [-1.3664,  0.7997, -0.2087, -0.1567],
                        [-1.0400,  0.3736, -0.3595,  0.6357]],

                       [[1.9552,  0.3296,  0.9287, -0.0249],
                        [2.8559,  0.0030, -0.2832, -0.2145],
                        [0.9232, -1.8124, -1.8449,  0.8248]]])
# print(logist)

# 这里elementwise_affine的值不会影响结果, 因为没有反向传播更新权重, 默认为True
layernorm = torch.nn.LayerNorm(4, elementwise_affine=True)
output_layernorm = layernorm(x)
print('output_layernorm:\n', output_layernorm)

# print('layernorm.weight:\n', layernorm.weight)
# print('layernorm.bias:\n', layernorm.bias)

print()
# 手工方法
eps = 1e-5
mean = x.mean(dim=-1, keepdim=True)
# print(mean)
var = ((x - mean) ** 2).mean(dim=-1, keepdim=True)
# print(var)
std = (var + eps).sqrt()
y = (x - mean) / std
print('handwork output:\n', y)
nn.layerNorm原理探究与实验_第1张图片

这里若是输出layerNorm的weight和bias可以发现,在该例子中加不加不影响输出效果。因为weight全为1,bias全为0。

nn.layerNorm原理探究与实验_第2张图片

你可能感兴趣的:(框架学习,深度学习,pytorch,机器学习,layerNorm,归一化)