← Назад к вопросам

В чем разница между 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 ]

Каждое слово учится ассоциироваться с другими словами.

Сравнительная таблица

ХарактеристикаAttentionSelf-Attention
Источникиquery и key/value разныевсе из одного источника
Взаимодействиемежду разными последовательностямивнутри одной последовательности
Примерыencoder↔decoder, image→textBERT, 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 в декодере
В чем разница между Attention и Self-Attention? | PrepBro