Sobes.tech
Middle — Senior
33

Что такое RoPE (rotary positional embeddings) и какие у него преимущества?

Компании, где спрашивали
SberDevices
филиппинский банк Salmon

Ответ от нейросети

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)

Таким образом, позиция влияет на вращение векторов, что учитывается при вычислении внимания.