浅谈正余弦位置编码的数学原理

Transformer 位置编码(Positional Encoding) 采用的是正余弦位置编码,其形式是:

PE(pos,2i)=sin⁡(pos100002i/dmodel) PE_{(pos,2i)}=\sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)

PE(pos,2i+1)=cos⁡(pos100002i/dmodel) PE_{(pos,2i+1)}=\cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)

两个问题:

  1. 为什么是 (2i/dmodel2i/d_{model}2i/dmodel)
  2. 为什么底数是 10000

这不是严格"数学推导出来"的,而是 根据设计目标推导出的一个合理形式。下面我们一步一步解释这个设计逻辑。

一、出发点:为何需要位置编码

Transformer 的自注意力机制是 置换不变(permutation invariant) 的,即它无法天然感知输入序列的顺序。

例如:"I love you", "you love I"

如果不加入位置信息,模型无法区分它们在语义上的差异。

因此需要给每个位置 pospospos 一个向量:

PE(pos)∈Rdmodel PE(pos) \in \mathbb{R}^{d_{model}} PE(pos)∈Rdmodel

并且让嵌入向量和位置编码可以直接相加:

xpos=embedding(pos)+PE(pos) x_{pos} = embedding(pos) + PE(pos) xpos=embedding(pos)+PE(pos)

二、理想位置编码应满足的设计目标

论文在设计位置编码时,主要考虑了以下几点:

(1)唯一性 :不同位置 pospospos 应该得到不同向量。

(2)相对位置的可线性表示性 :模型应能容易地学习到相对位置关系。理想情况下,PE(pos+k)PE(pos+k)PE(pos+k) 应该能由 PE(pos)PE(pos)PE(pos) 通过线性变换得到。正余弦函数天然满足这一性质:

sin⁡(θ+π2)=cos⁡(θ), cos⁡(θ+π2)=−sin⁡(θ) \sin(\theta + \frac{\pi}{2}) = \cos(\theta),\text{ } \cos(\theta + \frac{\pi}{2}) = -\sin(\theta) sin(θ+2π)=cos(θ), cos(θ+2π)=−sin(θ)

更一般地,可以通过线性变换表示:

cos⁡(θ)sin⁡(θ)\]=\[cos⁡(ϕ)−sin⁡(ϕ)sin⁡(ϕ)cos⁡(ϕ)\]\[cos⁡(θ−ϕ)sin⁡(θ−ϕ)\] \\begin{bmatrix} \\cos(\\theta) \\\\ \\sin(\\theta) \\end{bmatrix} = \\begin{bmatrix} \\cos(\\phi) \& -\\sin(\\phi) \\\\ \\sin(\\phi) \& \\cos(\\phi) \\end{bmatrix} \\begin{bmatrix} \\cos(\\theta - \\phi) \\\\ \\sin(\\theta - \\phi) \\end{bmatrix} \[cos(θ)sin(θ)\]=\[cos(ϕ)sin(ϕ)−sin(ϕ)cos(ϕ)\]\[cos(θ−ϕ)sin(θ−ϕ)

这一性质源自三角恒等式:
cos⁡(A+B)=cos⁡Acos⁡B−sin⁡Asin⁡B \cos(A + B) = \cos A \cos B - \sin A \sin B cos(A+B)=cosAcosB−sinAsinB
sin⁡(A+B)=sin⁡Acos⁡B+cos⁡Asin⁡B \sin(A + B) = \sin A \cos B + \cos A \sin B sin(A+B)=sinAcosB+cosAsinB

自己手推一下就知道了。

(3)多尺度表示 :希望不同维度能捕捉不同粒度的位置信息------有的维度变化快(适合短距离依赖),有的变化慢(适合长距离依赖),类似于多尺度编码的思想。

三、从目标到形式:逐步构造位置编码

目标有了,现在就开始想解决办法。

第一步:使用周期函数编码位置

受三角函数线性变换性质的启发,可以考虑用正弦函数表示位置:

PE(pos)=sin⁡(ω⋅pos) PE(pos)=\sin(\omega \cdot pos) PE(pos)=sin(ω⋅pos)

或PE(pos)=cos⁡(ω⋅pos)PE(pos)=\cos(\omega \cdot pos)PE(pos)=cos(ω⋅pos),其中,ω\omegaω是频率。

第二步:不同维度用不同频率

设词嵌入 (embedding) 维度为dmodeld_{\text{model}}dmodel。我们希望每一维都有不同频率。例如,ω0,ω1,ω2,...,ωdmodel−1\omega_0,\omega_1,\omega_2,...,\omega_{d_{model}-1}ω0,ω1,ω2,...,ωdmodel−1,以编码不同尺度的信息:

PE(pos,i)=sin⁡(ωi⋅pos) PE(pos,i)=\sin(\omega_i\cdot pos) PE(pos,i)=sin(ωi⋅pos)

其中,iii 是维度。

第三步:频率如何分布?

我们希望频率从高到低呈指数级变化,这样既能覆盖短距离细节,也能表达长距离结构。这与傅里叶特征(Fourier Features)中的做法类似。

定义波长为 λi=1ωi\lambda_i=\frac{1}{\omega_i}λi=ωi1,希望波长从小到大 指数增长
λi=λmin⋅ri \lambda_i=\lambda_{min}\cdot r^i λi=λmin⋅ri

其中,λmin\lambda_{min}λmin 为最小波长,r>1r>1r>1 是增长因子。 iii 的范围比较大,需要合理归一化。

第四步:引入指数衰减的频率

设最小波长为 1,最大波长为 LLL,并令波长随维度 iii 指数增长:
λi=L2idmodel \lambda_i=L^{\frac{2i}{d_{\text{model}}}} λi=Ldmodel2i

则频率为:
ωi=1λi=1L2i/dmodel \omega_i=\frac{1}{\lambda_i}=\frac{1}{L^{{2i}/{d_{model}}}} ωi=λi1=L2i/dmodel1

Transformer 中取 L=10000L=10000L=10000,于是:
ωi=1100002i/dmodel \omega_i=\frac{1}{10000^{{2i}/{d_{model}}}} ωi=100002i/dmodel1

四、为什么是 2i?

为了将同一频率的正弦和余弦配对,分别用于偶数维和奇数维,形成更丰富的表示。2i2i2i 能表示偶数维度,2i+12i+12i+1 能表示奇数维度。设 i=0,1,2,...,dmodel2−1i=0,1,2,...,\frac{d_{model}}{2}-1i=0,1,2,...,2dmodel−1,则:
PE(pos,2i)=sin⁡(pos100002i/dmodel) PE_{(pos,2i)}=\sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)

