Hoe Multi-Head Attention te Implementeren
Veeg om het menu te tonen
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 werkt door hetzelfde self-attention-mechanisme onafhankelijk toe te passen over meerdere heads in parallel. Elke head gebruikt zijn eigen set gewichtsmatrices voor queries, keys en values (W_q, W_k en W_v), waarmee de input wordt geprojecteerd naar lager-dimensionale subruimtes. De input x in dit voorbeeld bevat drie tokens, elk met een embeddinggrootte van 6, en wordt opgesplitst in twee heads.
Voor elke head herhaalt de code de standaard self-attention-stappen: het berekent de query (Q), key (K) en value (V) matrices, berekent attentiescores door het nemen van het dotproduct van Q en K.T (juist geschaald), en gebruikt een softmaxfunctie om attentiegewichten te verkrijgen. Deze gewichten worden vervolgens gebruikt om de value-vectoren te combineren, wat de output van elke head oplevert.
Er is hier geen nieuw mechanisme; multi-head attention is simpelweg het self-attention-proces dat parallel wordt uitgevoerd voor elke head. Nadat alle heads zijn verwerkt, worden hun outputs samengevoegd langs de laatste dimensie. Deze aanpak stelt het model in staat om diverse relaties in de data vast te leggen, omdat elke head zich op verschillende aspecten van de input kan richten. De weergegeven resultaten illustreren hoe het meerdere keren uitvoeren van hetzelfde self-attention-mechanisme en het combineren van de resultaten een rijkere representatie voor elk token oplevert.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.