Concetti di IA in Python

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

Esegui codice →
main.py
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.

  1. Cambia gli input o i pesi e prevedi l'output prima di eseguire.
  2. Stampa i valori intermedi per seguire ogni passo del calcolo.
  3. Risolvi le sfide collegate qui sotto per implementare l'idea da solo.
Esegui nell’IDE Python →

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.

Tutte le sfide