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

news2025/2/10 12:08:52

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.coloradmin.cn/o/2295791.html

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

相关文章

<论文>DeepSeek-R1:通过强化学习激励大语言模型的推理能力(深度思考)

一、摘要 本文跟大家来一起阅读DeepSeek团队发表于2025年1月的一篇论文《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning | Papers With Code》&#xff0c;新鲜的DeepSeek-R1推理模型&#xff0c;作者规模属实庞大。如果你正在使用Deep…

萌新学 Python 之字符串及字符串相关函数

字符串&#xff1a;单引号、双引号、三个单引号、三个双引号 字符串属于不可变的数据类型&#xff0c;一旦被定义&#xff0c;内存地址不变 name 张三 # 字符串赋值给name后&#xff0c;内存地址存储张三&#xff0c;地址不变 username 张三 # 张三去内存中找…

系统思考—自我超越

“人们往往认为是个人的能力限制了他们&#xff0c;但事实上&#xff0c;是组织的结构和惯性思维限制了他们的潜力。”—彼得圣吉 最近和一家行业隐形冠军交流&#xff0c;他们已经是领域第一&#xff0c;老板却依然要求&#xff1a;核心团队都要自我超越&#xff0c;攻坚克难…

redis高级数据结构Stream

文章目录 背景stream概述消息 ID消息内容常见操作独立消费创建消费组消费 Stream弊端Stream 消息太多怎么办?消息如果忘记 ACK 会怎样?PEL 如何避免消息丢失?分区 Partition Stream 的高可用总结 背景 为了解决list作为消息队列是无法支持消息多播问题&#xff0c;Redis5.0…

day44 QT核心机制

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QLabel> //标签类头文件 #include<QPushButton> //按钮类头文件 #include<QLineEdit> //行编辑器类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } …

打家劫舍3

今天和打家讲一下打家劫舍3 题目&#xff1a; 题目链接&#xff1a;337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为root。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“…

2024中国行政区划多边形矢量数据(含有十段线)仅供学习

中国标准行政区划数据GS&#xff08;2024&#xff09;0650号&#xff0c;包括&#xff1a; 分省市县 省内分市 省内分县 南海十段线与岛屿区域 全国市级行政区划 通过网盘分享的文件&#xff1a;中国标准行政区划数据GS&#xff08;2024&#xff09;0650号.rar等4个文件 链接…

给底部导航栏添加图形

文章目录 1. 概念介绍2. 修改方法2.1 修改属性2.2 包裹容器2.3 剪裁形状3. 代码与效果3.1 示例代码3.2 运行效果4. 内容总结我们在上一章回中介绍了"NavigationBar组件"相关的内容,本章回中将介绍如何修改NavigationBar组件的形状.闲话休提,让我们一起Talk Flutter…

#渗透测试#批量漏洞挖掘#WookTeam searchinfo SQL注入漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概述 二、漏洞成因分析 1. 代码…

HarmonyOS Next 方舟字节码文件格式介绍

在开发中&#xff0c;可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中&#xff0c;arkts会编译成方舟字节码。方舟字节码长什么样呢&#xff1f;我们以一个demo编译出的abc文件&#xff1a; 二进制就是长这样&#xff0c;怎么去理解呢&…

WPS如何接入DeepSeek(通过JS宏调用)

WPS如何接入DeepSeek 一、文本扩写二、校对三、翻译 本文介绍如何通过 WPS JS宏调用 DeepSeek 大模型&#xff0c;实现自动化文本扩写、校对和翻译等功能。 一、文本扩写 1、随便打开一个word文档&#xff0c;点击工具栏“工具”。 2、点击“开发工具”。 3、点击“查看代码”…

【课程设计参考】迷宫小游戏 :基于 Python+Pygame+AI算法

一、内容 实现走迷宫 &#xff08;1&#xff09;游戏界面显示&#xff1a;迷宫地图、上下左右移动的特效。 &#xff08;2&#xff09;动作选择&#xff1a;上下左右键对应于上下左右的移动功能&#xff0c;遇到障碍的处理。 &#xff08;3&#xff09;得分统计功能&#xff…

sa8295 qnx ais_camare如何支持一个摄像头两路vc输出?

当一个摄像头有两个vc输出的时候&#xff0c;如何更改驱动配置呢&#xff1f; 当一个摄像头可以输出两路vc&#xff0c;并且格式不同。根据每一路的vc图像数据格式修改串行器中maxxxx_mode_t里面的数组mode参数&#xff08;以下仅为例子&#xff09; struct maxxxx_mode_t ma…

Coze(扣子)+ Deepseek:多Agents智能体协作开发新范式

前言 在当今数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅猛发展正深刻改变着我们的生活和工作方式。从智能语音助手到自动化流程机器人&#xff0c;AI 的应用无处不在&#xff0c;为我们提供了更加便捷、高效的服务。然而&#xff0c;对于非专业人士来…

浅析Ruby类污染及其在Sinatra框架下的利用

和JavaScript中的原型链污染类似&#xff0c;Ruby中也存在类似的概念——类污染&#xff0c;两者都是对象进行不安全的递归合并导致的。 网上也没有相关的分析文章&#xff0c;只有下面这篇文章应该是第一次谈到这个问题 Class Pollution in Ruby: A Deep Dive into Exploiti…

【NLP251】Transformer API调用

1. nn.Transformer nn.Transformer封装了Transformer中的包含编码器&#xff08;Encoder&#xff09;和解码器&#xff08;Decoder&#xff09;。如下图所示&#xff0c;它对Encoder和Decoder两部分的包装&#xff0c;它并没有实现输入中的Embedding和Positional Encoding和最…

idea 如何使用deepseek 保姆级教程

1.安装idea插件codegpt 2.注册deepseek并生成apikey deepseek 开发平台&#xff1a; DeepSeek​​​​​​​ 3.在idea进行codegpt配置 打开idea的File->Settings->Tools->CodeGPT->Providers->Custom OpenAI Chat Completions的URL填写 https://api.deepseek…

python实现情绪识别模块,并将模块封装成可执行文件

目录&#xff1a; 1.源码&#xff1a;2.情绪识别模型运行流程&#xff1a;3.模型封装需要注意的地方&#xff1a;4.未解决问题&#xff1a; 1.源码&#xff1a; https://gitcode.com/xyint/deep_learning.git 2.情绪识别模型运行流程&#xff1a; 需要获取用户摄像头权限&…

AH比价格策略源代码

用python 获取在A股和香港上市的公司和在A股和香港上市的公司股票代码和名称并且选出港股和A股涨幅相差比较大的股票 import akshare as akdef get_ah_stocks():# 获取A股股票列表a_stock_list ak.stock_zh_a_spot_em()print(a_stock_list)a_stock_list a_stock_list[[&quo…

群晖安装Gitea

安装Docker Docker运行Gitea 上传gitea包&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/hmxm6/90360455 打开docker 点击印象&#xff0c;点击新增&#xff0c;从文件添加 点击启动 可根据情况&#xff0c;进行高级设置&#xff0c;没有就下一步 点击应…