计算上理解LayerNorm,为何泄露信息,知识追踪

2023-10-17 01:30

本文主要是介绍计算上理解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,为何泄露信息,知识追踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/222007

相关文章

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出