\subsection{为什么Transformer要进行位置编码}
Transformer模型以自注意力机制(Self-Attention)为核心,通过并行化计算在序列建模任务中表现卓越。然而,与递归神经网络(RNN)或卷积神经网络(CNN)不同,Transformer没有内置的顺序处理能力,即它并不知道序列中各个位置的先后顺序。为了解决这一问题,Transformer需要显式地引入序列的位置信息,这就是位置编码(Positional Encoding)的主要动机。下面将从模型原理、位置编码的数学形式以及它在Transformer中的重要作用等方面进行详细阐述。
\subsubsection{自注意力机制回顾}
\begin{itemize}
\item \textbf{输入表示}:给定一个长度为$n$的序列,记为
\[
X = \{ x_1, x_2, \dots, x_n \},
\]
其中每个$x_i \in \mathbb{R}^d$是一个$d$维的向量表示。将所有$x_i$堆叠起来可得到一个$n \times d$的矩阵表示,记为$X$。
\item \textbf{查询、键和值}:在自注意力机制中,首先通过三个不同的可训练权重矩阵
\[
W_Q, W_K, W_V \in \mathbb{R}^{d \times d_k}
\]
将输入矩阵$X$映射到查询矩阵$Q$、键矩阵$K$与值矩阵$V$:
\[
Q = X W_Q, \quad K = X W_K, \quad V = X W_V.
\]
这里$Q, K, V$的维度均为$n \times d_k$,其中$d_k$通常是$d$的一个分割或与$d$相同,取决于实际的模型超参数。
\item \textbf{注意力权重计算}:通过点积的方式计算查询与键之间的相似度,再进行缩放与归一化,得到注意力权重$\alpha$:
\[
\alpha = \mathrm{softmax}\!\Bigl(\frac{Q K^\mathsf{T}}{\sqrt{d_k}}\Bigr).
\]
其中$\mathrm{softmax}$操作保证了每一行的权重和为1,$\sqrt{d_k}$用来平衡点积可能带来的数值过大问题。
\item \textbf{加权求和}:最后,将注意力权重$\alpha$与值矩阵$V$相乘,得到输出
\[
\mathrm{Attention}(Q,K,V) = \alpha V.
\]
该输出矩阵的维度依然是$n \times d_k$,表示序列中每个位置的新的表示。
\end{itemize}
以上过程能够并行化处理序列中所有位置,而不再像RNN那样按时间步逐个更新状态。然而,这种并行计算并没有天然地反映位置先后顺序,如果不进行额外处理,模型将无法区分输入序列中不同元素的顺序。
\subsubsection{为什么需要位置编码}
\begin{itemize}
\item \textbf{与RNN的对比}:RNN由于在时间步之间存在递归连接,自然会携带前一步的隐状态信息,因此对序列顺序十分敏感。但同时也因为递归的方式,RNN在并行化上相对受限。
\item \textbf{与CNN的对比}:CNN主要依赖局部感受野来提取特征,对于图像这种二维网格数据具有良好的性能,但在处理变长序列时,需要额外设计卷积核大小以及扩张(Dilation)策略,序列的顺序特征也较为隐式地保留在卷积操作中。
\item \textbf{Transformer的特性}:Transformer完全基于注意力来建模序列中任意位置之间的依赖关系,如果不给出任何位置信息,序列中所有元素将被视作在同一位置,这将无法让模型学习到词序对语义的影响。因此,显式地为每个元素提供位置信息是必需的。
\end{itemize}
\subsubsection{位置编码的数学形式}
在Transformer中,位置编码被加到输入的词嵌入上,使得模型能够感知每个元素所在的位置。最常见的做法是使用基于正弦和余弦函数的周期性位置编码,其形式如下所示:
\[
PE_{(pos,2i)} = \sin\!\Bigl(\frac{pos}{10000^{\frac{2i}{d}}}\Bigr),
\quad
PE_{(pos,2i+1)} = \cos\!\Bigl(\frac{pos}{10000^{\frac{2i}{d}}}\Bigr).
\]
其中:
\begin{itemize}
\item $pos$表示序列中元素的位置(从0或1开始编号,具体实现可不同)。
\item $d$表示位置编码的维度,与词嵌入维度相同。
\item $i$表示维度索引的一半,$2i$与$2i+1$分别对应偶数维与奇数维。
\item $10000$是一个常数,主要用来调节不同位置之间的相对距离所占维度的比例。
\item $\sin$与$\cos$函数具有周期性,使得对于更大的$pos$也能保持有规律的变化。
\end{itemize}
将该位置编码向量$PE_{pos}$与词嵌入向量$\mathrm{Embed}(x_{pos})$逐元素相加后,就能得到包含位置信息的输入表示:
\[
X'_{pos} = \mathrm{Embed}(x_{pos}) + PE_{pos}.
\]
由于$\mathrm{Embed}(x_{pos})$和$PE_{pos}$的维度都是$d$,因此这种相加操作能够在不改变向量维度的情况下,为输入序列提供显式的位置信息。
Transformer使用正弦和余弦函数来生成位置编码的设计是基于以下几个重要考虑:
\begin{itemize}
\item \textbf{处理长距离依赖}:正弦和余弦函数的不同频率设计使得位置编码能够捕捉序列中不同长度的依赖关系。低频部分有助于捕捉序列中的长距离依赖,而高频部分则帮助捕捉短距离依赖。这使得模型能够更好地理解长序列中的关系。
\item \textbf{周期性}:正弦和余弦函数具有周期性,这意味着它们能够为序列中每个位置生成一个唯一的编码,同时能够自然地表示输入序列的顺序结构。例如,对于周期性变化的正弦波,当位置变化时,编码会在一定范围内“重复”并保持一致性,这与序列中位置的顺序密切相关。
\item \textbf{不同频率的正弦和余弦}:正弦和余弦函数在不同的频率下变化,能够捕捉到不同层次的位置信息。低频部分主要反映远距离位置之间的关系,而高频部分则能够捕捉到短距离位置的变化。因此,正弦和余弦函数通过不同频率的编码帮助模型在不同层次上理解输入序列的顺序。
\item \textbf{无参数依赖}:使用固定的正弦和余弦函数生成位置编码,不需要额外的可训练参数。这使得位置编码的计算变得高效,且无需增加额外的模型复杂度。此外,固定的周期性编码有助于处理未知长度的序列,避免了在不同长度序列上学习不同的位置编码。
\item \textbf{平滑的相对位置编码}:由于正弦和余弦函数的平滑变化,位置编码能够有效捕捉相对位置信息。由于这些编码是连续的且平滑变化,模型可以推断出不同位置之间的相对关系,而不是仅仅依赖于绝对位置。
\item \textbf{更好的泛化能力:}
基于正弦和余弦函数的相对位置编码具有天然的泛化能力。当训练过程中处理的序列长度为$n$时,模型能够有效地理解不同位置之间的相对关系,并且能够在测试时适应不同长度的序列。相对位置编码的这种特性使得Transformer能够处理不定长的输入序列,而不需要依赖训练过程中固定的绝对位置。
\item \textbf{捕捉相对位置信息:}
相对位置编码通过周期性正弦和余弦函数的设计,能够更好地捕捉不同元素之间的相对位置关系。这种方式比绝对位置编码更为灵活,特别是在需要理解相对顺序和上下文依赖的任务中,能够有效提升模型的表现。例如,在自然语言处理中,许多依赖关系(如句法关系、语义关系等)都与元素之间的相对位置密切相关,而相对位置编码能够很好地反映这些关系。
\item \textbf{平滑的相对位置关系表达:}
由于正弦和余弦函数是平滑变化的,模型能够在训练过程中捕捉到不同位置之间的细粒度相对关系。正弦和余弦函数的平滑性使得模型可以在不同的层次上理解相对位置的变化,这对于捕捉长距离依赖关系非常重要。
\item \textbf{不依赖序列长度的固定编码:}
相对位置编码不像绝对位置编码那样依赖于输入序列的长度,而是通过周期性编码来表示位置间的相对关系。这种设计使得Transformer模型能够在处理不同长度的序列时保持一致性,避免了在遇到较长或较短的序列时需要调整位置编码的情况。
\item \textbf{增强模型的迁移能力:}
相对位置编码具有高度的灵活性和适应性,使得模型在不同任务之间能够更好地迁移。例如,经过训练的Transformer模型可以在不同长度的序列上进行推理,而不需要重新学习每个位置的绝对意义,这使得模型在跨任务迁移时表现更加出色。
\end{itemize}
\subsubsection{位置编码的作用与优点}
\begin{itemize}
\item \textbf{显式地提供序列顺序}:通过位置编码,Transformer能够知道第1个位置与第2个位置的表示是不同的,这种位置信息在语言建模、机器翻译等序列任务中十分关键。
\item \textbf{易于并行化}:相对于RNN需要逐个时间步进行更新的特性,位置编码在计算时只需对每个位置做一次加法操作,不依赖前一位置的结果,因此支持并行化。
\item \textbf{周期性设计}:正弦和余弦函数具有周期性,可以让模型同时捕捉到序列的局部与整体位置信息,且对于序列长度扩展时依然能够保持顺序的连贯性。
\item \textbf{无参数或少参数开销}:与可学习的位置嵌入(Learnable Positional Embedding)相比,基于正弦和余弦函数的编码不需要额外的可训练参数,计算代价较低,且对未知长度的序列也有一定的外推能力。
\end{itemize}
\subsubsection{绝对位置编码的定义与工作原理}
绝对位置编码是一种为每个输入元素分配一个固定的位置信息,通常通过为每个序列位置指定一个唯一的编码来表示每个元素在序列中的绝对位置。例如,如果输入序列为$X = \{x_1, x_2, \dots, x_n\}$,那么每个位置$pos$都有一个与其位置相对应的编码$PE_{pos}$。绝对位置编码通常是通过一个固定的线性或递增的方式来为每个位置分配一个独特的编码。
在绝对位置编码中,模型必须记住每个位置的绝对顺序,并且这些位置编码是固定的,即在训练过程中不会进行调整。例如,常见的绝对位置编码方法就是为每个位置$pos$分配一个唯一的数字或向量(如向量值递增或通过学习得到的嵌入表示)。
\subsubsection{绝对位置编码的局限性}
虽然绝对位置编码在某些任务中是可行的,但它有几个局限性,这也是为什么Transformer通常选择基于正弦和余弦函数的相对位置编码的原因。以下是绝对位置编码的主要局限性:
\begin{itemize}
\item \textbf{无法处理长序列的泛化问题:}
绝对位置编码的一个主要问题是其不具备泛化能力。具体来说,绝对位置编码为每个位置分配一个固定的编码,这个编码是固定的并且与序列长度有关。当输入序列的长度发生变化时,绝对位置编码无法有效地适应。例如,如果在训练过程中序列长度为100,而在测试时序列长度变成了150,模型可能无法有效处理新的长序列,因为它在训练过程中见到的只是长度为100的序列。因此,绝对位置编码的表达能力在面对不同长度的序列时显得较为有限。
\item \textbf{缺乏对相对位置的敏感性:}
绝对位置编码只能告诉模型每个元素的固定位置,但它无法直接表达元素之间的相对位置关系。考虑到语言中许多任务依赖于元素之间的相对顺序(如依赖关系和句法结构),绝对位置编码可能无法充分捕捉这些信息。尽管可以通过学习得到位置编码的关系,但相对于相对位置编码,绝对位置编码在处理复杂的上下文时,捕捉不同位置之间的细粒度关系能力有限。
\item \textbf{无法自适应不同任务:}
绝对位置编码对于特定的任务或数据集是硬编码的,它没有根据任务本身的需求进行适应。这种硬编码方式可能导致对于某些任务而言过于刚性。虽然绝对位置编码在一些任务中工作良好,但对于一些具有灵活上下文依赖的任务,硬编码的位置分配可能会限制模型的表现。
\item \textbf{不利于跨任务迁移:}
绝对位置编码是与序列的绝对位置密切相关的,因此在跨任务迁移时会遇到困难。例如,某些任务可能要求模型处理不同长度的序列,而绝对位置编码往往依赖于特定的输入序列长度。此时,在不同长度的序列上进行训练和推理时,模型可能无法很好地迁移,因为它需要“重新学习”每个位置的含义。
\end{itemize}
\subsubsection{可学习的位置编码}
尽管原始论文中采用了固定的正弦和余弦函数来生成位置编码,也有研究工作尝试使用可学习的位置编码(Learnable Positional Embedding),使得模型可以通过训练来自适应某些任务中的特殊顺序模式。可学习的位置编码通常表现为一个可训练矩阵,与词嵌入大小相同,每个位置对应其中的一行或一列。它的优点在于可能更好地拟合某些特定任务的顺序特征,缺点在于在序列长度变化时需要额外的处理,并且未见过的长度可能会无法处理到位。
\subsubsection{总结}
在Transformer架构中,引入位置编码是为了弥补自注意力机制无法直接捕捉序列顺序的不足。通过对每个词的词嵌入加上对应位置的编码向量,模型能够在并行计算的同时,保留序列的位置信息。位置编码在实践中有效提升了Transformer在机器翻译、文本生成、文本分类等自然语言处理任务中的表现,也被拓展到其他领域,如视觉Transformer中对图像进行切块后嵌入顺序信息等。总的来说,位置编码为并行计算的自注意力机制补充了必要的顺序信号,使得Transformer在序列处理方面具备了与RNN、CNN等模型相媲美甚至更优的能力。