Quello dell’intelligenza artificiale, o in breve I.A., è un concetto un tempo esclusiva della sola ricerca, ma ormai di dominio pubblico. Il suo sdoganamento e il suo conseguente interesse da parte delle persone comuni fu dovuto principalmente alla narrativa e alla cinematografia fantascientifica del secolo scorso, che ne fece un suo tema ricorrente: il supercomputer Multivac dei racconti di Isaac Asimov, Pensiero Profondo e la sua indimenticabile risposta ’42’ alla domanda universale di Douglas Adams nella sua celebre Guida galattica per autostoppisti, HAL 9000 di 2001: Odissea nello Spazio di Stanley Kubrick, R2-D2 e C-3PO della saga di Star Wars di George Lucas sono gli esempi più celebri di I.A. della storia della fantascienza. Oltre alla finzione artistica però ci sono i risultati strabilianti che la scienza e l’ingegneria mondiale hanno raggiunto in questo affascinante campo, celebrati trionfalmente sui media generalisti, tuttavia molto “alla buona” e con non poche inesattezze. Anche questa volta allora si può cogliere l’occasione di fare un po’ di chiarezza su cosa sia la I.A. e come essa funzioni, evidenziando come giochi classici e videogiochi siano stati fondamentali per il suo sviluppo nel corso degli anni.

I.A. HAL 9000

Il celebre occhio di HAL 9000 di 2001: Odissea nello spazio.

Intelligenza: saper pensare o saper fare?

Potrà sembrare strano, ma ad oggi non esiste una definizione scientifica condivisa da tutti di “intelligenza”. L’etimologia è nota, deriva dalle due parole latine intus e legere, ovvero “leggere dentro”. Ma dentro dove? Dentro di noi, e quindi intelligenza vuol dire capacità di ragionare con metodi e concetti complessi? Oppure dentro il mondo che ci circonda, e quindi intelligenza vuol dire capacità di comprendere e interagire con l’ambiente in modo a noi favorevole? Entrambe le chiavi di lettura sono equamente valide, ragion per cui la definizione comune di “intelligenza” è di fatto una somma delle due.

Tale duplice visione si ribadisce anche nella definizione di I.A., più semplicemente descrivibile come quel ramo della ricerca scientifica e tecnica che ha come scopo il cercare di riprodurre e simulare totalmente o parzialmente l’intelligenza umana all’interno di calcolatori. Ad oggi infatti si possono distinguere due tipi di approcci allo studio della I.A. ugualmente rilevanti: il primo più scientifico, basato sulla psicologia cognitiva, e uno più ingegneristico, basato sulla mera risoluzione dei problemi. Il primo approccio è detto I.A. forte, parte dal presupposto che l’intelligenza umana è riproponibile all’interno delle macchine e ha come scopo la comprensione e simulazione di quest’ultima attraverso modelli computazionali verificabili sperimentalmente. Il secondo approccio è detto I.A. debole ed è più “praticone”, ponendo l’enfasi non sulla riproposizione totale dell’intelligenza umana ma sul creare modelli che permettano di risolvere problemi che richiedono soluzioni basate su logica e razionalità, anziché essere una mera sequenza di istruzioni e calcoli. Lo strumento più utilizzato ad oggi nella I.A. forte è la rete neurale, mentre nella I.A. debole è un insieme di algoritmi con alberi di ricerca.

I.A. test di turing russell norvig

Illustrazione schematica del test di Turing. Immagine del libro I.A.: un approccio moderno, S.Russell – P.Norvig, Prentice Hall.

Uomo o macchina? Il test di Turing

Un punto condiviso da tutti in questo campo però c’è, quello di partenza. Nel 1950 la rivista scientifica inglese Mind pubblicò un articolo di Alan Turing dal titolo Computing machinery and intelligence. In quell’articolo oggi storico Turing teorizzò un “gioco dell’imitazione”: in una stanza ci sono un uomo e una donna, mentre in un’altra stanza non comunicante c’è una terza persona che deve indovinare il corrispettivo sesso dei due. L’unico modo che hanno per comunicare è attraverso messaggi scritti (Turing disse tramite telescrivente, ma oggi potremmo tranquillamente dire tramite un programma di messaggistica istantanea): in particolare una delle due persone deve aiutare il giocatore nella risoluzione, mentre l’altra deve ingannarlo. Turing teorizzò inoltre la possibilità che una delle due persone possa essere sostituito da un calcolatore, giocando come un umano: se la probabilità che il giocatore risponda correttamente quando gioca con un umano e il calcolatore è circa uguale a quella quando gioca con i due esseri umani, allora secondo Turing il calcolatore può essere considerato dotato di intelligenza, dato che il suo comportamento dall’esterno è indistinguibile da quello di un essere umano.

