Hvordan Implementere Multi-Head Attention
Sveip for å vise menyen
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 å bruke den samme selvoppmerksomhetsmekanismen uavhengig på flere hoder parallelt. Hvert hode har sitt eget sett med vektmatriser for spørringer, nøkler og verdier (W_q, W_k og W_v), og projiserer inputen inn i lavere-dimensjonale delrom. Inputen x i dette eksemplet inneholder tre token, hver med en embedding-størrelse på 6, og deles opp i to hoder.
For hvert hode gjentas de vanlige trinnene for selvoppmerksomhet: det beregnes matriser for spørring (Q), nøkkel (K) og verdi (V), oppmerksomhetspoeng kalkuleres ved å ta prikkproduktet av Q og K.T (skalert riktig), og en softmax-funksjon brukes for å få oppmerksomhetsvekter. Disse vektene brukes deretter til å kombinere verdi-vektorene, noe som gir utdata for hvert hode.
Det er ingen ny mekanisme her, multi-head attention er rett og slett selvoppmerksomhetsprosessen utført parallelt for hvert hode. Etter at alle hodene er behandlet, blir utdataene deres satt sammen langs siste dimensjon. Denne tilnærmingen gjør det mulig for modellen å fange opp ulike relasjoner i dataene, siden hvert hode kan fokusere på forskjellige aspekter av inputen. De utskrevne resultatene illustrerer hvordan det å kjøre den samme selvoppmerksomhetsmekanismen flere ganger og kombinere resultatene gir en rikere representasjon for hvert token.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår