神经网络Transformer架构中的位置编码
位置编码是Transformer架构中的一种技术,用于为输入序列中的每个标记(如单词或子词)注入位置信息。由于Transformer的自注意力机制本身不包含顺序信息,位置编码确保模型能够理解序列中元素的相对或绝对位置。
-
自注意力机制的位置不变性
Transformer的自注意力层通过计算所有标记对之间的关联权重来捕捉上下文,但该操作是排列不变的:输入序列的顺序改变不会影响输出。例如,句子"猫追老鼠"和"老鼠追猫"在自注意力中可能产生相同的表示,但含义完全不同。位置编码通过向每个标记的嵌入向量添加位置相关向量来打破这种对称性,使模型区分序列顺序。 -
位置编码的数学形式
原始Transformer使用正弦和余弦函数生成位置编码。对于位置\(pos\)(从0到序列长度-1)和维度\(i\)(从0到嵌入维度-1),编码值计算为:
\[ PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \]
\[ PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) \]
其中\(d_{\text{model}}\)是嵌入维度。这种设计使模型能学习到相对位置:对于固定偏移\(k\),\(PE_{pos+k}\)可表示为\(PE_{pos}\)的线性函数。
-
位置编码的特性
- 周期性:正弦函数使编码在长序列中重复,但不同频率的叠加确保每个位置编码唯一。
- 有界性:编码值范围在[-1,1],与词嵌入尺度兼容。
- 泛化性:函数式编码允许模型处理比训练时更长的序列,而无需重新训练。
-
位置编码与词嵌入的整合
位置编码直接与输入词嵌入向量相加:
\[ \mathbf{h}_i = \mathbf{e}_i + \mathbf{p}_i \]
其中\(\mathbf{e}_i\)是第\(i\)个标记的词嵌入,\(\mathbf{p}_i\)是其位置编码。相加后的向量作为Transformer编码器的输入。
- 其他位置编码变体
- 可学习位置编码:将位置编码作为训练参数,适用于固定最大序列长度的任务,但缺乏外推能力。
- 相对位置编码:直接建模标记间的相对距离(如Transformer-XL),通过注意力权重中的偏置项实现。
- 旋转位置编码(RoPE):通过旋转矩阵将位置信息注入注意力计算,常用于大型语言模型(如LLaMA)。