Oggi questo test viene considerato in maniera più generale: una I.A. può comunicare correttamente con un essere umano, fornendo risposte sempre sintatticamente e semanticamente corrette in base alle domande poste in linguaggio umano (ad esempio in inglese) e non macchina, quindi senza che l’interlocutore umano si accorga che sta conversando con una macchina? La risposta ad oggi è : un esempio odierno diffuso è cleverbot, che dimostra avere buone capacità di dialogo generale ma alla lunga tradisce il suo essere “artificiale”. Altri esempi sono i software commerciali che si interfacciano a database, come ad esempio quelli per le compagnie aeree, che possono comunicare via telefono con una persona: se ad esempio un cliente chiedesse un cambio di posto o di volo, essi riescono a rispondere correttamente tramite sintetizzazione vocale di testo ed effettuare quanto chiesto, se però l’interlocutore si mettesse a parlare di tutt’altro, il software non capirebbe nulla di quello che sta ascoltando. Insomma, siamo ancora lontani dal poter avere una relazione con una I.A. come in Her di Spike Jonze.

I.A. Kasparov Deep Blue

Garry Kasparov contro IBM Deep Blue nel febbraio del 1996.

Parlarci ancora no, ma giocarci si!

Il problema fondamentale per cui il test di Turing è ancora non verificabile è il fatto che il linguaggio umano, benché sia dotato di grammatica ben definita, può descrivere potenzialmente ogni condizione ambientale e personale. Il campo d’interesse è di fatto infinito. Inoltre una stessa identica frase può avere più significati: gli uomini provano diversi sentimenti e si esprimono anche in base a essi, modificandone il significato in base al proprio umore. Ad esempio una frase detta con toni ironici ha tutt’altro significato rispetto alla stessa frase detta con toni irati. Una delle discriminanti odierne per differenziare le I.A. dall’intelligenza umana è proprio la facoltà di provare emozioni, che ne modulano i ragionamenti.

Quindi occorre definire campi d’azione più circoscritti e problemi che sono indipendenti dalle emozioni umane affinché le I.A. possano dare il meglio di loro. Uno di questi campi è indubbiamente quello ludico: i giochi sono stati dall’alba dei tempi uno dei veicoli dello sviluppo dei rapporti interpersonali e sono comunque problemi dalla risoluzione non banale, ma hanno il vantaggio di avere tutti regole chiare e non interpretabili in modi diversi, ambienti limitati dal tavolo di gioco stesso e dalla durata di una partita. D’altronde Turing stesso teorizzò una I.A. che potesse giocare a un gioco per il suo test. Sviluppare quindi I.A. che potessero giocare contro essere umani diventò non solo fattibile, ma realtà già durante gli anni Settanta, con programmi che potessero giocare a dama o a othello. In seguito ebbe grande diffusione la notizia della sfida che IBM lanciò nel 1996 all’allora campione del mondo di scacchi Garry Kasparov di provare a battere la loro I.A. creata per l’occasione, Deep Blue, con risultati per l’epoca sorprendenti. Oggi una I.A. di alto livello come AlphaGo di Google, basata su reti neurali, in poche ore impara da zero a giocare a scacchi a livelli da gran maestro, anche se essa è stata programmata per tutt’altri scopi!

I.A. tris tree search

Sviluppo dell’albero di ricerca del gioco del tris. Immagine dal libro I.A.: un approccio moderno, S.Russell – P.Norvig, Prentice Hall.

