漫谈 Transformer 中的绝对位置编码、相对位置编码和融合位置编码(旋转位置编码 RoPE)

文摘   2025-01-22 11:24   安徽  

点击下方卡片,关注“AI前沿速递”公众号

各种重磅干货,第一时间送达


转载自知乎:姚远    链接:https://zhuanlan.zhihu.com/p/17311602488

一. 前言

Transformer [1] 中的注意力机制可以有效建模 token 之间的相关性,在诸多任务中取得了显著的性能提升。然而,注意力机制本身并不具备对 token 位置信息的感知能力,即经过注意力机制计算后,结果只依赖于 token 之间的相关性,而与 token 的位置信息无关。然而,众所周知,位置信息在长序列建模中至关重要,因此需要一种方式显示的机制对每个 token 的位置信息进行编码,以使模型能够感知到每个 token 的位置信息。目前,位置编码可以大致分为三类:绝对位置编码、相对位置编码以及融合位置编码。本文结合一些高质量博客 [2-4] 和笔者自己的理解对几种常见的位置编码进行梳理总结,供大家参阅。

下文中的所有实验代码在:Learn_PositionEncoding_Colab

二.位置编码的作用

在正式介绍位置编码之前,先回顾一下 Transformer 中的注意力机制。假设分别表示 位置和位置的两个 token 的查询词向量和键词向量,则注意力权重艹的计算公式如下:

如果不是位置的函数且不是位置的函数,那么不论两个 token 在序列中的距离如何变化,其注意力权重都不会发生改变。这与人类的直觉相悖,因为通常情况下,两个 token 越相近,它们的注意力权重应该越大。为了解决这一问题,通过显式引入位置信息至每个词向量中,使每个 token 能够感知其在输入序列中的位置。具体而言,定义函数 ,其表示通过函数将位置信息编码到词向量中。结合位置信息后,注意力权重的计算公式如下:

此时,一旦两个 token 的位置信息发生变化,其注意力权重也会随之发生改变。

三. 绝对位置编码

绝对位置编码给每个位置 分 配 一 个 特 定 的 编 码 ,以唯一序列中每个 token 的位置。常见的 绝对位置编码方式包括可学习位置编码和正弦位置编码两种编码方式。

3.1 可学习位置编码 (Learnable Positional Encoding)

可学习位置编码是一种直观且简单的绝对位置编码方式,其编码由模型通过训练学习得到。具体而言,假设词向量的维度为 256,输入的 token 序列长度为 512,则可以随机初始化一个位置编码矩阵,其第行向量表示第个位置对应的位置编码。在模型的训练过程中,该矩阵会逐步更新以学习到最优的位置编码矩阵 。在推理阶段,最终训练得到的 被用于为每个位置提供对应的位置编码进行使用。

可学习位置编码具有以下特点:

  • 灵活性高:由于上述位置编码矩阵时通过模型在训练过程中从数据中学习得到,因此具有较高的灵活性。理论上,可学习位置编码可以使用不同类型的任务或序列长度。
  • 范围受限:可学习位置编码在序列长度当面存在限制,缺乏外推性。如果推理阶段输入的 token 序列长度超过训练阶段的最大 token 序列长度,由于缺乏对应位置的编码向量,模型可能无法有效处理这些超过范围的 token,进而影响推理性能。

3.2 三角位置编码 (Trigonometric Positional Encoding)

这是 Transformer 论文[1] 中使用的位置编码方法,个人感觉是一种很神奇的编码方式,真得很佩服谷歌研究人员的脑洞。具体而言,对于位置 ,它的正弦位置编码的第个分量计算如下

根据上述公式可知,三角位置编码的每一维分量其实是位置的正弦函数(偶数维分量)或者余 弦函数(奇数维分量),其根据维度的奇偶性分别采用正弦和余弦函数。这样设计的目的在 Transformer的原始论文[1] 中并没有明确解释。个人感觉这样设计可以让模型可以区分出维度的奇偶性以增强模型的表达能力(个人感觉一些对正余弦设计的解读似乎有点过度解读的感觉,也欢迎大家提出自己的看法)。三角位置编码主要具有以下优点:

  1. 三角函数具有周期性,这使得每个维度的分量都具有周期性,从而可以实现自然的外推。如下图所示,每一维分量都是一个三角函数,输入不同的位置即可计算对应的编码值。即使在推理阶段,序列长度超过训练时使用序列的最大长度,也可以基于该维度对应的三角函数直接计算出编码值。

  2. 三角位置编码自身具有远程衰减的性质,即对于两个不同位置的位置编码向量,当它们之间的距离较近时,其内积较大;反之,当它们之间的距离逐渐增大时,内积的值会随着减小并呈现出震荡衰减的趋势。如下图所示, 是两个不同位置的位置编码向量,随着它们距离的增加,它们的内积逐渐在震荡衰减。注意,这里三角位置编码自身具有远程衰减特性,笔者后续测试了一下,如果将位置编码与词向量直接相加,即两个不同的词向量后,其实不太好反映出远程衰减特性,如下图所示。不过,如果是把位置编码与词向量进行拼接(所有向量都是列向量),即拼接在一起,则仍然具有远程衰减特性,如下图所示。

所以,根据上述两组实验,是不是拼接使用位置编码会更好一些呢?

  1. 三角函数具有如下的特性:

上述公式表明,位置的编码向量可以由位置和位置的编码向量组合得到。这是一个很好的性质,表明使用三角函数进行位置编码可以一定程度上表达相对位置,即一定程度上可以让模型理解“相邻位置”的关系。

四.相对位置编码

相对位置编码关注的是一个单词与其他单词之间的位置关系,而不是绝对位置。这种方法更适合处理序列中相对顺序比绝对位置更重要的任务 (例如句子理解)。谷歌的研究人员于2018年提出在Transformer中使用相对位置编码[5],其具体计算方式如下:

其中,分别表示两个位置和位置的可学习的相对位置向量,分别是查询、键和值词向量。

五. 融合位置编码

融合位置编码是一种结合绝对位置编码和相对位置编码优点的位置编码方法。其中一个最具代表性的编码方式是旋转位置编码 [6],其通过严谨的数学推导,设计出了一种非常优雅的位置编码机制,即能够在词向量中嵌入绝对位置信息,又能在经过注意力机制计算后可以反映出相对位置信息。由于注意力权重计算本质上是在计算向量的内积,因此旋转位置编码旨在解决如下的数学问题:寻找到一个函数和一个函数 ,以满足为了解决上述问题,旋转位置编码从复数角度出发,通过数学推导 (具体的推导过程请参考 [2,3]),寻找到了一组满足上述条件的函数 和一个函数 。具体而言,对 于二维词向量,令

则如下公式成立:

据此,当时, ,其中是几何学中常见的旋转矩阵。函数的作用相当于将词向量以特定角度进行旋转,从而只改变词向量的方向而不改变其长度。这意味着,只需要对向量进行旋转操作便可以将位置信息编码进词向量中。换句话说,在旋转位置编码的设定下,每个词向量的位置信息可理解为每个词向量需要旋转的角度。因此,该位置编码也称之为旋转位置编码。上述公式从二维词向量的角度出发,推导出了旋转位置编码的基本原理。由于旋转矩阵具有正交性,即,因此,对于高维数据(通常词向量的维度为偶数维),可以通过将词向量的维度两两分组,分别对每组进行旋转,来实现高位空间的旋转位置编码。具体计算过程如下:

此外,旋转位置编码借鉴了三角位置编码的设计理念,为每个分组设置了不同的常量,以实现对远程距离的衰减效果,从而更好地步骤序列中不同位置之间的关系:

笔者测试了一下旋转位置编码的远程衰减特性,不过并没有得到很理想的结果,具体原因不是很清楚(不清楚是不是测试代码有问题)。


六. 总结

位置编码的出现主要是为了解决 Transformer 中的注意力机制无法建模位置信息的缺陷。各种各样的位置编码已经被提出,包括绝对位置编码,相对位置编码,还有集各家所长的融合位置编码。由于目前的大模型几乎都是基于 Transformer 架构,因此,位置编码的研究是至关重要的。首先确实非常佩服谷歌的研究人员,可以想到利用三角函数的性质来建模位置编码,引发了后续很多的研究。此外,笔者感觉自己对位置编码的理解还不是特别深刻,并且有一些疑问,是否将位置编码假设具有周期性是合理的?为什么位置编码需要周期性呢?有没有更合适的函数来建模位置编码?相信后续在该领域还会出现更加优雅的位置编码。


本文内容为论文学习收获分享,受限于知识能力,本文对原文的理解可能存在偏差,最终内容以原论文为准。本文信息旨在传播和学术交流,其内容由作者负责,不代表本号观点。文中作品文字、图片等如涉及内容、版权和其他问题,请及时与我们联系,我们将在第一时间回复并处理。

AI前沿速递
持续分享最新AI前沿论文成果
 最新文章