Chess Boxing

Era il 1971 quando in un celebre libro comparve la frase

Nell’analizzare variazioni complicate si deve esaminare ogni ramo dell’albero una ed una sola volta.

A scriverla non un informatico ne un matematico bensì il maestro di scacchi sovietico Alexander Kotov nel suo famoso Pensa come un Grande Maestro.

Continue reading »

 

Chi mi segue su Google+ o Twitter sa già tutta la storia. Per chi invece non lo fa eccola qui.

Un paio di settimane fa stavo pensando a quale progetto portare per l’esame di Machine Learning. Dopo aver scartato un po’ di idee perché troppo banali e altre perché troppo complesse mi si è accesa la lampadina. Ho pensato di progettare un intelligenza artificiale per il gioco della dama in grado di apprendere con l’esperienza.

Continue reading »

 

L’uso della logica come tentativo di emulare il ragionamento umano è un arte antica. Già Aristotele nel IV secolo A.C., spinto dal suo enorme desiderio di razionalizzare il mondo, si era spinto fino al punto di cercare di meccanizzare il pensiero umano. Aristotele ci provò con i sillogismi che definiva come “un discorso nel quale, supposta la verità di alcune cose, si deduce la necessaria verità di una conclusione diversa dai presupposti”.

Verso la fine del 1200, il filosofo catalano Ramon Llull passò gran parte del suo tempo nel tentativo di creare macchine in grado di generare automaticamente ragionamenti utili (Ars generalis ultima). Sebbene il suo scopo fosse un po’ ardito (Ramon tentava di dimostrare la supremazia del Cristianesimo sull’Islam e l’Ebraismo facendo derivare automaticamente la dottrina Cristiana a partire da alcuni principi di base) la mole di tecniche di calcolo e di ragionamento create dal filosofo catalano fu decisamente elevata per l’epoca.

Tuttavia sia Aristotele che Lull che tutti gli altri che ci hanno provato nei secoli a venire (e ci provano tutt’ora) hanno fallito: i loro metodi si sono sempre trovati davanti al problema di non essere scalabili alla complessità del mondo reale. Apparve chiaro, insomma, che l’uomo non è una raffinata macchina risolutiva di formule logiche o, almeno, non solo.

Continue reading »

 

È un po’ che ci penso su. L’ala di SlashCode dedicata all’intelligenza artificiale sta aumentando a dismisura sia come numero di post, sia come attrattiva nei miei interessi. Studio e leggo svariati argomenti di AI e neuroscienze praticamente ogni giorno e ora che ho ricominciato a seguire le lezioni (tutte a tema, ovviamente) il tempo per il resto è ulteriormente diminuito.

Allo stesso tempo mi sono fatto sempre più l’idea che il target di questo blog non può dividersi in entrambi gli argomenti in modo uniforme: chi è interessato al mondo OpenSource e alla programmazione “generale” non è detto che sia interessato ad AI e materie collegate, e viceversa. Tanto vale spezzare in due il blog separando la parte di AI da quella più semplice e generalista che tratta di informatica e opensource.

A questo punto però alzo un po’ il tiro. La mia idea era di aprire un blog (forse anche forum) dedicato alla materia, aperto ovviamente anche a contributi esterni. Una sorta di rivista online dedicata al mondo delle scienze cognitive. Per ora è solo un progetto vago su cui possiamo discutere.

Se qualcuno è interessato alle intelligenze artificiale, la robotica o altro, ma anche persone lontane dal mondo dell’informatica interessate alla neurofisiologia, ed è interessata a questo progetto mi contatti. Mi farebbe piacere riunire molte persone con questo interesse in comune. Sono sicuro che ne uscirebbe qualcosa di buono. :)

 

Vi avevo parlato già degli alberi decisionali in relazione al famoso gioco 20q. Ne avevo parlato in questo articolo facendovi vedere come un semplice albero binario potesse mostrare caratteristiche di apprendimento molto ampie. Questa volta voglio invece mostrarvi un concetto molto utilizzato negli alberi decisionali per migliorare l’efficienza dell’albero stesso: l’entropia. Prima di questo però è necessario che precisare che esistono due metodologie di apprendimento.

APPRENDIMENTO GLOBALE E APPRENDIMENTO STOCASTICO

Il gioco 20q è un ottimo esempio di apprendimento stocastico. In questo caso infatti l’algoritmo apprende domanda per domanda e si aggiorna progressivamente verso la forma definitiva. L’apprendimento avviene alla fine di ogni esempio.

L’apprendimento globale invece si svolge in maniera diversa. Si prende un insieme numeroso di esempi, li si da al programma tutti insieme, e il programma apprende. In questo caso l’apprendimento avviene globalmente alla fine di tutti gli esempi.

L’apprendimento stocastico è solitamente il più usato nella pratica (specie nelle reti neurali) per la sua migliore efficienza, adattabilità e possibilità di successo. Nonostante ciò in questo esempio useremo un apprendimento globale per semplificarci i conti.

L’ENTROPIA

Supponiamo di dover scrivere un applicazione in grado di apprendere quale sono le giornate ideali per andare a giocare a tennis. La prima cosa da fare è elencare alcuni attributi della giornata: tempo, temperatura, umidità e vento. A questo punto forniamo al programma 10 “giornate” e indichiamo se la giornata è adatta al tennis o meno. Ad esempio:

  1. sole, caldo, secco, lieve = si
  2. sole, caldo, umido, lieve = no
  3. nuvoloso, freddo, umido, forte = no
  4. nuvoloso, caldo, secco, lieve = si
  5. pioggia, caldo, umido, forte = no
  6. pioggia, freddo, umido, lieve = no
  7. sole, freddo, secco, lieve = si
  8. sole, freddo, umido, forte = no
  9. nuvoloso, caldo, secco, forte = no
  10. sole, caldo, secco, forte = si

A questo punto dobbiamo costruire un albero a partire da questi dati. Ma quale attributo testiamo alla radice? Ovviamente dobbiamo testare l’attributo la cui risposta ci da il maggior numero di informazioni (detto diversamente, quella che ci permette di eliminare il maggior numero di ipotesi). Per far questo utilizziamo l’entropia. Essa infatti ci è molto utile per calcolare l’information gain ovvero il grado di informazione associato ad ogni attributo.

L’entropia è espressa dalla seguente formula:

Dove c è il numero di possibili risposte (nel nostro caso sono due, “si” e “no”), e i vari p sono la frazione di esempi che hanno come risultato l’i-esima risposta. Ad esempio nella nostra lista di 10 giornate ce ne sono 4 con esito positivo e 6 con esito negativo. L’entropia del nostro insieme sarà:

Cioè circa 0.97.

INFORMATION GAIN

A questo punto dobbiamo cacolare l’information gain per ogni attributo. Secondo questa formula:

La formula sembra complicata ma non lo è. Vediamo infatti un rapido esempio. Cominciamo trovando il gain dell’attributo tempo. Tale attributo ha 3 valori possibili: sole, nuvoloso e pioggia.  La prima cosa da fare è trovare il sottoinsieme S(v) per ogni valore di tempo, cominciamo con S(sole). Per fare ciò dobbiamo identificare tutte le giornale che hanno come attributo di tempo il valore “sole” e fra queste contare quante sono associate ad una giornata “si” e quante ad una giornata “no”.

Il risultato è 3 “si” (la 1, la 7 e la 10) e 2 “no” (2,8). A questo punto calcoliamo l’entropia di questo sotto-insieme e moltiplichiamola per la frazione di giornate assolate (5/10). Ottenendo: 0.48. Facciamo lo stesso per tutti gli altri valori ottenendo che il gain per tempo vale esattamente 0.23.

Facciamo lo stesso per tutti gli altri attributi ottenendo:

  • tempo = 0.23
  • temperatura = 0.05
  • umidità =  0.61
  • vento = 0.13

Bene. A questo punto sappiamo cosa scegliere: umidità. Possiamo quindi porre come nodo radice la domanda “è umido o secco?”. Inoltre notiamo che l’entropia per l’insierme S(umido) è esattamente zero. Questo ci indica che se la risposta è “umido” possiamo già dare la risposta: no.

Se invece la risposta è “secco” dobbiamo continuare. Per fare ciò dobbiamo togliere dall’insieme tutte le giornate umide. A questo punto rifacciamo tutto il calcolo da capo, ricalcoliamo il nuovo gain per ogni attributo restante (tempo, temperatura e vento) e scegliamo nuovamente il maggiore. Così fino alla fine.

Ovviamente, tutti questi conti che abbiamo fatto a mano possono essere facilmente automatizzati, altrimenti non parleremmo di apprendimento automatico ;)   In un prossimo post infatti presenterò un piccolo script che dato un insieme di esempi calcola l’albero decisionale migliore in base ai dati forniti con tanto di dati sull’entropia del sistema.

 

Supponiamo di trovarci in una città a noi sconosciuta e di avere un appuntamento importante con una stupenda ragazza (o ragazzo a seconda dei casi). La cosa più semplice da fare è chiedere indicazioni ai passanti. Purtroppo però siamo sfortunati e quel giorno diluvia che dio la manda e non c’è anima viva in giro. Non c’è speranza.

LA RICERCA IN AMPIEZZA

In questo caso l’unica soluzione che avete è di tentare tutte le strade. Partite dal punto A e verificate tutti gli incroci a cui si arriva direttamente da A, se non siete arrivati tornate ad A e verificate tutti gli incroci a cui si arriva partendo da A e attraversando un solo incrocio, e così via, aumentanto ad ogni passo la profondità della ricerca. Questo tipo di ricerca prende il nome di ricerca in ampiezza. Funziona? Sicuro, prima o poi arriverete a destinazione. Tuttavia la domanda sorge spontanea: quanto poi?

Supponendo, come avviene spesso in realtà, che ad ogni incrocio si dipanino 3 strade (oltre a quella da cui siete venuti) se disgraziatamente la ragazza si trova a solo 10 incroci di distanza dovrete testare circa 59.049 incroci e un numero maggiore di strade. Un compito decisamente eccessivo anche per il più motivato.

Dobbiamo trovare un alternativa. Appare evidente che abbiamo bisogno di un informazione che ci permetta di scartare le strade che sicuramente non ci portano a destinazione. Chiamiamo quindi la ragazza e scopriamo che è una nerd d’alta categoria. Ella infatti vole metterci alla prova. Invece di dirci la strada ci promette solo di dirci la distanza in linea retta che separa ogni incrocio che vogliamo da lei. È sufficiente? Si, e non solo troviamo una strada che ci conduce da lei ma troviamo la migliore.

LA RICERCA GOLOSA

La prima soluzione che ci viene in mente è semplice: fra tutti gli incroci che posso raggiungere da A scelgo quello che è più vicino alla ragazza e così via per ogni incrocio su cui vado a finire. Questo tipo di ricerca (che prende il nome di ricerca golosa) è sicuramente migliore della ricerca in ampiezza tuttavia ha due grossi problemi: non trova la strada più breve e, nel caso di grafo con cicli, può finire per ciclare all’infinito.

LA RICERCA A*

Scegliamo questa strategia: assegno a tutti gli incroci che posso raggiungere dall’incrocio in cui sono un numero N corrispondente alla somma della strada percorsa fino a quel punto più la distanza in linea retta che separa quell’incrocio dalla ragazza. A questo punto scelgo l’incrocio che ha il numero N più basso fra quelli che ho assegnato fin’ora. Questa ricerca prende il nome di A* ed è l’algoritmo di ricerca più efficiente  su un grafo pesato (come ad esempio una mappa stradale).

I punti a favore di A* sono fondamentalmente due: l’efficienza computazionale e il fatto che, in alcune condizioni, il percorso trovato è ottimo.