Come detto, un gioco ha regole precise e un’area d’interesse limitata nello spazio (il tavolo da gioco come la scacchiera) e nel tempo; inoltre è possibile “spezzettare” le partite mossa per mossa, definendo così tutte le variazioni del tavolo di gioco, ponendo sempre la condizione di validità di ogni mossa. Ogni configurazione durante il corso della partita è detta stato (o ply): è possibile disporre logicamente ogni stato in uno schema ad albero che, a partire da uno stato iniziale (ad esempio nel caso degli scacchi è la disposizione iniziale dei pezzi), detto radice, descrive tutte le possibili evoluzioni di una partita fino a quando essa termina, ovvero arriva in stati detti terminali o foglie. Le I.A. vengono quindi programmate affinché, in base allo stato momentaneo della partita, possano ricercare i cammini attraverso tali alberi in modo tale che scelgano sempre quelli a loro più proficui, ovvero a quelli che la conducano ad una vittoria o se non fosse possibile ad un pareggio, evitando quelli che invece la porterebbero ad una sconfitta. Vittoria, pareggio e sconfitta sono definiti da una “funzione utilità” che ne quantifica il valore: la più banale possibile è quella che assegna +1 ad una vittoria, 0 ad un pareggio (se il gioco prevede una patta) e -1 ad una sconfitta. Per questo motivo i giochi come gli scacchi, la dama, etc. sono detti giochi “a somma zero”: c’è sempre uno che vince ed uno che perde, oppure un pareggio per entrambi. Questi algoritmi di ricerca su albero possono essere applicati, con opportune modifiche, anche a giochi che prevedono elementi aleatori, come un lancio di dadi, oppure a giochi cosiddetti “a informazione imperfetta”, cioè quelli in cui i giocatori hanno visione solo del loro stato e non di quello avversario, come ad esempio molti giochi di carte o la battaglia navale. Questi algoritmi hanno la caratteristica di essere matematicamente ottimi: le I.A. al massimo del loro “potenziale” non sbaglierebbero mai e sarebbero imbattibili!

Perché il condizionale? Semplice: le risorse per il calcolo, come ad esempio la memoria necessaria (esattamente come per la grafica), sarebbero estremamente difficili da soddisfare se si considerasse tutto l’albero, inoltre i tempi di calcolo della mossa corretta risulterebbero biblici. Per esempio, un gioco banalissimo come il tris prevede in teoria oltre 260.000 stati possibili validi, mentre un gioco più complesso come gli scacchi ne prevede circa 35100! Occorre quindi un’approssimazione o per meglio dire, mantenendo la metafora con gli alberi, una potatura: le I.A. vengono programmate in modo tale che possano durante il calcolo escludere subito, sotto opportune ipotesi, tutti i percorsi non proficui, nonché di poter fermare la ricerca entro un certo livello di profondità che eviti di procrastinare all’infinito il calcolo della scelta. Ciò è possibile definendo una “euristica”, una funzione che quantifica quanto sia profittevole per la I.A. ogni stato intermedio. Ad esempio, un’euristica semplice per gli scacchi può essere una funzione che assegna ad ogni pezzo un valore numerico, solitamente 1 ai pedoni, 3 agli alfieri e ai cavalli, 5 alle torri, 9 alla regina e +∞ al re (per i computer si usa un valore molto grande): tutti questi valori vengono sommati (positivi se propri, negativi se dell’avversario) e così più la somma è grande, più quello stato è profittevole per la I.A. Questo appena descritto è un metodo di calcolo sviluppato dal maestro russo Vladimir Medvedev.

I.A. Medvedev

Esempio di espansione dell’albero di ricerca di uno stato di scacchi secondo i punteggi di Medvedev.

L’ottimalità matematica viene perciò sacrificata affinché si possa giungere al calcolo di una mossa in tempi ragionevoli. Inoltre questi algoritmi “strozzati” possono definire il livello di sfida per un giocatore umano: più la ricerca sarà profonda, più la soluzione ricercata sarà vicina a quella ottima, allo stesso modo è possibile abbassare la profondità di ricerca in modo tale da venire incontro a giocatori meno forti.

Dai giochi ai videogiochi: gli alberi di comportamento

