multi-head self-attention

Multi-head self-attention er en mekanisme i transformer-arkitekturer, hvor opmærksomheden beregnes parallelt over flere repræsentationsunderrum (heads) for hvert element i en sekvens.

Kort fortalt

Kort fortalt: Det er en teknik, der giver en model mulighed for at fokusere på forskellige dele af en inputsekvens samtidigt, hvilket forbedrer evnen til at forstå sammenhænge.

Kategori
arkitektur
Niveau
øvet
Udtale
/ˈmʌlti hɛd sɛlf əˈtɛnʃən/

Betydninger

2
  1. 1

    Opmærksomhedsmekanisme, hvor en sekvens af elementer (fx ord) hver især beregner opmærksomhed over alle andre elementer i sekvensen, opsplittet i flere parallelle 'hoveder' for at fange forskellige repræsentationsaspekter.

    • Multi-head self-attention gør det muligt for modellen samtidig at fokusere på både lokale og globale afhængigheder i sætningen.Generelt eksempel
    • I transformerlaget efterfølges multi-head self-attention typisk af et feed-forward-netværk.Vaswani et al., 2017
  2. 2

    Specifik implementering af multi-head attention, hvor forespørgsler, nøgler og værdier alle stammer fra samme sekvens (self-attention). Dette er standard i koderdelen af transformere.

    • BERT anvender multi-head self-attention med 12 hoveder i sin base-version.Devlin et al., 2019

Hvornår bruges det

Multi-head self-attention anvendes som en central byggesten i transformermodeller såsom BERT og GPT. Det bruges i hvert lag til at lade token-repræsentationer interagere og aggregere information på tværs af sekvensen. Flere hoveder gør det muligt at fange forskellige typer relationer, fx syntaktiske og semantiske.

Formel

MultiHead(Q,K,V) = Concat(head_1, ..., head_h)W^O, where head_i = Attention(QW_i^Q, KW_i^K, VW_i^V) and Attention(Q,K,V) = softmax(QK^T/√d_k)V.

Kodeeksempel

import torch
import torch.nn as nn

class MultiHeadSelfAttention(nn.Module):
    def __init__(self, d_model, n_heads):
        super().__init__()
        self.n_heads = n_heads
        self.d_k = d_model // n_heads
        self.q_lin = nn.Linear(d_model, d_model)
        self.k_lin = nn.Linear(d_model, d_model)
        self.v_lin = nn.Linear(d_model, d_model)
        self.out_lin = nn.Linear(d_model, d_model)

    def forward(self, x):
        B, T, D = x.shape
        Q = self.q_lin(x).view(B, T, self.n_heads, self.d_k).transpose(1,2)
        K = self.k_lin(x).view(B, T, self.n_heads, self.d_k).transpose(1,2)
        V = self.v_lin(x).view(B, T, self.n_heads, self.d_k).transpose(1,2)
        attn = torch.softmax(Q @ K.transpose(-2,-1) / (self.d_k**0.5), dim=-1)
        out = (attn @ V).transpose(1,2).contiguous().view(B, T, D)
        return self.out_lin(out)

En forenklet PyTorch-implementering af multi-head self-attention med lineære projektioner.

Oprindelse

Begrebet blev introduceret i artiklen 'Attention Is All You Need' af Vaswani et al. (2017). 'Multi-head' refererer til brugen af flere uafhængige opmærksomhedsmekanismer i parallel, og 'self-attention' betyder, at opmærksomheden beregnes over inputsekvensens egne elementer.

Afledte ord

1

Kilder

2
  • Attention Is All You Need (Vaswani et al., 2017)
  • BERT: Pre-training of Deep Bidirectional Transformers (Devlin et al., 2019)