前文,我们已经构建了一个小型的字符级语言模型,是在transformer架构基础上实现的最基本的模型,我们肯定是希望对该模型进行改进和完善的。所以我们的另外一篇文章也从数据预处理、模型架构、训练策略、评估方法、代码结构、错误处理、性能优化等多个方面提出具体的改进点,但是还没有实现以及评估。接下来,我们就从最核心的模型架构开始,对模型进行改进,其中之一就是嵌入层的位置编码。
本文是在我前文的基础上讲解的:从零开始构建一个小型字符级语言模型的详细教程(基于Transformer架构)之一数据准备-CSDN博客
从零开始构建一个小型字符级语言模型的完整python示例代码-CSDN博客
以下是关于Sinusoidal位置编码、RoPE(旋转位置编码)和可学习嵌入的详细介绍及其区别,以及它们如何增强位置感知能力。
一、Sinusoidal位置编码
1.原理
Sinusoidal位置编码是Transformer原论文中提出的固定式编码方法,通过正弦和余弦函数的组合生成位置向量。其公式为:
其中,是位置索引(从0开始),
是维度索引(从0到
),
是模型维度(编码向量的总长度)。
具体来说,这种编码方式能够捕捉到不同位置之间的相对距离,因为正弦和余弦函数具有周期性,可以表示相对位置的信息。不过,因为是固定的,可能无法适应不同任务或数据的特点。
2.特点
(1)固定性:无需训练参数,直接通过数学公式生成。
(2)相对位置感知:由于三角函数的性质,不同位置的编码之间可以通过线性变换表示相对距离。
(3)长序列友好:周期性设计使其能泛化到训练时未见过的位置。
3.适用场景
(1)数据量较少或需要模型快速收敛的任务。
(2)需要处理超长序列的场景(如文档级文本生成)。
具体详细内容可以看我的文章:transformer架构嵌入层位置编码之Sinusoidal位置编码及简单实现示例-CSDN博客
二、RoPE(Rotary Position Embedding,旋转位置编码)
1.原理
RoPE通过旋转矩阵将位置信息融入注意力机制中,将绝对位置编码转化为相对位置的旋转操作。对于位置m和n的查询向量和键向量
,RoPE通过旋转操作引入位置相关性:
其中,是旋转矩阵,编码了位置差
的信息。
具体来说,对于每个位置的向量,RoPE会应用一个旋转矩阵,使得内积运算能够自然地包含相对位置信息。这种方法在保持序列长度的同时,增强了模型对位置关系的建模能力,尤其是在处理长序列时表现更好。RoPE似乎结合了绝对位置和相对位置的优点,同时可能更容易优化。
2.特点
(1)显式相对位置编码:通过旋转矩阵直接建模相对位置关系。
(2)结构灵活性:支持自注意力机制中的相对位置偏置。
(3)计算高效:旋转操作可融合到注意力计算中,无需额外参数。
3.适用场景
(1)需要精确建模长距离依赖的任务(如对话生成、长文本理解)。
(2)对计算效率要求较高的场景。
具体详细内容可以看我的文章:transformer架构嵌入层位置编码之RoPE旋转位置编码及简单实现示例-CSDN博客