Sinusoidal(正弦曲线)位置编码公式详细推导过程

Sinusoidal(正弦曲线)位置编码公式推导

参考链接

Transformer升级之路:1、Sinusoidal位置编码追根溯源

1. 前置数学的基本概念

1.1 内积

  • 定义: 内积是两个向量之间的一种运算,其结果为一个标量。
  • 公式: 对于向量 a = [ a 1 , a 2 , … , a n ] a = [a_1, a_2, \dots, a_n] a=[a1,a2,,an] b = [ b 1 , b 2 , … , b n ] b = [b_1, b_2, \dots, b_n] b=[b1,b2,,bn],内积定义为
    ⟨ a , b ⟩ = a 1 b 1 + a 2 b 2 + ⋯ + a n b n \langle a, b \rangle = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n a,b=a1b1+a2b2++anbn
  • 解释: 即将两个向量对应元素相乘后求和。

1.2 复数及其性质

  • 复数: 形式为 a + b i a+bi a+bi,其中 a , b a, b a,b 为实数, i i i 为虚数单位,满足 i 2 = − 1 i^2 = -1 i2=1
  • 复数的共轭: 对于复数 a + b i a + bi a+bi,其共轭为 a − b i a - bi abi
  • 实部与虚部: 对于 a + b i a + bi a+bi,实部为 a a a,虚部为 b b b

1.3 复数的指数形式

  • 模长: 对于复数 z = a + b i z = a + bi z=a+bi,其模长为
    r = a 2 + b 2 r = \sqrt{a^2 + b^2} r=a2+b2
  • 幅角: 幅角为
    ϕ = tan ⁡ − 1 ( b a ) \phi = \tan^{-1} \left(\frac{b}{a}\right) ϕ=tan1(ab)
  • 指数表示:
    故复数可写为
    z = r e i ϕ z = r e^{i \phi} z=reiϕ

1.4 复数的欧拉公式

e i θ = cos ⁡ ( θ ) + i sin ⁡ ( θ ) e^{i \theta} = \cos(\theta) + i \sin(\theta) eiθ=cos(θ)+isin(θ)


2. 推导过程

2.1 Sinusoidal的相对位置编码

在Transformer里,因为输入的Token是并行输入的,所以模型并不能知道输入的Token的先后顺序的位置信息。但是位置信息有助于模型区分不同的输入Token从而更好地理解输入的内容,因此需要给模型输入位置信息。

在Transformer里,给模型输入位置信息的是绝对位置编码,位置编码只跟当前位置有关,而且各个位置编码之间是互相独立的。但位置之间不是互相独立的,而是邻近之间的位置编码越相关,而距离较远的位置之间的位置编码应尽量不相关。

而相对位置编码则能够解决这个问题。相对位置编码不是考虑当前位置,而是考虑当前位置和其他位置之间的关系,它们之间的关系应该满足:位置向量之间的内积只依赖于位置差。假设当前位置 m m m和它对应的位置向量 p m p_m pm,另一个位置 n n n和它对应的位置向量$p_n $。

假设存在一个函数 g g g使得
< p m , p n > = g ( m − n ) <p_m, p_n> = g(m - n) <pm,pn>=g(mn)

