MXnet LayerNorm
pytorch LayerNorm
说明
LayerNorm中不会像BatchNorm那样跟踪统计全局的均值方差,因此train()和eval()对LayerNorm没有影响。
LayerNorm参数
torch.nn.LayerNorm(
normalized_shape: Union[int, List[int], torch.Size],
eps: float = 1e-05,
elementwise_affine: bool = True)
normalized_shape
如果传入整数,比如4,则被看做只有一个整数的list,此时LayerNorm会对输入的最后一维进行归一化,这个int值需要和输入的最后一维一样大。
- 假设此时输入的数据维度是[3, 4],则对3个长度为4的向量求均值方差,得到3个均值和3个方差,分别对这3行进行归一化(每一行的4个数字都是均值为0,方差为1);LayerNorm中的weight和bias也分别包含4个数字,重复使用3次,对每一行进行仿射变换(仿射变换即乘以weight中对应的数字后,然后加bias中对应的数字),并会在反向传播时得到学习。
如果输入的是个list或者torch.Size,比如[3, 4]或torch.Size([3, 4]),则会对网络最后的两维进行归一化,且要求输入数据的最后两维尺寸也是[3, 4]。
- 假设此时输入的数据维度也是[3, 4],首先对这12个数字求均值和方差,然后归一化这个12个数字;weight和bias也分别包含12个数字,分别对12个归一化后的数字进行仿射变换(仿射变换即乘以weight中对应的数字后,然后加bias中对应的数字),并会在反向传播时得到学习。
- 假设此时输入的数据维度是[N, 3, 4],则对着N个[3,4]做和上述一样的操作,只是此时做仿射变换时,weight和bias被重复用了N次。
- 假设此时输入的数据维度是[N, T, 3, 4],也是一样的,维度可以更多。
注意:显然LayerNorm中weight和bias的shape就是传入的normalized_shape。
eps
归一化时加在分母上防止除零。
elementwise_affine
如果设为False,则LayerNorm层不含有任何可学习参数。
如果设为True(默认是True)则会包含可学习参数weight和bias,用于仿射变换,即对输入数据归一化到均值0方差1后,乘以weight,即bias。
LayerNorm前向传播(以normalized_shape为一个int举例)
- 如下所示输入数据的shape是(3, 4),此时normalized_shape传入4(输入维度最后一维的size),则沿着最后一维(沿着最后一维的意思就是对最后一维的数据进行操作)求和,并用这两个结果把batch沿着最后一维归一化,使其均值为0,方差为1。归一化公式用到了eps(),即。
此时,(有偏样本方差),归一化后的值如下,举例说明:第0行第2列的数字4,减去第0行的均值2.0等于2,然后除以即2/1.224749≈1.6330。tensor = torch.FloatTensor([[1, 2, 4, 1], [6, 3, 2, 4], [2, 4, 6, 1]])
[[-0.8165, 0.0000, 1.6330, -0.8165], [ 1.5213, -0.5071, -1.1832, 0.1690], [-0.6509, 0.3906, 1.4321, -1.1717]]
- 如果elementwise_affine==True,则对归一化后的batch进行仿射变换,即乘以模块内部的weight(初值是[1., 1., 1., 1.])然后加上模块内部的bias(初值是[0., 0., 0., 0.]),这两个变量会在反向传播时得到更新。
- 如果elementwise_affine==False,则LayerNorm中不含有weight和bias两个变量,只做归一化,不会进行仿射变换。
内容部分来自 :https://blog.csdn.net/weixin_39228381/article/details/107939602