这里写目录标题
- 高维情况下的旋转位置编码
- 1. 词向量维度很大的概念
- 2. 旋转位置编码在高维向量上的公式
- 3. 实际例子:4 维词向量
- 第一组 ( 1 , 0 ) (1, 0) (1,0) 的旋转
- 第二组 \((0, 1)\) 的旋转
- 旋转后完整的 4 维向量
- 4. 更高维的情况
- 为什么要这样分组?
- 5. 旋转角度 θ \theta θ的计算
- 6. 旋转位置编码的优点
- 总结
高维情况下的旋转位置编码
当词向量的维度很大时(比如 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} xi′yi′=xi⋅cos(θ)−yi⋅sin(θ)=xi⋅sin(θ)+yi⋅cos(θ)
其中:
- ( 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} x1′y1′=1⋅cos(30∘)−0⋅sin(30∘)=0.866=1⋅sin(30∘)+0⋅cos(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} x2′y2′=0⋅cos(30∘)−1⋅sin(30∘)=−0.5=0⋅sin(30∘)+1⋅cos(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=p⋅based2i
其中:
- p p p 是词的位置(比如第 1 个词、第 2 个词等)。
- base \text{base} base 是一个常数,比如 10000。
- d d d是词向量的总维度。
- i i i 是当前维度的索引。
这种方法让不同位置的词向量以不同的角度旋转,确保位置编码在高维空间中有效。
6. 旋转位置编码的优点
-
适合高维向量:
通过将高维向量分成多个二维组,旋转位置编码可以轻松应用到高维向量中。 -
灵活且连续:
旋转操作是平滑和连续的,可以自然地表示不同位置的变化。 -
提升模型效果:
在许多自然语言处理任务中,旋转位置编码比传统的固定位置编码效果更好,尤其是在处理长文本或复杂句子时。
总结
- 高维向量 可以分成多个二维组,每组进行旋转。
- 旋转公式:
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} xi′yi′=xi⋅cos(θ)−yi⋅sin(θ)=xi⋅sin(θ)+yi⋅cos(θ) - 旋转角度 θ \theta θ 由词的位置和向量的维度共同决定。
- 优点:适合高维、灵活、效果好。
这样,模型就能在高维空间中更好地理解词的顺序信息。