什么是相对位置编码?
相对位置编码(Relative Positional Encoding,RPE)是一种在序列处理模型,特别是Transformer架构中,注入序列中元素间相对位置信息的方法。与传统的位置编码(如正弦/余弦函数或可学习的绝对位置嵌入)关注每个元素在序列中的绝对位置不同,相对位置编码的核心思想是强调序列中任意两个元素之间的相对距离。
它不是什么:
- 它不是一个固定不变的、添加到每个输入词嵌入上的单一向量。
- 它不直接告诉模型“这个词是序列的第一个,那个词是序列的第十个”。
- 它与原始Transformer中使用的绝对位置编码(Absolute Positional Encoding)存在显著区别,后者将一个唯一的向量添加到每个词的嵌入中,以表示其在序列中的绝对位置。
它的核心:
相对位置编码认为,模型在处理序列时,一个词与另一个词的交互或依赖程度,更多地取决于它们之间的相对距离,而非它们在整个序列中的固定起始位置。例如,在“我爱北京天安门”这句话中,“我”和“爱”的关系以及“北京”和“天安门”的关系,其本质联系与它们在句子中的具体开始位置关系不大,而更多取决于它们是相邻的还是间隔几个词。
具体而言,相对位置编码通常通过修改自注意力机制的计算方式来实现。它将元素间的相对距离编码成可学习的嵌入,并在计算查询(Query)和键(Key)之间的相似度(即注意力分数)时,或者在加权求和值(Value)时,考虑这些相对位置信息。这使得模型能够更好地理解和利用序列内部的结构关系,尤其是对于长序列的处理。
为什么需要相对位置编码?
原始的Transformer模型在处理序列时,缺乏对词序的显式建模。虽然通过向输入嵌入添加绝对位置编码解决了这一问题,但这种方法存在一些固有的局限性,促使了相对位置编码的出现和发展:
-
泛化能力不足:
传统的绝对位置编码在训练时只能学习到固定长度范围内的位置信息。如果模型在推理时遇到比训练时更长的序列,它可能无法正确地处理超出其已知范围的绝对位置,导致性能下降。相对位置编码通过关注相对距离,理论上可以更好地泛化到未见过的序列长度。
-
不自然的绝对位置依赖:
在许多语言和序列任务中,一个词汇对另一个词汇的依赖关系往往更取决于它们之间的相对距离(例如,动词和它的宾语通常相邻或间隔很近),而不是它们在整个序列中的绝对位置(例如,都是句子的开头或末尾)。绝对位置编码可能会让模型过度依赖或偏向于特定的绝对位置,而忽略了更重要的相对关系。
-
解决长序列建模挑战:
对于非常长的序列,绝对位置编码可能变得低效或难以学习。例如,Transformer-XL等模型通过引入分段循环机制(segment-level recurrence)来处理超长序列,这要求模型能够跨越不同段来保持连贯性。在这种情况下,传统的绝对位置编码无法有效地工作,因为它无法将不同段中的相同相对位置映射到相同的语义。相对位置编码则能够自然地适应这种跨段的上下文依赖,因为无论词语在哪个段中,只要它们的相对距离相同,它们之间的关系编码就可以保持一致。
-
提升模型性能:
实践证明,采用相对位置编码的模型在多种序列任务(如机器翻译、语言建模、文本摘要等)上都取得了比使用绝对位置编码更好的性能。这表明它能更有效地捕捉和利用序列内部的结构信息。
综上所述,相对位置编码的提出是为了克服绝对位置编码的局限性,使得Transformer模型在处理序列时,能够更自然、更灵活、更有效地理解和利用元素之间的相对关系,尤其是在面对长序列和需要泛化到未知长度的场景时。
相对位置编码在哪里发挥作用?
相对位置编码的核心作用场所在于Transformer模型的自注意力机制(Self-Attention Mechanism)内部。它是注意力分数计算和/或值向量加权求和过程中的一个关键修改点,而不是独立于注意力机制之外的模块。
主要作用位置:
-
注意力分数计算(Attention Logits):
这是最常见的集成相对位置编码的方式。在计算查询向量($Q_i$)与键向量($K_j$)之间的相似度,即生成注意力分数(或称为注意力对数,logits)时,相对位置信息被引入。原始的注意力分数计算公式为 $Q_i \cdot K_j^T$。加入相对位置编码后,这个计算会额外考虑 $i$ 和 $j$ 之间的相对距离 $i-j$。
- 在键向量中加入相对位置信息: 某些方法将相对位置嵌入($R_{i-j}$)添加到原始的键向量 $K_j$ 中,或者与 $K_j$ 共同作用于查询 $Q_i$。例如,计算 $Q_i^T (K_j + R_{i-j})$。
- 作为注意力偏置项: 另一种常见做法是直接将一个与相对距离相关的可学习偏置项(scalar bias)加到注意力对数上。例如,T5模型中使用的就是这种方法:$Q_i \cdot K_j^T + b_{clip(i-j)}$,其中 $b$ 是对应于相对距离的偏置。
-
值向量的加权求和:
在某些相对位置编码的变体中,相对位置信息不仅影响注意力分数,还会影响如何加权求和值向量($V_j$)。例如,在计算最终的输出上下文向量时,除了用注意力权重 $\alpha_{ij}$ 乘以原始的值 $V_j$,还会考虑将与相对位置相关的嵌入($R’_{i-j}$)与 $V_j$ 一起加权求和。
例如:$\sum_j \alpha_{ij} (V_j + R’_{i-j})$。这种方式使得模型在汇聚信息时,也能感知到信息来源的相对位置。
常见的模型/架构应用:
- Transformer-XL: 这是第一个系统性提出并广泛应用相对位置编码的Transformer变体,其引入的循环机制和相对位置编码协同工作,显著提升了长序列处理能力。
- XLNet: 在Transformer-XL的基础上,进一步整合了相对位置编码到其置换语言建模任务中,使用了更复杂的四项注意力分数计算方式。
- T5 (Text-to-Text Transfer Transformer): 采用了更简洁的、可学习的标量相对偏置来增强注意力机制。这种方式计算效率高,且在大型预训练模型中表现出色。
- Music Transformer: 在音乐生成领域,利用相对位置编码来捕捉音乐事件之间的时间关系,使其能够生成更连贯、更富有结构感的音乐序列。
- 其他现代大型语言模型: 许多后续的Transformer变体和大型语言模型(LLMs),无论是否直接声称使用“相对位置编码”,都或多或少地借鉴了其核心思想,以各种形式在注意力机制中融入了位置或距离信息,以提高模型的序列理解和生成能力。
因此,相对位置编码不是一个独立的层,而是深入到自注意力层的内部,以修改其核心的注意力计算逻辑,从而间接影响整个模型的表示学习能力。
相对位置编码涉及“多少”?
在相对位置编码的设计和实现中,“多少”体现在几个关键方面:涉及到的相对距离的数量、引入的参数量、以及对计算资源的消耗程度。
1. 相对距离的数量(Maximum Relative Distance):
- 范围限制: 相对位置编码通常不会为所有可能的相对距离(从负无穷到正无穷)都分配一个独立的嵌入。相反,它会设定一个最大相对距离(Maximum Relative Distance),记作 $k$ 或 $K_{max}$。
- 距离裁剪(Clipping): 对于任何大于 $k$ 的相对距离,它会被裁剪到 $k$。例如,如果相对距离是100,而 $k=64$,那么100会被视为64。同样,负向距离也会被裁剪到 $-k$。这样做的目的是限制需要学习的相对位置嵌入的数量,同时也假设超过一定距离的元素之间的精确相对位置关系变得不那么重要,或者可以被概括为一个“很远”的关系。
- 具体值: 这个 $k$ 值是一个超参数,可以根据任务和序列长度的特点进行选择。例如,Transformer-XL可能使用几百的 $k$ 值,而T5模型可能采用32或128的 $k$ 值。这意味着需要学习 $2k+1$(从 $-k$ 到 $k$)或 $2k$(忽略0或特殊处理)个相对位置嵌入。
2. 引入的参数量:
- 相对位置嵌入: 相对位置编码的核心是可学习的相对位置嵌入。如果每个相对距离都对应一个 $d_{model}$ 维的嵌入向量,那么参数量大致为 $2k \times d_{model}$ 或 $2k \times d_h$(如果嵌入维度与头维度相关)。这相比于整个Transformer模型动辄数千万或数十亿的参数量来说,通常是一个相对较小的增量。
- 额外的投影矩阵/偏置: 某些更复杂的相对位置编码变体,如XLNet,可能会引入额外的投影矩阵或全局偏置向量,以区分内容依赖和位置依赖的查询/键,这会略微增加参数。例如,XLNet引入了两个全局偏置向量 $u$ 和 $v$。
- 共享策略: 相对位置嵌入通常会在所有自注意力层中共享。这意味着整个模型只需要学习一套相对位置嵌入,而不是每层一套,从而显著减少了参数量。
3. 计算开销:
- 注意力分数计算: 相对位置编码通常通过修改自注意力机制的计算过程来实现。这会在计算注意力分数时引入额外的矩阵乘法或加法操作。
- 复杂度: 虽然会增加一定的计算量,但这种增加通常是线性的,或者相比于主要的 $O(N^2 \cdot D)$(N为序列长度,D为模型维度)注意力计算复杂度来说,是相对较小的。例如,对于T5的标量偏置,只需要额外的查找和加法操作,计算开销极低。对于更复杂的相对键/值形式,可能需要额外的矩阵乘法,但仍然在可接受的范围内。
- 内存开销: 存储相对位置嵌入表需要额外的内存,但通常不大。此外,在某些实现中,为了方便并行计算,可能需要生成一个相对位置索引矩阵,这会占用一些内存。
总而言之,相对位置编码通过引入可控数量的额外参数和适度的计算开销,为Transformer模型带来了显著的性能提升和泛化能力,尤其是在处理长序列时。它在“多少”的选择上体现了一种权衡:在捕捉足够多的相对位置信息与保持模型效率和参数量之间找到平衡。
如何实现相对位置编码?
相对位置编码的实现方式多种多样,但核心都是在自注意力机制中引入相对距离信息。以下列举几种主流且具有代表性的实现方案:
1. Shaw et al. (2018) / Self-Attention with Relative Positional Representations
这是最早期的相对位置编码方案之一,它将相对位置信息同时融入到注意力分数的计算和值向量的加权求和中。
- 核心思想: 为每个可能的相对距离学习一个独立的嵌入向量。
-
注意力分数: 原始的注意力分数 $e_{ij} = Q_i^T K_j$ 被修改为包含相对位置项。一种常见形式是:
$e_{ij} = Q_i^T K_j + Q_i^T W_k^{rel} R_{rel(i-j)}$
其中,$R_{rel(i-j)}$ 是对应于相对距离 $i-j$ 的可学习的相对位置嵌入,$W_k^{rel}$ 是一个投影矩阵。这相当于将相对位置信息注入到键向量中,使其变成一个“相对键”。
-
值向量: 最终的输出也考虑相对位置信息:
$O_i = \sum_j \alpha_{ij} (V_j + W_v^{rel} R’_{rel(i-j)})$
其中,$R’_{rel(i-j)}$ 是另一组可学习的相对位置嵌入,$W_v^{rel}$ 是另一个投影矩阵。这使得模型在聚合值信息时,也能感知到信息来源的相对位置。
- 距离裁剪: 通常会设定一个最大相对距离 $k$,超出 $k$ 的距离都会被裁剪到 $k$。
2. Dai et al. (2019) / Transformer-XL and XLNet
Transformer-XL和XLNet采用了更为复杂和精巧的相对位置编码机制,尤其在XLNet中得到了更普遍的推广。它不再使用绝对位置编码,而是完全依赖相对位置。其注意力分数计算包含四项:
- 核心思想: 将注意力分数分解为内容-内容、内容-位置、位置-内容和位置-位置的交互项。
-
注意力分数: 对于查询 $Q_i$ 和键 $K_j$,其注意力分数 $\text{A}_{i,j}$ 为:
$\text{A}_{i,j} = \frac{1}{\sqrt{d_k}} [ (Q_i)^T K_j + (Q_i)^T R_{i-j} + u^T K_j + v^T R_{i-j} ]$
- 第一项 $(Q_i)^T K_j$: 内容-内容交互,传统的注意力分数。
- 第二项 $(Q_i)^T R_{i-j}$: 内容-相对位置交互,查询 $Q_i$ 与相对位置嵌入 $R_{i-j}$ 的交互。
- 第三项 $u^T K_j$: 全局内容偏置 $u$(一个可学习的向量)与键 $K_j$ 的交互,表示一个查询对所有键的通用偏置。
- 第四项 $v^T R_{i-j}$: 全局位置偏置 $v$(另一个可学习的向量)与相对位置嵌入 $R_{i-j}$ 的交互,表示一个查询对所有相对位置的通用偏置。
- 优势: 这种分解使得模型能够更细致地捕捉不同类型的依赖关系,并且通过共享 $R_{i-j}$,使得模型在处理长序列时能够更好地泛化。
3. Raffel et al. (2020) / T5 (Text-to-Text Transfer Transformer)
T5模型采用了一种极为简洁高效的相对位置编码方法,称为“标量相对偏置”(scalar relative bias)。
- 核心思想: 不为每个相对距离学习一个完整的向量,而是学习一个单一的标量偏置项,直接加到注意力对数上。
-
注意力分数:
$e_{ij} = Q_i^T K_j + b_{clip(i-j)}$
其中,$b$ 是一个可学习的标量数组,每个元素对应一个裁剪后的相对距离。
- 距离裁剪: T5也使用了距离裁剪,但裁剪函数更细致,通常是非线性的,如 $log(distance)$ 或分段线性映射,以更好地平衡近距离和远距离的关系。例如,对于距离 $d$ 的裁剪可能为 $\min(d, K_{max})$。
- 优势: 这种方法参数量极小,计算开销低,但在实践中表现非常出色,证明了简洁性与有效性可以兼得。它也通常在所有注意力头和所有层之间共享这些标量偏置。
实现步骤总结:
- 计算相对距离: 对于自注意力层中的每一对 $Q_i$ 和 $K_j$,计算它们的相对距离 $d = i-j$。
- 距离映射/裁剪: 将计算出的相对距离 $d$ 映射到一个有限的索引范围。这通常涉及将距离裁剪到预设的最大值(例如 $k$ 或 $K_{max}$),并处理正负号(例如,将 $-k$ 到 $k$ 映射到 $0$ 到 $2k$ 的索引)。
- 查找相对位置嵌入/偏置: 使用映射后的索引从一个可学习的嵌入表(或标量偏置表)中查找对应的相对位置嵌入或标量偏置。
- 融入注意力计算: 将查找到的相对位置信息融入到注意力分数($Q \cdot K^T$)或值向量($V$)的计算中,具体方式取决于所选择的方案(如上述Shaw、XLNet、T5等)。
- 共享机制: 许多实现中,相对位置嵌入(或偏置)在所有注意力头、甚至所有Transformer层之间共享,以减少参数量并促进学习的稳定性。
这些不同的实现方案各有优劣,但都殊途同归地在模型中引入了对元素之间相对关系的感知,从而提升了Transformer处理序列数据的能力。
相对位置编码如何影响模型的最终结果?
相对位置编码的引入对Transformer模型的最终性能和行为产生了多方面且通常是积极的影响。这些影响体现在模型的泛化能力、对长序列的处理、以及整体任务表现上。
1. 提升模型性能:
- 更高的准确性: 在各种序列建模任务上,如机器翻译(NMT)、语言建模(Language Modeling)、文本摘要、问答系统等,采用相对位置编码的模型通常能取得比使用绝对位置编码的模型更好的表现。这表明它能更有效地捕捉和利用序列的内部结构和语义关系。
- 更强的鲁棒性: 模型对输入序列的起始位置和绝对长度的依赖性降低,使其在面对多样化的输入时表现更稳定。
2. 增强长序列处理能力:
- 处理超长上下文: 尤其是如Transformer-XL结合相对位置编码的方案,使得模型能够有效处理远超传统Transformer限制的超长序列(例如数千甚至数万个token)。通过这种方式,模型能够建立更长距离的依赖关系,对于需要全局上下文理解的任务(如长文档摘要、代码生成)至关重要。
- 记忆力改善: 类似于Transformer-XL的机制,模型可以“记住”前面处理过的段落的信息,并在处理当前段落时利用这些记忆,这在语言建模和生成任务中表现为更连贯、更自然的输出。
3. 改善泛化能力:
- 应对未知长度: 相对位置编码使得模型能够更好地泛化到在训练过程中未曾见过的序列长度。因为它学习的是距离关系,而不是具体的绝对位置。例如,如果模型训练时最长序列是512个token,但推理时遇到1024个token的序列,相对位置编码能够处理超出512的相对距离(通过裁剪或外推),而绝对位置编码则会遇到未知的位置嵌入。
- 避免绝对位置偏差: 减少了模型对特定绝对位置的过度依赖或“偏见”,使得模型能够更加专注于词语内容及其相对位置的语义。
4. 对注意力权重的微妙影响:
- 更精细的注意力分布: 相对位置编码使得注意力机制能够更细致地衡量不同词对之间的关联强度。例如,即使两个词在语义上高度相关,如果它们的相对距离很远,注意力权重可能会因此受到调整,反映出长距离依赖的难度。反之,近距离的词语可能会得到更高的关注。
- 结构感知: 模型不再仅仅根据词汇内容计算注意力,而是将位置信息融入到每个注意力决策中,这有助于捕捉语法结构、短语结构等信息。
5. 对模型复杂度和效率的影响:
- 参数量增加: 相对位置编码会引入少量额外的参数(用于存储相对位置嵌入或偏置),但通常相对于整个模型参数量而言是微不足道的。
- 计算开销略增: 在自注意力计算中会增加一些额外的操作(如矩阵乘法或查找加法),但这通常是可接受的,且通常远小于核心注意力计算本身的开销。对于T5的标量偏置,计算开销尤其小。
总而言之,相对位置编码通过其对自注意力机制的精妙修改,赋予了Transformer模型更强大的能力,使其能够更自然、更有效地处理序列数据,尤其在面对长序列和需要强大泛化能力的场景时,其优势尤为明显。这使得它成为了现代高级Transformer架构中不可或缺的组成部分。