Secondo i dettami della I.A. forte ad oggi è impossibile far “provare sentimenti” a una I.A., ma secondo quella debole è possibile trovare un compromesso quantomeno sui comportamenti derivanti da differenti stati d’animo, nonché sulle azioni da essi condizionati. Ad esempio se ci si sente minacciati o ci si trova da soli in un ambiente ostile, si avrà un atteggiamento più predente, se invece si è in compagnia magari l’atteggiamento sarà più rilassato e più orientato verso alla cooperazione con coloro che sono al proprio fianco. Entra in gioco quindi anche l’osservazione dell’ambiente in cui la I.A. viene immersa e gli elementi che lo compongono: per quanto concerne i giochi classici, l’ambiente è come detto limitato al solo tavolo di gioco e su quello che c’è sopra. Negli scacchi ad esempio l’ambiente è banalmente composto dalla scacchiera e dalle pedine: a una I.A. che gioca a scacchi non le importa se ad esempio la partita si effettua al chiuso o all’aperto o se la scacchiera e le pedine sono fatte d’avorio piuttosto che di plastica. Per i videogiochi invece il discorso cambia drasticamente: gli ambienti e gli elementi grafici sono estremamente mutevoli da videogioco a videogioco, inoltre devono tenere conto innanzitutto della tipologia di videogioco e del relativo gameplay: ad esempio una I.A. di un videogioco di calcio deve tenere conto della posizione del pallone, dei ruoli dei calciatori, della disposizione dei compagni e degli avversari, etc. Altro esempio possono essere gli shooter cooperativi, in cui bisogna tener conto delle formazioni di difesa o di attacco, della disposizione delle squadre nemiche, della ricerca delle coperture, etc.

I.A. behaviour tree

Esempio di semplice albero di comportamento per un generico RPG.

Per poter “trasferire” alle I.A. questa capacità di valutazione dell’ambiente circostante e di come agire di conseguenza esistono vari modelli. Uno tra i più usati nella progettazione di I.A. videoludiche è l’albero di comportamento (behaviour tree), simile nella struttura ad un albero di ricerca ma più simile ad un diagramma di flusso nel funzionamento. In un albero di comportamento ci sono due tipi di nodi fondamentali: i “nodi di condizione” sono le funzioni di sola lettura che si attivano quando la I.A. osserva l’ambiente e ne trae le informazioni che le servono (se ci sono nemici, compagni, eventuali luoghi strategici, eventuali ostacoli, etc.), mentre i “nodi di azione” sono appunto le azioni conseguenti alle condizioni raccolte e che poi vengono “tradotte” all’interno del motore grafico (muoversi, coprirsi, attaccare un nemico, soccorrere un compagno, etc.). A seconda delle condizioni possono essere effettuate o una serie fissa di azioni detta “sequenza”, indicata con una freccia, oppure una singola azione tra il ventaglio possibile di scelte tramite un elemento della I.A. detto “selettore”, indicato con una spunta, che le simula ad una ad una fino a quando non trova la più congeniale al momento.

Screenshot di Halo: Combat Evolved (Bungie, 2001). Immagine: Wikipedia.

Gli alberi di comportamento hanno il grande vantaggio di permettere alla I.A. che lo utilizza di essere molto adattiva rispetto a svariate situazioni di gioco e può essere applicata a differenti elementi di gioco simili tra loro, ad esempio per un manipolo di soldati o una squadra di calcio. Infatti essi vengono utilizzati tantissimo per la programmazione delle I.A. degli NPC (non playable characters) nemici: storici franchise come quello di Halo della Bungie e di Left 4 Dead della Valve utilizzano alberi di comportamento estremamente dettagliati per le I.A. che controllano rispettivamente gli alieni covenant e le orde di zombie. Gli alberi di comportamento vengono utilizzati anche in svariati RTS come Age of Empires 2 di Microsoft o RPG open world come The Elder Scrolls V: Skyrim di Bethesda per il controllo rispettivamente delle civiltà avversarie e dei mostri.

Gli alberi di comportamento tuttavia sono molto onerosi, computazionalmente parlando, difatti il loro utilizzo è divenuto più massiccio solo da circa un decennio. Inoltre devono essere estremamente dettagliati, poiché se nel caso la I.A. potesse trovarsi in situazioni non modellate in nodi di condizione semplicemente non saprebbe cosa fare! Nei videogiochi degli anni Ottanta e Novanta le soluzioni più utilizzate per le I.A. degli NPC e dei nemici erano o blocchi di codice fissi detti script (copione) oppure semplici modelli basati su “automi a stati finiti”, o in breve FSA (finite state automaton); nei videogiochi di ultima generazione invece iniziano a essere implementate delle reti neurali non eccessivamente complesse ma che offrono una maggiore adattività all’ambiente di gioco rispetto agli alberi di comportamento. Le reti neurali inoltre negli ultimi anni iniziano ad essere utilizzate anche per la progettazione di I.A. che giocano loro stesse a dei videogiochi, con risultati strabilianti. Tutti questi temi verranno affrontati nel prossimo articolo.