https://zhuanlan.zhihu.com/p/86765356
batch norm
![](https://img.haomeiwen.com/i11440646/f0d181814986f292.png)
计算batch个μ和batch个σ
layer norm
我以前一直以为是对seq轴上做类似于batch norm的操作,结果是hidden轴上。
例如,input是[ batch × seq_len × hidden ],则layer norm首先在hidden维度求出batch × seq_len个标准差和均值,再使用它们进行归一化,但γ和β只有hidden个,因此LayerNorm归一化之后的缩放是再特征维度上进行。
class LayerNorm(nn.Module):
"Construct a layernorm module (See citation for details)."
def __init__(self, features, eps=1e-6):
super(LayerNorm, self).__init__()
self.a_2 = nn.Parameter(torch.ones(features))
self.b_2 = nn.Parameter(torch.zeros(features))
self.eps = eps
def forward(self, x):
# mean(-1) 表示 mean(len(x)), 这里的-1就是最后一个维度,也就是hidden_size维
mean = x.mean(-1, keepdim=True)
std = x.std(-1, keepdim=True)
return self.a_2 * (x - mean) / (std + self.eps) + self.b_2
区别:
Batch Normalization,它去除了不同特征之间的大小关系,但是保留了不同样本间的大小关系,所以在CV领域用的多。
Layer Normalization,它去除了不同样本间的大小关系,但是保留了一个样本内不同特征之间的大小关系,所以在NLP领域用的多。
1)layer normalization 有助于得到一个球体空间中符合0均值1方差高斯分布的 embedding, batch normalization不具备这个功能。
- layer normalization可以对transformer学习过程中由于多词条embedding累加可能带来的“尺度”问题施加约束,相当于对表达每个词一词多义的空间施加了约束,有效降低模型方差。batch normalization也不具备这个功能。
![](https://img.haomeiwen.com/i11440646/23ea9ec4d81b10ae.png)
网友评论