1. 正弦位置编码的诞生背景
在自然语言处理领域,Transformer架构彻底改变了序列建模的方式。但与传统RNN不同,Transformer的自注意力机制本身并不包含任何位置信息——它只能看到输入序列中各个token之间的关系,却无法感知这些token在序列中的先后顺序。这就好比一个人阅读文章时能理解每个词语的含义,却不知道这些词语在句子中的排列顺序。
为了解决这个问题,研究人员引入了位置编码(Positional Encoding)的概念。2017年Vaswani等人在原始Transformer论文中提出的正弦位置编码方案,成为了后续众多模型的基础。这种编码方式之所以经典,是因为它巧妙地利用了三角函数的数学性质,满足了序列建模中对位置信息的多种需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 正弦位置编码的数学定义
2.1 基本公式
正弦位置编码的数学表达式如下:
对于位置pos和维度i,编码值PE的计算方式为:
code复制PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
其中:
- pos:token在序列中的位置索引(从0开始)
- i:编码向量的维度索引(从0到d_model/2-1)
- d_model:模型的隐藏层维度
这个公式有几个关键特点:
- 偶数维度使用正弦函数,奇数维度使用余弦函数
- 分母中的10000^(2i/d_model)项决定了不同维度的频率
- 频率随着维度增加呈几何级数下降
2.2 频率设计原理
频率的选择是正弦位置编码的核心设计之一。公式中10000^(2i/d_model)这一项确保了:
- 低频维度(i较大)变化缓慢,可以捕捉长距离的位置关系
- 高频维度(i较小)变化迅速,可以区分相邻位置
- 频率范围覆盖了约4个数量级,提供了多尺度的位置感知能力
这种设计类似于傅里叶变换中的多频率分解,不同频率的分量共同构成了完整的位置信息表示。
3. 正弦编码的数学性质
3.1 线性变换表示相对位置
正弦编码最精妙的性质在于它能用线性变换表示位置偏移。对于任意偏移量k,存在一个变换矩阵M_k,使得:
code复制PE(pos + k) = M_k · PE(pos)
这个性质源自三角函数的和角公式:
code复制sin(ω(pos + k)) = sin(ω·pos)cos(ωk) + cos(ω·pos)sin(ωk)
cos(ω(pos + k)) = cos(ω·pos)cos(ωk) - sin(ω·pos)sin(ωk)
用矩阵表示就是:
code复制[ sin(ω(pos+k)) ] [ cos(ωk) sin(ωk) ] [ sin(ω·pos) ]
[ cos(ω(pos+k)) ] = [-sin(ωk) cos(ωk) ] [ cos(ω·pos) ]
这个性质使得模型可
