本文主要是介绍计算上理解LayerNorm,为何泄露信息,知识追踪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
pytorch 中layernorm 的使用
首先给出官网的解释,
torch.nn.LayerNorm(normalized_shape: Union[int, List[int], torch.Size],eps: float = 1e-05,elementwise_affine: bool = True)
其中注意:LayerNorm中不会像BatchNorm那样跟踪统计全局的均值方差,因此train()和eval()对LayerNorm没有影响。
如何计算:训练样本a:batch=2,seq_len=2,dims=3
pytorch
a = torch.tensor([[[1.0,2.0,3.0],[4.0,5.0,6.0]],[[1.0,2.0,3.0],[4.0,5.0,6.0]]])
ln = torch.nn.LayerNorm([2,3],elementwise_affine=False)
ln_out = ln(a)
numpy
mean = np.mean(a.numpy(), axis=(1,2))
var = np.var(a.numpy(), axis=(1,2))
div = np.sqrt(var+1e-05)
ln_out = (a-mean[:,None,None])/div[:,None,None] # None的作用是增加维度
所以layernorm中的normalized_shape是算矩阵中的后面几维,这里的[2,3] 表示倒数第二维和倒数第一维,最后针对每个样本都有只有一个均值和方差。
带参数的layernorm,由于是面向最后两个维度,那么weigth和bias与最后两维形状一样[2,3]。那么每一个样本都会重复使用,进行仿射变换,(仿射变换即乘以weight中对应的数字后,然后加bias中对应的数字),并会在反向传播时得到学习。
ln=torch.nn.LayerNorm([2,3],elementwise_affine=True)
ln.state_dict()
#OrderedDict([('weight', tensor([[1., 1., 1.],[1., 1., 1.]])),('bias', tensor([[0., 0., 0.],[0., 0., 0.]]))])
pytorch LayerNorm参数详解,计算过程
tensor = torch.FloatTensor([[1, 2, 4, 1],[6, 3, 2, 4],[2, 4, 6, 1]])
在使用LayerNorm时,通常只需要指定normalized_shape就可以了。
pytorch常用normalization函数
与batch normalization和instance normalization不同,batch normalization使用affine选项为每个通道/平面应用标量尺度γ和偏差β,而layer normalization使用elementwise_affine参数为每个元素应用尺度和偏差。
知识追踪领域
数据形状:【batch,sentence,feature】
SAKT中,或者Transformer中,我们的LayerNorm定义为:
self.layer_norm = nn.LayerNorm(d_model)
所以是对最后一维,特征维度进行归一化。.
而某一篇文字,(在没证实、没充分证据说明它的结果有问题,计算过程有泄露信息前,先不透漏文章)
self.layer_norm = nn.LayerNorm(normalized_shape = [length, d_model])
他是对最后两维,因为知识追踪,第t个时间步,是不能看到第t+1个时间步的信息的。问题是归一化只涉及到数值上面的放大缩小(scale),如何泄露还确实不知道模型怎么做到的。只能确定的是,第t个时间步看到了后面的信息。
这篇关于计算上理解LayerNorm,为何泄露信息,知识追踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!