一、位置编码为什么重要?(小白必看)
1.1 现实世界的启示
想象你在听音乐会时:
- 第一排观众能清晰看到乐手表情(位置近)
- 后排观众主要感受整体氛围(位置远)
- 这种位置差异直接影响听觉体验
1.2 计算机的困境
当处理句子"猫追老鼠"时:
- 原始Transformer无法区分以下差异:
"猫[第1位] 追[第2位] 老鼠[第3位]" vs "老鼠[第1位] 追[第2位] 猫[第3位]"
1.3 解决方案演化史
方法 | 发明时间 | 代表模型 | 特点 |
---|---|---|---|
循环神经网络 | 1997 | LSTM | 自带顺序处理 |
卷积网络 | 2014 | CNN | 局部位置感知 |
位置编码 | 2017 | Transformer | 显式位置标记 |
二、手把手实现基础位置编码(含可运行代码)
2.1 正弦位置编码(原版Transformer)
import torch
import math
def positional_encoding(max_len, d_model):
position = torch.arange(max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * (-math.log(10000.0)/d_model))
pe = torch.zeros(max_len, d_model)
pe[:, 0::2] = torch.sin(position * div_term) # 偶数位用sin
pe[:, 1::2] = torch.cos(position * div_term) # 奇数位用cos
return pe
# 生成示例:序列长度50,维度128
pe = positional_encoding