【Transformer深入学习】之一:Sinusoidal位置编码的精妙

news/2024/9/19 3:14:16/ 标签: transformer, 学习, 深度学习

看苏神的文章提到:Transformer原论文使用Sinusoidal位置编码,作为位置编码的一个显式解,Google 在原论文中对它的描述寥寥无几,只是简单提及了它可以表达相对位置信息,并未提及这个编码的合理性。
看了几篇文章,做一个笔记。

Sinusoidal位置编码

公式和在模型中的位置
在这里插入图片描述
在这里插入图片描述

为什么需要位置编码

单词的位置和顺序是任何语言的重要组成部分。它们定义了句子的语法,从而定义了句子的实际语义。递归神经网络 (RNN) 本质上会考虑单词的顺序;他们按顺序逐字解析句子。这会将单词的顺序集成到 RNN 的主干中。

但是 Transformer 架构放弃了递归机制,转而采用多头自注意力机制。避免 RNN 的递归方法将导致训练时间的大幅加快。从理论上讲,它可以在句子中捕获更长的依赖项。

由于句子中的每个单词同时流经 Transformer 的编码器/解码器堆栈,因此模型本身对每个单词没有任何位置/顺序感。因此,仍然需要一种方法将单词的顺序合并到模型中。

为模型提供一些顺序感的一种可能解决方案是向每个单词添加一条有关其在句子中的位置的信息。我们称此 “信息片段”为位置编码。

可能想到的第一个想法是为 [0, 1] 范围内的每个时间步长分配一个数字,其中 0 表示第一个单词,1 是最后一个时间步长。您能弄清楚它会导致什么样的问题吗?它将引入的问题之一是您无法弄清楚特定范围内存在多少个单词。换句话说,时间步长 delta 在不同的句子中没有一致的含义。

另一个想法是为每个时间步线性分配一个数字。也就是说,第一个单词被赋予 “1”,第二个单词被赋予 “2”,依此类推。这种方法的问题在于,不仅值可能会变得相当大,而且我们的模型可能会面对比训练中的句子更长的句子。此外,我们的模型可能看不到任何具有特定长度的样本,这会损害我们模型的泛化。

理想情况下,应满足以下条件:

  • 它应该为每个时间步(单词在句子中的位置)输出唯一的编码
  • 任意两个时间步长之间的距离在不同长度的句子中应该是一致的
  • 我们的模型应该可以毫不费力地推广到更长的句子。它的值应该是有界的。
  • 它必须是确定性的。

Sinusoidal位置编码

论文提出的编码是一种简单而天才的技术,可以满足所有这些标准。首先,它不是一个单一的数字。相反,它是一个d-维度向量,其中包含有关句子中特定位置的信息。其次,这种编码没有集成到模型本身中。相反,这个向量用于为每个单词提供有关其在句子中的位置的信息。换句话说,我们增强了模型的输入以注入单词的顺序。

让t是输入句子中所需的位置,d是编码维度,编码定义如下:
在这里插入图片描述
由于可以从函数定义中得出,频率沿着向量维度递减。因此,它在波长上形成了从2π到10000⋅2π的几何级数。
还可以想象位置位置嵌入作为包含每个频率的正弦和余弦对的向量:
在这里插入图片描述

直觉

你可能想知道 sines 和 cosines 的这种组合怎么能代表一个位置/顺序?其实很简单,假设你想用二进制格式表示一个数字,那会怎么样?

在这里插入图片描述
您可以发现不同位之间的变化率。LSB 位在每个数字上交替,第二低位在每两个数字上旋转,依此类推。

但是在浮点数的世界中使用二进制值会浪费空间。因此,我们可以改用它们的 float 连续对应物 - Sinusoidal 函数。事实上,它们相当于交替的位。此外,通过降低它们的频率,我们可以从红色位变为橙色位。
在这里插入图片描述
图: 最大长度为 50 的句子的 128 维正序编码。每行表示嵌入向量

相对位置

正弦位置编码的另一个特点是它允许模型毫不费力地处理相对位置。以下是原始论文中的一段引述:
“我们选择这个函数是因为我们假设它允许模型轻松学习通过相对位置来关注,因为对于任何固定偏移量 k, PEpos+K可以表示为 PE 的线性函数PEpos”(原文:We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, PEpos+kcan be represented as a linear function of PEpos.)

但为什么这种说法成立呢?
简单版本的证明:

对于对应于频率的每个正弦-余弦对ωk,则存在线性变换M:
在这里插入图片描述
证明:
M是2×2的矩阵,我们想要找到u1,v1,u2和v2,因此
在这里插入图片描述
通过应用加法定理,我们可以按如下方式展开右侧:
在这里插入图片描述
这会产生以下两个方程:
在这里插入图片描述
通过求解上述方程,我们得到:
在这里插入图片描述
所以最终的变换矩阵M是:
在这里插入图片描述
如您所见,最终转换矩阵M不依赖于t。
请注意,可以找到矩阵M与 Rotation Matrix 非常相似。
同样,我们可以找到对于其他正弦-余弦对的M矩阵,这最终允许我们表示pt+φ作为pt对于任何固定偏移量φ。此属性使模型很容易按相对位置进行学习
正弦位置编码的另一个特性是相邻时间步长之间的距离是对称的,并且会随时间很好地衰减。
在这里插入图片描述
图 所有时间步长的位置嵌入的点积

远程衰减

苏神的文章 ,评估了Sinusoidal位置编码的远程衰减:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
除了θt=t比较异常之外(与横轴有交点),其他很难断定孰优孰劣。

其他总结

这是一个如何破坏轮换对称性,同时给长距离的 token 关联做自动衰减的有效方法。

参考文献

《Transformer Architecture: The Positional Encoding
Let’s use sinusoidal functions to inject the order of words in our model》
(https://kazemnejad.com/blog/transformer_architecture_positional_encoding/)

《Transformer升级之路:Sinusoidal位置编码追根溯源》
(https://mp.weixin.qq.com/s/57iu8rPTXXG0jb2xxEVnTw)

《BERT为何使用学习的position embedding而非正弦position encoding?》
(https://www.zhihu.com/question/307293465/answer/1039311514)


http://www.ppmy.cn/news/1527503.html

相关文章

python定时任务,定时爬取水质和天气

定时爬取水质和天气 代码 代码 from apscheduler.schedulers.background import BackgroundScheduler import requests import datetimeurlweather "http://localhost:8000/CrwalingViewWeather" # 天气接口 urlwater "http://localhost:8000/CrwalingViewW…

【LeetCode】每日一题 2024_9_15 与车相交的点(差分)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 今天的题目曾经的我做过了 . . . 又是复习的一天 题目:与车相交的点 代码与解题思路 func numberOfPoints(nums [][]int) (ans int) { diff : [102]int{}for _, p : range nums {diff[p[0]]d…

Redhat 7,8系(复刻系列) 一键部署Oracle21c-xe rpm

Oracle21c-xe前言 无论您是开发人员、DBA、数据科学家、教育工作者,还是仅仅对数据库感兴趣,Oracle Database Express Edition (XE) 都是理想的入门方式。它是全球企业可依赖的强大的 Oracle Database,提供简单的下载、易于使用和功能齐全的体验。您可以在任何环境中使用该…

快手手撕 力扣2487 从链表中移除节点 单调栈 递归

Problem: 2487. 从链表中移除节点 👨‍🏫 参考题解 💖 递归解法 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* …

Qt中QGraphicsView窗口大小与视图大小的关系

在Qt框架中,QGraphicsView窗口和视图的大小之间存在一定的关系。为了更好地理解这种关系,我们可以从以下几个方面来阐述: 1. 窗口大小 定义:窗口大小指的是QGraphicsView部件在屏幕上占据的矩形区域的大小。它由宽度和高度两个维…

get_property --Cmakelist之中

get_property 是 CMake 中用于获取目标、目录、变量或文件等属性的命令。它可以提取某个特定属性的值&#xff0c;以便在构建脚本的其他地方使用。 语法 get_property(<variable> <TYPE> <name> PROPERTY <property-name> [SET | DEFINED | BRIEF_DO…

Spring Boot-API网关问题

****### Spring Boot API 网关问题分析与解决方案 在微服务架构中&#xff0c;API 网关扮演着非常重要的角色。它位于客户端和微服务之间&#xff0c;充当所有外部请求的入口&#xff0c;负责请求的路由、聚合、鉴权、限流等功能。Spring Boot 提供了多种方式实现 API 网关&am…

记录工作中遇到的问题(持续更新~)

跨域问题 2024-09-15 【前提】&#xff1a;前端配置了nignx转发&#xff0c;后端设置了跨域拦截&#xff0c;对http://xxxx做了允许跨域。但是访问http://xxx被拦截了&#xff0c;返回403 Forbidden。同样的配置放在另外一套部署的环境上就完全没问题&#xff0c;http://xxx可…

828华为云征文|华为Flexus云服务器搭建OnlyOffice私有化在线办公套件

一、引言 在当今数字化办公的时代&#xff0c;在线办公套件的需求日益增长。华为Flexus云服务器凭借其强大的性能和稳定性&#xff0c;为搭建OnlyOffice私有化在线办公套件提供了理想的平台。在2024年9月14日这个充满探索精神的日子里&#xff0c;我们开启利用华为Flexus云服务…

Python实现一个简单的爬虫程序(爬取图片)

目录 1、安装爬虫Scrapy 2、新建爬虫项目 3、配置爬虫 4、编写爬虫代码,爬取百度图片 5、运行爬虫程序 使用爬虫需要遵守相关法律和规范! 1、安装爬虫Scrapy 编程环境是Anaconda,其安装和使用见我之前的文章,这里就不赘述了。 首先安装爬虫Scrapy,为了加快下载速度…

边缘计算网关:连接中心计算与边缘设备的重要桥梁-天拓四方

一、边缘计算网关&#xff1a;重新定义信息高速公路的“路标” 边缘计算网关&#xff0c;作为边缘计算生态系统中的核心组件&#xff0c;不仅承载着数据传输的功能&#xff0c;更是智能信息处理的关键节点。它通过分布式计算架构&#xff0c;将数据处理任务前置到网络边缘&…

[Linux#49][UDP] 2w字详解 | socketaddr | 常用API | 实操:实现简易Udp传输

目录 套接字地址结构&#xff08;sockaddr&#xff09; 1.Socket API 2.sockaddr结构 3. sockaddr、sockaddr_in 和 sockaddr_un 的关系 sockaddr 结构体 sockaddr_in 结构体&#xff08;IPv4 套接字地址&#xff09; sockaddr_un 结构体&#xff08;Unix域套接字地址&a…

oracle表的类型

表是数据库最基本的逻辑结构&#xff0c;一切数据都存放在表中&#xff0c;其它数据库对象(索引、视图、同义词等)都是为了更方便的操作表中的数据。Oracle数据库是由若干个表组成&#xff0c;每个表由列和行组成。 数据库表的类型按照存储结构划分&#xff1a; (1)普通表&…

镀金引线---

一、沉金和镀金 沉金和镀金都是常见的PCB金手指处理方式&#xff0c;它们各有优劣势&#xff0c;选择哪种方式取决于具体的应用需求和预算。 沉金&#xff08;ENIG&#xff09;是一种常用的金手指处理方式&#xff0c;它通过在金手指表面沉积一层金层来提高接触性能和耐腐蚀性…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二集:通过InControl插件实现绑定玩家输入以及制作小骑士移动空闲动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、通过InControl插件实现绑定玩家输入二、制作小骑士移动和空闲动画 1.制作动画2.玩家移动和翻转图像3.状态机思想实现动画切换总结 前言 好久没来CSDN看看&…

Gitlab 中几种不同的认证机制(Access Tokens,SSH Keys,Deploy Tokens,Deploy Keys)

前言 公司主要使用 Go 语言做项目&#xff0c;有一些 Gitlab 私有仓库需要引用&#xff0c;在做 CI 时&#xff0c;要自行配置权限以获取代码。 最近发现各个项目组在做 CI 遇到仓库权限问题时的解决方式不尽相同&#xff0c;有用 Project Token 的&#xff0c;有用 Deploy K…

css总结(记录一下...)

文字 语法说明word-wrapword-wrap:normal| break-word normal:使用浏览器默认的换行 break-word:允许在单词内换行 text-overflow clip:修剪文本 ellipsis:显示省略符号来代表被修剪的文本 text-shadow可向文本应用的阴影。能够规定水平阴影、垂直阴影、模糊距离&#xff0c;以…

CCS811二氧化碳传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 ccs811.h文件 ccs811.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 CCS811模块是一种气体传感器&#xff0c;可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2…

Jetbrains开发工具使用通义灵码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装二、使用步骤1.模型选择2.存在的问题 总结 前言 之前用过tabnine等AI工具&#xff0c;tabnine还行&#xff0c;有免费版&#xff0c;但是效果有限&…

某思CMS V10存在SQL注入漏洞

Fofa: product"魅思-视频管理系统" 框架:ThinkPHP 5,6 1 漏洞分析&复现 位于 /controller/Api.php 控制器中的getOrderStatus 方法POST传入&#xff0c;然后直接拼接了 orderSn 变量到 where 查询中&#xff0c;导致漏洞产生. /** * 查询订单支付状态 */ pub…