torch.nn.LayerNorm(
normalized_shape: Union[int, List[int], torch.Size],
eps: float = 1e-05,
elementwise_affine: bool = True)
————————————————
LayerNorm前向传播(以normalized_shape为一个int举例)
如下所示:
输入数据的shape是(3, 4)
此时normalized_shape传入4(输入维度最后一维的size)
则沿着最后一维(沿着最后一维的意思就是对最后一维的数据进行操作)求和,并用这两个结果把batch沿着最后一维归一化,使其均值为0,方差为1。归一化公式用到了eps(),即。
tensor = torch.FloatTensor([[1, 2, 4, 1],
[6, 3, 2, 4],
[2, 4, 6, 1]])
此时,(有偏样本方差),归一化后的值如下,
举例说明:第0行第2列的数字4,减去第0行的均值2.0等于2,然后除以即2/1.224749≈1.6330。
[[-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两个变量,只做归一化,不会进行仿射变换。
总结
在使用LayerNorm时,通常只需要指定normalized_shape就可以了。