il piano cartesiano
INTELLIGENZA ARTIFICIALE
Una definizione
Dimiter Dobrev
Illustrazioni di Konstantin Lakov

(testo originale)
Nota dei redattori:
Questo articolo, opera del matematico bulgaro Dimiter Dobrev, rappresenta un
non facile approccio alla definizione (per ora teorica) di un algoritmo per la creazione
di programmi per l'Intelligenza artificiale. Perciò, anche se non di immediata comprensibiltà,
siamo lieti di ospitarlo su queste pagine, certi che la collaborazione
potrà continuare anche in futuro. L'articolo, come si può evincere da logo sottostante,
è stato ospitato anche dalla rivista PC Magazine, nell'edizione della Bulgaria.
Il logo che appare alla fine dell'articolo rinvia al sito di Dimiter,
nel quale è possibile acquistare e scaricare il compilatore Strawberry Prolog per Win9x
che lui e il suo team hanno elaborato e che continuano a sviluppare.


In questo articolo discuteremo i seguenti quesiti: "E'
possibile sapere che cos'è l'Intelligenza
Artificiale?" e "Che cos'è
l'intelligenza?". In seguito potremo dare una
definizione di Intelligenza Artificiale (d'ora in poi AI,
da Artificial Intelligence). Infine, da questa
definizione, potremo ottenere un algoritmo che, dopo una
serie finita di passi, potrà determinare l'AI.

E' possibile sapere che cos'è l'AI? A questa domanda si può facilmente rispondere: Sì. E, se vogliamo trovarla, il nostro compito sarà molto più facile se conosciamo ciò che stiamo cercando. Se non definissimo l'AI, la nostra posizione non sarebbe diversa da quella degli Alchimisti, che cercarono la Pietra Filosofale, ma non avevano idea di cosa fosse.
La più diffusa definizione di AI è data dal cosiddetto test di Turing. Alan Turing fu un matematico inglese, famoso per l'invenzione della teoria della macchina di Turing e per la decifratura dei codici tedeschi durante la seconda guerra mondiale. Il test di Turing è piuttosto semplice. Poniamo un "qualcosa" dietro a una tenda, e chiacchieriamo con questo "qualcosa". Se non riusciamo a scoprire differenze tra esso e un essere umano, allora quel "qualcosa" è dotato di AI. Questa definizione esiste da più di cinquant'anni, e ci proponiamo di costruirne una più nuova e più aggiornata.

