文章目录
这些Normalization的作用都是让数据保持一个比较稳定的分布,从而加速收敛。Batch Normalization 的处理对象是对一批样本, Layer Normalization 的处理对象是单个样本。不过,他们到底指的是什么呢?有的时候,讲解是多余的,实战一下,你就懂了:
talk is cheap,show me the code
import torch
import torch.nn as nn
LayerNormalization
LayerNormalization通常用于RNN网络或者处理句子的网络中,假设我们有如下数据
a=torch.empty(2,2,3).random_(0,3)
print(a)
上述a就是我们的模型中某一层的数据,所以其维度代表的意思是(懂的都懂):
#[batch_size=2,seq_len=2,emb_size=3]
那么LayerNormalization是指:我们将我们这个batch中的2个数据,分别处理:
怎么处理呢?那就是在一个数据的内部,扁平化然后z-score标准化
(如下公式),然后处理回原来的形状。
我们以第一个数据为例:
1.扁平化
2.求其均值为1,标准差为0.816496580927726。
3.z-score公式带入
4.还原回原来的形状
这就是这个batch中第一个数据LayerNormalization的结果,第二个数据也是重复这个流程。
我们使用pytorch验证一下:
ln=nn.LayerNorm(3)#3表示最后一个维度的大小
ln(a)
完全正确!
BatchNormalization
b=torch.empty(2,3).random_(0,3)
print(b)
上述b就是我们的模型中某一层的数据,所以其维度代表的意思是(懂的都懂):
#[batch_size=2,feature_size=3]我们可以想象输入的是2个人的信息,这个信息由一个3维向量来表示,比如[身高,体重,胸围],我们要做分类问题。
那么BatchNormalization是指:我们将我们这个batch中的2个数据一起处理(前面是分别处理),这里是分别处理身高,体重和胸围。
即对不同人的身高,体重和胸围分别做z-score:
我们以身高为例,第一个人为2,第二个人为0,那么均值是1,标准差是1,所以带入z-score的那个公式,结果是[1,-1]。
其他依次类推。
bn=nn.BatchNorm1d(3)#最后一个维度的大小。
bn(b)