【基础理论】位置向量|位置编码学习笔记
位置向量(准确说应该叫 “位置编码”)的设计特别巧妙,既能让模型区分词的顺序,又能适应任意长度的句子,还不增加太多计算量。它是 2017 年 Transformer 那篇经典工作里提出的,背后是谷歌的一个研究团队(Vaswani 等人),能想出用正弦余弦函数生成位置信息,确实很有洞察力~
一、先明确:位置向量的核心作用——给“词向量”加“顺序标签”
Transformer处理文本时,会把句子里的所有词并行计算(同时处理“我”“喜欢”“猫”),但这样会丢失“词的顺序信息”(比如分不清“我喜欢猫”和“猫喜欢我”)。
位置向量的作用就是:给每个词的“词嵌入向量”(比如512维)补充“位置信息”,让模型知道“哪个词在前、哪个词在后”。
关键前提:位置向量的维度必须和词嵌入向量一致(比如词嵌入是512维,位置向量也得是512维)——只有维度相同,才能直接“相加”(不是拼接),既保留词的语义,又加上位置信息。
二、位置向量的“样子”:两个核心特征
位置向量没有“固定不变的数字”,但有固定的维度结构和可预测的数值规律,我们从这两点拆解“长什么样”。
1. 维度结构:和词嵌入向量完全一致(常用512维)
无论句子里的词在“第几个位置”(比如第1个词、第10个词、第100个词),它的位置向量维度都和“词嵌入向量的维度(d_model)”保持一致:
- 若d_model=512(日常最常用的设置):每个位置的位置向量都是 512维(一串512个数字);
- 若d_model=128(小模型常用):每个位置的位置向量都是 128维。
举个直观例子:
句子“我喜欢猫”有3个词,分别在“位置1”“位置2”“位置3”,每个词的位置向量都是512维,形状如下(用“[数字1, 数字2, …, 数字512]”表示):
- 位置1的位置向量:[a₁, a₂, a₃, …, a₅₁₂]
- 位置2的位置向量:[b₁, b₂, b₃, …, b₅₁₂]
- 位置3的位置向量:[c₁, c₂, c₃, …, c₅₁₂]
核心:不同位置的向量,维度相同,但里面的数字不同(以此区分位置)。
2. 数值规律:按“周期性”变化(不用记公式,看规律)
位置向量的数值是通过“正弦(sin)和余弦(cos)函数”生成的,但不用纠结复杂公式,重点理解**“不同位置的向量,数值有固定变化规律,且每个位置的向量都是唯一的”**:
- 对于位置向量的“偶数维度”(比如第2维、第4维、第6维…):用正弦函数生成,周期随维度增大而变长;
- 对于位置向量的“奇数维度”(比如第1维、第3维、第5维…):用余弦函数生成,周期同样随维度增大而变长。
用“简化例子”看数值规律(d_model=4,小维度更易理解)
假设d_model=4(位置向量是4维),我们看“位置1”“位置2”“位置3”的位置向量数值(数字仅为示例,体现规律):
位置编号 | 位置向量(4维) | 数值规律说明 |
---|---|---|
位置1 | [sin(1), cos(1), sin(1×4), cos(1×4)] | 第1维(奇数):sin(1);第2维(偶数):cos(1);第3维(奇数):sin(4);第4维(偶数):cos(4) |
位置2 | [sin(2), cos(2), sin(2×4), cos(2×4)] | 位置变2,“括号里的数”也变2,数值随位置递增而变化 |
位置3 | [sin(3), cos(3), sin(3×4), cos(3×4)] | 同理,位置3对应“括号里的数=3”,数值继续变化 |
关键观察:
- 同一维度(比如第1维):不同位置的数值不同(sin(1)≠sin(2)≠sin(3)),能区分“位置1/2/3”;
- 同一位置(比如位置1):4个维度的数值组合是唯一的([sin(1),cos(1),sin(4),cos(4)]),不会和其他位置重复;
- 周期变化:维度越大,“括号里的乘数”越大(比如第3维乘数是4,第1维是1),数值变化周期越长,能覆盖“很长的句子”(哪怕句子有1000个词,也能生成唯一的位置向量)。
三、位置向量的“使用方式”:和词嵌入向量“直接相加”
位置向量不是“单独用”,而是和词嵌入向量结合后,作为Transformer的最终输入:
最终输入向量 = 词嵌入向量 + 位置向量
用简化例子(d_model=4)看结合过程:
- 词嵌入向量(比如“喜欢”的向量):[0.2, 0.5, -0.1, 0.3];
- 位置向量(“喜欢”在位置2):[sin(2), cos(2), sin(8), cos(8)] ≈ [0.909, 0.416, 0.989, -0.145];
- 相加后的最终输入向量:[0.2+0.909, 0.5+0.416, -0.1+0.989, 0.3+(-0.145)] ≈ [1.109, 0.916, 0.889, 0.155]。
为什么相加不是拼接? 因为相加能在“不增加维度”的前提下,把位置信息融入词向量——如果拼接,维度会变成512+512=1024,会增加后续计算量,且不符合Transformer的输入设计。
四、核心总结:位置向量的3个关键“样子”特征
- 维度固定匹配:和词嵌入向量的维度(d_model)完全一致(常用512维),确保能直接相加;
- 数值唯一且有规律:每个位置的向量数值都是唯一的,通过“正弦/余弦的周期性变化”生成,能清晰区分“第1个词、第2个词…第N个词”;
- 与词嵌入结合使用:不是单独存在,而是和词嵌入向量相加,形成“带位置信息的词向量”,作为Transformer的输入基础。
不用记生成公式! 只需记住:位置向量的核心是“给词加顺序标签”,维度和词嵌入一致,数值能区分不同位置,通过相加融入即可。
附:简化可视化
假设d_model=4,句子长度=3,位置向量的“样子”可简化为下表(数值为近似值,体现规律):
位置编号 | 位置向量(4维) | 对应“词+位置”示例 |
---|---|---|
1 | [0, 1, 0, 1] | “我”(第1个词)的位置向量 |
2 | [0.909, 0.416, 0.989, -0.145] | “喜欢”(第2个词)的位置向量 |
3 | [0.141, -0.989, -0.757, -0.654] | “猫”(第3个词)的位置向量 |