self Attention 位置编码的奇偶输入问题

news2024/11/28 14:05:28

attention机制一直是放在encoder-decoder中进行使用,self-attention是为了解决前者结构无法并行计算,而抽离出的概念(前者的编码解码多为时序网络)。

但因为缺少时序模型天然的位置编码特点,所以self-attention模型需要自己嵌入位置编码。

 本着不重复造轮子的态度,自然是先在网上搬运代码,但发现一个奇怪的问题,即我的实验数据词向量维度为偶数的时候,运行正常,但如果词向量维度为奇数,则无法运行,会报如下错误:

# The expanded size of the tensor (i) must match the existing size (i+1) at non-singleton dimension 2.  Target sizes: [batch_size, seq_len, i].  Tensor sizes: [seq_len, i+1]    

因为对应不同人的数据不一致,所以这里用i代替具体数据,batch_size, seq_len同理。

而导致这个报错的原因是,因为常见的位置编码方式(如下图),在编码的时候,是先生成一个由2j构成的矩阵,j∈d_model,d_model为词向量维度。

 因为直接口述相对抽象,这里先展示源码,然后在根据代码说明。

类的输入数据尺寸为(batch_size,seq_len,d_model)

class PositionalEncoding(nn.Module):
    """位置编码
    d_model: 特征维度
    max_len: 序列长度
    dropout:是为了防止对位置编码太敏感
    """
    def __init__(self, d_model, max_len=10, dropout=0):
        super(PositionalEncoding, self).__init__()
        self.dropout = nn.Dropout(dropout)
        # 创建一个足够长的P
        self.P = torch.zeros((1, max_len, d_model))
        position = torch.arange(max_len, dtype=torch.float32).reshape(-1, 1)
        div_term = torch.pow(10000, torch.arange(0, d_model, 2, dtype=torch.float32) / d_model)
        X = position / div_term
        # P[[:, :, 0::2]这个用法,就是从0开始到最后面,步长为2,代表的是偶数位置
        self.P[:, :, 0::2] = torch.sin(X)
        # self.P[:, :, 1::2] = torch.cos(X)
        if d_model % 2 == 0:
            self.P[:, :, 1::2] = torch.cos(X)
        else:
            self.P[:, :, 1::2] = torch.cos(X)[ :, :-1]

    def forward(self, X):
        X = X + self.P[:, :X.shape[1], :].to(X.device)
        return self.dropout(X)

 根据上面公式可以发现,sin和cos的括号中,参与计算的数据是一样的(也就是上文中提到的生成的2j矩阵),在代码中,该数据由下列代码生成:

        position = torch.arange(max_len, dtype=torch.float32).reshape(-1, 1)
        div_term = torch.pow(10000, torch.arange(0, d_model, 2, dtype=torch.float32) / d_model)
        X = position / div_term

其中,position为公式中的分子,div_term为分母,根据div_term中的arrange可以看出步长为2,也就对应2j,而这导致一个什么结果呢?

d_model=3,生成的二维矩阵X的第二维为2;

d_model=4,生成的二维矩阵X的第二维为2;

d_model=5,生成的二维矩阵X的第二维为3;

d_model=6,生成的二维矩阵X的第二维为3.

第一维为seq_len

我们再看看self.P,其尺寸为(1, seq_len, d_model)

        
        # P[[:, :, 0::2]这个用法,就是从0开始到最后面,步长为2
        self.P[:, :, 0::2] = torch.sin(X)
        # self.P[:, :, 1::2] = torch.cos(X)
        if d_model % 2 == 0:
            self.P[:, :, 1::2] = torch.cos(X)
        else:
            self.P[:, :, 1::2] = torch.cos(X)[ :, :-1]