EURISTICHE AMMISSIBILI

Ma quali sono queste condizioni? Torniamo all’informazione che ci forniva la ragazza: la distanza in linea retta di ogni incrocio da lei. Questa prende il nome di funzione euristica. In parole povere è una funzione che esprime una stima della “distanza” dall’obiettivo. Bene, affinché la ricerca di A* sia ottima è necessario che la funzione euristica non sovrastimi mai la distanza reale dall’obiettivo! Quando questa condizione è soddisfatti si dice che la funzione euristica è ammissibile.

Nel nostro caso la funzione euristica soddisfa questa condizione in quanto la distanza in linea retta fra un incrocio e la ragazza non può mai essere maggiore della distanza reale (per definizione la retta è la distanza più breve fra due punti). La funzione è quindi ammissibile soluzione che troveremo sarà quindi ottima.

La non ammissibilità di una funzione non è però un limite stringente, spesso infatti trovare una funzione euristica ammissibile necessita di un quantitativo di calcoli troppo elevato che vanificherebbe i vantaggi di A*. In questi casi si può scegliere di usare una funzione non ammissibile ma di facile calcolo a patto di accontentarsi di una soluzione che potrebbe non essere ottimale.

Abbiamo imparato tanto in questa uscita. La ragazza al nostro arrivo sarà sicuramente soddisfatta.

 

Nella quasi totalità dei libri informatici e dei testi introduttivi ai calcolatori elettronici il computer, e in particolare la CPU, viene descritta come un dispositivo analogo al cervello umano, in grado di elaborare e memorizzare dati allo stesso modo in cui il cervello umano elabora e memorizza gli stimoli esterni.

Questa analogia è ottima per dare l’idea di cosa sia un computer ma se scendiamo nei dettagli ci rendiamo conto che il paragone è tutt’altro che preciso. L’architettura del cervello umano e quella di una CPU sono completamente differenti: la prima è estremamente parallelizzata mentre la seconda è praticamente seriale.

Nel cervello ogni cellula celebrale delle decine di miliardi di cellule nel cervello umano lavora quasi in completa autonomia, ogni zona del cervello lavora senza curarsi (o curandosene solo in casi specifici) di cosa fanno le altre zone e anche all’interno di un singolo settore possono svolgere micro-calcoli in contemporanea. Tuttavia le cellule umane sono estremamente lente con velocità dei segnali dell’ordine dei millisecondi.

Le CPU invece, anche nel migliore dei casi, non supera il numero delle 32/64 unità e quindi un grado di parallelizzazione di 32/64, insufficiente a dare un grande vantaggio prestazionale a qualsivoglia algoritmo. Tuttavia una CPU ha segnali che viaggiano quasi alla velocità della luce e il numero spaventoso di miliardi di operazioni al secondo.

È quindi ovvio che nel tentativo dell’ AI di replicare l’intelligenza umana subentrino difficoltà legate proprio alla differenza architetturale del sistema di origine e del sistema di destinazione. Si cerca infatti di replicare in modo efficiente algoritmi che funzionano bene su sistemi “paralleli” su dispositivi “seriali”. E la differenza può essere notevole! È infatti noto che modelli di calcolo equipotenti (come lo sono Cervello e CPU) non sono equivalenti quando subentra il fattore “spazio” e l’ancor più importante fattore “tempo”.

Algoritmi risolvibili in tempo esponenziale su un sistema possono essere risolti in tempo polinomiale su altre architetture e viceversa. Ad esempio la ricerca su un grafo, che viene eseguita scandendo progressivamente ogni singolo nodo, può essere notevolmente migliorata nel caso in cui vengano esplorati decine di milioni di nodi in contemporanea.

Quindi, al di là dei progressi teorici e algoritmici che da qui ai prossimi anni coinvolgeranno l’AI, ci sono progressi tecnologici che coinvolgono la struttura stessa dei calcolatori che potrebbero aprire nuove strade o riaprirne di vecchie (scartate perché poco efficienti su architetture tradizionali).

