Attention e self-attention in Python
L'attention permette a ogni token di guardare gli altri token e decidere quali contano. Ogni token ha una query (ciò che cerca), una key (ciò che offre) e un value (l'informazione che trasmette).
Il concetto in parole semplici
L'attention permette a ogni token di guardare gli altri token e decidere quali contano. Ogni token ha una query (ciò che cerca), una key (ciò che offre) e un value (l'informazione che trasmette).
Calcola a mano la scaled dot-product attention con query, key e value, poi aggiungi una maschera causale come in GPT.
Idee chiave
- I pesi di attention vengono da un softmax, quindi ogni riga somma a 1.
- Dividere per √d evita che i punteggi diventino troppo grandi con vettori lunghi.
- Una maschera causale impedisce a un token di guardare i token futuri durante la generazione.
- La multi-head attention esegue più attention in parallelo, e il positional encoding aggiunge l'ordine delle parole.
Quando si usa?
- Capire cosa succede dentro le reti neurali e le librerie di IA.
- Imparare l'idea prima di implementarla nelle sfide corrispondenti.
- Prepararti a corsi di machine learning, colloqui e progetti.
Guardalo in azione
Fai clic su una riga della heatmap per vedere dove guarda quel token. Attiva la causal mask per nascondere i token futuri e cambia la nitidezza per concentrare l'attention.
Codice di esempio
import math
def softmax(row):
exps = [math.exp(v - max(row)) for v in row]
return [e / sum(exps) for e in exps]
# Three tokens, each with a query, key and value vector of size 2.
Q = [[1, 0], [0, 1], [1, 1]]
K = [[1, 0], [0, 1], [1, 1]]
V = [[10, 0], [0, 10], [5, 5]]
d = len(K[0])
def attention(causal=False):
out = []
for i, q in enumerate(Q):
# Score: how well this query matches every key, scaled by sqrt(d).
scores = [sum(a * b for a, b in zip(q, k)) / math.sqrt(d) for k in K]
if causal: # a token may only look at itself and earlier tokens
scores = [s if j <= i else -1e9 for j, s in enumerate(scores)]
weights = softmax(scores)
out.append([round(sum(w * v[c] for w, v in zip(weights, V)), 2) for c in range(2)])
return out
print("attention:", attention())
print("causal attention:", attention(causal=True))
Output previsto
attention: [[6.02, 3.98], [3.98, 6.02], [5.0, 5.0]]
causal attention: [[10.0, 0.0], [3.3, 6.7], [5.0, 5.0]]
Come funziona
Per ogni query, i punteggi sono i suoi prodotti scalari con tutte le key, divisi per √d. Softmax trasforma i punteggi in pesi, e l'output è la media pesata dei value. Con la maschera causale il primo token vede solo sé stesso, quindi il suo output è esattamente il suo value [10, 0].
Modifica i valori ed esegui il programma nel compilatore Python online CodeUtility senza installare Python.
Esercizi pratici
Modifica gli input e verifica i casi limite prima di usare dataset più grandi.
- Cambia gli input o i pesi e prevedi l'output prima di eseguire.
- Stampa i valori intermedi per seguire ogni passo del calcolo.
- Risolvi le sfide collegate qui sotto per implementare l'idea da solo.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
- Codifica posizionale sinusoidale Calcola i vettori di posizione seno e coseno che i Transformer sommano agli embedding dei token. Media
- Attenzione a prodotto scalare scalato Implementa l'operazione di attenzione, il cuore dei Transformer e dei grandi modelli linguistici. Difficile
- Self-attention causale (mascherata) Implementa l'attenzione mascherata dei modelli GPT, in cui ogni token può vedere solo se stesso e i token precedenti. Media
- Self-attention multi-head Proietta l'input in query, key e value, esegui l'attenzione in più head in parallelo e combinale. Difficile