← Назад к вопросам
В чем разница между Attention и Self-Attention?
1.0 Junior🔥 141 комментариев
#Глубокое обучение
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между Attention и Self-Attention
Это базовые концепции трансформеров. Хотя термины часто путают, между ними есть принципиальное различие.
Attention (межслойный механизм)
Attention в общем смысле — механизм, при котором модель фокусирует внимание на важных частях разных источников информации.
query ← один источник
key, value ← другой источник
Впроцесс: query ищет релевантные parts в key/value
Классический пример: Encoder-Decoder Attention (из статьи "Attention Is All You Need", 2017):
# Encoder-Decoder Attention в машинном переводе
# query из decoder, key/value из encoder
def encoder_decoder_attention(query, key, value):
# query.shape = (batch, tgt_seq_len, d_model) из декодера
# key.shape = (batch, src_seq_len, d_model) из энкодера
# value.shape = (batch, src_seq_len, d_model) из энкодера
scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(d_k)
# scores.shape = (batch, tgt_seq_len, src_seq_len)
# Внимание: декодер смотрит на исходное предложение
attention_weights = torch.softmax(scores, dim=-1)
output = torch.matmul(attention_weights, value)
return output
Применения:
- Декодер обращается к энкодеру (seq2seq, трансформеры)
- Cross-modal retrieval (текст → изображение)
- Визуальное Question Answering (вопрос → регион изображения)
Self-Attention (внутри последовательности)
Self-Attention — частный случай attention, где query, key и value происходят из одного источника.
query, key, value ← ОДИН источник (одна последовательность)
Впроцесс: каждый элемент последовательности ищет отношения с другими элементами в той же последовательности
Пример: Self-Attention в трансформере:
def self_attention(X):
# X.shape = (batch, seq_len, d_model)
# Все три получаются из одного источника!
query = X @ W_q # (batch, seq_len, d_model)
key = X @ W_k # (batch, seq_len, d_model)
value = X @ W_v # (batch, seq_len, d_model)
# Каждое слово смотрит на все слова, включая себя
scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(d_k)
# scores[batch, i, j] = внимание слова i к слову j
attention_weights = torch.softmax(scores, dim=-1)
output = torch.matmul(attention_weights, value)
# output[i] = взвешенная сумма всех значений
return output
Матрица внимания:
Input: "The cat sat on the mat"
self-attention matrix:
the cat sat on the mat
the [0.8 0.1 0.05 0.02 0.02 0.01]
cat [0.1 0.7 0.1 0.03 0.04 0.02]
sat [0.05 0.1 0.6 0.15 0.05 0.05]
on [0.02 0.02 0.1 0.7 0.1 0.06]
the [0.02 0.03 0.05 0.1 0.75 0.05]
mat [0.01 0.02 0.08 0.09 0.1 0.7 ]
Каждое слово учится ассоциироваться с другими словами.
Сравнительная таблица
| Характеристика | Attention | Self-Attention |
|---|---|---|
| Источники | query и key/value разные | все из одного источника |
| Взаимодействие | между разными последовательностями | внутри одной последовательности |
| Примеры | encoder↔decoder, image→text | BERT, GPT, трансформер encoder |
| Граф зависимостей | двусторонний граф | полносвязный граф |
| Сложность | O(seq_len_q × seq_len_kv) | O(seq_len²) |
Практический пример: BERT
# BERT использует только self-attention!
import torch
from transformers import BertModel
model = BertModel.from_pretrained('bert-base-uncased')
inputs = torch.tensor([[101, 2054, 2003, 999, 102]]) # "What is this?"
# Внутренне: каждый токен смотрит на все остальные токены
outputs = model(inputs)
# Это чистый self-attention (плюс position embeddings, layer norm, FFN)
Практический пример: машинный перевод
# Трансформер: encoder + cross-attention + decoder + self-attention
# Исходный текст: "Hello, world"
encoder_output = transformer.encoder(src_tokens) # self-attention
# Декодирование: генерируем "Привет, мир"
# шаг 1: декодер генерирует "Привет"
decoder_state = transformer.decoder.init_state()
target_token = start_token
# Внутри decoder происходит:
# 1. Self-attention: "Привет" смотрит на себя (и на начальный token)
# 2. Cross-attention: "Привет" смотрит на "Hello, world" через encoder
decoder_output, attention_weights = transformer.decoder(
target_token,
encoder_output, # ← для cross-attention
decoder_state
)
Вывод
- Attention — общий механизм для связи разных данных
- Self-Attention — специализированный случай для анализа отношений внутри последовательности
- Self-attention = мощнее для захвата дальних зависимостей (O(seq_len²) позволяет каждому элементу видеть все остальные)
- Трансформеры революционизировали NLP благодаря self-attention в энкодере + cross-attention в декодере