La creazione di un dispositivo che abbia un livello di parallelizzazione analogo a quello di un cervello umano ma allo stesso tempo conservi la velocità di calcolo di un computer tradizionale sembra ancora al di là delle possibilità tecnologiche umane, ma potrebbe essere un buon punto in cui concentrare la ricerca nel prossimo futuro. Magari sfruttando le nuove scoperte di computer quantistici e di spintronica.

 

Correva l’anno 1950, il mondo si risvegliava dagli anni della Seconda Guerra Mondiale con la voglia di lasciarsi alle spalle gli orrori del totalitarismo. Era l’anno in cui nasceva Charlie Brown, l’anno in cui a Roma veniva firmata la “Convenzione europea per la salvaguardia dei diritti dell’uomo”, l’anno del primo super computer britannico (il Pilot ACE). Lo stesso anno però è noto a chi si interessa di AI soprattutto per l’articolo di un giovane Alan Turing sulla rivista Mind (che potete leggere qui http://loebner.net/Prizef/TuringArticle.html ).

In quell’articolo Turing presentava per la prima volta il Test di Turing spinto da una domanda fondamentale ma allo stesso tempo quasi rivoluzionaria: può una macchina pensare? E se si come si può verificare questa capacità?

La domanda in realtà ne racchiude molte altre, prima fra le quali: che cosa si intende per macchina? Anche l’uomo è una macchina, costruita di aminoacidi e filamenti di carbonio, ma pur sempre una costruzione chimica. In questo caso la domanda ha una risposta semplice: si, le macchine possono pensare e la prova è la nostra stessa esistenza unita ad una volontà di non entrare troppo nei dettagli. Come lo stesso Turing scriveva rifacendosi al Cogito Ergo Sum di Cartesio:

Secondo la forma più estrema di questa opinione, il solo modo per cui si potrebbe essere sicuri che una macchina pensa è quello di essere la macchina stessa e sentire se si stesse pensando. [...] Allo stesso modo, la sola via per sapere che un uomo pensa è quello di essere quell’uomo in particolare. [...] Probabilmente A crederà “A pensa, mentre B no”, mentre per B è l’esatto opposto “B pensa, ma A no”. Invece di discutere in continuazione su questo punto, è normale attenersi alla educata convenzione che ognuno pensi.

Ma limitandoci al caso di macchine artificiali ed escludendo i casi troppo filosofici, esiste un metodo che ci permetta di dire, con buona approssimazione, che una macchina è dotata di pensiero?

Per rispondere a questa domanda Turing nell’articolo presenta una sorta di gioco. Ci sono tre partecipanti: un uomo A, una donna B e una terza persona C. C è separato dagli altri due concorrenti e può interagire con loro solo tramite una console. Lo scopo di C è di individuare chi fra A e B sia un uomo e una donna. Allo stesso modo A deve cercare di ingannare C mentre B deve cercare di aiutarlo.

Il test consiste nel sostituire A con una macchina: se la percentuale di volte in cui C indovina con A-Uomo è simile a quella con A-Macchina allora la macchina è in grado di pensare perché è indistinguibile da un essere umano.

Il Test di Turing nel corso degli anni è stato però più volte riformulato. Infatti molti programmi chiaramente non pensanti (come ELIZA) riuscirono a superare i criteri del test che fu quindi reso più complesso anche alla luce dei nuovi problemi che affiorarono durante l’esplorazione dei confini dell’AI. Celebre è ad esempio il problema delle stanze cinesi proposto da  John Searle nel 1980 di cui forse parleremo in futuro.

Tuttavia, anche se ormai il Test di Turing è stato praticamente stravolto e non considerato un test totalmente affidabile, la data di pubblicazione di quell’articolo viene considerata la data di nascita dell’AI moderna. Questo perché Turing ebbe l’audacia di porre la domanda fondamentale e allo stesso tempo di proporre un sogno: applicare l’informatica a problemi strettamente collegati all’intelligenza umana fino al punto di riuscire a replicarla.

Due anni più tardi Turing venne arrestato con l’accusa di essere omosessuale. Un periodo di prigionia a accuse che lo segnò profondamente portandolo, il 7 giugno del 1954, a uccidersi a soli 42 anni dando un morso ad una mela avvelenata con del cianuro di potassio. Bisogna aspettare il 2009 per veder riconoscere dal governo inglese il “grave atto di discriminazione omofobica” a cui Turing era stato sottoposto e a chiedere scusa.

Una delle menti informatiche più rivoluzionarie dell’informatica del ‘900 muore fagocitato dall’ignoranza del suo governo. Strappato al sogno di veder realizzate le macchine che da li a pochi anni avrebbero cominciato a sfidare il suo Test. Quelle stesse macchine che lui sperava, un giorno, sarebbero diventate intelligenti come l’uomo. Forse addirittura più intelligenti di coloro che l’avevano ucciso.

 

Che cos’è l’apprendimento? La domanda apre orizzonti molto complessi molti dei quali sono attualmente “zona di confine” e oggetto di numerose ricerche. Tuttavia possiamo iniziare a capire l’essenza intima dell’apprendimento tramite un piccolo gioco.

Supponiamo che ci vengano restituiti in modo casuale dei punti su di un piano cartesiano. Per ogni punto ci viene inoltre detto se si trova all’interno o all’esterno di un rettangolo disegnato sullo stesso piano ma di cui non conosciamo dimensione e posizione. Il gioco consiste nel tracciare il rettangolo che più si avvicina al rettangolo da indovinare con il minor numero di indizi. Nella figura seguente consideriamo i punti esterni come cerchietti bianchi e i punti interni come puntini neri.

Per questioni di semplicità consideriamo il rettangolo da cercare con i lati paralleli alle assi del piano cartesiano.

Una regola di ragionamento molto severa che possiamo applicare al seguente problema può essere la seguente. Ad ogni punto che ci viene dato consideriamo solo quelli interni, dopodiché tracciamo il più piccolo rettangolo allineato che contiene tutti i punti interni. Questo può essere fatto velocemente prendendo la massima (e la minima) coordinata X e la massima (e la minima) coordinata Y dell’insieme dei punti esterni. Questi 4 valori corrispondono alle posizioni dei segmenti che compongono il rettangolo.

Questo metodo ci fornisce subito un vantaggio. Il rettangolo che tracceremo sarà sempre interno al rettangolo reale, sarà sempre un approssimazione per difetto del rettangolo originale. Un sistema automatico così progettato apprenderà la forma e la posizione del rettangolo in modo autonomo basandosi solamente sull’input.

Come può questo esempio farci capire qualcosa sull’apprendimento? Se prendiamo l’esempio così com’è probabilmente nulla, ma se proviamo a sostituire l’asse delle X con “altezza” e quella delle Y con “peso” possiamo subito intuire che il rettangolo T potrebbe essere, ad esempio, l’insieme delle persone con peso-forma ideale. Un sistema che prova ad indovinare il rettangolo esatto tramite i vari indizi nel modo appena descritto apprenderà la classe “persone con peso forma ideale”.

Possiamo quindi iniziare a dare delle definizioni formali degli elementi che abbiamo presentato.

Il piano cartesiano prende il nome di contesto o spazio delle istanze. Nel caso generico tale spazio non è detto sia infinito ma potrebbe essere a sua volta un insieme di punti (ad esempio, nel caso del peso-forma, possiamo escludere i pesi superiori a 400 e inferiori allo 0, idem per le altezze ottenendo un contesto di forma rettangolare). Un contesto può anche avere dimensioni superiori alle due del piano, anzi, questo è solitamente il caso più frequente in quanto i vettori di parametri in ingresso spesso sono molto grandi.

Un concetto c nel contesto X rappresenta un qualunque sotto-insieme di X. Nel nostro caso tale concetto era rappresentato dal rettangolo T. In esempi alternativi un concetto potrebbe essere “tutte le matrici di pixel che rappresentano la lettera A” oppure “gli animali simili ad un gatto”. I concetti non è detto che siano rettangoli ma possono avere una forma qualsiasi all’interno del contesto. Una classe di concetti rappresenta un insieme di concetti nel contesto che definiscono una proprietà del concetto stesso. Nel nostro esempio una classe può essere “tutti i rettangoli allineati agli assi” in modo tale da escludere qualunque altra forma rettangolare e non allineata.

Infine ci sono due concetti importanti: il concetto obiettivo e il concetto ipotetico che nel nostro disegno sono rispettivamente T e T’. Il concetto obiettivo è la rappresentazione ideale di ciò che cerchiamo di apprendere mentre il concetto ipotetico è la versione nella nostra mente, o in quella di un calcolatore, ed è quella su cui basiamo le nostre decisioni.

Tutti questi elementi sono sufficienti a descrivere il processo dell’apprendimento nella sua interezza, sia esso di un uomo o di un automa. Gran parte dell’apprendimento, anche nel caso umano, ricalca queste definizioni. Fin da bambini infatti l’apprendimento consiste, almeno nella sua essenza, nel suddividere e associare i vari elementi del mondo reale (che possono essere oggetti fisici, emozioni oppure azioni e/o gruppi di azioni) all’interno di classi. Impariamo così a distinguere un gatto da una sedia, un’auto da una moto, un gesto utile da uno inutile e così via. La complicazione maggiore nel caso reale consiste nel vastissimo numero di parametri che vengono utilizzati per effettuare queste suddivisioni: forma, colore, odore, tipo di movimento, calore, periodo del giorno in cui l’oggetto appare, stato emotivo e molto altro. Senza parlare del fatto che molti parametri sono ancora poco quantificabili (vedasi il concetto di forma), oppure altri derivano a loro volta da classificazioni primitive (moto e auto si differenziano dal numero di ruote, ma cosa distingue una ruota da copertone poggiato ad un edicola?). E il tutto deve essere fatto in un tempo sufficientemente breve da essere “real-time” o quasi.

Inoltre il processo di aggiornamento di un concetto (apprendimento) è eseguito fondamentalmente in due modi: per rafforzamento e per emulazione.

L’apprendimento per rafforzamento è esattamente quello che succede nel gioco del rettangolo. Un essere umano (o una macchina) ricevono vettori di input e uno stimolo (che rappresenta la correttezza o la scorrettezza di un associazione). Se un bambino guarda l’acqua riceve in ingresso una nuvola di dati, se la sua classificazione è errata (ad esempio dice “pane” ma indicando l’acqua) la madre subito corregge dicendo “acqua” inviando un segnale demolitore (cerchio esterno), in caso contrario la madre sorriderà e porgerà l’acqua inviando un segnale rafforzatore (cerchio interno).

L’apprendimento per emulazione/induzione consiste invece nell’aggiornamento immediato del nostro “rettangolo” basandoci su quello di un altro. Tale procedimento non necessita necessariamente di prove concrete e segnali personali ma adattamenti basati su “quello che ci mostra un altro”. Ad esempio nessuno è andato mai a controllare che sulla Luna non ci sia aria personalmente eppure il nostro “rettangolo” delle “luoghi senza aria” comprende sicuramente la Luna. Ma essendo questo un comportamento quasi esclusivamente umano (gli animali non apprendono mai per emulazione) non mi dilungherò su esso.

Un altro punto fondamentale consiste nel fattore di sfumatura del contorno. Non sempre i concetti o le classi sono delimitate nettamente da un contorno, molto più spesso tale confine è sfumato. Qual è, ad esempio, la zona di confine che delimita la classe delle sedie da quella degli sgabelli? Qual è la linea di demarcazione fra calvi e non calvi? Tutte queste domande hanno una soluzione ovvia soltanto per punti molto interni o molto esterni al “confine”. Per punti prossimi allo stesso la situazione è più complicata, ci troviamo in una zona in cui si passa gradualmente da un concetto ad un altro o addirittura sono equiprobabili. Inoltre non potremmo nemmeno utilizzare segnali tanto chiari come “dentro” e “fuori” perché per i punti sul confine dovremmo quantificare quanto sia dentro e quanto sia fuori.

Il problema è che effettuare ragionamenti automatici con questo genere di insiemi è ancora pesantemente oggetto di studio. Non esiste, infatti, nessuna versione “probabilistica” o “fuzzy” della logica del primo ordine e successive, aree di logica strettamente collegate ai concetti di cui abbiamo appena parlato. La discussione su questo quindi può essere solo che rinviata alle prossime scoperte (al più presto speriamo).

La cosa importante però è che aggiungere un tale comportamento darebbe agli “automi” un comportamento molto umano: il dubbio. Il dubbio e l’incertezza umana è proprio data dal nostro percorre queste zone di confine che in concetti reali sono molte più di quelle che si riescano a valutare negli asettici laboratori di intelligenza artificiale.

Il dubbio è però anche quella cosa che ci spinge a cercare ulteriori informazioni per poter ridisegnare il nostro “rettangolo” in modo più preciso. Cartesio diceva: “Dubito ergo cogito ergo sum”. Chissà che presto non siano anche gli automi a dubitare e quindi a “essere” qualcosa di più.

 

Il 10 febbraio 1996 il computer Deep Blue batte per la prima volta il campione del mondo di scacchi Garry Kasparov. L’incontro finì comunque a favore del maestro russo per 4 a 2.

L’11 maggio dell’anno successivo tuttavia Deep Blue è stato in grado di aggiudicarsi la rivincita battendo Kasparov per 3.5 a 2.5. La data è da sempre citata come una delle tappe fondamentali dell’AI eppure spesso tale evento viene citato per lo più a sproposito.

Innanzitutto bisogna valutare se possiamo aggiudicare la vittoria alla mente del pc oppure semplicemente alla sua incredibile capacità di calcolare fino a 100 milioni di posizioni al secondo. Quest’ultima caratteristica è un capolavoro dell’ingegneria, dell’elettronica e dell’algoritmica ma mi terrei molto cauto a definirlo un capolavoro dell’AI.

Che gli algoritmi che analizzano ed esplorano i nodi dello spazio di ricerca di un problema assumano un ruolo fondamentale per molti aspetti dell’AI è fuori discussione. Ma essi sono una parte della disciplina, non la sua totalità.

Oltre a tutto questo anche le modalità della vittoria lasciano a desiderare. Il computer era situato a chilometri di distanza e i tecnici della IBM erano autorizzati a modificare il programma fra una partita e l’altra. Cosa che fecero per adattare manualmente il programma al gioco di Kasparov per evitare che cadesse nelle trappole sferrate dal russo e in cui Deep blue cadde per ben due volte.

IBM ritirò frettolosamente Deep blue dalle competizioni senza chiarire molti dei fatti sopracitati. Ma l’assedio al campione del mondo di scacchi non finì con Deep Blue ma proseguì ancora per anni. Ad esempio il motore scacchistico Fritz in una serie di quattro partite fra l’11 e il 18 novembre riuscì a strappare due pareggi e due sconfitte.

La mente umana quindi rimane ancora la cosa più elegante che popola il nostro sistema solare e trovo estremamente riduttivo dare del “più bravo” ad un entità in grado solamente di elaborare dati molto velocemente.

Il cervello umano è ancora insostituibile, ad esempio per inventare modi originali per avvantaggiare programmi per pc nelle sfide con i campioni di scacchi. La ricerca deve andare nella direzione dell’eleganza piuttosto che nella direzione dell’efficienza e del calcolo puro.

Perché forse la creatività è proprio il tentativo del nostro cervello di compensare la nostra inefficienza.

© 2008-2012 SlashCode Suffusion theme by Sayontan Sinha