Ответ
Механизм внимания (Attention) — это компонент архитектуры нейронных сетей, который позволяет модели динамически выделять и взвешивать наиболее релевантные части входной последовательности при генерации каждого элемента выходной последовательности. Он решает проблему "бутылочного горлышка" в encoder-decoder архитектурах и улучшает работу с длинными зависимостями.
Основная идея: Вместо того чтобы кодировать всё входное предложение в один фиксированный вектор контекста (как в классических RNN), механизм внимания создаёт разный вектор контекста для каждого шага декодирования, основанный на взвешенной сумме всех входных скрытых состояний.
Ключевые компоненты Scaled Dot-Product Attention (из Transformer):
- Query (Q): Вектор, представляющий текущий элемент, для которого ищется информация.
- Key (K): Вектор, представляющий каждый элемент входной последовательности.
- 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.