Позиционные эмбеддинги: виды, назначение
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Позиционные эмбеддинги: виды, назначение
Позиционные эмбеддинги — это дополнительные векторы, которые добавляются к обычным эмбеддингам токенов в трансформерах для того, чтобы модель могла различать порядок слов. Это критически важно, потому что механизм self-attention сам по себе инвариантен к перестановкам последовательности.
Назначение позиционных эмбеддингов
В трансформерах нет рекуррентности, как в RNN. Все токены обрабатываются параллельно через multi-head attention. Без информации о позиции слова в предложении модель не может понять разницу между фразами вроде "кот ловил мышь" и "мышь ловила кота". Позиционные эмбеддинги решают эту проблему, добавляя структурную информацию о местоположении каждого токена.
Основные виды позиционных эмбеддингов
1. Абсолютные позиционные эмбеддинги (Absolute Positional Embeddings)
Оригинальный подход из статьи "Attention is All You Need" (Vaswani et al., 2017) — каждой позиции в последовательности присваивается фиксированный вектор. Используются синусоидальные функции разных частот:
import numpy as np
import torch
def get_positional_encoding(seq_length, d_model):
"""Синусоидальные позиционные эмбеддинги"""
pos = np.arange(seq_length)[:, np.newaxis]
i = np.arange(d_model)[np.newaxis, :]
angle_rates = 1 / np.power(10000, (2 * (i // 2)) / np.float32(d_model))
pos_encoding = pos * angle_rates
pos_encoding[:, 0::2] = np.sin(pos_encoding[:, 0::2])
pos_encoding[:, 1::2] = np.cos(pos_encoding[:, 1::2])
return torch.from_numpy(pos_encoding).float()
Преимущества: не требуют обучения, экстраполируют на длинные последовательности, малый вычислительный вес. Недостатки: не учитывают контекст, фиксированная максимальная длина.
2. Относительные позиционные эмбеддинги (Relative Positional Embeddings)
Введены в работах Shaw et al. (2018) и T5. Модель учится относительным расстояниям между токенами, а не абсолютным позициям. Это позволяет лучше работать с длинными последовательностями:
class RelativePositionBias(torch.nn.Module):
def __init__(self, num_heads, max_distance):
super().__init__()
self.num_heads = num_heads
self.max_distance = max_distance
self.relative_attention_bias = torch.nn.Parameter(
torch.randn(max_distance * 2 + 1, num_heads)
)
def forward(self, seq_length):
distance_matrix = torch.abs(
torch.arange(seq_length).unsqueeze(0) -
torch.arange(seq_length).unsqueeze(1)
)
distance_matrix = torch.clamp(distance_matrix, 0, self.max_distance)
return self.relative_attention_bias[distance_matrix]
Преимущества: гибкие, модель учится релевантным расстояниям, отличная экстраполяция, используются в BERT и RoBERTa.
3. Вращаемые позиционные эмбеддинги (Rotary Position Embeddings - RoPE)
Новейший подход, используемый в GPT-4, PaLM и LLaMA. Вращает векторы эмбеддингов в многомерном пространстве на угол, зависящий от позиции:
def apply_rotary_pos_emb(x, cos, sin):
x1, x2 = x[..., : x.shape[-1] // 2], x[..., x.shape[-1] // 2 :]
out = torch.cat([
x1 * cos - x2 * sin,
x1 * sin + x2 * cos
], dim=-1)
return out
Преимущества: лучше масштабируются на очень длинные последовательности, эффективнее в вычислениях, показывают лучшие результаты на практике.
Сравнительная таблица
| Вид | Обучение | Экстраполяция | Вычисления | Использование |
|---|---|---|---|---|
| Абсолютные | Нет | Хорошая | Минимальные | BERT, базовые трансформеры |
| Относительные | Да | Очень хорошая | Средние | T5, RoBERTa |
| RoPE | Нет | Отличная | Низкие | LLaMA, GPT-4, современные LLM |
Практическое значение
Выбор типа позиционного эмбеддинга критичен для production систем. Абсолютные хороши для стандартных длин последовательностей, относительные улучшают экстраполяцию, RoPE показывает лучшие результаты и для длинных контекстов, и для инференса. При работе с длинными документами (>2048 токенов) рекомендуется RoPE или методы расширения контекста (ALiBi, position interpolation).