Intelligenze Artificiali e dintorni 2 (parte 2)
APPROFONDIMENTI TEORICI
Definiamo l'errore della rete in funzione del quadrato della differenza tra l'output attuale e quello desiderato per tutti i pattern che devono essere appresi.
Il coefficiente "1/2" non altera la sostanza della formula ma presenta il vantaggio di semplificare alcuni calcoli successivi (*). Il valore di attivazione di ciascun nodo j al pattern p consiste nella somma pesata con w dei precedenti output o.
A sua volta ciascun output è dato dalla funzione di soglia f, nella fattispecie una sigmoide, applicata alla somma pesata.
Considerando il rapporto tra E e w possiamo scrivere
e soffermandoci sul secondo fattore evidenziamo che
Indicando
diventa.
Inoltre si può scrivere
ed essendo il secondo fattore Df(x)/Dx esso equivale a.
Considerando poi il primo fattore, e calcolando la derivata di E rispetto ad o, otteniamo.
Perciò, rimoltiplicando i fattori otteniamo.
Questo risultato presuppone che siano direttamente valutabili il target t e l'output o, e la sua validità è limitata al solo livello di output. Per i livelli intermedi consideriamo nuovamente il primo dei fattori in cui era stato scomposto g e notiamo che;
rimoltiplicando ancora i fattori abbiamo infine.
Questa equazione rappresenta la variazione dell'errore in relazione ai pesi della rete, e fornisce un criterio per ridurre tale errore. A questo punto non resta che calcolare la derivata di f(net).
Autore: Sconosciuto (da me ovvio..;D)
Altre informazioni sull’argomento (Reti Neurali) potete trovarle un po’ ovunque nella rete...date cmq un’occhiata a questo URL
http://lbalzerani.supereva.it/ia/backpropagation.html
Dovrebbe risultare un po’ più semplice...almeno lo spero ;D
Ed ora un esempio pratico...
Un emulatore ad apprendimento dinamico di personalità virtuale
ELECTRA
di Gianluigi Davassi
Gigy@freemail.it
"algoritmo è tutto e soltanto ciò che può essere elaborato con un’opportuna Macchina di Turing"
Alan Turing
Electra è essenzialmente un’entità informatica che può essere definita come un esperimento di "Personalità virtuale". Che cosa è una personalità virtuale? Nient’altro che un emulatore, a livello umano, di conversazione.
In chiave più implicita (e meno sfarzosa) posso definire Elettra semplicemente come un software che imita in tutto e per tutto il modello della conversazione umana attraverso pochi (ma complicati) algoritmi.
In maniera più fantasiosa (definire Electra un software può sembrare alquanto riduttivo per chi ha molta immaginazione) è possibile, seppur azzardatamente, definire Electra come una Intelligenza artificiale, ma personalmente aborrisco questa definizione sia perché la suddetta "Intelligenza" non esiste, sia perché Electra è esente da qualsiasi facoltà di ragionamento autonomo (almeno al livello attuale)
Electra è un software da me sviluppato, scritto in Visual Basic 6.0 dedicato hai sistemi operativi Windows 9x. Le funzionalità di questo programma sono molteplici…teoricamente illimitate, la difficoltà sta proprio nell’implementare queste funzionalità, ma è una difficoltà che si può facilmente aggirare, come spiegherò più avanti.
Dunque: principalmente Electra (il nome della personalità virtuale) ha il compito di rispondere a qualsiasi domanda che le venga posta, sia attraverso la tastiera sia attraverso la voce, in quest'ultimo caso ho implementato delle librerie dinamiche per il riconoscimento vocale nel software del ViaVoice1.4 SDK sviluppato e rilasciato da IBM
La struttura portante del programma è questa: dopo che è stata posta una domanda (o affermazione) scritta o detta a voce, questa viene spedita tramite algoritmi (di mia creazione) a controlli sintattici e che ne stabiliscono la composizione e successivamente ripartiscono i criteri di ricerca che sono necessari per l'individuazione della risposta, presente nei database di Electra.
il sistema di ricerca funziona questo modo:
'inizio dichiarazione variabili
Dim w() As String 'array per le parole
Dim w2() As String 'array temp per le frasi
Sub cerca()
Dim x As Integer
Dim ric As String
Dim sPy As Integer
sPy = 0
'inizio ricerca
‘elimino le possibili parole di lunghezza inferiore hai 2 caratteri e tolgo anche i pronomi impersonali…
For k = 1 To UBound(w())
If w(k) "" And w(k) " " And Len(w(k)) > 2 And w(k) "una" And w(k) "uno" And w(k) "un'" And w(k) "che" Then
For i = 1 To UBound(w2())
TextBox2.Text = w2(i)
x = TextBox2.Find(w(k), 0, , 2) ‘Cerca nel database la parola w(k)
If x = -1 Then w2(i) = "%not%"
Next
End If
Next
'evitiamo le ripetizioni inutili...
For k = 1 To UBound(w2())
ric = w2(k)
For i = 1 To UBound(w2())
If k i And ric = w2(i) Then w2(i) = "%not%"
Next
Next
For i = 1 To UBound(w2()) ' e mettiamo il tutto nella textbox3
If w2(i) "%not%" And w2(i) "" And w2(i) " " Then
TextBox3.Text = TextBox3.Text + w2(i) + vbCrLf
End If
Next i
'ma evitiamo di dire TROPPO!
For i = 1 To UBound(w2())
If w2(i) "%not%" And w2(i) "" And w2(i) " " Then
sPy = sPy + 1
End If
Next i
If sPy < 2 Then
If TextBox3.Text "" And TextBox3.Text " " Then
uscita TextBox3.Text
Else
'uscita "risposta non definita"
Call ri_cerca
If guess = True And RiCerca = False Then uscita "non lo so..." & vbCrLf
End If
Else
InDef = True
If RiCerca = False Then uscita w(UBound(w())) & " cosa?" + vbCrLf
End If
TextBox3.Text = ""
TextBox2.FileName = App.Path & "\matrix.txt"
'guess = False: RiCerca = False
End Sub
Esempio
Domanda in entrata :
Dove è nato il Manzoni?
Vengono incluse in un array w(i) le parole "dove", "nato", "Manzoni". Successivamente per queste tre parole vengono ricercate all'interno del database che riporterà in un'altro array tutte le risposte contenenti queste parole.
E successivamente l’insieme S viene frazionato e trasformato in un insieme S’ contenente tutte le frasi nel quale la parola "dove" è effettivamente presente:
e così per tutte le altre parole …
Da questa parte il collegamento diretto verso la risposta (che è presente nello stesso database, proprio accanto alla domanda) che viene visualizzata sullo schermo, oppure "letta" (sempre attraverso le routine del ViaVoice) verso utente.
In tal modo vengono eliminate le frasi superflue e l'ultima frase rimasta viene visualizzata. Se la risposta non c'è ovvero non compare nel database, allora Electra chiama la funzione di apprendimento.
C’è un problema però! E se le domande fossero 2 nello stesso momento? Ad esempio e se chiedessero ad electra "Ciao chi sei? Da dove vieni?"
Se il programma andasse a cercare tutte le parole contenute in una "stringa" di non le troverebbe MAI tutte insieme ma bensì troverebbe:
[ciao]
[chi sei]
[da dove vieni]
Ma poiché nel metodo sopra descritto la frase scelta è una soltanto e gli insiemi vengono selezionati per successivi "inscatolamenti" parola per parola, c’è il rischio che il programma o vada tranquillamente in loop, o che non fornisca all’utente alcuna frase. In questo caso bisogna impartire dei criteri di ricerca ben più sottili e raffinati. Personalmente ho risolto il problema in questo modo: metto tutto il contenuto dell’array contenente le parole della domanda posta a Electra in un array temporaneo con estensione uguale al primo, e ridimensiono questo con l’estensione minima, ovvero 1. Quindi il mio array conterrà solo la prima parola della domanda. Impartisco la funzione della ricerca per la prima parola e guardo il risultato. Se la parola è stata trovata solo una volta e in una sola "stringa" nel database, allora fornisco all’utente la risposta che segue la stringa; ridimensiono l’array a 1, e lo riempo con la seconda parola dell’array temporaneo e faccio partire d’accapo il ciclo. Se la parola è stata trovata più volte nel database allora imposto un Flag di ricerca che chiamo (e ritengo, per ovvie ragioni) indefinito. In questo caso allora ricomincio dall’ inizio ma ridimensiono l’array incrementandolo di un fattore 1, e in questo spazio così creato inserisco il contenuto dell’array temporaneo fino a quanto permette la nuova dimensione del medesimo. Rinizio la ricerca. Se (in questo caso) le due parole vengono trovate INSIEME una e una sola volta nel database dei criteri di ricerca allora li accetto, e fornisco all’utente la risposta collegata ad essi. In caso contrario aumento ancora l’estensione dell’array e ricomincio tutto d’accapo fino all’esaurimento delle parole.
Ma teoricamente il programma per gli usi destinato alla società ovvero come punto di riferimento per informazioni e consigli è concluso ovvero adesso è esattamente che risponde esattamente a ogni domanda chiedendosi spiegazioni quando ce ne è bisogno
Ma cosa dovremmo fare invece prendere èlectra più umana. 0vvero come rendere èlectra capace di dialogare con un anziano o un bambino è una persona di modo che possa sembrare un dialogo umano e possa dialogare più volta se affidando l'impressione di dialogare con la persona vera e propria? sfortunatamente non si può. Emulare tutti i processi mentali umani che sono infiniti nella maggior parte sconosciute è una cosa chiaramente impossibile. Però si possono implementare una quantità tale di funzioni (o processi) in modo tale da approssimare in maniera quasi impercettibile il ragionamento umano. Più funzioni mettiamo più la validità dei discorsi di Electra sul piano umano sia approssimo a quello di un vero ragionamento
Ma non sto parlando di teorie di pura fantasia: ho fatto un esperimento: ho realizzato un prototipo di Electra chiamato "Emily" (ampiamente scaricabile da internet a www.davassi.freeweb.org) e l’ho fatta "dialogare" con alcune persone inconsapevoli attraverso Irc e ciò mi ha dimostrato che Emily è riuscita almeno in un’occasione a sostenere un (corto) dialogo: questo sta a dimostrare che sebbene il numero di funzioni incrementato fosse effettivamente basso (circa 4 funzioni) e nonostante la quantità di risposte scarsissime (un centinaio di frasi) Emily è riuscita in questo caso a realizzare un dialogo intero compiuto…eccolo!
<Zorro> ciao, come va??
<Emily> >non lo so...
<Emily> >
<Zorro> nemmeno io mi ricordo
<Zorro> comunque che fa
<Zorro> vuoi parlare
<Emily> abbastanza allegra e contenta: mi piace parlare con altre persone
<Zorro> mi fa molto piacere
<Emily> non guardo molto spesso la televisione
<Zorro> e il circo??
<Emily> che cavolo stai facendo?
<Emily> e il circo??
<Zorro> tu che dici
<Zorro> che c'entra la televisione
<Zorro> dai
<Zorro> da dove digiti
<Emily> non lo so...
<Zorro> da dove digiti
<Emily> digito da roma
<Zorro> io da Formia
<Zorro> sai dov'è
<Emily> non lo so...
<Zorro> sai dov'è?
<Emily> non lo so...
<Zorro> scusa Emily ma quanti anni hai
<Emily> Io ho 19 anni Sono nata in Italia il 7 marzo del 1980
<Emily> che cavolo stai facendo?
<Zorro> da madre italiana e padre francese
<Emily> mia madre Susy era norvegese
<Zorro> vedi
<Zorro> perchè era?
<Zorro> tu che fai nella vita
<Emily> mi prendi per i fondelli? allora tanti saluti
<Zorro> magari potessi
<Zorro> ma sto scherzando
<Zorro> non ti offendere
<Zorro> sei permalosa??
<Emily> *** ehm...zorro stavi parlando con un bot! (ora entro in scena io veramente)
<Emily> ehehe
<Emily> l'ho programmato io...
<Emily> :)
<Emily> non ti arrabbiare!
<Zorro> che cosa è un bot
<Emily> un ROBOT
<Zorro> ma non dire cazzate
<Emily> ?
<Zorro> e poi
<Zorro> l'ho fatto arrabbiare
<Emily> non ci credi?
<Emily> te lo spedisco se vuoi...:)
<Zorro> no
<Emily> eheheh
<Zorro> ora posiamo parlare
<Zorro> ti va
<Emily> ho l'hobby di programmare intelligenze artificiali
<Zorro> io non sono artificiale
<Double> capito? HAI PARLATO CON UN PROGRAMMA SCRITTO DA ME! cavolo!
<Zorro> eh?
questo comunque mostra che è l'intelletto umano al non essere affatto costante!
Oltre modo dato che è possibile fare assegnare ad una parola un significato preciso dobbiamo agire su un unico elemento che ci è permesso modificare e programmare a nostro piacimento…ovvero l'inerenza delle parole …ovviamente incrociando un po' le dita!
<!--
Due emulatori di IA, Elena ed Emily, sono scaricabili a questo indirizzo:
http://www.freeweb.org/software/Davassi/progetto.htm
Si possono trovare informazioni anche su Electra, ma quest’ultima non è a disposizione per il download (lo sviluppatore ha iniziato a sentire l’odore dei soldi;D).
-->
Conclusioni vere e proprie:
L’argomento è vasto, appassionante (almeno per me) e anche divertente dal punto di vista pratico...Questo articolo non ha la pretesa di dire tutto (anche perché sarebbe troooooppa roba;D), è solo una piccola base, un probabile trampolino di lancio per qualcosa di più mirato...quindi se volete che si tratti qualcosa di specifico io vi prometto il mio impegno...quindi non vi rimane altro che scrivermi ;DDD
Non me la sono sentita di parlare di etica perché ognuno ha le sue idee e se uno vuole avere un corpo robotico e non morire mai è una sua opinione quindi lascio libertà di pensiero...semmai, come ho già detto sopra, si potrebbe organizzare qualche IRCmeeting su sta roba o un ng...bo fate voi;D