Sebbene i dati di addestramento siano fondamentali per il funzionamento finale di un modello di IA, non sono l’unico elemento da considerare. Perché i dati risultino utili, è cruciale un’architettura adeguata su cui basare il modello. Pensa all’architettura come a uno scheletro: da solo è solo un insieme di ossa, che ha bisogno di muscoli per funzionare.
Esistono molte tipologie di architettura per scopi diversi. Alcuni modelli sono “stretti” (ANI – Artificial Narrow Intelligence), ottimizzati per compiti specifici (ad esempio, le IA per giocare a scacchi). Altri modelli, detti AGI – Artificial General Intelligence, cercano di imitare la comprensione umana in più campi. L’AGI non è ancora stato raggiunto e resta oggetto di dibattito. I Large Language Models (LLM), come ChatGPT, sono un tentativo verso l’AGI e rappresentano un enorme progresso rispetto a pochi anni fa.
Ogni architettura presenta punti di forza, limiti e casi d’uso specifici. In questo modulo tratteremo due esempi fondamentali: algoritmi genetici e reti neurali.
Gli algoritmi genetici (GA) sono un tipo di architettura di IA, un po’ diversa da quella a cui probabilmente sei abituato nel mainstream. Per ampliare la comprensione delle varie tipologie di IA, vedremo a cosa servono e come funzionano. Si tratta di un’architettura molto specializzata, non ampiamente utile per molti compiti differenti, ma altamente efficiente per problemi specifici.
Di solito i GA vengono utilizzati in problemi di ottimizzazione in cui ci sono più variabili di quante se ne possano gestire con la forza bruta. È una soluzione elegante e leggera per testare le possibili soluzioni a problemi rigidamente definiti. Tutto ciò può sembrare un po’ astratto, quindi analizziamo l’esempio più famoso: il problema del commesso viaggiatore.
Diagramma di scenario potenziale
Nel disegno sopra si vedono 7 nodi. Il problema del commesso viaggiatore richiede una soluzione in cui ogni nodo o città sia visitato esattamente una volta, con l’obiettivo di trovare il percorso più breve. Per semplicità, in questo esempio non ci sono distanze tra i nodi. Una soluzione potenziale è ABCDEFG. Un’altra è ABCDEGF. Sebbene esistano altri modi per risolvere il problema, i GA funzionano molto bene in casi di questo tipo.
Come funzionano?
In questo esempio, ogni soluzione è lunga 7 lettere e include ciascuna lettera una sola volta. Pensa a questo come al DNA su cui si basano le “genetiche”: la posizione di ciascuna lettera è un attributo della soluzione. Ogni soluzione è un membro della popolazione.
Inizialmente viene generata una popolazione casuale con tutti i tipi di soluzioni, alcune inefficienti e altre più veloci. Una funzione di fitness è un sistema di valutazione usato per confrontare la qualità delle soluzioni. In questo esempio, la funzione di fitness è semplicemente la distanza del percorso: più è bassa, meglio è. Ciò significa che le soluzioni con distanza totale inferiore saranno classificate meglio e usate per produrre la generazione successiva. Con 3 nodi, se la soluzione è ABC, la distanza è AB + AC, dove AB è la distanza da A a B.
Una volta generata la popolazione, essa deve essere ordinata in base alla funzione di fitness. Poi, la generazione successiva può essere prodotta dai genitori della generazione attuale. Anche se le soluzioni con ranking più alto hanno più probabilità di riprodursi, c’è un certo grado di casualità, per evitare una convergenza prematura e massimi locali. Questo argomento è troppo complesso per essere trattato in dettaglio all’interno di questo corso, ma per chi è curioso sono disponibili risorse aggiuntive.
La riproduzione avviene prendendo due genitori e combinandoli per variare la prole. Sebbene esistano molti modi diversi per combinare la “genetica”, l’idea generale è che la nuova popolazione sia in media migliore, poiché le soluzioni meno efficaci di ogni generazione vengono eliminate. Facendo funzionare l’algoritmo per più generazioni, si possono monitorare le migliori soluzioni fino a trovarne una sufficientemente valida per lo scopo, poiché non vi è mai garanzia che sia la soluzione ottimale assoluta.
Le reti neurali (NNs) sono la pietra angolare dell’IA moderna. L’idea è che esse imitino il funzionamento del cervello umano, con i neuroni (cellule cerebrali) e le connessioni tra di essi. Nel contesto dell’IA, ogni neurone è chiamato nodo e la sua rappresentazione informatica è una funzione per l’elaborazione dei dati. Un caso semplice è quando il nodo ha un valore compreso tra 0 e 1 e l’input viene moltiplicato per quel valore: questa è una funzione. Le connessioni hanno spesso anch’esse valori, detti pesi, che rappresentano l’influenza di un nodo su quello successivo.
Esistono numerosissime strutture di reti neurali, tra cui l’architettura transformer – quella su cui si basano la maggior parte dei LLM (Large Language Models) come ChatGPT. In questo capitolo tratteremo l’idea generale di rete neurale piuttosto che i dettagli delle architetture più avanzate.
Per sviluppare un’intuizione su come funzionano le reti neurali, useremo un esempio visivo di un’IA per il riconoscimento di immagini.
Rappresentazione potenziale di una rete neurale https://www.sciencelearn.org.nz/images/5156-neural-network-diagram
In questo esempio, i nodi sono i cerchi e le frecce rappresentano le connessioni. I pesi delle connessioni e i valori dei nodi influenzano entrambi i risultati. Vedremo da dove provengono questi valori nel capitolo 4 – addestrare l’IA.
Ora immagina una griglia come questa sovrapposta a un’immagine. Invece dei quadrati, tuttavia, ogni pixel è un cerchio blu di input nella rete neurale. Questi input vengono quindi elaborati dalla rete: ogni connessione analizza schemi tra i pixel vicini. Quando l’input attraversa un numero sufficiente di strati nascosti, la rete diventa capace di identificare strutture basate sui pixel di input, arrivando quindi a descrivere cosa rappresentano tali strutture.
Le capacità dipendono dalla dimensione della rete neurale, poiché essa può gestire solo tanti input quanti sono i suoi nodi. Puoi pensarla come un puzzle: se ogni nodo sapesse dirti dove va un pezzo, avresti bisogno di tanti nodi quanti sono i pezzi. Questa è una semplificazione: nella realtà, avere più nodi è utile per ottenere maggiore accuratezza e sfumature. Come abbiamo visto nel capitolo precedente, i dati di addestramento sono importanti, ma anche la dimensione della rete neurale rappresenta un collo di bottiglia per le prestazioni. Se avessi un solo nodo, per quanto buoni e numerosi siano i dati, tutto ciò che potresti fare è aggiornare un singolo valore – e alla fine la tua IA non sarebbe utile.
Da quanto visto in questo capitolo dovrebbe essere chiaro che l’architettura di un modello di IA incide direttamente sulle sue capacità. Le reti neurali sono più versatili, poiché i dati di input possono essere flessibili se la dimensione della “mente” (numero di parametri) è sufficiente. Gli algoritmi genetici, invece, sono specifici per singoli casi d’uso, a causa della rigidità degli input e degli output, ma hanno comunque grande efficacia se impiegati nel contesto giusto.
Esistono molte altre architetture, alcune molto avanzate e altre più basilari. In generale, i modelli semplici sono più veloci da eseguire e preferiti quando le aspettative sono ben definite. I modelli avanzati, invece, sono costosi da addestrare e richiedono hardware all’avanguardia, ma producono risultati straordinari se progettati correttamente. È sempre fondamentale analizzare quale architettura sia adatta, perché essa determinerà i risultati. Ad esempio, Stockfish è una potente IA per gli scacchi, migliore di qualunque essere umano nella storia, mentre ChatGPT commette ancora mosse illegali nelle partite. Entrambi sono sistemi di IA, ma sono stati addestrati con intenzioni e obiettivi diversi.