mirror of
https://github.com/pese-git/simple-llm.git
synced 2026-01-23 21:14:17 +00:00
129 lines
4.6 KiB
Markdown
129 lines
4.6 KiB
Markdown
# MultiHeadAttention - Многоголовый механизм внимания
|
||
|
||
> **Документ актуален для Simple-LLM v1.0 (июль 2025)**
|
||
|
||
---
|
||
|
||
**Краткое summary:**
|
||
Документ описывает реализацию многоголового механизма внимания (Multi-Head Attention) в трансформерах. Включает описание алгоритма, пример использования и типовые ошибки.
|
||
|
||
---
|
||
|
||
**Структура документа:**
|
||
- Назначение
|
||
- Алгоритм работы
|
||
- Пример использования
|
||
- Параметры
|
||
- Типовые ошибки и их решения
|
||
|
||
---
|
||
|
||
## Назначение
|
||
Модуль реализует ключевой компонент архитектуры Transformer, который:
|
||
- Параллельно вычисляет несколько типов внимания
|
||
- Позволяет модели фокусироваться на разных аспектах данных
|
||
- Улучшает качество в задачах:
|
||
- Машинного перевода
|
||
- Генерации текста
|
||
- Классификации последовательностей
|
||
|
||
## Алгоритм работы
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A[Вход: x] --> B[Линейные проекции Q,K,V]
|
||
B --> C[Разделение на num_heads частей]
|
||
C --> D[Параллельные вычисления внимания]
|
||
D --> E[Конкатенация результатов]
|
||
E --> F[Финальная проекция]
|
||
F --> G[Выход]
|
||
```
|
||
|
||
1. **Инициализация проекций**:
|
||
```python
|
||
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. **Разделение на головы**:
|
||
```python
|
||
q = q.view(batch_size, seq_len, num_heads, head_size)
|
||
```
|
||
|
||
3. **Вычисление внимания**:
|
||
```python
|
||
scores = (q @ k.transpose(-2, -1)) / math.sqrt(head_size)
|
||
```
|
||
|
||
## Пример использования
|
||
```python
|
||
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. Размерность должна делиться на число голов:
|
||
```python
|
||
assert emb_size % num_heads == 0
|
||
```
|
||
2. Для визуализации весов:
|
||
```python
|
||
weights = [head.get_attention_weights(x) for head in mha._heads]
|
||
```
|
||
|
||
[Пример визуализации](/example/multi_head_attention_example.py)
|