目录
在学习 Transformer 的过程中,很多人都会产生一个疑问:
既然 Transformer 已经如此强大,那么它是如何知道一句话中词语先后顺序的?
例如:
我喜欢学习人工智能
和:
人工智能喜欢我学习
虽然包含相同的词汇。
但是:
含义完全不同。
对于人类来说:
我们天然能够理解词语顺序的重要性。
但对于计算机而言:
输入本质上只是一个个数字向量。
如果不额外处理:
模型根本无法区分:
A B C D
和:
D C B A
的区别。
这正是 Transformer 面临的一个核心问题。
2017年,Google 在论文:
《Attention Is All You Need》
中提出了一种巧妙的解决方案:
Positional Encoding
即:
位置编码
位置编码的出现,使 Transformer 在不依赖 RNN 和 CNN 的情况下,依然能够理解序列顺序信息。
可以说:
没有位置编码,就没有真正意义上的 Transformer。
本文将深入讲解 Transformer 中位置编码的设计思想、数学原理、实现方式以及实际应用。
二、为什么 Transformer 需要位置编码
(一)RNN为什么天然具有顺序信息
在 Transformer 出现之前。
主流模型包括:
-
RNN
-
LSTM
-
GRU
例如:
我
↓
喜欢
↓
学习
↓
AI
RNN 是逐个词处理的。
因此:
顺序天然保留。
模型知道:
我
在前面
AI
在后面
(二)Transformer的特点
Transformer 完全不同。
其核心是:
Self-Attention
在计算过程中:
所有词同时进入模型
例如:
我
喜欢
学习
AI
会一次性输入。
结构如下:
Input
↓
Self-Attention
↓
Output
模型并不知道:
谁在前
谁在后
(三)顺序信息丢失问题
假设:
输入:
我 爱 北京
Embedding后:
[0.3,0.5...]
[0.7,0.2...]
[0.9,0.8...]
Transformer只能看到向量。
并不知道:
第一词
第二词
第三词
因此:
必须额外加入位置信息。
三、位置编码的核心思想
(一)给每个位置添加身份标识
类似于:
电影院座位号。
例如:
第1排
第2排
第3排
即使人换了。
座位顺序不会变。
同理:
Transformer希望告诉模型:
我是第1个词
我是第2个词
我是第3个词
(二)位置编码加入方式
假设:
词向量:
Embedding
位置向量:
Position Encoding
最终输入:
Input
=
Embedding
+
Position Encoding
即:
词语语义
+
位置信息
同时输入模型。
四、最简单的位置编码方法
(一)绝对位置编号
例如:
句子:
我 喜欢 学习 AI
位置:
我 → 1
喜欢 → 2
学习 → 3
AI → 4
直接将位置作为数字。
(二)存在的问题
如果直接使用:
1
2
3
4
模型难以学习。
并且:
无法泛化到更长序列。
例如:
训练长度:
100
测试长度:
1000
效果会变差。
因此:
Google采用了更聪明的方法。
五、Transformer中的正弦位置编码
(一)Google提出的方法
Transformer论文采用:
Sin
Cos
函数构建位置编码。
原因:
连续
平滑
可泛化
(二)位置编码公式
Transformer原始公式:
PE(pos,2i)=\sin\left(\frac{pos}{10000^{\frac{2i}{d_{model}}}}\right)
偶数维:
使用 Sin。
奇数维:
PE(pos,2i+1)=\cos\left(\frac{pos}{10000^{\frac{2i}{d_{model}}}}\right)
使用 Cos。
(三)参数解释
其中:
pos
表示:
位置编号。
例如:
第1个词
第2个词
第3个词
i
表示:
向量维度索引。
d_model
表示:
Embedding维度。
例如:
512
六、为什么使用 Sin 和 Cos
(一)不同维度对应不同波长
例如:
某些维度:
变化较快。
波长短
某些维度:
变化较慢。
波长长
这样:
每个位置都会获得唯一编码。
(二)天然表达相对距离
例如:
位置:
10
与:
11
编码非常接近。
而:
10
与:
100
差异明显。
因此:
模型可以轻松学习:
词与词之间距离关系
(三)支持超长序列
即使训练时:
512 Tokens
推理时:
2048 Tokens
仍可计算位置编码。
无需重新训练。
七、位置编码生成示例
假设:
d_model = 4
位置:
pos = 1
生成:
[
sin(...),
cos(...),
sin(...),
cos(...)
]
位置:
pos = 2
生成:
[
sin(...),
cos(...),
sin(...),
cos(...)
]
最终:
每个位置对应唯一向量。
八、位置编码与Embedding融合
(一)Embedding表示什么
例如:
苹果
Embedding表示:
水果
食物
植物
等语义信息。
(二)位置编码表示什么
例如:
第5个词
表示:
位置信息。
(三)最终融合
Transformer采用:
Embedding
+
Position Encoding
例如:
[0.2,0.5,0.8]
+
[0.1,0.3,0.4]
=
[0.3,0.8,1.2]
最终送入Attention。
九、位置编码可视化理解
可以将位置编码看成:
GPS坐标
系统。
Embedding表示:
你是谁
位置编码表示:
你在哪
两者结合:
身份
+
位置
模型才能真正理解序列。
十、位置编码在Self-Attention中的作用
加入位置编码后:
输入变为:
Token
+
Position
随后:
进入:
Q
K
V
计算。
因此:
Attention不仅关注:
词义
同时关注:
词序
十一、位置编码存在的问题
虽然Sin-Cos编码非常经典。
但仍存在一些局限。
(一)固定编码
训练过程中:
无法更新。
属于:
Fixed Encoding
(二)表达能力有限
对于超长文本:
效果逐渐下降。
(三)无法充分建模相对位置
例如:
A距离B三个词
这种关系表达不够直接。
十二、可学习位置编码
后来研究人员提出:
Learnable Position Embedding
即:
可训练位置编码。
(一)基本思想
直接定义:
Position Matrix
例如:
512 × 768
矩阵。
(二)训练过程中更新
类似:
Embedding
不断优化。
(三)代表模型
例如:
-
BERT
-
ViT
都采用可学习位置编码。
十三、相对位置编码
随着大模型发展。
又出现:
Relative Position Encoding
相对位置编码。
(一)核心思想
不关注:
你在第几位
而关注:
你离我多远
(二)优势
更符合语言规律。
能够更好处理:
长文本
任务。
(三)代表模型
例如:
-
Transformer-XL
-
T5
-
DeBERTa
十四、RoPE旋转位置编码
近年来最热门的位置编码:
RoPE
即:
Rotary Position Embedding
旋转位置编码。
(一)核心思想
通过旋转矩阵:
将位置信息直接融入:
Q
K
计算。
(二)优势
支持:
超长上下文
表现优秀。
(三)应用模型
目前主流大模型:
-
GPT-NeoX
-
LLaMA
-
Qwen
-
DeepSeek
均采用:
RoPE
方案。
十五、PyTorch实现位置编码
下面实现经典Sin-Cos位置编码。
import torch
import math
class PositionalEncoding(torch.nn.Module):
def __init__(
self,
d_model,
max_len=5000):
super().__init__()
pe = torch.zeros(
max_len,
d_model
)
position = torch.arange(
0,
max_len
).unsqueeze(1)
div_term = torch.exp(
torch.arange(
0,
d_model,
2
)
*
(-math.log(10000.0)
/ d_model)
)
pe[:,0::2] = torch.sin(
position * div_term
)
pe[:,1::2] = torch.cos(
position * div_term
)
self.register_buffer(
'pe',
pe
)
def forward(self,x):
return x + self.pe[
:x.size(1)
]
该代码就是 Transformer 原始论文中的位置编码实现思想。
十六、总结
位置编码(Positional Encoding)是 Transformer 架构不可或缺的重要组成部分,它解决了 Self-Attention 无法感知词序的问题。
本文重点掌握了:
1、为什么 Transformer 需要位置编码;
2、RNN 与 Transformer 的区别;
3、位置编码核心思想;
4、Sin-Cos位置编码公式;
5、位置编码生成原理;
6、Embedding与位置编码融合方式;
7、固定位置编码与可学习位置编码;
8、相对位置编码思想;
9、RoPE旋转位置编码原理;
10、PyTorch实现方式。
可以将位置编码理解为:
“给每个Token附加一个位置身份证,让Transformer在全局并行计算的同时,依然能够理解序列顺序信息。”
正是位置编码的存在,Transformer 才真正具备了处理自然语言、代码、图像和多模态数据的能力。而随着大模型的发展,从 Sin-Cos 到 Relative Position,再到如今广泛使用的 RoPE,位置编码技术也正在不断演进,成为现代 AI 模型中的关键基础技术。

404

被折叠的 条评论
为什么被折叠?



