旋转位置编码的理解

发布于:2024-12-18 ⋅ 阅读:(164) ⋅ 点赞:(0)

高维情况下的旋转位置编码

当词向量的维度很大时(比如 128 维、256 维,甚至 512 维),旋转位置编码仍然可以起作用。接下来,我会一步步解释它是如何在高维空间中工作的,以及如何结合公式来理解。


1. 词向量维度很大的概念

假设我们有一个 4 维的词向量:
v = ( x 1 , y 1 , x 2 , y 2 ) v = (x_1, y_1, x_2, y_2) v=(x1,y1,x2,y2)

对于高维词向量,我们可以将它的维度分成若干组,每组包含两个元素(即一对坐标),然后对每一组应用旋转位置编码。

例子

  • 一个 4 维的向量可以分成两组: ( x 1 , y 1 ) (x_1, y_1) (x1,y1) ( x 2 , y 2 ) (x_2, y_2) (x2,y2)
  • 一个 8 维的向量可以分成四组: ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , ( x 4 , y 4 ) (x_1, y_1), (x_2, y_2), (x_3, y_3), (x_4, y_4) (x1,y1),(x2,y2),(x3,y3),(x4,y4)

2. 旋转位置编码在高维向量上的公式

对于每一组 ( x i , y i ) (x_i, y_i) (xi,yi),我们使用相同的旋转公式:

x i ′ = x i ⋅ cos ⁡ ( θ ) − y i ⋅ sin ⁡ ( θ ) y i ′ = x i ⋅ sin ⁡ ( θ ) + y i ⋅ cos ⁡ ( θ ) \begin{aligned} x_i' &= x_i \cdot \cos(\theta) - y_i \cdot \sin(\theta) \\ y_i' &= x_i \cdot \sin(\theta) + y_i \cdot \cos(\theta) \end{aligned} xiyi=xicos(θ)yisin(θ)=xisin(θ)+yicos(θ)

其中:

  • ( x i , y i ) (x_i, y_i) (xi,yi) 是向量中第 i i i 组的坐标。
  • θ \theta θ 是根据词的位置计算出的旋转角度。

3. 实际例子:4 维词向量

假设我们有一个 4 维的词向量:
v = ( 1 , 0 , 0 , 1 ) v = (1, 0, 0, 1) v=(1,0,0,1)

我们把它分成两组:

  • 第一组: ( 1 , 0 ) (1, 0) (1,0)
  • 第二组: ( 0 , 1 ) (0, 1) (0,1)

假设我们对第 1 个位置的词使用角度 (\theta = 30^\circ),我们来计算旋转后的向量。

第一组 ( 1 , 0 ) (1, 0) (1,0) 的旋转

x 1 ′ = 1 ⋅ cos ⁡ ( 3 0 ∘ ) − 0 ⋅ sin ⁡ ( 3 0 ∘ ) = 0.866 y 1 ′ = 1 ⋅ sin ⁡ ( 3 0 ∘ ) + 0 ⋅ cos ⁡ ( 3 0 ∘ ) = 0.5 \begin{aligned} x_1' &= 1 \cdot \cos(30^\circ) - 0 \cdot \sin(30^\circ) = 0.866 \\ y_1' &= 1 \cdot \sin(30^\circ) + 0 \cdot \cos(30^\circ) = 0.5 \end{aligned} x1y1=1cos(30)0sin(30)=0.866=1sin(30)+0cos(30)=0.5

旋转后的第一组是 ((0.866, 0.5))。

第二组 ((0, 1)) 的旋转

x 2 ′ = 0 ⋅ cos ⁡ ( 3 0 ∘ ) − 1 ⋅ sin ⁡ ( 3 0 ∘ ) = − 0.5 y 2 ′ = 0 ⋅ sin ⁡ ( 3 0 ∘ ) + 1 ⋅ cos ⁡ ( 3 0 ∘ ) = 0.866 \begin{aligned} x_2' &= 0 \cdot \cos(30^\circ) - 1 \cdot \sin(30^\circ) = -0.5 \\ y_2' &= 0 \cdot \sin(30^\circ) + 1 \cdot \cos(30^\circ) = 0.866 \end{aligned} x2y2=0cos(30)1sin(30)=0.5=0sin(30)+1cos(30)=0.866

旋转后的第二组是 ((-0.5, 0.866))。

旋转后完整的 4 维向量

旋转后,我们得到新的 4 维向量:
v ′ = ( 0.866 , 0.5 , − 0.5 , 0.866 ) v' = (0.866, 0.5, -0.5, 0.866) v=(0.866,0.5,0.5,0.866)


4. 更高维的情况

如果词向量是 256 维的,我们可以将它分成 128 组,每组包含两个元素。然后对这 128 组应用相同的旋转公式,使用相同的旋转角度 (\theta),这样整个向量就被编码了位置信息。

为什么要这样分组?
  • 旋转操作只能在二维平面中进行,所以我们把高维向量拆分成多个二维小组,每组分别进行旋转。
  • 这种方法能够让整个高维向量保留位置信息,同时保持向量的结构。

5. 旋转角度 θ \theta θ的计算

对于不同位置的词,旋转角度 θ \theta θ 会根据位置 p p p 和维度索引 i i i来计算。例如:

θ p , i = p ⋅ base 2 i d \theta_{p, i} = p \cdot \text{base}^\frac{2i}{d} θp,i=pbased2i

其中:

  • p p p 是词的位置(比如第 1 个词、第 2 个词等)。
  • base \text{base} base 是一个常数,比如 10000。
  • d d d是词向量的总维度。
  • i i i 是当前维度的索引。

这种方法让不同位置的词向量以不同的角度旋转,确保位置编码在高维空间中有效。


6. 旋转位置编码的优点

  1. 适合高维向量
    通过将高维向量分成多个二维组,旋转位置编码可以轻松应用到高维向量中。

  2. 灵活且连续
    旋转操作是平滑和连续的,可以自然地表示不同位置的变化。

  3. 提升模型效果
    在许多自然语言处理任务中,旋转位置编码比传统的固定位置编码效果更好,尤其是在处理长文本或复杂句子时。


总结

  1. 高维向量 可以分成多个二维组,每组进行旋转。
  2. 旋转公式
    x i ′ = x i ⋅ cos ⁡ ( θ ) − y i ⋅ sin ⁡ ( θ ) y i ′ = x i ⋅ sin ⁡ ( θ ) + y i ⋅ cos ⁡ ( θ ) \begin{aligned} x_i' &= x_i \cdot \cos(\theta) - y_i \cdot \sin(\theta) \\ y_i' &= x_i \cdot \sin(\theta) + y_i \cdot \cos(\theta) \end{aligned} xiyi=xicos(θ)yisin(θ)=xisin(θ)+yicos(θ)
  3. 旋转角度 θ \theta θ 由词的位置和向量的维度共同决定。
  4. 优点:适合高维、灵活、效果好。

这样,模型就能在高维空间中更好地理解词的顺序信息。


网站公告

今日签到

点亮在社区的每一天
去签到