Archivio

Archivio per la categoria ‘Ai & Neural’

Automi cellulari per generare numeri casuali

28.06.2011 2 commenti

Come avviene la generazione di numeri casuali? Con algoritmi pseudo-casuali, dove le sequenze sono molto lunghe ma finite. A volte si usano metodi legati al tempo corrente in millisecondi, ma anche tali sistemi possono produrre risultati ben poco casuali. Esistono automi cellulari in grado di generare sequenze realmente “rumorose”. In accordo con la teoria degli automi cellulari di Wolfram, ho scritto una classe Java in grado di generare sequenze di numeri indipendenti tra di loro.  La regola utilizzata è la #30.

Regola 30

La classe si inizializza con un vettore di 50 posizioni in cui tutti i valori sono a 0 tranne in una cella in cui metto 1. L’automa procede per 7 passi ed inizia a fornire numeri casuali. Ha dimostrato di essere molto efficiente rispetto al suo corrispettivo java.lang.Random.
L’idea non è mia, ma deriva dalla lettura del libro di S.Wolfram – “A new kind of science”.

Ecco il codice sorgente in java:

/**
 * Automa alla Wolfram x generare rumore
 */

public class Random {

    private final int SEED_RULE = 22; //30
    int seed;
    byte[] rule;
    byte[] data;
    protected static Random instance;

    public static void main(String[] args) {
	Random r = new Random();
	for (int i = 0; i < 1000; i++) {
	    r.nextFloat();
	    System.out.println(r.nextFloat());
	}
    }

    private Random() {
	super();
	seed = SEED_RULE;
	init();
    }

    static public Random getInstance() {
        if (instance == null) {
            instance = new Random();
        }
        return instance;
    }

    private void init() {
        //un buffer per i dati
        data = new byte[50];
	//init delle rules
	rule = new byte[8];
	int pad = 128;
	for (int i = 7; i >= 0; i--) {
	    if ((seed & pad) == pad) {
		rule[i] = 1;
	    }
	    pad = pad >> 1;
	}
	//init del livello
	java.util.Random r = new java.util.Random();
	int numSingolarita = r.nextInt(data.length-1);
	numSingolarita++; //almeno 1 singolarita
	for (int i = 0; i < numSingolarita; i++) {
    	    //posizione singolarita' nella schiera dati
   	    int pos = r.nextInt(data.length);
	    data[pos] = 1;
	}
	nextInt();
    }

    private int nextInt() {
        //ritorna un'intero casuale
	byte[] newdata = new byte[data.length];
	for (int i = 0; i < (data.length - 1); i++) {
	    int a = (i == 0 ? data[(data.length - 1)] : data[i-1]);
	    int b = data[i];
	    int c = (i == (data.length - 1) ? data[0] : data[i+1]);
	    int n = c+2*b+4*a;
	    newdata[i+1] = automa(n);
	}
        System.arraycopy(newdata, 0, data, 0, data.length);
        byte[] ret = new byte[32];
        System.arraycopy(data, 10, ret, 0, 32);
        long R = 0;
        for (int i = 0; i < ret.length; i++) {
 	    R += ret[i]*Math.pow(2, i);
	}

	/* per visualizzare i passaggi a console
        for (int i = 0; i < data.length; i++) {
	    System.out.print((data[i] == 0 ? ' ' : 'x'));
	}
	System.out.print(" " + R + "\n");
        */

        return (int)R;
    }

    public float nextFloat() {
        //torna un float casuale
	float ret = 0f;
	int n = nextInt();
	if ( n != 0 ) {
	    ret = (float) ((float)n / (float)(Integer.MAX_VALUE));
	}
	ret = Math.abs(ret);
        return ret;
    }

    private byte automa(int n) {
        return rule[n];
    }
}

Categories: Ai & Neural, java, tech Etichette: , , ,

La mappa mentale di Aeolian (2)

La mappa mentale di Aeolian

La stavo cercando disperatamente per la presentazione alla WhyMCA… ed ora ecco che mi spunta adesso tra le mani. Maledetta!

E’ disegnata su carta con penne colorate. Stavo cercando di trovare un senso nel progetto. Le mappe mentali aiutano anche ad orientarsi.

Categories: aeolian, Ai & Neural Etichette: , ,

Riconoscere le parole: Levenshtein e dintorni

Alessandro Graps mi ha chiesto consigli su come classificare il contenuto di un file excel, correggendo, se possibile gli errori in modo automatico. La sua idea iniziale era di utilizzare la logica  Fuzzy per correggere gli errori di battitura. A mio avviso delle reti neurali o delle semplici correlazioni avrebbero risolto il problema.
Con le reti neurali avrebbe dovuto, prima di tutto far apprendere alla sua rete le parole da riconoscere, ma queste non sono note a priori. Sarebbe necessaria quindi una rete in grado di apprendere in modo autonomo. Tra l’altro mi ritroverei delle reti molto grandi e un numero notevole di simboli catalogati.
Gli propongo di provare a calcolare la distanza tra le parole.

La prima parola ricevuta finisce in un archivio di simboli; la seconda parola viene confrontata con la prima e si calcola la distanza tra le due. Nel caso la distanza sia inferiore ad un numero prefissato, i due simboli si considerano uguali, altrimenti un nuovo simbolo è generato.
La distanza? si, in effetti è possibile calcolare la distanza tra parole. Tra l’altro proprio Alessandro ha postato recentemente sull’argomento. Io pensavo a qualcosa tipo la distanza di Hamming in uso nei codici numerici. In effetti esistono algoritmi specifici per il linguaggio naturale. L’algoritmo citato da Alessandro è quello che su Google propone le correzioni sui termini ricercati (la distanza di Levenshtein o distanza di edit ).
Quando il numero di simboli cresce, dovrò eseguire un grande numero di paragoni, calcolando di volta in volta la distanza tra le parole.

Distanza tra due punti senza alcun riferimento assoluto

In effetti non è molto prestante. Per migliorare potrei però calcolare la distanza tra ogni parola (anche la prima ricevuta) ed una parola neutra.

Calcolo la distanza di ogni parola da una parola campione P0

Vediamo un esempio.
Ricevo la prima parola: “abate” e ne calcolo la distanza con una parola campione per esempio: “aaaaa”.
Utilizzando la la distanza di Levenshtein ottengo: 3 [Si può verificare online!]
Salverò in una tabella sia la parola “abate” che la distanza calcolata.

parole
name distanza
3 abate
3 casa
4 mela
6 pattern

Quando riceverò la seconda parola: “abete”. Ne calcolo la distanza rispetto ad “aaaaa”: 4. Per verificare la vicinanza alle parole presenti nel sistema mi è sufficiente una query in cui filtro direttamente sulle distanze vicine a 4 (nell’intorno di 4).

select name, distanza from parole where  3 < distanza < 5

E’ critica la scelta del parametro da utilizzare per determinare l’intorno in cui considerare 2 simboli identici o no.

Attendo conferme da Alessandro!