这也被称为使用绝对位置编码( < p m , p n > <p_m, p_n > <pm,pn>)实现相对位置编码( g ( m − n ) g(m - n) g(mn)

2.2 二维向量的内积

  • 复数与二维向量的对应:
    将二维向量 [ x , y ] [x, y] [x,y] 视为复数 x + y i x + yi x+yi

  • 复数乘法法则:
    对于复数 z 1 = a + b i z_1 = a + bi z1=a+bi z 2 = c + d i z_2 = c + di z2=c+di,有
    z 1 z 2 = ( a + b i ) ( c + d i ) = ( a c − b d ) + ( a d + b c ) i z_1 z_2 = (a + bi)(c + di) = (ac - bd) + (ad + bc)i z1z2=(a+bi)(c+di)=(acbd)+(ad+bc)i

  • 内积关系:
    取乘积的实部,便得到
    R e ( z 1 z 2 ) = a c − b d \mathrm{Re}(z_1 z_2) = ac - bd Re(z1z2)=acbd
    这正好等同于向量 [ a , b ] [a, b] [a,b] [ c , d ] [c, d] [c,d] 的内积。

  • 应用:
    对于复数形式的向量
    p m = x m + y m i , p n = x n + y n i p_m = x_m + y_m i, \quad p_n = x_n + y_n i pm=xm+ymi,pn=xn+yni
    内积可表示为
    ⟨ p m , p n ⟩ = R e ( p m p n ∗ ) = x m x n + y m y n \langle p_m, p_n \rangle = \mathrm{Re}(p_m p_n^*) = x_m x_n + y_m y_n pm,pn=Re(pmpn)=xmxn+ymyn
    其中 p n ∗ p_n^* pn p n p_n pn 的共轭,即 p n ∗ = x n − y n i p_n^* = x_n - y_n i pn=xnyni

2.3 构造满足相对位置信息的假设

  • 为使内积仅依赖于位置差,假设存在复数 q m − n q_{m-n} qmn 使得
    p m p n ∗ = q m − n p_m p_n^* = q_{m-n} pmpn=qmn
  • 取实部后便有
    ⟨ p m , p n ⟩ = R e ( q m − n ) \langle p_m, p_n \rangle = \mathrm{Re}(q_{m-n}) pm,pn=Re(qmn)

2.4 使用复数的指数形式

  • 表示: 将复数写成指数形式
    p m = r m e i ϕ m , p n ∗ = r n e − i ϕ n , q m − n = R m − n e i Φ m − n p_m = r_m e^{i \phi_m}, \quad p_n^* = r_n e^{-i \phi_n}, \quad q_{m-n} = R_{m-n} e^{i \Phi_{m-n}} pm=rmeiϕm,pn=rneiϕn,qmn=RmneiΦmn
  • 代入关系式:
    将上述表达式代入 p m p n ∗ = q m − n p_m p_n^* = q_{m-n} pmpn=qmn
    r m r n e i ( ϕ m − ϕ n ) = R m − n e i Φ m − n r_m r_n e^{i(\phi_m - \phi_n)} = R_{m-n} e^{i\Phi_{m-n}} rmrnei(ϕmϕn)=RmneiΦmn
  • 拆分成两部分:
    • 模长关系:
      r m r n = R m − n r_m r_n = R_{m-n} rmrn=Rmn
    • 角度关系:
      ϕ m − ϕ n = Φ m − n \phi_m - \phi_n = \Phi_{m-n} ϕmϕn=Φmn

2.5 求解方程

  • 求解模长:
    n = m n = m n=m
    r m 2 = R 0 r_m^2 = R_0 rm2=R0
    为简化,令 R 0 = 1 R_0 = 1 R0=1,则 r m = 1 r_m = 1 rm=1,即所有位置编码的模长均为 1。

  • 求解角度:

    1. n = 0 n = 0 n=0,有
      ϕ m − ϕ 0 = Φ m \phi_m - \phi_0 = \Phi_m ϕmϕ0=Φm
      ϕ 0 = 0 \phi_0 = 0 ϕ0=0,则 ϕ m = Φ m \phi_m = \Phi_m ϕm=Φm,即
      ϕ m − ϕ n = ϕ m − n \phi_m - \phi_n = \phi_{m-n} ϕmϕn=ϕmn
    2. n = m − 1 n = m - 1 n=m1,则
      ϕ m − ϕ m − 1 = ϕ 1 \phi_m - \phi_{m-1} = \phi_1 ϕmϕm1=ϕ1
      这说明 { ϕ m } \{\phi_m\} {ϕm} 为等差数列,其通解为
      ϕ m = m θ \phi_m = m \theta ϕm=mθ
      其中 θ \theta θ 为常数。
  • 得到二维位置编码:
    由上述可得
    p m = e i m θ = cos ⁡ ( m θ ) + i sin ⁡ ( m θ ) p_m = e^{i m \theta} = \cos(m \theta) + i\sin(m \theta) pm=eimθ=cos(mθ)+isin(mθ)
    以向量形式表示为
    p m = ( cos ⁡ ( m θ ) sin ⁡ ( m θ ) ) p_m = \begin{pmatrix} \cos(m \theta) \\ \sin(m \theta) \end{pmatrix} pm=(cos(mθ)sin(mθ))

2.6 高维情况

  • 原理:
    利用内积的线性性质,更高维(偶数维)的位置信息可由多个二维位置编码组合而成。
  • 表示:
    若维度 d d d 为偶数,则用不同角度 θ k \theta_k θk ` 表示每个二维编码,得到 d d d 维位置编码:
    p m = ( cos ⁡ ( m θ 0 ) sin ⁡ ( m θ 0 ) cos ⁡ ( m θ 1 ) sin ⁡ ( m θ 1 ) ⋮ cos ⁡ ( m θ d 2 − 1 ) sin ⁡ ( m θ d 2 − 1 ) ) p_m = \begin{pmatrix} \cos(m \theta_0) \\ \sin(m \theta_0) \\ \cos(m \theta_1) \\ \sin(m \theta_1) \\ \vdots \\ \cos\left(m \theta_{\frac{d}{2}-1}\right) \\ \sin\left(m \theta_{\frac{d}{2}-1}\right) \end{pmatrix} pm= cos(mθ0)sin(mθ0)cos(mθ1)sin(mθ1)cos(mθ2d1)sin(mθ2d1)

3. 总结

  • 通过复数的表示和指数形式,将二维位置编码问题转化为求解模长与角度的关系。
  • 在简化假设下(如 R 0 = 1 R_0 = 1 R0=1 ϕ 0 = 0 \phi_0 = 0 ϕ0=0),可得 ϕ m = m θ \phi_m = m \theta ϕm=mθ,从而得到二维位置编码表达式
    p m = e i m θ = cos ⁡ ( m θ ) + i sin ⁡ ( m θ ) p_m = e^{i m \theta} = \cos(m \theta) + i \sin(m \theta) pm=eimθ=cos(mθ)+isin(mθ)
  • 高维位置编码则视为多个二维编码的线性叠加,每个编码对应一个不同的角度 θ k \theta_k θk

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

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

相关文章

仿 RabbitMQ 实现的简易消息队列

文章目录 项目介绍开放环境第三⽅库介绍ProtobufMuduo库 需求分析核⼼概念实现内容 消息队列系统整体框架服务端模块数据管理模块虚拟机数据管理模块交换路由模块消费者管理模块信道&#xff08;通信通道&#xff09;管理模块连接管理模块 客户端模块 公共模块日志类其他工具类…

CANoe查看CAN报文发送周期

在CANoe软件中&#xff0c;Analysis -> Select other options 下的 Toggle Grid 和 Toggle Samples 选项确实用于控制分析窗口中的显示方式和采样行为&#xff0c;从而更清晰地查看CAN报文周期。 Toggle Grid&#xff08;切换网格&#xff09; 功能&#xff1a;启用网格线…

【Go语言圣经】第八节:Goroutines和Channels

DeepSeek 说 Goroutines 和 Channels 最近非常流行询问DeepSeek某些相关概念或热点的解释&#xff0c;因此在开始系统性地学习《Go语言圣经》之前&#xff0c;我首先向DeepSeek进行了提问。具体的Prompt如下&#xff1a; 有关Golang当中的Goroutines和Channels&#xff0c;我现…

e2studio开发RA4M2(10)----定时器AGT输出PWM

e2studio开发RA4M2.10--定时器AGT输出PWM 概述视频教学样品申请硬件准备参考程序源码下载选择计时器新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置SWD调试口设置GPIO口配置AGT定时器AGT定时器属性配置初始化AGT启动AGT PWM模块AGTIO 和 AGTO演示 概述 AGT模块是R…

使用PyCharm进行Django项目开发环境搭建

如果在PyCharm中创建Django项目 1. 打开PyCharm&#xff0c;选择新建项目 2.左侧选择Django&#xff0c;并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一&#xff1a; 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…

【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Java基础面经 &#x1f4da;本系列文章为个…

bladeX微服务框架如何修改nacos分组

nacos中注册的服务他的分组&#xff08;分组名称&#xff09;怎么修改 在org.springblade.common.launch // 指定注册IP PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.ip", "127.0.0.1"); // 指定注册端口 PropsUtil.setProperty(props, &…

大数据项目2a:基于spark的电影推荐和分析系统设计与实现

1、项目目的 本项目的目的是设计并实现一个基于Spark的电影推荐系统&#xff0c;以应对大数据环境下电影推荐服务的挑战。通过整合电影、评分和用户数据集&#xff0c;并利用SparkSql框架进行高效处理&#xff0c;系统能够为用户提供个性化的电影推荐。项目采用多种先进技术&…

机器学习常用包matplotlib篇(四)绘图规范

前言 为了让 Matplotlib 绘图代码更规范、易读&#xff0c;且为后期图形完善预留空间&#xff0c;建议遵循一些规范绘图方法。&#x1f609; 1.管理图形对象 建议使用 plt.figure() 或者 plt.subplots() 管理完整的图形对象&#xff0c;而非直接用 plt.plot(...) 绘图。这样能…

LVGL4种输入设备详解(触摸、键盘、实体按键、编码器)

lvgl有触摸、键盘、实体按键、编码器四种输入设备 先来分析一下这四种输入设备有什么区别 &#xff08;1&#xff09;LV_INDEV_TYPE_POINTER 主要用于触摸屏 用到哪个输入设备保留哪个其他的也是&#xff0c;保留触摸屏输入的任务注册&#xff0c;其它几种种输入任务的注册&…

5G技术解析:从核心概念到关键技术

1. 引言 5G技术的迅猛发展正在重塑我们的生活方式和社会结构。它不仅仅是新一代的移动通信技术&#xff0c;更是一场深刻的技术革命。5G网络正在以其惊人的高速、低延迟和大带宽能力&#xff0c;为智能家居、自动驾驶、工业自动化、远程医疗等另一带来前所未有的可能性。 本文…

背包问题1

核心&#xff1a; // f[i][j] 表示只看前i个物品&#xff0c;总体积是j的情况下&#xff0c;总价值是多少 //res maxx(f[n][]0-v] //f[i][j]: //1 不选第i个物品 f[i][j] f[i-1][j] //2 选第i个物品 f[i][j] f[i-1][j-v[i]] w[i]

Redis | 十大数据类型

文章目录 十大数据类型概述key操作命令数据类型命令及落地运用redis字符串&#xff08;String&#xff09;redis列表&#xff08;List&#xff09;redis哈希表&#xff08;Hash&#xff09;redis集合&#xff08;Set&#xff09;redis有序集合&#xff08;ZSet / SortedSet&…

DeepSeek图解10页PDF

以前一直在关注国内外的一些AI工具&#xff0c;包括文本型、图像类的一些AI实践&#xff0c;最近DeepSeek突然爆火&#xff0c;从互联网收集一些资料与大家一起分享学习。 本章节分享的文件为网上流传的DeepSeek图解10页PDF&#xff0c;免费附件链接给出。 1 本地 1 本地部…

C# OpenCvSharp 部署MOWA:多合一图像扭曲模型

目录 说明 效果 项目 代码 下载 参考 C# OpenCvSharp 部署MOWA&#xff1a;多合一图像扭曲模型 说明 算法模型的paper名称是《MOWA: Multiple-in-One Image Warping Model》 ariv链接 https://arxiv.org/pdf/2404.10716 效果 Stitched Image 翻译成中文意思是&…

vite+vue3搭建前端项目并使用 Bulma 框架

vitevue3搭建前端项目并使用 Bulma 框架 bluma css框架参照。 https://bulma.org.cn/documentation/start/overview/ 1. 创建项目 npm init vitelatest ai-imageneration --template vue选择 vue 和 typescript 作为模板&#xff1a; 2. 安装依赖 npm install npm install…

Spring 6.2.2 @scope(“prototype“)原理

Spring Prototype 原理&#xff1f; 前置准备 创建一个MyService类 Scope("prototype") Service("myService") public class MyService {public String getMessage() {return "Hello, World!";} }创建一个main类&#xff0c;用于debug。 pr…

RabbitMQ 可靠性投递

文章目录 前言一、RabbitMQ自带机制1、生产者发送消息注意1.1、事务&#xff08;Transactions&#xff09;1.2、发布确认&#xff08;Publisher Confirms&#xff09;1.2.1、同步1.2.2、异步 2、消息路由机制2.1、使用备份交换机&#xff08;Alternate Exchanges&#xff09;2.…

【实用技能】如何借助3D文档控件Aspose.3D, 在Java中无缝制作 3D 球体

概述 创建 3D 球体是 3D 图形设计的一个基本方面。无论您是在开发游戏、模拟还是可视化&#xff0c;无缝创建 3D 球体模型的能力都至关重要。Aspose.3D通过提供强大的 3D 图形 SDK 在各个行业中发挥着重要作用。它允许开发人员轻松创建、操作和转换 3D 模型。此 SDK 对于希望将…

C语言基础系列【3】VSCode使用

前面我们提到过VSCode有多么的好用&#xff0c;本文主要介绍如何使用VSCode编译运行C语言代码。 安装 首先去官网&#xff08;https://code.visualstudio.com/&#xff09;下载安装包&#xff0c;点击Download for Windows 获取安装包后&#xff0c;一路点击Next就可以。 配…