Что такое RoPE (rotary positional embeddings) и какие у него преимущества?
Answer from AI
sobes.tech AI
RoPE (rotary positional embeddings) — это способ кодирования позиционной информации в трансформерах, который отличается от классических позиционных эмбеддингов (например, синусоидальных или обучаемых). Вместо добавления позиционного вектора к входным эмбеддингам RoPE внедряет позиционную информацию через вращение (rotary) векторов ключей и запросов в механизме внимания.
Идея в том, что каждая позиция кодируется как вращение векторного пространства, и при вычислении скалярного произведения внимания учитывается относительное смещение между позициями. Это позволяет модели лучше захватывать относительные позиции, а не абсолютные, что улучшает обобщение на последовательностях разной длины.
Преимущества RoPE:
- Поддержка относительных позиционных отношений без явного добавления позиционных векторов.
- Улучшенная способность к обобщению на более длинные последовательности, чем те, на которых обучалась модель.
- Более естественная интеграция с механизмом внимания, так как позиционная информация внедряется через вращение ключей и запросов.
Примерно, если q и k — векторы запроса и ключа, то RoPE применяет к ним позиционное вращение:
import numpy as np
def apply_rope(x, pos, dim):
# x — вектор размерности dim
# pos — позиция
# dim — размерность, должна быть четной
x_ = x.reshape(dim // 2, 2)
theta = pos / 10000 ** (2 * np.arange(dim // 2) / dim)
cos_theta = np.cos(theta)
sin_theta = np.sin(theta)
x_rotated = np.empty_like(x_)
x_rotated[:, 0] = x_[:, 0] * cos_theta - x_[:, 1] * sin_theta
x_rotated[:, 1] = x_[:, 0] * sin_theta + x_[:, 1] * cos_theta
return x_rotated.reshape(dim)
Таким образом, позиция влияет на вращение векторов, что учитывается при вычислении внимания.