这里通过 P[[:, :, x::2]中x为0还是1来控制奇数还是偶数,但当P中d_model为奇数的时候,cos那行等式左右两个矩阵大小就不一致了。

以d_model=5举例

此时X = [seq_len, 3],torch.cos(X)为[seq_len, 3],

而self.P[:, :, 1::2] 的维度为[1, seq_len, 2]

上式是将右侧二维矩阵赋给左侧三维矩阵的后两维,但此时两者尺寸并不满足条件,cos注释部分为网上找到的源码,下面为改进方法,其实思路很简单,就是先对d_model做一个奇偶判断,当我们输入数据的词向量维度为奇数的时候,我们不取最后一维的最后一个值即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker镜像大小优化

如何缩小镜像的体积大小? 1)尽可能的使用小体积的基础镜像 2)尽可能减少Dockerfile文件中的指令数量 3)构建镜像步骤最后添加清空系统和应用程序的缓存的命令 4)使用多级(多阶段)构建 FROM A…

亚信科技AntDB数据库荣获赛宝优选信创优秀解决方案奖

近日,由工业和信息化部电子第五研究所主办的中国赛宝信创生态合作伙伴大会暨赛宝优选信创优秀解决方案颁奖仪式在北京成功举办,亚信科技AntDB数据库信创解决方案“业务支撑系统核心数据库迁移改造”从千余案例中脱颖而出,荣获赛宝优选信创优秀…

文件描述符表

文章目录 1. 文件描述符1.1 前言1.2 理解文件1.3 文件描述附表1.4 打开文件时1.5 默认打开的三个文件 2. 重定向2.1 瞅瞅2.2 dup22.3 实现原理 3. 一切皆文件 1. 文件描述符 1.1 前言 环境:Linux 2.6 在 Linux 中,有句话叫做「一切皆文件」&#xff0…

Coinbase:如有必要,不惜在最高法院与SEC“一决胜负”!

6日早间,央视财经频道(CCTV-2)对“币安及其首席执行官被美证交会(SEC)起诉”进行了报道。 值得一提的是,央视并不常播报加密货币相关新闻,上一次是关于香港监管框架,赵长鹏&#xff…

< 每日算法:一文带你认识 “ 双指针算法 ” >

每日算法:初识双指针算法 👉 1. 双指针概念:👉 2. 左右指针> 案例一:二分查找> 案例二:双指针 - 移除元素 👉 3. 快慢指针> 案例一: 删除排序数组中的重复项 👉…

MySQL8安装详细教程

MySQL8安装详细教程 一、下载二、安装三、配置环境 一、下载 官网下载:点击跳转 进入官网后,如下界面 点击Archives可以选择版本进行下载,如下图根据描述操作即可。 百度云下载链接:点击跳转 或者复制到浏览器打开:链…

【1 微信小程序学习-核心思想与体验】

1 小程序的核心技术 .js文件,负责数据处理,函数定义和实现 .wxml文件,组件结构与数据绑定 .wxss文件,组件样式 .json配置信息补充 MVVM架构实现声明式编程 采用MVVM架构,核心是通过数据绑定实现响应式编程(声明式编程). M:数据处理 V:样式结构 VM:数据绑定和事件监听 vue和小程…

程序员的职场危机,能靠技术化解吗?

很多人认为,程序员一定要干到管理层,才会有继续走下去的希望,而踏实做技术的程序员,只会面临淘汰。 事实真是如此吗? △ 截图来源脉脉,如侵删 我们先不说结论,一起看看网友们的看法&#xff1…

Linux | Job control

Linux | Job control 文章目录 Linux | Job control命令直接将命令丢到后台中“执行”的 &将当前工作丢到后台“暂停”:Ctrl z查看后台工作状态:jobs将后台工作拿到前台处理:fg让工作在后台下的状态变成运行中:bg管理后台工作…

Qt6之vc调用qt生成的带ui的dll