PE(pos,2i+1)=cos⁡(pos100002i/dmodel) PE_{(pos,2i+1)}=\cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)

这样既保证了频率的多样性,又保持了表示的对称性。

五、为什么是 10000?

这是一个 经验性选择 。作用是控制 波长范围 。刚刚提到,波长定义式是λi=L2idmodel\lambda_i=L^{\frac{2i}{d_{\text{model}}}}λi=Ldmodel2i。

当 i=0i=0i=0 时,波长 λ=1\lambda= 1λ=1,周期 =2π= 2\pi=2π

当 i=dmodel2i=\frac{d_{\text{model}}}{2}i=2dmodel时,波长 λ=10000\lambda=10000λ=10000,周期 =10000×2π= 10000\times 2\pi=10000×2π

这样可以覆盖短距离和长距离关系。如果序列长度是512、1024、4096都能表示。实际上很多模型会改成1000、100000或设为可学习参数。


六、总结

位置编码本质是 不同频率的正弦波叠加 类似傅里叶特征信号频谱

  • 低维维度:频率高 → 适合捕捉短距离依赖

  • 高维维度:频率低 → 适合捕捉长距离依赖

这种设计将绝对位置 pos 映射到一个多频率坐标系中,使得模型既能区分不同位置,也能通过线性变换轻松学习相对位置关系。最终的形式简洁而统一,成为 Transformer 成功的关键组件之一。

相关推荐
小陈phd2 小时前
多模态大模型学习笔记(十二)——transformer学习之Embedding
笔记·学习·transformer
高洁014 小时前
生产线数智化质量可靠性管控与安全风险感知
人工智能·机器学习·数据挖掘·transformer·知识图谱
做cv的小昊8 小时前
大语言模型系统:【CMU 11-868】课程学习笔记02——GPU编程基础1(GPU Programming Basics 1)
人工智能·笔记·学习·语言模型·llm·transformer·agent
查无此人byebye15 小时前
【保姆级教程】从零实现模块化Transformer对话生成模型(PyTorch完整代码)
pytorch·深度学习·transformer
青春不败 177-3266-052016 小时前
最新AI-Python自然科学领域机器学习与深度学习技术——随机森林、XGBoost、CNN、LSTM、Transformer,从数据处理到时空建模等
人工智能·深度学习·机器学习·transformer·自然科学随机森林
小陈phd17 小时前
多模态大模型学习笔记(十三)——transformer学习之位置编码
人工智能·笔记·transformer
高洁0118 小时前
学习基于数字孪生的质量预测与控制
人工智能·python·深度学习·数据挖掘·transformer
飞升不如收破烂~18 小时前
Transformer 架构:用「工厂流水线」讲透(无代码、纯人话)
人工智能·深度学习·transformer
机器学习之心1 天前
基于Transformer编码器的锂电池健康状态估计(电池SOH预测,NASA数据集)MATLAB代码,MATLAB代码
matlab·transformer·电池soh预测·锂电池健康状态估计·nasa数据集