Что такое attention-механизм?
Attention-механизм — это компонент нейросетевых моделей, позволяющий фокусироваться на разных частях входной последовательности при генерации каждого элемента выходной последовательности. Он особенно популярен в NLP и CV, где важна способность учитывать контекст неравномерно, выделяя наиболее значимые элементы.
Мотивация и интуиция
В классических RNN/LSTM/GRU, независимо от длины входа, модель должна кодировать всю информацию в одном векторе фиксированной длины (контекст). Это затрудняет обучение и ведёт к потере информации, особенно при длинных последовательностях.
Attention решает эту проблему, позволяя модели динамически выделять важные части входа, когда она генерирует выход.
Пример (машинный перевод):
- Для перевода слова “eats” в фразе “He eats an apple”, attention может фокусироваться на соответствующем слове "ест" в целевом языке, игнорируя остальное.
Общая идея механизма Attention
Пусть у нас есть:
-
Входная последовательность: X=[x1,x2,...,xn]X = [x_1, x_2, ..., x_n]
-
Скрытые состояния энкодера: H=[h1,h2,...,hn]H = [h_1, h_2, ..., h_n]
-
Скрытое состояние декодера на шаге tt: sts_t
Задача attention — взвешенно суммировать h1…hnh_1 \dots h_n, чтобы получить контекстный вектор ctc_t, отражающий, какие слова важны для текущего вывода.
Формулы
-
Считаем внимание (attention weights):
eti=score(st,hi)e_{ti} = \text{score}(s_t, h_i)
где score — функция похожести между текущим состоянием декодера sts_t и каждым состоянием энкодера hih_i. -
Нормализация (softmax):
αti=exp(eti)∑jexp(etj)\alpha_{ti} = \frac{\exp(e_{ti})}{\sum_j \exp(e_{tj})}
αti\alpha_{ti} — степень важности hih_i для шага tt -
Контекстный вектор:
ct=∑iαtihic_t = \sum_i \alpha_{ti} h_i - Новый выход:
s~t=tanh(Wc[ct;st])\tilde{s}_t = \text{tanh}(W_c [c_t; s_t])
Типы attention-функций (score functions)
- Dot-product (простой и быстрый):
```python
score(st,hi)=st⊤hi\text{score}(s_t, h_i) = s_t^\top h_i
2. **Scaled dot-product**:
```python
score(st,hi)=st⊤hid\\text{score}(s_t, h_i) = \\frac{s_t^\\top h_i}{\\sqrt{d}}
- Additive (Bahdanau attention):
```python
score(st,hi)=v⊤tanh(W1st+W2hi)\text{score}(s_t, h_i) = v^\top \tanh(W_1 s_t + W_2 h_i)
## **Классификация attention-механизмов**
### **1\. Bahdanau attention (Additive attention)**
- Применяется в seq2seq.
- Вычисляет вес через MLP:
```python
score(st,hi)=vTtanh(W1st+W2hi)\\text{score}(s_t, h_i) = v^T \\tanh(W_1 s_t + W_2 h_i).
- Позволяет моделировать нелинейные зависимости.
2. Luong attention (Multiplicative attention)
-
Более простой.
-
Использует dot-product между sts_t и hih_i.
3. Self-Attention
-
Каждый элемент входа взаимодействует с каждым другим, включая себя.
-
Основа трансформеров.
-
Нет разницы между энкодером и декодером — внимание применяется "внутри" последовательности.
Self-Attention — основа трансформеров
Для self-attention (например, в BERT, GPT):
-
Вход X∈Rn×dX \in \mathbb{R}^{n \times d}
-
Проецируем в три пространства:
-
Q (queries): Q=XWQQ = XW^Q
-
K (keys): K=XWKK = XW^K
-
V (values): V=XWVV = XW^V
-
-
Attention:
python Attention(Q,K,V)=softmax(QK⊤dk)V\\text{Attention}(Q, K, V) = \\text{softmax} \\left( \\frac{QK^\\top}{\\sqrt{d_k}} \\right) V
Итог: каждый токен "смотрит" на все остальные и решает, на кого обратить внимание.
Multi-head attention
Вместо одного внимания — несколько:
-
Каждый head обучается фокусироваться на разных аспектах.
-
Модель получает богатое представление о контексте.
Алгоритм:
-
Применяется hh параллельных self-attention.
-
Результаты конкатенируются и проецируются снова:
```python
MultiHead(Q,K,V)=Concat(head1,...,headh)WO\text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1,...,\text{head}_h)W^O
## **Attention в компьютерном зрении**
Визуальное внимание позволяет модели фокусироваться на важных регионах изображения:
- **Spatial attention**: "где" смотреть.
- **Channel attention**: "на какие каналы" смотреть (цвет, границы).
- Пример: CBAM (Convolutional Block Attention Module), SENet (Squeeze-and-Excitation).
## **Преимущества attention**
- **Гибкость**: легко работает с переменной длиной последовательностей.
- **Контекстность**: позволяет учитывать всю последовательность при генерации каждого элемента.
- **Параллелизм**: self-attention легко параллелизуется на GPU (в отличие от RNN).
- **Интерпретируемость**: веса внимания можно визуализировать для понимания модели.
## **Ограничения**
- **Квадратичная сложность по длине**: O(n²) из-за матрицы QK^T.
- **Требует много памяти** для длинных входов (особенно в видео или длинных текстах).
- Решается с помощью sparse attention, Longformer, Performer и других упрощений.
## **Примеры в коде**
### **PyTorch:**
```python
import torch.nn as nn
attention = nn.MultiheadAttention(embed_dim=512, num_heads=8)
TensorFlow:
from tensorflow.keras.layers import MultiHeadAttention
mha = MultiHeadAttention(num_heads=8, key_dim=64)
Attention-механизм — ключевой строительный блок современных моделей машинного обучения, особенно в задачах, где требуется обработка контекста, иерархичность, фокусировка и эффективная работа с последовательностями.