How to Implement Multi-Head Attention
Stryg for at vise menuen
12345678910111213141516171819202122232425262728293031323334353637383940import numpy as np # Toy input: 3 tokens, embedding size 6 x = np.array([ [0.1, 0.2, 0.3, 0.4, 0.5, 0.6], [0.6, 0.5, 0.4, 0.3, 0.2, 0.1], [0.2, 0.1, 0.4, 0.3, 0.6, 0.5], ]) # Multi-head attention parameters num_heads = 2 embed_size = x.shape[1] head_dim = embed_size // num_heads # Random weights for queries, keys, and values for each head np.random.seed(42) W_q = np.random.randn(num_heads, embed_size, head_dim) W_k = np.random.randn(num_heads, embed_size, head_dim) W_v = np.random.randn(num_heads, embed_size, head_dim) attention_outputs = [] for head in range(num_heads): # Linear projections Q = x @ W_q[head] K = x @ W_k[head] V = x @ W_v[head] # Scaled dot-product attention scores = Q @ K.T / np.sqrt(head_dim) attention_weights = np.exp(scores) / np.sum(np.exp(scores), axis=-1, keepdims=True) head_output = attention_weights @ V attention_outputs.append(head_output) # Concatenate outputs from all heads multi_head_output = np.concatenate(attention_outputs, axis=-1) print("Output from head 0:\n", attention_outputs[0]) print("Output from head 1:\n", attention_outputs[1]) print("Concatenated multi-head output:\n", multi_head_output)
Multi-head attention fungerer ved at anvende den samme self-attention-mekanisme uafhængigt på flere hoveder parallelt. Hvert hoved bruger sit eget sæt vægtmatricer til forespørgsler, nøgler og værdier (W_q, W_k og W_v), hvilket projicerer inputtet ind i lavere-dimensionelle delrum. Inputtet x i dette eksempel indeholder tre tokens, hver med en embedding-størrelse på 6, og deles op i to hoveder.
For hvert hoved gentager koden de standard self-attention-trin: den beregner forespørgsels- (Q), nøgle- (K) og værdimatricer (V), udregner attention-scorer ved at tage prikproduktet af Q og K.T (skaleret passende), og bruger en softmax-funktion til at opnå attention-vægte. Disse vægte bruges derefter til at kombinere værdivektorerne, hvilket producerer hvert hoveds output.
Der er ingen ny mekanisme her, multi-head attention er blot self-attention-processen udført parallelt for hvert hoved. Når alle hoveder er behandlet, sammenkædes deres output langs den sidste dimension. Denne tilgang gør det muligt for modellen at opfange forskellige relationer i dataene, da hvert hoved kan fokusere på forskellige aspekter af inputtet. De udskrevne resultater illustrerer, hvordan det at køre den samme self-attention-mekanisme flere gange og kombinere resultaterne giver en rigere repræsentation for hver token.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat