1. 从时钟指针到词向量:RoPE的直观理解
想象你面前摆着一排老式钟表,每个钟表的指针都指向不同的方向。第一个钟表指针指向12点方向,第二个钟表指针顺时针旋转了30度,第三个又转了30度...这就是RoPE(Rotary Position Embedding)最形象的比喻。在自然语言处理中,每个词就像钟表的指针,通过不同的旋转角度来标记它在句子中的位置。
传统的位置编码就像给每个词贴上一个编号标签——"这是第5个词"。但RoPE的做法更巧妙:它让词向量在抽象的空间中"旋转",位置越靠后的词旋转角度越大。这样当模型计算两个词的注意力权重时,它们的相对角度差就自然包含了位置距离信息。
举个例子,假设"苹果"这个词在位置1,它的向量旋转了15度;"吃"在位置3,旋转了45度。当模型计算它们的相关性时,30度的角度差(45-15)就暗示着它们相隔2个位置。这种设计让模型无需显式计算位置差,就能感知词语的相对距离。
2. 二维旋转的数学舞蹈
RoPE的核心是一个二维旋转矩阵。对于向量中的每一对相邻维度(比如第0和1维、第2和3维...),RoPE应用如下变换:
def rotate_vector(x1, x2, theta):
"""二维旋转操作"""
new_x1 = x1 * cos(theta) - x2 * sin(theta)
new_x2 = x1 * sin(theta) + x2 * cos(theta)
return new_x1, new_x2
这个操作保持了向量的模长不变——就像钟表指针无论怎么转,长度都不会改变。旋转角度θ由位置编号和维度共同决定:
θ = 位置编号 × 维度频率
其中维度频率的计算公式为:
freq = 1 / (10000 ** (2i / d_model)) # i是维度组的索引
为什么要用不同的频率?这就像交响乐团的不同声部:高频的小提琴能捕


2048

被折叠的 条评论
为什么被折叠?