[fonte immagine: http://www.cabap.org/science/measure-and-estimate-the-weight-length-or-volume-of-objects]

Cos’è un gioco? – La mente del giocatore.

Abbiamo parlato di giochi, ora dovremmo anche parlare di giocatori.
I giocatori siamo noi ed ognuno di noi ha un cervello tutto suo (per fortuna): tutti diversi.
Si fa spesso confusione parlando di mente e cervello: il cervello è l’organo fisico, mentre la mente è (scusate il paragone) il software.
La metafora tra cervello e computer è quasi automatica, anche se poco calzante. Stiamo affiancando due sistemi ben differenti: i computer sono macchine che lavorano in sequenza, con regole precise e matematiche (Von Neumann), i cervelli supportano attività parallele, non hanno logica, lavorano con pattern (la lista è lunga!).
Il cervello supporta i pensieri. Ne abbiamo di vari tipi. Al livello più basso ci sono i cosidetti Stimolo-Risposta. Non credo si possano considerare proprio dei pensieri. Uno SR è la risposta automatica ad un certo stimolo. Molti sono innati, altri li apprendiamo (per esempio toccando qualcosa di incandescente impariamo rapidamente a ritrarre la mano).
Un livello di pensiero intermedio è quello logico, matematico e di ordinamento. E’ abbastanza lento.
Il livello superiore è il pensiero associativo, integrativo ed intuitivo – molto lento.

Cosa fa la mente?

L’essere umano non è un sistema chiuso ed isolato. Il cervello è connesso ad organi di senso: alcuni verso l’interno del corpo – di cui non abbiamo neppure sentore, altri verso il mondo esterno.
Questi sensori generano un flusso continuo di impulsi elettrici, convogliati verso il cervello. La mente li elabora in modo raffinato. Innanzitutto filtra l’irrilevante, nascondendo i dettagli del mondo che ci circonda. Nello stesso tempo non perde nulla e nota ogni cosa d’interesse, anche se non ne siamo pienamente consapevoli.
Ogni situazione viene scomposta (in simboli) e poi ricondotta a dei modelli o dei pattern. L’accumularsi delle esperienze accresce ed ingrandisce i modelli. A volte ne nascono di nuovi, a volte si fondono. Riconosciamo pattern: le situazioni (configurazioni di stimoli) che ci si presentano vengono ricondotte a dei pattern. A volte abbiamo configurazioni sconosciute e le cataloghiamo come rumore. Si pensi al Jazz o all’arta contemporanea: a molti risultano incomprensibili, altri ne vanno pazzi.
Le situazioni che ci piacciono sono quelle regolari, ordinate, dove si possano rilevare texture o lievi variazioni nella struttura.

Siamo scimmie e scimmie pigre! Ci piace imparare ma con moderazione.
Abbiamo detto che i giochi sono sistemi per insegnarci qualcosa; agli uomini piace imparare. I giochi, intesi come sistemi per apprendere, provocano piacere.
Quando ci troviamo di fronte a qualcosa di nuovo, ne siamo attratti e la scimmietta che è in noi inizia a studiare il nuovo oggetto.
Vi gira attorno cercano di capire cos’è e come funziona: quali sono le regole.
Cerchiamo dei pattern, delle situazioni già note o qualcosa che sia riconducibile alla nostra precedente esperienza.
Affrontare un sistema alieno richiede una maggiore quantità di pazienza: lo si deve studiare e capire. Queste operazioni sono faticose e la scimmietta potrebbe stancarsi e fuggire a gambe levate.
Sistemi riconducibili a pattern noti, richiedono meno sforzi e l’unica fatica riguarda le quantità di dati che ci trasmettono.

Appena la situazione è stata ricondotta a qualcosa di noto, o comunque si sono ricavate le regole, cerchiamo subito di semplificare e trovare scorciatoie. In fondo siamo pigrissimi.
Ecco un’utile considerazione per i game designer:
“Ci annoiamo facilmente e cerchiamo la novità, che però non deve essere troppo stravolgente altrimenti ci tocca fare troppa fatica per comprenderla (siamo pigri)”.

[Continua... ]

[pensieri liberamente tratti dalla lettura di 'A theory of fun in game design' - Raph Koster]

Robocup days!!!

La macchina del tempo… eccomi apparire al secondo 35…

La finale Italia vs Iran: vinta dall’Iran per guasto al nostro portiere.

 

Categories: Ai & Neural, tech, zmaker Etichette: , , ,

Biostori

Tool/Lab per il test di reti di biostori

Tool/Lab per il test di reti di biostori

Le reti neurali ‘classiche’ possono non essere adatte a tutte le situazioni. Una rete neurale classica nasce come una “rete calcolatrice” (o una funzione che associa ad un vettore di ingressi un valore in uscita). Il neurone nella modellizzazione ‘classica’ è visto come un sommatore di segnali privo di una memoria e abbastanza lontano dal comportamento di un neurone reale. Manca l’evoluzione temporale continua della rete.

L’apprendimento di tali sistemi, nella visione più classica, è supervisionato (back propagation), e richiede quini interventi ‘esterni’.

Gli esperimenti da me condotti hanno cercato di definire un nuovo modello di neurone (in parte ispirato agli automi cellulari di Wolfram e alle ricerche da lui condotte in questi campi).

Il modello di neurone nei miei sistemi è una entità autonoma e svincolata dalle altre; comunica in modo asincrono ricevendo e trasmettendo segnali; vive in un’ ambiente rumoroso; è dotato di una certa memoria e gli effetti (in frequenza ed ampiezza) dei segnali ricevuti ne modificano lo stato.

Ho battezzato questa unità biostore.

L’elaborazione dei segnali è locale, nel senso che non avviene a livello di rete, ma autonomamente in ogni singolo biostore. Locale è anche il processo di apprendimento, che non sarà quindisuprevisionato. In effetti anche per i neuroni reali mi risulta che sia così: nessuna entità o struttura biologica superiore interviene modificando globalmente la rete e le sue connessioni.

Verifica del funzionamento di un singolo Biostore

Ambiente di prova del singolo biostore: il biostore è il quadrato bianco. A destra si vedono in blu gli spike generati, ed in rosso il livello interno.

Ogni biostore ha un livello energetico interno dipendente dal tempo; il livello energetico è necessario per verificare la condizione di rilascio di uno segnale in uscita (spike).

Il biostore mantiene anche un livello mediato di tale livello energetico. Sugli ingressi (sinapsi) giungono segnali che vanno ad incrementare il livello energetico dell’unità. I segnali sono pesati e i pesi presenti sulle sinapsi risentono della storia delle attivazioni passate.

Nei primi istanti successivi allo spike del neurone è presente anche un effetto inibitorio, per cui nuovi ingressi vengono ignorati.

I segnali circolanti sulla rete hanno una loro propria forma e non sono semplici delta di dirac. L’ampiezza delle forme d’onda generate è costante: adottando ampiezze normalizzate, queste saranno tutte pari ad uno. Tuttavia i segnali si propagano in un mezzo dotato di una certa resistenza e quindi si ha una attenuazione dei segnali proporzionali alla distanza percorsa. La propagazione non è istantanea, ed affinchè un segnale raggiunga un biostore è necessario un certo tempo (dipendente dalla distanza).

Si potrebbe pensare che limitare ad uno l’ampiezza degli impulsi (spike) generati sia limitante: se un biostore ha un potenziale di attivazione molto elevato, non dovrebbe generare un segnale più vigoroso? In effetti no, in quanto il biostore è assimilabile ad una specie di trigger e anche in considerazioen del fatto che se il potenziale è molto alto il biostore puo’ generare una serie di spike in stretta sequenza. Il tempo che separa uno spike dal successivo è determinato dalla durata del tempo di inibizione.

spike teorico d'uscita

spike teorico in uscita

Lo spike generato dal biostore, approssimabile con un delta di dirac.

Lo spike generato dal biostore, approssimabile con un delta di dirac.

Alle sinapsi giungono impulsi di diverse ampiezze (per via dell’attenuazione del segnale) e con diverse temporizzazioni. Nelle sinapsi vengono sommati tali impulsi istante per istante; alla somma di tali segnali si aggiunge il rumore presente nella ambiente.

Il rumore è implementato con un automa cellulare: questo sistema garantisce un rumore totalmente aciclico ed imprevedibile.

Simulatore di Rete Neurale - prima dell'avvio

Simulatore di Rete Neurale - prima dell'avvio

Simulatore di Rete Neurale - avviato. I biostori sono i quadrati bianchi. I segnali hanno diversi colori (diversi flavour chimici) e viaggiano verso il loro neurone di destinazione.

Simulatore di Rete Neurale - avviato. I biostori sono i quadrati bianchi. I segnali hanno diversi colori (diversi flavour chimici) e viaggiano verso il loro neurone di destinazione.

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.

Iscriviti

Get every new post delivered to your Inbox.