
Transformer 架构凭借其强大的自注意力机制,彻底改变了机器学习领域。然而,该机制存在一个根本性的盲点:它将输入数据视为一个无序的“项目袋”,这使其天生无法感知序列顺序——而顺序是语言、时间和空间的关键组成部分。本文旨在探讨位置编码这一概念,来解决这一关键缺陷。位置编码是一种优雅的解决方案,它为模型注入了顺序感。在接下来的章节中,我们将探讨使该技术如此有效的原理,及其在各种不可或缺的应用场景中的多样化应用。
自注意力机制是 Transformer 的核心,它以其简洁和强大而令人惊叹。想象一个房间里挤满了人,每个人都可以观察其他任何人来形成自己的想法。在一个句子中,每个词都可以“审视”其他所有词,从其邻近词中汲取上下文和意义。这是通过计算一个词的“查询 (query)”向量与所有其他词的“键 (key)”向量之间的“相似度得分”(一个点积)来实现的。这些得分决定了在为该词生成新的、富含上下文的表示时,应给予每个词的“值 (value)”向量多大的注意力或权重。这是一个非常民主的系统。
但在这幅简单的图景背后,隐藏着一个深刻而微妙的问题。
让我们将这个机制简化到其最基本的核心:一组通过点积和加权和相互作用的向量。如果我们把“狗咬人”这个句子打乱成“人咬狗”,会发生什么?词的集合是完全相同的。在一个没有任何位置信息的基本自注意力机制中,向量表示的集合也是完全相同的。网络实际上是在处理一个“词袋”。它知道哪些词存在,但完全不清楚它们的顺序。
为了证明这不仅仅是泛泛而谈,我们考虑一个纯粹由自注意力层和逐位置前馈网络层构成的 Transformer 编码器,其中没有任何位置信息。如果你向它输入一个序列 ,它会产生一个输出序列 。现在,如果你向它输入一个经过排列的序列,比如 ,输出将仅仅是原始输出的排列版本,即 。这个属性被称为排列等变性 (permutation equivariance)。
如果我们接着对这些输出向量进行平均以进行最终分类——一种称为池化 (pooling) 的常用策略——结果就变成了排列不变性 (permutation-invariant)。 的平均值与 的平均值相同。这意味着模型将从根本上无法区分“狗咬人”和“人咬狗”。它无法解决任何顺序对意义至关重要的任务。
这不是一个小缺陷,而是一个灾难性的缺陷。语言,以及大多数序列数据,都是由其顺序定义的。我们必须给模型一个时钟,或者一张地图。我们需要注入位置的概念。
我们如何告诉模型一个词的位置在哪里?一个朴素的方法可能是为每个位置分配一个整数:1、2、3,依此类推。但这存在问题:数字可能会无限增长,而且它们之间的差异(从1到2的步长与从99到100的步长)可能没有一致的含义。
Transformer 的创造者们提出了一个远为优雅的解决方案:正弦位置编码。每个位置 不再被赋予一个单一的数字,而是被分配一个独特的、高维的向量 。这个向量不是学习得来的,而是由一个固定的公式生成。具体来说,它的分量由不同频率的正弦和余弦函数构成:
其中 是向量的维度, 是频率的索引。这个向量随后被加到词语的内容嵌入 (content embedding) 上。
为什么是这个特殊而奇特的公式?它看似复杂,实则天才。可以这样想:我们正在为每个词在多维空间中赋予一个独特的坐标。但这些不仅仅是任意的坐标,它们构成了一组强大的基函数。在一个思想实验中,一个简单的线性模型试图逼近复杂函数,当提供了这些正弦特征后,其表达能力显著增强。一个只能画直线的模型,在获得这些特征后,突然可以描绘出复杂的、高频的波形。位置编码为模型提供了一种丰富的“语言”来描述位置和结构。
当我们回顾注意力机制的点积时,使用正弦和余弦对的真正美妙之处就显现出来了。假设位置 和 的查询向量和键向量分别包含了它们的位置编码 和 。点积 将是注意力分数的主要部分。让我们来看一下仅由一个频率为 的正弦/余弦对所做的贡献:
你可能从高中三角函数课上认出这个公式。这是余弦的差角公式!这个表达式完全等于:
这是一个深刻的结果。位置 和位置 的位置编码之间的点积,不是它们绝对位置的函数,而是它们相对偏移 的函数。完整的点积是这些余弦项在编码中所有不同频率上的总和。
这意味着注意力机制内在地具备了学习相对位置的能力。它可以轻易地学习到诸如“密切关注我左边两个位置的词”之类的规则,因为“左边两个位置”的信号是稳定且强烈的,无论我们是处在位置5还是位置50。相比之下,如果我们为每个位置使用简单的学习嵌入(例如,使它们相互正交),点积只会告诉模型两个位置是否相同,而不会告诉它们相距多远。正弦编码的选择将序列的几何结构融入其中。
这种理解相对位置的能力赋予了正弦编码另一个近乎神奇的特性:能够泛化到训练中从未见过的序列长度。
想象一下,你已经在一个长度最多为 个词的文本上训练了一个模型。当你让它处理一个有100个词的句子时,会发生什么?
如果你使用的是“学习到的”位置嵌入——即模型为从1到64的每个位置学习一个独特的向量——你就会遇到问题。你该为位置65使用哪个向量呢?一种常见的方法是直接重用位置64的向量。但这是一个笨拙的修复方法。模型实际上对其训练范围之外的任何结构都视而不见。正如一项分析所示,这样的模型完全无法外推一个简单的周期函数,而是对所有未来的位置都预测一个常数值。
但正弦编码是一个公式。你可以代入任何位置 ,无论是65还是65000,这个公式都会生成一个完全有效、独特的位置向量。因为模型已经学会了基于点积中编码的相对偏移的规则,这些规则可以无缝地应用于更长的序列。它理解“距离”这个概念,这是一个可以无限延伸的概念。
正弦编码之所以是解决这个问题的“正确”数学工具,还有一个更深层、更美妙的原因。这个原因来自信号处理和线性代数的世界。
考虑对序列最基本的操作:将其移动一个位置。我们称之为移位算子 (shift operator) 。我们可以问一个非常数学化的问题:是否存在任何特殊的向量,当你移动它们时,它们的形状不改变,只是被一个常数因子缩放?这些特殊的向量被称为特征向量 (eigenvectors)。对于具有周期性边界的有限序列上的移位算子,其特征向量恰好是复指数——也就是我们用于位置编码的正弦和余弦波。它们是任何离散、移位不变系统的自然“模式”或“共振频率”。
现在,关键的飞跃来了:一个只关心相对位置的自注意力机制是一个移位不变算子 (shift-invariant operator)。这意味着它与移位算子是可交换的,而线性代数的一个基本定理表明,可交换的算子共享相同的特征向量。
这告诉我们一个惊人的事实:我们的正弦位置编码同时也是相对注意力算子的特征向量!当我们向注意力层输入一个特定频率的纯正弦波时,输出的是完全相同的正弦波,只是被放大或衰减并发生了相移。注意力层就像一个频率滤波器 (frequency filter)。它可以选择对某些频率给予更多或更少的关注,但它不能将它们混淆——它不能将高频信号变成低频信号。这为学习提供了一个极其稳定和结构化的基础,将整个架构植根于傅里叶分析强大且被充分理解的原理之上。
我们所揭示的原理是如此基础,以至于它们持续启发着新的、更优的架构。
旋转位置编码 (Rotary Positional Encoding, RoPE) 是对加法式位置编码的一个优雅的后继者。RoPE 不是将位置向量加到内容向量上,而是根据查询和键向量的位置,将它们在多维空间中旋转一个特定的角度。这个巧妙的技巧在数学上保证了点积 仅依赖于相对位置 ,从而以一种更直接、更稳健的方式实现了相对编码的目标。在圆形序列上测试时,基于 RoPE 的注意力表现出近乎完美的旋转不变性,这是加法式编码所缺乏的特性。
当然,即使有完美的理论模型,实践细节也很重要。其中的平衡非常微妙。如果位置信号的幅度太小,模型就会失去其顺序感。如果幅度太大,注意力机制中的 softmax 函数可能会饱和,导致注意力“坍缩”到单个位置,从而失去整合多个来源信息的能力。
从一个关于词序的简单谜题出发,我们穿越了几何学、三角学,并深入到线性代数的核心。位置编码的故事完美地展示了一个实际的工程问题如何导向一个具有深刻数学美感和统一性的解决方案,揭示了不仅支配着语言,也支配着信息本身的深层结构。
在前面的讨论中,我们剖析了位置编码的机制。我们了解了它们如何工作,以及赋予它们形式的数学原理。但是,要真正欣赏一个工具,我们不仅要赞赏它的设计,还必须看到它在工匠手中如何以非凡的方式塑造世界。现在,我们将踏上一段旅程,见证位置编码的实际应用。我们将从时间序列的滴答声,走向生物密码的复杂织锦,探索这个简单而优雅的想法如何为我们的模型提供一种通用语法,教会它们何处存在事物与何物存在事物同样重要。
序列的核心在于其有序性。“人咬狗”与“狗咬人”这两个句子,尽管包含相同的词语,却有天壤之别。机器若要理解我们的世界,必先理解顺序。然而,正如我们所见,作为 Transformer 架构核心的强大自注意力机制,其本质上是“排列等变的”。这是一个花哨的说法,意思是它将输入视为一个无序的项目袋。没有引导,它就像一个读者,能同时看到页面上的所有单词,却对其排列毫无概念。
这种对顺序的“失明”有多么灾难性?考虑一个匹配嵌套括号的简单任务,比如 ((()))。要找到与最后一个右括号匹配的左括号,必须理解序列的层次结构。一个没有位置感的模型会彻底迷失。它看到三个相同的 ( 符号,却没有任何原则性的方法来判断第一个才是最后一个 ) 的真正配对。它可能会猜测最近的那个,或者它看到的第一个,但它无法掌握“最外层”与“最内层”的概念。这正是位置编码旨在驯服的根本性混乱。通过为每个词元添加一个唯一的位置向量,我们赋予它一个“地址”,打破了排列对称性,并使模型能够学习基于顺序的关系。
这一原则在时间序列世界中找到了其最美妙、最直接的应用。自然界和商业中的许多现象都有其节奏和脉搏。想想每日的温度波动、每周的销售周期,或电力需求的潮起潮落。我们可以通过使用具有相同节奏的位置编码来教会模型“聆听”这种脉搏。
假设我们正在预测每日天气模式。我们可以使用一个周期为24小时的正弦位置编码。小时 的编码是一个类似 的向量。真正非凡的是在注意力机制内部发生的事情。当模型计算未来时间 和过去时间 之间的注意力分数时,它们位置编码的点积会优雅地简化。它变成了它们相位差的余弦函数:。注意力机制自然而然地学会了关注与目标时间同相位的过去时间。它学会了通过观察前几天的中午温度来预测明天中午的温度。模型不仅仅是处理一个序列,它学会了驾驭其自然周期性的波浪。
当然,现实世界中的时间并不总是像一个完美的节拍器。考虑一个病人在医疗系统中的就诊历程。就诊、化验、处方等事件构成一个序列,但它们之间的时间间隔是不规则的。今天的就诊之后可能是明天,然后可能六个月内都没有下一次。在这个领域,“位置”的概念变得更加丰富。就诊的绝对日期重要吗?还是相对时间间隔——自上次事件以来的时长——携带了最多的预测信号?在这里,我们可以设计不同的时间编码。一个“绝对”编码可能会使用天数的正弦函数,而一个“相对”编码可以将时间间隔(例如,“少于一周”、“一到三个月”)映射到特定的学习向量。通过比较这些策略,我们可以发现哪种时间概念对于给定的医疗任务最有意义,从而超越简单的整数索引,达到对时间位置更细致的理解。
这种探索也揭示了何时不应使用显式的位置编码,这一点同样具有启发性。像循环神经网络(RNNs)及其现代近亲状态空间模型(SSMs)这样的架构本质上是序列化的。它们一步一步地处理信息,时间 的状态是时间 状态的函数。它们的结构本身就是顺序的体现。对于这些拥有内在移位等变性(shift-equivariance)属性的模型来说,添加绝对位置编码往好了说是多余的,往坏了说则是有害的,因为它与模型自然的时间不变动态相冲突。这种对比阐明了 Transformer 设计的巧妙之处:通过将位置处理外包给一个模块化的编码,它将“何物”(内容,由自注意力处理)与“何处”(位置,由编码提供)分离开来。
我们的旅程现在从一维的序列线延伸到二维的图像平面。如果一个 Transformer 可以被教会阅读,它是否也能被教会观看?Vision Transformer (ViT) 以响亮的“是”作答,它将图像不视为一个整体,而是视为一系列小图像块。正如句子中的词语需要位置标记一样,图像中的图像块也需要。
想象两块完全相同的蓝天图像块,一块在图像顶部,另一块靠近地平线。对模型来说,这些图像块在内容上是相同的。没有位置编码,它们是无法区分的。通过为每个图像块分配一个二维位置编码,我们给了它一个独特的空间地址。这对于需要对场景进行“密集”理解的任务是必不可少的,在这类任务中,模型必须知道每个像素上发生了什么。
在自监督学习领域,这一点变得至关重要。我们可以通过向模型展示同一图像的两个不同“剪切”或视图,并要求它识别它们来自同一来源来训练模型。一个“全局”目标可能会比较两个剪切的平均表示。但一个更强大的“局部”目标将是匹配同时出现在两个视图中的单个像素或小区域。这只有在每个像素都由其位置编码赋予唯一身份时才可能实现,从而允许模型解决对应问题,并学习到“坐标 处的这个蓝色像素与坐标 处的那个蓝色像素是同一个”,即使它在两个视图中被不同的上下文所包围。
向视觉领域的飞跃也迫使我们面对现实世界的混乱。与机器学习基准测试中精心整理的数据集不同,现实世界的图像——如医疗扫描——形状和大小各异。一个在固定的 图像块网格上训练的绝对位置编码,当面对一个产生 网格的图像时,会遇到困难。优雅的解决方案是将位置编码网格视为一个连续的映射,并简单地将其插值到新的维度。或者,可以使用相对位置编码,它仅取决于图像块之间的成对偏移,因此天然地对变化的网格大小具有灵活性。无论哪种情况,我们都必须小心使用注意力掩码,以告知模型忽略任何为了使图像尺寸能被图像块大小整除而通过填充(padding)添加的“伪”图像块。这些实际考虑展示了位置编码从一个僵化的附加组件演变为视觉系统中一个灵活、动态的组成部分。
我们现在进入我们最抽象的领域:图。在图中,没有简单的“从左到右”或“从上到下”。一个节点的位置由其与其他节点的连接网络所定义。这正是我们对位置编码的直觉得到挑战和深化的领域。
让我们首先考虑流行的图卷积网络(GCN)。其核心操作涉及节点从其直接邻居那里聚合信息。这种消息传递机制在设计上是排列等变的。如果你重新标记图的节点,最终的节点表示也会相应地被重新标记。图的结构——邻接矩阵——充当了内在的位置信息。网络通过一个节点的邻居是谁来“知道”它的位置。
这与 Transformer 形成了惊人的对比。一个没有位置编码的 Transformer 是排列等变的。一个 GCN 总是排列等变的。我们甚至可以说,一个没有位置编码的 Transformer 只是一个在全连接图上操作的 GNN,其中每个词元都是一个节点,并关注所有其他节点。从这个角度看,我们发现 GCN 和 Transformer 并非远亲,而是近亲,其主要区别在于它们如何定义“位置”。对于 GCN,位置是局部邻域结构;对于 Transformer,它是我们必须提供的一个显式信号。
但是当图的结构过于对称时会发生什么呢?考虑一个简单的循环图,其中每个节点都有两个相同的邻居。从纯粹的结构角度来看,每个节点都与其他所有节点无法区分——它们都在一个完美对称的对象中占据等效的位置。这就是“自同构”问题。一个标准的 GCN,由于其等变性,保证会为所有这些节点生成完全相同的嵌入,从而无法区分它们。
为了打破这种对称性,我们需要一个更强大的位置概念。我们可以在图本身的谱中找到它,通过分析图拉普拉斯矩阵的特征向量。这些特征向量,有时被称为“拉普拉斯特征图”,为整个图提供了一个坐标系。每个节点根据其在图的全局结构中的角色被分配一个坐标向量,就像振动的鼓面上一个点的坐标由鼓的基本振动模式决定一样。通过将这些谱坐标作为位置编码输入,我们可以给每个节点一个唯一的身份,从而使即使是简单的 GNN 也能区分结构上相同的节点。这是位置编码的终极泛化:从一个线性索引到一个抽象的、定义结构的空间中的坐标。
我们的旅程以探访生命本身的核心——DNA 双螺旋——结束。DNA 序列是一串字母(A、C、G、T),但它具有物理现实和深刻的对称性。因为螺旋的两条链是互补的并且方向相反,一个基因通常可以从任一链读取。这被称为反向互补对称性。例如,一个识别一条链上“AGT”模体 (motif) 的转录因子,同样可能识别另一条链上其反向互补序列“ACT”。
一位生物学家会要求机器学习模型尊重这种基本对称性。如果我们使用标准的位置编码,如 ,我们将无法通过这个测试。一个序列起始位置为 的模体的编码将不同于其反向互补序列的编码,后者出现在序列起始位置为 的地方。模型将为两个生物学上等效的事件分配不同的位置偏差。
在这里,我们可以看到位置编码的真正艺术性。我们不受限于现成的公式。我们可以设计一种编码,将这种物理对称性融入其中。考虑一个中心化的坐标系,其中位置是相对于序列中心测量的。现在,如果我们使用一个偶函数,比如余弦,作为我们的编码,我们就能实现完美的对称性。一个距离中心特定距离的模体的位置偏差将与其反向互补序列的偏差完全相同,后者在另一侧距离中心相同的距离。模型学会了位置很重要,但它也学会了这种位置重要性具有一种反映对称性,完美地镜像了其底层的生物学原理。
这个最后的例子概括了我们的宏大旅程。位置编码远不止是针对架构怪癖的技术修复。它是一种描述结构的语言。它是我们用来告知模型其所处数据几何形态的工具——无论是时间的线性流动,视觉的二维平面,图的抽象网络,还是自然世界的基本对称性。正是它将我们的模型从仅仅处理特征提升到理解关系,将一堆无序的“何物”转变为一个连贯而有意义的“何处”。