Lazy loaded image
记录-Transformer的位置编码(二)
字数 2676阅读时长 7 分钟
2025-8-27
2025-10-20
AI智能摘要
GPT
这里是萌新AI,这篇文章介绍了 Transformer 中的相对位置编码。作者从理论和代码实践两方面展开,重点讲解了相对位置编码的公式及其在自注意力机制中的应用。与绝对位置编码不同,相对位置编码通过为键 K 和值 V 添加偏置来体现 token 间的相对距离,从而更精准地捕捉局部相关性,避免注意力分散。
URL
type
status
date
slug
summary
tags
category
icon
password
😀
本篇博客主要记录Transformer位置编码中的相对位置编码。博主主要从两个方面介绍:理论和代码实践。

📝 理论

Self-Attention with Relative Position Representations

本篇论文引入了可学习位置编码和相对距离范围。其中,可学习位置编码可参与模型梯度回传,相对距离范围是用于规范每个token关注周围几个token的相关性,即目标token左边几个token和右边几个token。
让我们一起看一下该论文如何处理和应用相对位置编码。
首先,我们需要了解相对位置编码的公式。
计算完QK点积,需要经过sofmax函数,得到最终的权重值。
最后需要将权重值与V进行点积计算。
通过上诉公式,我们不难发现,与传统的QKV点积计算对比,相对位置编码的K和V都加了一个偏置。这个偏置就是我们要去实现的相对位置编码。同时,我们也发现相对位置编码会贯穿整个编码层和解码层,不像绝对位置编码仅仅在输入前与词嵌入层输出相加。
接着,我们需要理解K,V偏置的概念,以及为什么Q没有偏置?
  • 为什么Q没有偏置?
    • 从QKV的含义来解释:Q用于查询,即每个token与其他token的相关性。Q应该是纯粹的,相互独立的,仅仅代表token本身的含义。如果增加偏置,标记相对位置,这会导致每个token不再相互独立。
  • 那么如何理解偏置以及如何实现相对位置编码?
    • 为什么要使用相对位置编码?
      • 句子:「你好,你是我的猫!」。这句话中“你好”与“我”的相关性较弱。绝对位置编码是无差别关注每个token间的相关性。这样分散了注意力机制网络的关注点!同时,绝对位置编码预先设置了最大token数量。如果输入的token超出了预先设置最大值便会报错,需要重新设置。这需要我们设置一个区间,让注意力机制网络只关注每个token附近几个token的相关性。如果超出设置的区间范围,则位置编码不再发生变化(后面博主有一个例子,供大家理解)。
    • 这个偏置是什么?
      • 这个偏置就是相对位置编码。将相对位置编码贯穿整个KV,这样学习到的位置编码更能表达token间的相对位置关系。
    • 如何构造位置编码?
      • 位置编码是根据我们设置最大相邻token个数(max_relative_position)进行设置。代码如下:
      • 如果max_relative_position=2,则relative_position的shape=(5, token_dim)。
    • 如何挑选位置编码?
      • 假设,我们有一个句子,句子包含8个token。同时,我们设置每个token只关注附近两个token。如下是每个token与其他token的位置距离:
      • 因为每个token只关注附近两个token,所以需要我们截断离得较远的位置距离。>2设置为2,<-2 设置为-2。
      • 在上诉基础上+2,让负数距离变为正数。
      • 上诉矩阵,便是选择位置编码的index。以第一个token[ 2, 3, 4, 4, 4, 4, 4, 4]为例,index=2代表目标token自身的位置编码索引。index=3时,3-2=1代表该目标token右边第一个token。index=4时,4-2=2代表该目标token右边第二个token。然而,从第4个开始,index都等于4,这代表目标token只会将他们识别为最右边的token。
最后,我们需要根据上方理论去实现代码。
博主通过一个简单的例子来对该篇论文相对位置编码的理论理解。例子如下:
假设,我们有一个(16,8,512)的输入,其中16代表batch size,8代表token数量,512代表每个token的特征数量。自注意力机制是多头自注意力机制:4头。
假设QKV的线性层nn.Linear(512, 512),则Q.shape = K.shape = V.shape = (16,8,512)。因为是多头注意力机制,所以QKV的维度经过转换变为Q.shape = K.shape = V.shape = (16, 4, 8, 128)。
传统QKV计算的维度转换,相信大家已经了解,博主不在这里去记录。那么,让我们一起看一下Q如何与K的偏置和QK权重之后如何与V得到偏置计算。
Q如何与K的偏置进行矩阵相乘?
Q的shape=(16, 4, 8, 128)。K_relation的shape=(8, 8, 128),可以理解为每个token与其他token的相对位置关系。将K_relation的维度调整为shape=(8, 128, 8)。同时,我们也需要将Q的维度从四维调整到三维,所以Q的shape=(64, 8, 128)。大家可以将64看作有64个句子,每个句子包含8个token,每个token有128个特征。但是,我们依然需要调整Q的维度,Q的shape=(8, 64, 128)。为什么要这做?
从矩阵乘法解释:如果直接(64, 8, 128)* (8, 128, 8)会产生广播机制,将(8, 128, 8)广播到(64, 128, 8),这样虽然可以得到结果,但是从理论上是说不通的。相对位置编码针对的是token与token之间的,不能是64个句子与8个token之间。所以需要将Q的维度再次变换为(8, 64, 128)。
假设我们从Q取第一个token,shape=(1, 64, 128)。如何理解呢?总共64个句子,每个句子的第一个token包含128个特征。我们再从K_relation取出第一token,shape=(1, 128, 8)。如何理解呢?第一个token与其他token间的相对位置关系。这样矩阵相乘是64个句子的第一个token与第一个token和其他token的相对位置关系进行操作。
相信大家在这里会有一点明了。
QK权重之后如何与V的偏置进行矩阵计算?
同理,QK权重的shape=(16, 4, 8, 8)。V的shape=(16, 4, 8, 128)。K_relation的shape=(8, 8, 128)。传统QKV的计算,博主不在这里赘述。
这里只需要调整QK权重的维度即可,理论思想与上方是一样的,直接转换shape=(8, 64, 8)。然后进行矩阵计算即可。
通过整个理论分析,接下来我们一起将相对位置编码应用到attention block中。代码如下:

🤗 代码实践

可以点击下方链接查看相对位置编码的所有代码:

📎 参考文章

 
💡
以上便是TransFormer的相对编码记录,欢迎您在底部评论区留言,一起交流~
上一篇
记录-Transformer的位置编码(一)
下一篇
记录-HuggingFace镜像

评论
Loading...