Files
simple-llm/doc/multi_head_attention_ru.md

4.6 KiB
Raw Permalink Blame History

MultiHeadAttention - Многоголовый механизм внимания

Документ актуален для Simple-LLM v1.0 (июль 2025)


Краткое summary: Документ описывает реализацию многоголового механизма внимания (Multi-Head Attention) в трансформерах. Включает описание алгоритма, пример использования и типовые ошибки.


Структура документа:

  • Назначение
  • Алгоритм работы
  • Пример использования
  • Параметры
  • Типовые ошибки и их решения

Назначение

Модуль реализует ключевой компонент архитектуры Transformer, который:

  • Параллельно вычисляет несколько типов внимания
  • Позволяет модели фокусироваться на разных аспектах данных
  • Улучшает качество в задачах:
    • Машинного перевода
    • Генерации текста
    • Классификации последовательностей

Алгоритм работы

flowchart TD
    A[Вход: x] --> B[Линейные проекции Q,K,V]
    B --> C[Разделение на num_heads частей]
    C --> D[Параллельные вычисления внимания]
    D --> E[Конкатенация результатов]
    E --> F[Финальная проекция]
    F --> G[Выход]
  1. Инициализация проекций:

    self._q = nn.Linear(emb_size, num_heads * head_size)
    self._k = nn.Linear(emb_size, num_heads * head_size)
    self._v = nn.Linear(emb_size, num_heads * head_size)
    
  2. Разделение на головы:

    q = q.view(batch_size, seq_len, num_heads, head_size)
    
  3. Вычисление внимания:

    scores = (q @ k.transpose(-2, -1)) / math.sqrt(head_size)
    

Пример использования

from simple_llm.transformer import MultiHeadAttention

# Инициализация
mha = MultiHeadAttention(
    num_heads=8,
    emb_size=512,
    head_size=64,
    max_seq_len=1024
)

# Пример входа
x = torch.randn(1, 50, 512)  # [batch_size, seq_len, emb_size]
output = mha(x)  # [1, 50, 512]

Параметры

Параметр Тип Описание

Рекомендации

  • Размерность emb_size должна делиться на num_heads * head_size
  • Для визуализации весов используйте специализированные инструменты

Типовые ошибки и их решения

Ошибка: Размерности не совпадают при разделении на головы

Возможные причины:

  • emb_size не делится на num_heads * head_size
  • Некорректная форма входного тензора

Решение:

  • Проверьте, что emb_size = num_heads * head_size
  • Убедитесь, что вход имеет форму [batch_size, seq_len, emb_size]

Ошибка: CUDA out of memory

Возможные причины:

  • Слишком большой batch_size, seq_len или число голов

Решение:

  • Уменьшите batch_size, seq_len или num_heads

Ошибка: Не работает маскирование

Возможные причины:

  • Неправильная форма или тип маски

Решение:

  • Проверьте, что mask совпадает по размерности с attention scores

| num_heads | int | Количество голов внимания | | emb_size | int | Размерность входных эмбеддингов| | head_size | int | Размерность каждой головы | | max_seq_len | int | Максимальная длина последовательности|

Рекомендации

  1. Размерность должна делиться на число голов:
    assert emb_size % num_heads == 0
    
  2. Для визуализации весов:
    weights = [head.get_attention_weights(x) for head in mha._heads]
    

Пример визуализации