Transformer位置编码的数学之美:从几何直觉到相对位置建模
当我们第一次看到Transformer模型中的位置编码公式时,难免会产生这样的疑问:为什么选择正弦和余弦函数的组合?这个看似简单的设计背后隐藏着怎样的数学智慧?让我们暂时抛开论文中的公式,从一个全新的视角来探索这一设计的精妙之处。
想象一下,如果让你设计一个系统来表示序列中元素的位置,你会怎么做?最简单的方案可能是直接用自然数1,2,3...来表示位置,但这种方案在处理不同长度序列时会遇到数值范围不统一的问题。另一种方案是使用归一化的位置索引(如将位置映射到[0,1]区间),但这又无法体现相对位置关系。Transformer的发明者们找到了一种既优雅又实用的解决方案——通过正弦波的交织来编码位置信息。
1. 位置编码的几何解释
1.1 作为高维空间中的螺旋线
位置编码最直观的几何解释是将其视为高维空间中的螺旋线。每个位置t对应的编码向量pt可以看作是一个在多维空间中沿着特定轨迹移动的点。正弦和余弦函数的交替使用,创造了一种旋转的效果:
python复制import numpy as np
def positional_encoding(pos, d_model=512):
position = np.arange(pos)[:, np.newaxis]
div_term = np.exp(np.arange(0, d_model, 2) * -(np.log(10000.0) / d_model))
pe = np.zeros((pos, d_model))
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
return pe
这段代码生成的每个位置编码向量,实际上记录了该点在多维旋转空间中的"相位"。不同维度的频率呈几何级数下降,确保了从短周期变化到长周期变化的平滑过渡。
1.2 与傅里叶分析的深刻联系
位置编码的设计灵感部分来源于傅里叶分析。我们知道,任何周期函数都可以表示为不同频率正弦和余弦函数的线性组合。Transformer的位置编码采用了类似的思路,但有两个关键创新:
