相对位置编码与绝对位置编码

本文探讨了Transformer模型中位置编码的重要性,包括绝对位置编码和相对位置编码。绝对位置编码通过训练得到,但无法捕捉相对位置信息;相对位置编码则解决了这一问题,能够表达词与词之间的距离。正弦位置编码是一种数学上优雅的解决方案,通过线性组合表示相对位置。文章还提到了层次分解方法来扩展绝对位置编码的适用范围,以处理超长文本,并链接了几篇相关研究论文供深入阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

位置编码

在输入的第k个向量xk中加入位置向量pk变为xk+pk,其中pk只依赖于位置编号k.位置向量和词向量相加而不是拼接。不选择拼接,
(1)拼接会导致参数数量的增加,其学习难度进一步上升

(2)另一个解释的原因是选择拼接后的效果有时积极有时消极

绝对位置编码

BERT使用的是训练出来的绝对位置编码,这种编码方式简单直接,效果也不错,且位置嵌入只与词的位置i有关,绝对方法将输入tokens的绝对位置从1编码到最大序列长度。也就是说,每个位置都有单独的编码向量。然后将编码向量与输入Tokens组合,以将位置信息输入给模型。但是该方法不能表达1与2之间的距离相比2与5的距离更小。因此引入了相对的位置编码
绝对位置编码的生成和生成词向量的方法相似,先初始化位置编码,再放到预训练过程中,训练出每个位置的位置向量。缺点是没有外推性,如果预训练的最大长度为512的话,那么只能处理长度为512的句子,最近研究表明可以通过层次分解的方式,可以使得绝对位置编码能外推的足够长的范围n^2
链接: 《层次分解位置编码,让BERT可以处理超长文本》
链接: ICCV2021 | Vision Transformer中相对位置编码的反思与改进

链接: 相对位置编码和绝对位置编码原理及源码

正弦位置编码

Position Encodeing 公式如下
在这里插入图片描述
pos即position,意为token在句中的位置,句子长度L,pos=0,1…L-1,i为向量的某一维度在这里插入图片描述
i=0,1…255.
根据数学公式
在这里插入图片描述
可以将公式拆分开为
在这里插入图片描述
可以看出,对于pos+k位置的位置向量某一维2i或2i+而言可以表示为pos位置与k位置的位置向量的2i与2i+1维的线性组合,这样的线性组合意味着位置中蕴含了相对的位置信息

参考链接: 如何理解Transformer论文中的positional encoding,和三角函数有什么关系?

相对位置编码

图片举例
在这里插入图片描述
图片中为了得到两个 i 的表示向量,如果不加入位置编码是会把两个i看作一样的,但是从语义语法的角度这是不合理,为了解决该问题就引入
相对位置变量:一个位置相对另一个位置的采用一组可训练的embedding向量来表示输入的句子中每个单词的位置编码。可以表示出单词之间的相互距离,该距离为一个设定值2k+1,左边K个右边k个,当前一个。超过范围就认为影响较小没必要精确计算两者之间的距离。具体计算请参考链接
中文版
链接: relative position representation
英文原版
强烈推荐 How Self-Attention with Relative Position Representations works

### 绝对位置编码相对位置编码 #### 定义概念 绝对位置编码是一种直接为序列中的每个元素赋予唯一标识符的方式,通常基于元素在序列中的确切位置。这种方法简单直观,在许多实际应用中表现出良好的性能[^1]。 相对位置编码则采用不同的策略,不依赖于固定的位置编号,而是关注序列内部各部分间的相互关系。具体而言,此方法利用成对距离来表示不同元素间的关系,从而构建出能够反映这些关联性的编码向量。 #### 工作机制对比 对于绝对位置编码来说,实现方式较为直接——给定长度固定的输入序列,按照预定义规则(如正弦函数或线性增长)分配特定数值作为该位置上的附加特征。这种方式有助于模型理解长期依赖性和全局结构信息。 相比之下,相对位置编码更注重局部模式的学习以及上下文感知能力的发展。通过计算窗口内各个像素之间的相对位置关系,可以生成更加灵活多变的位置编码矩阵;这一过程涉及初始化相应规模的零矩阵,并依据每一对节点间的偏移量更新其值[^2]。 ```python import numpy as np def absolute_position_encoding(seq_len, d_model): pos = np.arange(seq_len)[:, None] i = np.arange(d_model)[None, :] angle_rates = 1 / np.power(10000, (2 * (i//2)) / np.float32(d_model)) angle_rads = pos * angle_rates # apply sin to even indices in the array; 2i angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2]) # apply cos to odd indices in the array; 2i+1 angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2]) return angle_rads def relative_position_encoding(window_size): matrix = np.zeros((window_size, window_size)) for row in range(window_size): for col in range(window_size): diff = abs(row - col) matrix[row][col] = diff return matrix ``` 上述代码片段展示了两种不同类型的位置编码的具体实现逻辑:`absolute_position_encoding()` 函数用于生成标准形式下的绝对位置嵌入向量,而 `relative_position_encoding()` 则负责创建描述相邻单元间距情况的数据表。 #### 应用场景差异 当处理具有明显时间戳记或者严格有序排列的任务时,比如自然语言处理领域内的翻译工作,绝对位置编码往往能提供更好的指导作用。然而,在某些情况下,特别是涉及到图像识别等领域时,考虑到对象之间可能存在复杂的交互效应,此时引入相对位置编码可能会带来意想不到的效果改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值