Il test di Turing sottintende che un Intelletto sia una persona che possieda una conoscenza accumulata negli anni. Se è così, allora cosa dire di un neonato? Un neonato può essere definito un Intelletto? Naturalmente sì. La nostra definizione di Intelletto è quindi: un "qualcosa" (che d'ora in poi chiameremo device) che non sa niente, ma che può imparare. A questo punto la nostra definizione differisce molto da quella di chi pensa a un professore universitario quando sente la parola "Intelletto"!

Prima di dare una definizione formale di AI, chiariamo che noi accettiamo la tesi di Church, che afferma che ogni device di calcolo può essere modellato da un programma. Questo significa che potremo cercare l'AI entro un gruppo di programmi. Supponiamo che l'AI sia un device passo-passo che viva in un certo tipo di "mondo" (world). A ogni passo riceve informazioni (dal mondo) e influenza (il mondo) con le informazioni che elabora. In più, assumeremo che le informazioni ricevute ed elaborate a ogni passo siano in numero finito. Diciamo quindi che il nostro device riceve n bytes ed elabora m bytes.

Dopo questi chiarimenti possiamo introdurre la nostra formale definizione di AI. Essa consiste in un programma tale che, in un arbitrario mondo, non si comporterà in maniera diversa da un essere umano. Il compito successivo è formalizzare questa definizione allo scopo di usarla e sperimentare l'AI attraverso di essa. Ma prima: cos'è un mondo per noi? Introduciamo due funzioni, World(s, d) e View(s). La prima prende come argomenti la condizione del mondo e l'influenza che il nostro device ha sul mondo a un dato passo. Come risultato questa funzione restituisce la nuova condizione del mondo (al successivo passo). La seconda funzione ci informa su cosa vede il nostro device. L'argomento di questa funzione è la condizione del mondo, e il valore restituito è l'informazione che il device riceve (ad un dato passo). Introduciamo ora s0. E' la condizione del mondo alla "nascita" del nostro device. Durante la sua vita, il mondo attraversa le condizioni s0, s1, s2, ... . Il device influenza il mondo con le informazioni che elabora ad ogni passo, ovvero d0, d1, d2, ... . In più, l'AI riceve dal mondo le informazioni v0, v1, v2, ... . E' chiaro che si+1=World(si , di) e vi=View(si).

Per il momento c'è tutto quello che ci serve. Abbiamo un mondo e un device che ci vive dentro. Comunque, a ben guardare, qualcosa ancora ci manca: il significato di vita. Cosa sia la vita senza gioia e dolore è compito del filosofo. Introduciamo allora la seguente definizione: la vita rappresenta la capacità di valutare che il vettore v0, v1, v2, ... è migliore di un altro. Molti ritengono che avrebbero speso meglio la loro vita se avessero visto più località svizzere e meno miniere di carbone. Più o meno la nostra definizione del significato di vita è la stessa. Prendiamo due bytes da vi e chiamiamoli "vittoria" e "sconfitta". Lo scopo sarà avere più vittorie e meno sconfitte.

L'ultimo passo è costruire un algoritmo che sperimenterà l'AI. L'idea è lanciare tutti i programmi in tutti i mondi, e prendere quelli che si comportano meglio. Questo non suona come un algoritmo. E' come se stessimo facendo un esame infinito con un numero infinito di candidati. Il problema non è il numero infinito dei candidati: non abbiamo bisogno di tutti loro, ma solo di una parte di coloro che hanno passato l'esame. Il vero problema è che l'esame non finirà mai per ogni candidato. Per rendere l'esame finito, rendiamo finito il numero dei mondi. Questo non è sufficiente, perché anche per un mondo solo l'esame sarebbe infinito. Ecco perché introduciamo il requisito dell'efficienza. Diamo per ogni mondo un limite di tempo entro cui il device può allenarsi, e stabiliamo anche che tipo di risultati deve raggiungere dopo l'allenamento (per esempio, il rapporto vittorie/sconfitte deve essere almeno 9 a 1). Restringiamo inoltre il tempo e la memoria disponibile al device per un dato passo. Questi requisiti non dovrebbero essere troppo esigenti, altrimenti la nostra AI non li potrà soddisfare e falliremmo l'esame.

Supponiamo infine che non ci siano errori fatali nel mondo scelto per l'esame. Se ce ne fossero, la nostra AI potrebbe commettere un errore fatale durante il suo allenamento, e fallire l'esame. Naturalmente, se l'AI vivesse molte volte in un tale mondo, otterebbe ugualmente una buona media di punteggio, ma noi vogliamo che viva una sola AI per ogni mondo.

Il mondo reale non soddisfa questi requisiti, semplicemente perché uno potrebbe essere Einstein, ma essere divorato da un orso prima di sviluppare la Teoria della Relatività, cioè commettere un errore fatale prima di cominciare l'allenamento. Un esempio di mondo senza errori fatali potrebbe essere il caso in cui in nostro device gioca a scacchi con qualcun altro. Alla fine di ogni partita, ne comincia un'altra, e in questo mondo, l'AI può perdere molte partite, ma questo non influenzerà la successiva partita.

Dopo aver stabilito l'esame finale, il nostro algoritmo può cominciare generando i programmi uno dopo l'altro, per metterli alla prova e tenere quelli che hanno passato l'esame. Consideriamo che il nostro algoritmo ordini i programmi secondo la loro complessità (per es. secondo la lunghezza). Ciò sta a significare che preleverà per primo il più semplice programma (il più corto) da quelli che hanno superato l'esame. E' questo programma l'AI, o l'AI verrà generata in un secondo momento?
Dobbiamo chiarire che non tutti i programmi che passano l'esame saranno AI. Per esempio, se scriviamo un programma specifico per i mondi in cui lo testiamo, esso supererà l'esame, ma ciò non sarà AI. Abbiamo lo stesso problema con gli esami per gli studenti. Quelli che hanno imparato a memoria gli esercizi passeranno l'esame, ma questi studenti non saranno intelligenti: solamente pappagalli. Consideriamo che i mondi inclusi nell'esame siano abbastanza numerosi e vari (un più grande numero di esercizi non fa l'esame più duro per l'esaminatore, perché la maggior parte degli esaminandi fallirà all'inizio). In questa situazione, quasi tutti i programmi che non sono AI saranno scartati. Come risultato, il primo (il più semplice) programma processato sarà di AI, e gli altri, scritti solo per i mondi in esame, saranno più complessi e saranno processati più tardi. Così, abbiamo già un algoritmo per scoprire l'AI! Ma questo, significa forse che ogni programmatore decente può scrivere un programma siffatto, lanciarlo, attendere un attimo e scoprire la desiderata AI? Sì, ma il tempo necessario sarebbe piuttosto grande (diciamo cento - mille anni). Il motivo è il fenonemo chiamato esplosione combinatoria. Non è granché difficile scrivere un programma che si fermi dopo la fine dell'Universo (per esempio, si può incrementare un contatore a dieci byte fino all'overload).

L'algoritmo dell'esempio esposto è completamente inutile, ma non è così con la definizione di AI. Dopo aver imparato cos'è l'AI, potremo cercare di costruirla direttamente, e usare l'algoritmo per assicurarci che sia veramente AI. Dopo il superamento del test per il nostro device in tutti i mondi di test, possiamo porlo nel nostro mondo reale. Naturalmente, non sarà pronto immediatamente per il test di Turing, perché al massimo lo si potrà udire tubare da dietro la tenda. Il nostro device avrà prima bisogno di tutori e governanti per imparare le buone maniere. Gli insegnanti dovrebbero incoraggiarlo dandogli punti di vittoria, e punirlo dandogli punti di sconfitta. Perciò, la nostra AI sgobberà sodo per ottenere il massimo incoraggiamento e la minore punizione. Probabilmente, allora, i computer non saranno programmati, ma educati e allenati. E forse, un giorno, dopo averli educati e allenati, saremo noi a diventare inutili.

Traduzione dall'inglese di Antonio Maschio

1