Что такое механизм внимания (Attention) в нейронных сетях?

«Что такое механизм внимания (Attention) в нейронных сетях?» — вопрос из категории NLP и трансформеры, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Механизм внимания (Attention) — это компонент архитектуры нейронных сетей, который позволяет модели динамически выделять и взвешивать наиболее релевантные части входной последовательности при генерации каждого элемента выходной последовательности. Он решает проблему "бутылочного горлышка" в encoder-decoder архитектурах и улучшает работу с длинными зависимостями.

Основная идея: Вместо того чтобы кодировать всё входное предложение в один фиксированный вектор контекста (как в классических RNN), механизм внимания создаёт разный вектор контекста для каждого шага декодирования, основанный на взвешенной сумме всех входных скрытых состояний.

Ключевые компоненты Scaled Dot-Product Attention (из Transformer):

  1. Query (Q): Вектор, представляющий текущий элемент, для которого ищется информация.
  2. Key (K): Вектор, представляющий каждый элемент входной последовательности.
  3. Value (V): Вектор, содержащий фактическую информацию каждого входного элемента.

Вычисление:

import torch
import torch.nn.functional as F

def scaled_dot_product_attention(query, key, value, mask=None):
    """
    query: [batch_size, seq_len_q, dim_k]
    key: [batch_size, seq_len_k, dim_k]
    value: [batch_size, seq_len_v, dim_v] (обычно seq_len_k == seq_len_v)
    """
    dim_k = query.size(-1)
    scores = torch.matmul(query, key.transpose(-2, -1)) / torch.sqrt(torch.tensor(dim_k, dtype=torch.float32))

    if mask is not None:
        scores = scores.masked_fill(mask == 0, -1e9)

    attention_weights = F.softmax(scores, dim=-1)  # [batch_size, seq_len_q, seq_len_k]
    output = torch.matmul(attention_weights, value)  # [batch_size, seq_len_q, dim_v]
    return output, attention_weights

Практическое значение: Этот механизм позволяет модели, например, при переводе слова "bank", "посмотреть" на разные части исходного предложения ("река" или "финансовое учреждение"), чтобы выбрать правильный контекст. Он является фундаментом для архитектуры Transformer, лежащей в основе современных LLM.