L’intelligenza artificiale generativa sembra magia, ma sotto il cofano non ci sono né coscienza né intuizione: ci sono solo numeri. In questo articolo, esploreremo il funzionamento dei Large Language Models (LLM) partendo da concetti che chiunque conosca le addizioni e le moltiplicazioni può comprendere. Scopriremo come un computer passa dal distinguere un fiore da una foglia a scrivere poesie o codice complesso.


1. La Base: Tutto è un Numero

Il primo concetto fondamentale da metabolizzare è che le reti neurali accettano solo numeri come input e restituiscono solo numeri come output. Non ci sono eccezioni. La vera “arte” della programmazione AI risiede nel modo in cui scegliamo di interpretare questi numeri per raggiungere i nostri scopi.

Esempio Semplice: Classificare una Pianta

Immaginiamo di voler costruire una mini-rete neurale per distinguere tra una Foglia e un Fiore. Abbiamo a disposizione quattro dati numerici (input):

  1. Colore dominante (canali R, G, B).
  2. Volume (in millilitri).

Poiché la rete non può “dire” parole, decidiamo che l’output sarà composto da due numeri. Se il primo numero è più grande, interpreteremo l’output come “Foglia”; se il secondo è più grande, sarà “Fiore”.

L’Anatomia di una Rete Neurale

Una rete neurale è composta da neuroni (i numeri nei cerchi) e pesi (i numeri sulle linee di connessione).

  • Forward Pass: Per calcolare l’output, prendiamo i numeri in input, li moltiplichiamo per i rispettivi pesi e sommiamo i risultati per passare al livello successivo.
  • Parametri: Il termine “parametri” si riferisce a tutti quei numeri (pesi e bias) che non sono neuroni ma che determinano il comportamento della rete.

2. Come si Addestra un’Intelligenza Artificiale?

L’addestramento non è altro che il processo di impostazione dei pesi corretti affinché l’output sia quello desiderato.

  1. Inizio Random: Partiamo con pesi scelti a caso.
  2. Calcolo della Perdita (Loss): Se inseriamo i dati di una foglia e la rete ci dice “fiore”, misuriamo la differenza tra ciò che volevamo (es. 1.0 per foglia) e ciò che abbiamo ottenuto (es. 0.2). Questa differenza è la nostra “perdita”.
  3. Gradient Descent (Discesa del Gradiente): Cambiamo leggermente ogni peso per vedere se la perdita diminuisce. Ripetendo questo processo per migliaia di esempi (un ciclo chiamato epoch), la rete “impara” a minimizzare l’errore.

3. Dalla Classificazione alla Generazione di Linguaggio

Se una rete può distinguere una foglia, può anche prevedere il carattere successivo in una frase.

Il Problema della Rappresentazione

Per inserire una parola come “Gatto” in una rete, dobbiamo convertirla in numeri. Un metodo semplice è assegnare a ogni lettera un numero (a=1, b=2…), ma questo non cattura il significato.

Qui entrano in gioco gli Embedding: invece di un singolo numero, assegniamo a ogni parola o carattere un vettore (una collezione ordinata di numeri). Questi numeri non sono scelti a caso, ma vengono addestrati tramite gradient descent proprio come i pesi. In questo modo, parole con significati simili (es. “cane” e “cucciolo”) finiscono per avere vettori numericamente vicini nello spazio matematico.

Tokenizzazione Sub-word

I modelli moderni non leggono carattere per carattere. Utilizzano tokenizer che spezzano le parole in frammenti chiamati “token”. Ad esempio, “gatti” potrebbe essere diviso in “gatt” e “i”. Questo riduce la dimensione del vocabolario e permette alla rete di capire meglio le radici comuni delle parole.


4. Il Cuore del Successo: Il Meccanismo di Self-Attention

Perché i modelli come GPT-4 sembrano così intelligenti? La chiave è la Self-Attention.

In una frase, l’importanza di una parola dipende dal contesto. Consideriamo: “Il bambino ha preso la mela perché era matura”. La parola “era” si riferisce alla mela. La Self-Attention permette alla rete di “decidere” a quali parole precedenti prestare attenzione, indipendentemente dalla loro posizione fissa nella frase.

Il processo utilizza tre vettori per ogni parola:

  • Query (Q): Cosa sto cercando?
  • Key (K): Che informazioni offro?
  • Value (V): Qual è il contenuto effettivo dell’informazione?

Facendo il prodotto scalare tra la Query della parola corrente e le Key di tutte le parole precedenti, la rete ottiene un punteggio di importanza che usa per pesare i Value.


5. L’Architettura Transformer e GPT

L’architettura Transformer (introdotta nel celebre paper “Attention is all you need”) organizza questi blocchi in modo magistrale.

Blocchi Fondamentali

  1. Multi-head Attention: Invece di un solo meccanismo di attenzione, ne usiamo diversi in parallelo per catturare diverse relazioni (es. una per la grammatica, una per il significato semantico).
  2. Layer Normalization: Serve a stabilizzare i calcoli numerici, evitando che i numeri diventino troppo grandi o troppo piccoli durante l’addestramento.
  3. Residual Connections: Permettono ai dati di “saltare” alcuni blocchi, facilitando l’addestramento di reti molto profonde senza perdere il segnale originale.
  4. Softmax: Uno strato finale che converte i numeri grezzi in probabilità, permettendoci di scegliere la parola successiva più probabile (o di campionare tra le prime migliori per dare varietà).

Differenza tra Encoder e Decoder

  • L’Encoder (usato in modelli come BERT) legge una frase intera per capirne il senso.
  • Il Decoder (usato in GPT) è ottimizzato per generare testo una parola alla volta, basandosi sul contesto precedente.

FAQ: Domande Frequenti sugli LLM

Q: L’AI capisce davvero quello che scrive? A: No. Matematicamente, l’AI sta solo calcolando la probabilità statistica che un determinato token segua una sequenza data. Non c’è comprensione concettuale, solo manipolazione di vettori numerici.

Q: Cos’è la “Context Length”? A: È il numero massimo di token che il modello può “tenere a mente” contemporaneamente per fare una previsione. È determinata dalla dimensione dello strato di input.

Q: Perché l’AI a volte “allucina”? A: Poiché il modello cerca sempre di massimizzare la probabilità statistica di una frase, se non ha dati certi, genererà comunque la sequenza di parole che “suona” più plausibile, anche se fattualmente errata.


Approfondimento Tecnico: Un esempio in Python

Ecco come potremmo visualizzare un semplice meccanismo di calcolo del punteggio di attenzione (semplificato):

Python

import numpy as np

def simple_attention(query, keys, values):
    # Calcolo dei punteggi (dot product)
    scores = np.dot(query, keys.T)
    
    # Softmax per ottenere le probabilità (pesi)
    weights = np.exp(scores) / np.sum(np.exp(scores))
    
    # Somma pesata dei valori
    output = np.dot(weights, values)
    return output, weights

# Esempio: 3 parole con vettori di dimensione 4
keys = np.random.rand(3, 4)
values = np.random.rand(3, 4)
query = np.random.rand(4)

result, attention_weights = simple_attention(query, keys, values)
print(f"Pesi di attenzione: {attention_weights}")

Conclusione

Comprendere gli LLM significa smettere di vederli come entità magiche e iniziare a vederli come complessi sistemi statistici di previsione. Dagli embedding alla self-attention, ogni pezzo del puzzle serve a trasformare il linguaggio umano in una geometria di numeri che la macchina può processare velocemente.

. Rohit Patel (“LLMs From Scratch Using Middle School Math”)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *