Alberi decisionali in 20q

Probabilmente fra tutti gli esempi di applicazioni dell’Intelligenza Artificiale la più semplice e famosa consiste sicuramente nel gioco 20q. Il gioco in questione funziona così: il giocatore pensa ad un oggetto o ad un animale e il marchingegno tenta di indovinare di cosa si tratta in meno di 20 domande a cui il giocatore può rispondere si o no. Potete trovare una versione online del gioco all’indirizzo http://www.20q.net/. Potrete constatare che in alcuni casi il programma sembra proprio leggervi nella mente con risultati quasi spaventosi.

La versione usata dal sito è piuttosto avanzata ed utilizza le reti neurali e permette quindi una gamma di riposte più vasto (c’è anche forse, probabilmente, a volte, ecc…). Il programma è inoltre in grado di apprendere mentre si gioca: ogni qual volta si gioca, o il programma si arrende richiedendo di inserire l’oggetto a cui si pensava, l’insieme di risposte appena date plasma la struttura dati interna del programma in modo tale che la prossima volta l’oggetto venga riconosciuto più velocemente. È un modello di apprendimento molto basilare ma che è analogo a quello umano percezione-previsione-modifica: il programma riceve dati percettivi (le risposte alle domande), formula un ipotesi (i tentativi di indovinare) e modifica la struttura dati in base all’esito della previsione.

Sarei curioso di sapere se il programma del sito ha qualche contromisura contro il problema del sovra-adattamento: questo tipo di problema affligge gran parte dei modelli decisionali, comprese le reti neurali, ed è causato da un eccessivo adattamento della rete a certi tipi di dati piuttosto che ad altri. Facciamo un esempio. Nel gioco 20q è molto più probabile che il giocatore pensi a cose “banali” come “gatto”, “cane”, “fiore” e simili piuttosto che a “antilope”, “spinterogeno” e “neutrino”. Questo significa che nel corso dell’esistenza del gioco il programma verrà addestrato alla perfezione a riconoscere cani e gatti mentre riceverà poche informazioni riguardo antilopi e neutrini. Possiamo quindi dire che “gatto” e “fiore” e le parole comuni facciano parte dell’insieme di addestramento di una rete. Bene, è possibile dimostrare che una rete sovra-adattata al suo insieme di addestramento indovina, in media, molto meno volte oggetti che non appartengono a tale insieme rispetto ad una rete che è solo parzialmente adattata.

Rimandiamo però questi approfondimenti sulle reti neurali. Il motivo per cui ho scritto questo articolo era di mostrare come sia possibile in una manciata di righe scrivere un programma che emuli in modo semplice il gioco di 20q. Per questa approssimazione consideriamo che sia possibile dare alle domande soltanto le risposte si o no.

Il metodo che vi mostrerò non utilizza nessuna tecnica propria dell’IA bensì dei semplicissimi alberi binari. Questi alberi binari li indicheremo come alberi decisionali binari. Nel nostro albero decisionale definaiamo:

  • I nodi interni dell’albero sono domande.
  • I nodi foglia dell’albero sono gli oggetti da indovinare.
  • Il sotto-albero destro di un nodo corrisponde al caso in cui la risposta alla domanda sia si.
  • Il sotto-albero sinistro di un nodo corrisponde al caso in cui la risposta alla domanda sia no.

L’algoritmo del gioco consiste in una cosa del tipo:

  • Il programma formula la prima domanda che trova (cominciando con il nodo radice).
  • Se non c’è più nessuna domanda il programma si arrende e chiede al giocatore di inserire 1) l’oggetto a cui stava pensando. 2) una domanda che rappresenta l’oggetto 3) la risposta a questa domanda.
  • Il programma aggiunge questa domanda e la relativa risposta al sotto albero in cui si era fermato (oppure come nodo radice se l’albero era vuoto).
  • Se invece la domanda c’è il programma formula la domanda e scende nel sotto-albero relativo alla risposta.
  • Il programma ricomincia dal punto 1.

Tutto qui. Tale algoritmo è effettivamente molto grezzo e sono possibili un gran numero di migliorie (ad esempio usare dei modelli di albero più “elastici” per evitare alberi troppo sbilanciati) ma svolge decentemente il proprio lavoro. Dopo che l’avete fatto girare per qualche tempo vedrete che inizierà ad imparare e ad indovinare un discreto numero di parole. Ovviamente potete partire da un albero vuoto oppure pre-costruire un albero di base con alcune domande comuni.

Un altra cosa che può farci capire questo semplice programma è una considerazione che mi ha fatto notare un gentile commentatore: la capacità degli algoritmi di AI non dipende dalla dimensione del programma ovvero dal suo numero di righe di codice allo stesso modo di come le capacità celebrali umane non dipendono dalla dimensione del cervello (una balena ha il cervello molto più voluminoso di un essere umano eppure fa molte meno cose). Le capacità cognitive di un programma dipendono solamente dalle relazioni che si auto-generano fra le strutture dati del programma (nel nostro caso tali relazioni sono i collegamenti ad albero fra i nodi).

