1. 为什么Transformer需要位置编码?
在自然语言处理领域,Transformer模型彻底改变了传统的序列建模方式。与传统RNN不同,Transformer采用Self-Attention机制,这种机制天生就有一个特点:它对输入序列中各个词的位置关系是"盲"的。当模型看到"猫追老鼠"和"老鼠追猫"这两个句子时,如果仅从词袋的角度看,它们的词序是完全相同的。
这里有个关键认知:Self-Attention计算的是词与词之间的相关性权重,但这个过程本身不包含任何位置信息。就像你在听一首歌时,如果只给你看歌词而不告诉你每句歌词出现的顺序,你根本无法还原歌曲的原貌。
传统RNN通过逐步处理序列来隐式编码位置信息,而CNN则通过卷积核的滑动窗口捕获局部位置关系。Transformer要突破这些限制,就必须显式地告诉模型每个词的位置。这就是Positional Encoding(位置编码)的核心使命——为模型装上"时钟",让词语找回它们的位置感。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 音乐节拍启发的位置编码设计
2.1 从正弦波到位置编码矩阵
原始Transformer论文提出的位置编码使用了一组精心设计的正弦函数:
python复制def positional_encoding(max_len, d_model):
position = np.arange(max_len)[:, np.newaxis]
div_term = np.exp(np.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))
pe = np.zeros((max_len, d_model))
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
return pe
这段代码生成的矩阵中,每一行对应一个位置,每一列对应一个维度。奇数列使用正弦函数,偶数列使用余弦函数。这种设计有三个精妙之处:
- 不同频率的正余弦函数组合可以表示绝对位置
- 线性组合后可以表示相对位置(得益于三角函数的加法公式)
- 数值范围稳定在[-1,1]之间,与词嵌入的数值范围匹