受益于跨平台的特性,Qt生成dll的各种语言调用上体现的淋漓尽致,上篇已经演示了qt生成的无ui的dll及vc如何调用它,本篇将演示vc如何调用qt生成的带ui的dll。 传统观点认为Qt生成的带ui的dll受限于 QApplication 的 exec 方法,这样才…

《精通特征工程》学习笔记(6):非线性特征化与k-均值模型堆叠

1.非线性特征 当数据位于一个薄饼状的线性子空间时,PCA 是非常有用的。但如果数据形成了一个更加复杂的形状,情况又将如何呢? 如果线性子空间是一张平展的纸,那么非线性流形的一个简单例子就是卷起来的纸,它有 个非…

《人人健康》期刊简介及投稿邮箱

《人人健康》期刊简介及投稿邮箱 《人人健康》期刊简介: 主管单位:山西出版传媒集团有限责任公司 主办单位:山西三晋报刊传媒集团有限责任公司 国际刊号ISSN:1004-597X 国内刊号CN:14-1033/R 邮发代号&#xff1…

不甘做小弟,JS时间对象又在搞事情!(上)

关注“大前端私房菜”微信公众号,回复暗号【面试宝典】即可免费领取107页前端面试题。 Date Date 是 js 的一个内置对象,也叫内置构造函数。提供了一堆的方法帮助我们更方便的操作时间 创建时间对象:new Date() 获取时间对象:ne…

NTSC和PAL视频格式的区别

1,历史演变 NTSC早期描述的是525I59.94格式视频,1953年确立标准,美国主导。后来为了方便和PAL制式格式的视频转换,于是将60hz的倍数关系的帧率纳入该系统。 PAL描述的是625I50格式视频,1967年确立标准,欧洲…

完全免费白嫖 GPT-4 的终极方案!

原文链接:https://icloudnative.io/posts/completely-free-to-use-gpt4/ GPT-4 目前是世界上最强的多模态大模型,能力甩 GPT-3.5 好几条街。 大家都希望早日用上 GPT-4,不过目前体验 GPT-4 的渠道非常有限,要么就是开通 ChatGPT …

Java编程笔记31:Record

Java编程笔记31:Record 图源:Fotor懒设计 在日常使用的时候,我们往往需要创建一些“仅用于传输数据的类型”,比如Web编程时候的DTO。 将特殊用途的类型限制为“只读”的一个好处是,这些类型可以安全地在多线程之间共享…

uniapp开发小程序-显示左滑删除效果

一、效果图&#xff1a; 二、代码实现&#xff1a; <template><view class"container"><view class"myorderList"><uni-swipe-action><uni-swipe-action-item class"swipe-action-item" :right-options"option…

【严重】Nacos 集群Raft反序列化漏洞

漏洞描述 Nacos是一个用于动态服务发现和配置以及服务管理的平台。 攻击者可以在Nacos集群处理某些Jraft请求时利用Hessian进行无限制的反序列化&#xff0c;从而造成远程代码执行。 由于Nacos默认监听7848端口处理Raft协议请求&#xff0c;攻击者可能通过向7848端口发送恶意…

[笔记]C++并发编程实战 《四》同步并发操作

文章目录 前言第4章 同步并发操作4.1 等待一个事件或其他条件4.1.1 等待条件达成4.1.2 使用条件变量构建线程安全队列 4.2 使用期望值等待一次性事件4.2.1 后台任务的返回值4.2.2 任务与期望值关联4.2.3 使用(std::)promises4.2.4 将异常存与期望值中4.2.5 多个线程的等待 前言…

【Mysql】InnoDB 中的聚簇索引、二级索引、联合索引

一、聚簇索引 其实之前内容中介绍的 B 树就是聚簇索引。 这种索引不需要我们显示地使用 INDEX 语句去创建&#xff0c;InnoDB 引擎会自动创建。另外&#xff0c;在 InnoDB 引擎中&#xff0c;聚簇索引就是数据的存储方式。 它有 2 个特点&#xff1a; 特点 1 使用记录主键…