Se qualcuno avesse voglia di creare questo programmino usando il minor numero di righe possibili sarei felice di pubblicarlo. Inoltre potreste anche usarlo per sbalordire amici, parenti e vicini di casa! XD

Alla prossima!

8 comments on “Alberi decisionali in 20q

  1. Inutile dire che mi hai fatto venire una grandissima curiosità. Se ti è possibile, potresti pubblicare algoritmi o pseudo-algoritmi, a titolo d’esempio, e dilungarti un po di più su questo argomento?
    Ho provato il programma, e sono rimasto decisamente sorpreso.

    • Riguardo ai programmi li sto facendo. Non sono una mia priorità comunque sto facendo programmi che riguardano sia gli alberi decisionali che il calcolo dell’entropia. Quel programma può essere replicato, nella sua forma base, in modo molto semplice. Appena ho un po’ di tempo scrivo qualcosa. 🙂

  2. Una considerazione che mi viene da fare, prendendo in considerazione anche il sito da te segnalato, è se un AI può, sotto un “cattivo” allenamento, dare poi con più probabilità risultati sbagliati. È un po’ il discorso di sovra-adattamento che hai fatto te volendo.
    Mi spiego meglio (e prendo come riferimento quel sito): visto che l’AI apprende ogni volta che si gioca ed in base alle risposte che si danno alle domande, se fornisco di proposito risposte completamente sbagliate, l’AI tenderà col tempo a “prenderci” di meno o è possibile fare in modo che al di la della quantità di informazioni sbagliate (magari anche superiori a quelle giuste), riesc a fornire comunque la risposta esatta con la stessa precisione (o quasi)? Che possa riconoscere la risposte giusta anche traendolo in inganno con un “cattivo” allenamento?

    • Il concetto di giusto o sbagliato deve arrivare da qualcosa. 🙂 Se io ti dico “grog”. Tu come fai a indovinare e a capire se hai pensato la cosa giusta senza nessuno che ti informi se hai indovinato oppure no? 🙂 Io potrei dirti che il “grog” ha due ruote ed è rosso. Tu crederesti a questa cosa. E invece il grog è una bevanda. E tu non lo sapresti mai (almeno fino a quando non riceverai un “input” che ti fa capire che il grog non è quello che pensavi te).

  3. Infatti io chiedevo. Poi hai semplificato un po’ troppo il mio discorso 😀 in pratica la realtà è che siamo ancora molto lontani da una vera AI. Chiedevo comunque se ci fosse un modo per “intuire” la risposta giusta nonostante l’inganno. Infatti io non parlavo di avere solo info errate, ma avendole entrambe, se è possibile mantenere le stesse possibilità di riuscita rispetto a quando si hanno solo info giuste. E tutto ciò anche nel caso in cui se ne hanno più sbagliate di buone.
    Per fare un’analogia con l’essere umano, mettiamo che ti viene insegnato che non sia giusto uccidere un altro uomo, poi ti viene insegnato pesantemente che è giusto uccidere un uomo. Trovandoti di fronte ad una scelta, puoi scegliere tranquillamente di non uccidere un uomo (anche se magari ti son state date in input più info sul fatto che sia giusto uccidere). Prendi ovviamente questo accostamento con le pinze visto che nell’essere umano entrno in gioco altri fattori.

    • Questo meccanismo è attuato anche in pratica. Ovviamente non basta un esempio “sbagliato” per far “confondere” la macchina. Inoltre, in casi veri (e non questo gioco), ci sono fonti privilegiate rispetto ad un altra: ad esempio, se te sei in dubbio su una cosa troverai più attendibile la definizione di un enciclopedia rispetto a quella del pensionato al bar. 😉 Anche in IA, nelle macchine che apprendono per rinforzo, ci sono fonti “privilegiate” rispetto ad altre (più test autonomi fatti dalla macchina stessa per verificare le sue conoscenze).

      Se era questo che intendevi allora è giusto. 🙂 Però ricorda che il concetto di giusto e sbagliato esistono solo nel momento in cui c’è qualcuno o qualcosa che ti dica “è giusto” o “è sbagliato”. Devi fidarti. 😉

  4. Ecco, ora ci siamo 😉 allora è possibile fare in modo che l’AI non si faccia “ingannare” diciamo. Visto che posso immaginare come fare (concettualmente), ma in pratica (matematicamente, graficamente con automi o altro che sia) non riesco a vedere la cosa in modo così chiaro, ti dispiacerebbe magari, se hai tempo, voglia e capacità, affrontare la cosa?

    Sulla tua ultima considerazione, ovviamente si, o almeno all’inizio, poi un AI potrebbe essere in grado di decidere da se. AI che si “istruiscono” da se fin da subito, se mai fosse possibile, direi che ad oggi è un miraggio la cosa 😀