Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

55
Universit ` a degli Studi di Trieste Facolt` a di Ingegneria Dipartimento di Elettrotecnica, Elettronica ed Informatica Corso di Laurea in Ingegneria dell’Informazione – curriculum Informatica Tesi di Laurea in Sistemi Operativi I MPLEMENTAZIONE IN J AVA DI PLUGIN M AVEN PER ALGORITMI DI ADDESTRAMENTO PER RETI NEURALI ARTIFICIALI Laureando: Relatore: Francesco Komauli Prof. Ing. Enzo Mumolo Anno Accademico 2012-2013

description

L’idea del progetto di questa tesi è applicare all’addestramento di reti neurali artificiali le funzionalità di uno strumento di gestione di progetti software, in questo caso Maven, per rendere configurabili e componibili in modo dichiarativo, e possibilmente estendibili, sia l’algoritmo di addestramento che le componenti di supporto, come la persistenza della rete neurale e la gestione dei dati dell’insieme di addestramento. Tale idea è nata dall’analogia tra progetti software e addestramento di reti neurali artificiali. Prima dell’introduzione di strumenti di gestione, ciascun progetto software possedeva una propria organizzazione del processo di compilazione, test, deploy, di versionamento e di gestione delle dipendenze. Maven introduce un’interfaccia comune ed un insieme di convenzioni che, oltre a rendere portabile il progetto, ne semplifica il processo di build. Le reti neurali vengono costruite e addestrate usando strumenti di calcolo matematico o scrivendo un eseguibile che utilizzi una libreria dedicata. Il codice per l’addestramento è sviluppato per lo specifico problema, talvolta scartato una volta terminato il suo compito. Nonostante l’addestramento di reti neurali non sia deterministico come un processo di compilazione, ma adotti una serie di tecniche ed euristiche per trovare soluzioni non ottime, sono state cercate delle caratteristiche comuni ai due processi. Si vuole quindi introdurre Maven per definire un prototipo di interfaccia comune all’addestramento di reti neurali artificiali, tenendo conto delle problematiche di questo tipo di processo. Il meccanismo sviluppato per consentire configurabilità e componibilità delle componenti introduce il concetto di servizi: tipologie di oggetti a ciascuna delle quali è associata una factory col compito di configurare le istanze create. Nella configurazione da iniettare attraverso una factory sono tenuti distinti i puri dati, come parametri numerici o stringhe, e servizi collaboratori dotati di comportamento. Attraverso questa distinzione è possibile rappresentare in formato puramente testuale la gerarchia di composizione di un qualunque servizio. Le responsabilità del gestore di progetti sono importare le factory da librerie dichiarate come dipendenze, costruire i servizi in base alla struttura gerarchica specificata nel descrittore di progetto ed utilizzarli per effettuare l’addestramento.

Transcript of Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Page 1: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Universita degli Studi di Trieste

Facolta di IngegneriaDipartimento di Elettrotecnica, Elettronica ed Informatica

Corso di Laurea inIngegneria dell’Informazione – curriculum Informatica

Tesi di Laurea inSistemi Operativi

IMPLEMENTAZIONE IN JAVADI PLUGIN MAVEN PER

ALGORITMI DIADDESTRAMENTO PER RETI

NEURALI ARTIFICIALI

Laureando: Relatore:Francesco Komauli Prof. Ing. Enzo Mumolo

Anno Accademico 2012-2013

Page 2: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali
Page 3: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Indice

1 Introduzione 51.1 Obiettivi della tesi . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2 Organizzazione della tesi . . . . . . . . . . . . . . . . . . . . . . . 61.3 Strumenti utilizzati . . . . . . . . . . . . . . . . . . . . . . . . . . 61.4 Codice sorgente del progetto . . . . . . . . . . . . . . . . . . . . . 7

2 Maven 82.1 Modello concettuale di progetto . . . . . . . . . . . . . . . . . . . 8

2.1.1 Dependency management . . . . . . . . . . . . . . . . . . 82.1.2 Repository remote . . . . . . . . . . . . . . . . . . . . . . 82.1.3 Portabilita . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.2 Convention over Configuration . . . . . . . . . . . . . . . . . . . 92.3 Estensione del framework . . . . . . . . . . . . . . . . . . . . . . 9

3 Multilayer perceptron 113.1 Il modello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2 Addestramento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.2.1 Batch back propagation . . . . . . . . . . . . . . . . . . . 133.2.2 Parametrizzazione dell’algoritmo . . . . . . . . . . . . . . 14

3.3 Generalizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

4 Plugin Maven per multilayer perceptron 164.1 Layout di un progetto . . . . . . . . . . . . . . . . . . . . . . . . 164.2 Addestramento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.3 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.4 Rappresentazione di multilayer perceptron . . . . . . . . . . . . . 19

4.4.1 Funzioni di attivazione . . . . . . . . . . . . . . . . . . . . 194.4.2 Neuroni . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.4.3 Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.4.4 Multilayer perceptron . . . . . . . . . . . . . . . . . . . . 20

5 Servizi 225.1 Motivazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225.2 Identificazione e configurazione . . . . . . . . . . . . . . . . . . . 225.3 Descrizione gerarchica . . . . . . . . . . . . . . . . . . . . . . . . 235.4 Generazione di servizi . . . . . . . . . . . . . . . . . . . . . . . . 235.5 Definizione di servizi . . . . . . . . . . . . . . . . . . . . . . . . . 245.6 Pubblicazione delle factory . . . . . . . . . . . . . . . . . . . . . 25

5.6.1 Recupero delle configurazioni dal classpath . . . . . . . . 255.6.2 Recupero delle librerie . . . . . . . . . . . . . . . . . . . . 26

5.7 Organizzazione delle dipendenze per il plugin Maven per multi-layer perceptron . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

6 Risultati sperimentali 286.1 Dominio di apprendimento . . . . . . . . . . . . . . . . . . . . . . 286.2 Scelta della funzione d’errore . . . . . . . . . . . . . . . . . . . . 286.3 Topologia del multilayer perceptron . . . . . . . . . . . . . . . . 306.4 Risultati dell’addestramento . . . . . . . . . . . . . . . . . . . . . 30

3

Page 4: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

7 Modelli di Markov nascosti (HMM) 337.1 Introduzione ai processi stocastici . . . . . . . . . . . . . . . . . . 337.2 I tre problemi principali degli HMM . . . . . . . . . . . . . . . . 36

7.2.1 Il primo problema . . . . . . . . . . . . . . . . . . . . . . 367.2.2 Il secondo problema . . . . . . . . . . . . . . . . . . . . . 377.2.3 Il terzo problema . . . . . . . . . . . . . . . . . . . . . . . 37

7.3 Risultati sperimentali . . . . . . . . . . . . . . . . . . . . . . . . 38

8 Volterra vs. NN 40

9 Conclusioni 449.1 Risultati ottenuti . . . . . . . . . . . . . . . . . . . . . . . . . . . 449.2 Vantaggi dovuti all’uso di Maven . . . . . . . . . . . . . . . . . . 449.3 Sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

A Esempio di progetto per multilayer perceptron: xor 47

B Implementazione dell’algoritmo di back-propagation 51B.1 Fase feedforward . . . . . . . . . . . . . . . . . . . . . . . . . . . 51B.2 Fase di back propagation . . . . . . . . . . . . . . . . . . . . . . . 52B.3 Aggiornamento dei pesi . . . . . . . . . . . . . . . . . . . . . . . 53

4

Page 5: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Ringraziamenti

Desidero ringraziare la mia famiglia per il sostegno datomi in questi mesi diduro lavoro. Ringrazio il professor Enzo Mumolo per avermi dato l’opportunitadi approfondire un argomento interessante come le reti neurali artificiali. Vorreiringraziare i miei amici per essermi stati sempre accanto ed avermi consigliato.Infine ringrazio i miei colleghi senza i quali non avrei sviluppato un approcciocritico all’architettura e al design del software.

5

Page 6: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

1 Introduzione

L’idea del progetto di questa tesi e applicare all’addestramento di reti neuraliartificiali le funzionalita di uno strumento di gestione di progetti software, inquesto caso Maven, per rendere configurabili e componibili in modo dichiarativo,e possibilmente estendibili, sia l’algoritmo di addestramento che le componen-ti di supporto, come la persistenza della rete neurale e la gestione dei datidell’insieme di addestramento.

Tale idea e nata dall’analogia tra progetti software e addestramento di re-ti neurali artificiali. Prima dell’introduzione di strumenti di gestione, ciascunprogetto software possedeva una propria organizzazione del processo di compi-lazione, test, deploy, di versionamento e di gestione delle dipendenze. Mavenintroduce un’interfaccia comune ed un insieme di convenzioni che, oltre a rendereportabile il progetto, ne semplifica il processo di build.

Le reti neurali vengono costruite e addestrate usando strumenti di calcolomatematico o scrivendo un eseguibile che utilizzi una libreria dedicata. Il codiceper l’addestramento e sviluppato per lo specifico problema, talvolta scartato unavolta terminato il suo compito. Nonostante l’addestramento di reti neurali nonsia deterministico come un processo di compilazione, ma adotti una serie ditecniche ed euristiche per trovare soluzioni non ottime, sono state cercate dellecaratteristiche comuni ai due processi.

Si vuole quindi introdurre Maven per definire un prototipo di interfacciacomune all’addestramento di reti neurali artificiali, tenendo conto delle proble-matiche di questo tipo di processo.

Il meccanismo sviluppato per consentire configurabilita e componibilita dellecomponenti introduce il concetto di servizi : tipologie di oggetti a ciascuna dellequali e associata una factory col compito di configurare le istanze create. Nel-la configurazione da iniettare attraverso una factory sono tenuti distinti i puridati, come parametri numerici o stringhe, e servizi collaboratori dotati di com-portamento. Attraverso questa distinzione e possibile rappresentare in formatopuramente testuale la gerarchia di composizioe di un qualunque servizio.

Le responsabilita del gestore di progetti sono importare le factory da li-brerie dichiarate come dipendenze, costruire i servizi in base alla strutturagerarchica specificata nel descrittore di progetto ed utilizzarli per effettuarel’addestramento.

Il progetto e inserito nel contesto di un esperimento che vede confrontate traloro tre tipologie di classificatori: Multilayer Perceptron, Hidden Markov Modele Serie di Volterra. Nello specifico caso del riconoscimento di lettere pronunciatedell’alfabeto inglese, vengono analizzate le diverse capacita di generalizzazionedi ciascun modello.

1.1 Obiettivi della tesi

L’obiettivo principale della tesi e fornire un’implementazione di plugin Mavenper ciascuna tipologia di classificatori. Ciascun plugin deve poter compierel’addestramento di classificatori, sviluppato in modo tale da rendere ogni com-ponente configurabile e componibile, con un livello di dettaglio che consenta diaffrontare problemi specifici come quello particolare del riconoscimento di lette-re pronunciate. Allo stesso tempo si cerca di minimizzare la quantita di codicededicata esclusivamente alla sua risoluzione.

6

Page 7: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Si intende quindi fare uso dei plugin sviluppati per confrontare le capacitadi generalizzazione delle tipologie di classificatori sopra menzionati.

1.2 Organizzazione della tesi

Nella Sezione 2 viene descritto cosa sia Maven, quale sia il suo funzionamento edi vantaggi che ha portato alla gestione di progetti software grazie all’introduzionedi un modello di progetto.

La Sezione 3 introduce il modello teorico del multilayer perceptron. Inoltreviene presentato uno degli algoritmi adatti al suo addestramento, quello di batchback propagation.

La sezione 4 presenta il plugin Maven per multilayer perceptron, descrivendole fasi di addestramento e test e fornendo esempi sul suo utilizzo, tra cui comestrutturare la configurazione e come rappresentare un multilayer perceptron.

Il meccanismo dei servizi che sta alla base del funzionamento del plugin epresentato nella Sezione 5. Viene spiegato come i servizi possano essere utilizzatiprogrammaticamente, in che modo ne vengano definiti di nuovi e come renderlidisponibili attraverso i repository Maven.

Nella Sezione 6 viene descritto come il plugin sia stato utilizzato per l’ad-destramento di un multilayer perceptron il cui compito e classificare le letterepronunciate dell’alfabeto inglese. Sono dati i parametri della rete neurale e del-l’algoritmo di back propagation, e una descrizione del preprocessamento degliesempi. Per l’addestramento e stata impiegata una particolare funzione d’erroreadatta al tipo di problema, detta classification figure of merit. Infine vengonopresentati i risultati ottenuti.

La sezione 7 introduce il modello di Hidden Markov Model, esponendo qualisiano le problematiche collegate al suo utilizzo per la classificazione di segnalied i relativi algoritmi, tra cui l’algoritmo di Baum-Welch per l’addestramentodi un HMM. Sono poi esposti i risultati ottenuti per il riconoscimento di letterepronunciate dell’alfabeto inglese.

Nella sezione 8 vengono presentate le Serie di Volterra, il cui modello puoessere dedotto da quello delle reti neurali attraverso un’approssimazione poli-nomiale delle non-linearita che contraddistinguono i neuroni artificiali. Sonodati inoltre alcuni risultati preliminari dell’applicazione di serie volterriane alproblema di classificazione di lettere pronunciate dell’alfabeto inglese.

Per ultima, la Sezione 9 contiene le conclusioni relative al progetto di questatesi ed i risultati ottenuti. Inoltre e data una lista degli sviluppi che non si sonopotuti avviare o portare a termine, o che si sono delineati come deduzioni dallavoro svolto.

Nell’appendice e presentato un’esempio completo di utilizzo del plugin Ma-ven per multilayer perceptron (Appendice A) e una descrizione dell’implemen-tazione dell’algoritmo di batch back propagation (Appendice B).

1.3 Strumenti utilizzati

Una parte del software, riguardante Hidden Markov Model e Serie di Volterra, estata sviluppata nel linguaggio C. Il software che si occupa del preprocessamentodei file di esempio e stato implementato in C, ed in Java quello che converte i ri-sultati del preprocessamento in formato json. Il plugin per multilayer perceptrone invece scritto interamente in Java 1.7.

7

Page 8: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Oltre all’ambiente di build Maven, descritto nella Sezione 2, e stato utiliz-zato lo strumento di continuous integration Jenkins1. Si tratta di una webappgeneralmente impiegata per effettuare build automatizzate, che richiede il sup-porto di un servlet container per la sua esecuzione. Nel caso di questa tesi estato utilizzato il server Tomcat2.

Tra le varie funzionalita vi e la possibilita di memorizzare le ultime buildeffettuate, per poter confrontare i risultati e generare reportistica. Le buildpossono essere avviate manualmente, venir temporizzate o lanciate in rispostaa degli eventi, come l’aggiornamento di una repository attraverso un sistema diversion control.

Oltre ad ospitare il progetto del plugin in Java, Jenkins e stato configuratoper l’addestramento di multilayer perceptron attraverso il suo interfacciamentocon Maven.

1.4 Codice sorgente del progetto

Il progetto e suddiviso in due repository, versionato con il sistema di controllodi versione Mercurial3, ed i suoi sorgenti sono ospitati sul sito BitBucket:

Genesis : https://bitbucket.org/0xdeadc0de/genesis/libreria contenente le difinizioni di servizio e factory, e l’implementazionedi application context che li gestisce;

Seshat : https://bitbucket.org/0xdeadc0de/seshat/definizioni delle interfacce dei servizi per mulilayer perceptron, pluginMaven e implementazioni di servizi basilari per il suo funzionamento.

1 Jenkins CI: http://jenkins-ci.org/2 Apache Tomcat: http://tomcat.apache.org/3 Mercurial SCM: http://mercurial.selenic.com/

8

Page 9: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

2 Maven

Una definizione formale di Maven4 e che si tratta di uno strumento di gestionedi progetti, il quale provvede un insieme di standard, un lifecycle di progetto, unmeccanismo di gestione delle dipendenze, e la logica per eseguire goal di pluginin determinate fasi di un lifecycle. Non si tratta quindi di uno strumento dibuild incentrato solo su compilazione e distribuzione del codice, ma fornisce unsoprainsieme di funzionalita.

2.1 Modello concettuale di progetto

Un progetto in generale consiste in codice sorgente e un insieme di risorse.Maven consente di aggiungere al progetto una descrizione, come nome, licenzae informazioni sugli sviluppatori. Ma le informazioni piu importanti sono lecoordinate che lo identificano:

groupId : famiglia di progetti, data ad esempio dal nome dell’azienda oassociazione;

artifactId : identificativo del progetto, solitamente una versione codificatadel nome;

version : numero di versione che puo essere di tipo stabile (release), men-tre per le versioni ancora in fase di sviluppo viene aggiunto il suffisso-SNAPSHOT;

packaging : e la tipologia di artefatto, inteso come risultato prodotto dallacompilazione, e definisce un proprio insieme di goal in determinate fasi dellifecycle; di default e jar e altri packaging integrati in Maven sono war,ear e pom.

La definizione di un modello per i progetti consente di implementare funzio-nalita aggiuntive rispetto a un sistema unicamente dedicato alla build.

2.1.1 Dependency management

Poiche ciascun progetto e univocamente identificato da groupId, artifactIde version, si possoo usare queste coordinate per dichiarare dipendenze.

2.1.2 Repository remote

Sfruttando lo stesso meccanismo delle dipendenze, si possono usare le coordi-nate dei progetti per creare repository di artefatti. Maven gestisce gli artefattiattraverso un repository locale e uno o piu repository remoti. Tutte gli artefattidichiarati come dipendenze vengono installati nel repository locale, e inclusi nelclasspath al momento dell’esecuzione di un plugin.

Esiste un repository principale di riferimento: il Central Maven Reposito-ry5. Qui sono pubblicati tuti gli artefatti che passano i criteri di accettazionenecessari ad ottenere uno spazio.

Quando vi sia la necessita di condividere delle librerie ma senza dover depo-sitarle sul repository centrale, come nel caso di aziende, dipartimenti o gruppi

4 Apache Maven: https://maven.apache.org/5 The Central Repository. http://search.maven.org/

9

Page 10: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

di sviluppo, e possibile gestire un repository personalizzato attraverso la we-bapp Nexus6. Questo servizio si interpone tra i repository locali degli utentie quello centrale, arricchendo la collezione di librerie con quelle sviluppate dalgruppo. I repository personalizzati possono essere resi pubblici, e aggiungendolialla configurazione della propria installazione di Maven vengono inclusi durantela ricerca di librerie.

2.1.3 Portabilita

Maven definisce un’interfaccia comune a ciascun progetto, permettendo di com-pilare un clone di progetto di terze parti semplicemente attraverso il comandomvn install. Inoltre non e piu necessario per gli IDE definire un propriosistema di metadati per il progetto, in quanto attraverso il Project Object Model(POM) dispongono di una sorgente di informazioni comune.

2.2 Convention over Configuration

Maven adotta il paradigma Convention over Configuration. Secondo i suoi det-tami, un sistema deve poter funzionare senza richiedere parametri non stretta-mente necessari, assumendo per questi dei valori di default. Senza customizza-zione, Maven assume che il codice sorgente sia in

${basedir}/src/main/java/

e quello di test in

${basedir}/src/main/test/

mentre la tipologia di artefatto sia jar. I risultati della build vengono infineposti nel path

${basedir}/target/

L’adozione del paradigma Convention over Configuration non si limita alladefinizione di directory per il progetto. I plugin fondamentali applicano uninsieme di convenzioni per la compilazione dei sorgenti, per la distribuzionedegli artefatti, per la generazione della documentazione e per molti altri processi.Quando si seguono le convenzioni si ha il vantaggio di dover fornire a Mavenuna configuraziuone minima, mentre nel caso sia necessario modificare un certocomportamento e possibile modificare i parametri di default.

2.3 Estensione del framework

Il nucleo di Maven comprende solo alcune funzionalita di base, come il parsingdi xml ed esecuzione di un lifecycle. Infatti il suo design prevede che la maggiorparte delle responsabilita siano delegate a un insieme di plugin Maven, cheinteragiscono con il lifecycle e forniscono dei goal da poter collegarvi. I pluginsono a loro volta dei progetti Maven, e sono installabili in un repository allostesso modo degli altri artefatti.

Un goal di un plugin rappresenta uno specifico task che contribuisce allabuild o alla gestione di un progetto Maven. In Maven e possibile definire deilifecycle aventi una nuova lista di fasi. I goal vengono eseguiti durante la fase a

6 Nexus: http://www.sonatype.org/nexus/

10

Page 11: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

cui sono stati assegnati, imponendo l’ordine con cui le fasi sono state dichiaratenel rispettivo lifecycle.

11

Page 12: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

3 Multilayer perceptron

Questa sezione introduce i multilayer perceptron, una tra le tipologie di retineurali artificiali piu comunemente usate. Viene presentato inoltre l’algoritmodi addestramento back propagation, nella sua variante batch.

3.1 Il modello

I multilayer perceptron sono formati da unita chiamate neuroni, interconnessetra loro da collegamenti sinaptici, a ciascuna delle quali viene associato un peso.Il livello di attivazione di una sinapsi e determinato moltiplicando il valore dioutput del neurone sorgente per il peso. Ogni unita effettua la somma dei propriinput, rappresentanti i livelli di attivaione delle sinapsi in ingresso, a cui vieneaggiunto un eventuale termine costante detto bias.

La somma complessiva viene mappata da una funzione non lineare denomina-ta funzione di attivazione, il cui risultato rappresenta l’output del neurone. Duetra le funzioni di attivazione piu comunemente usate sono la funzione logistica(Figura 1) e la tangente iperbolica (Figura 2).

Figura 1: funzione logistica 11+e−x

Figura 2: tangente iperbolica ex−e−x

ex+e−x

12

Page 13: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Detti w = (w1, . . . , ws) i pesi delle sinapsi e b il bias, il vettore in ingressox = (x1, . . . , xs) viene mappato dal neurone nel valore di output y attraverso

y = f( b+

s∑i=1

xiwi ) (1)

I multilayer perceptron sono organizzati in layer, composti da neuroni cheottengono i propri input unicamente dai neuroni del layer precedente, cosı comei propri output sono usati solo da quelli del layer successivo.

Figura 3: multilayer perceptron formato da due layer, uno nascosto e quellodi output; all’interno dei neuroni, rappresentati come cerchi, avviene la som-ma degli input pesati dalle sinapsi e la mappatura attraverso la funzione diattivazione, come specificato dall’Equazione 1

L’operazione effettuata da un multilayer perceptron e la mappatura di unvettore di dimensione pari al layer di input in un vettore composto dai valoridi output dei neuroni dell’ultimo layer. I segnali vengono mappati attraversociascun layer per attivare le sinapsi di quello successivo.

Il comportamento di un multilayer perceptron, ovvero la trasformazione ef-fettuata sui vettori in ingresso, dipende dai pesi delle sinapsi e dai bias dei singolineuroni. E attraverso la variazione di questi pesi che un multilayer perceptronviene addestrato a svolgere una determinata operazione.

3.2 Addestramento

L’addestramento di un multilayer perceptron avviene applicando un vettore iningresso e confrontando il vettore prodotto in uscita con uno desiderato. Ta-le metodo e detto di apprendimento supervisionato in quanto sono note dellecoppie di segnali di input e output desiderato (xk,dk), di cui si vuole che ven-ga riprodotta la corrispondenza da parte del multilayer perceptron addestra-to. La differenza tra output effettivo ok e desiderato dk fornisce l’errore diriconoscimento:

ek = ok − dk (2)

Tale errore viene mappato attraverso una funzione d’errore o di costo, chefornisce una misura scalare dello scostamento della rete neurale dal suo com-portamento ideale. Una funzione spesso usata e l’errore quadratico

Ek = ‖ek‖22 (3)

ma altre funzioni possono essere impiegate in base al tipo di problema di rico-noscimento da risolvere, dove l’errore quadratico non sia la miglior misura della

13

Page 14: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

deviazione dal comportamento ideale.

Ek = C(ek) (4)

La funzione di costo C dovrebbe essere scelta in modo che rappresenti piuverosimilmente le relative importanze degli errori nel contesto in cui la rete neu-rale viene applicata. In generale una funzione di errore ha un minimo assolutoper e = 0.

Considerando l’intero insieme di esempi per l’addestramento, lo scostamentodella rete neurale dal comportamento ideale si misura attraverso la somma deisingoli errori:

E =∑k

Ek (5)

Dato un inseme di esempi per l’addestramento e fissata la struttura delmultilayer perceptron, l’errore e funzione dei soli pesi. Una tra le procedurepiu semplici per la minimizzazione dell’errore E(w) e il metodo del gradiente:consiste nell’iterare passi, nello spazio dei pesi, proporzionali all’opposto delgradiente della funzione da ottimizzare. I pesi sono aggiornati ad ogni passocon

w′ = w − η · ∇E(w) (6)

dove per semplicita w indica il vettore contenente tutti i pesi della rete. Se l’er-rore presenta una debole regolarita e il parametro η e sufficientemente piccolo,le iterazioni convergono verso un minimo locale di E. Il parametro η e notocome learning rate.

In questo metodo la parte critica risulta essere il calcolo delle componentidel gradiente ∂E/∂wi. Per le reti neurali feedforward, ed in particolare per imultilayer perceptron, questo calcolo assume una forma semplice.

3.2.1 Batch back propagation

L’algoritmo consiste nella costruzione di una rete neurale detta rete di backpropagation, richiedendo pero che le funzioni di attivazione e la funzione d’erroresiano differenziabili. Detto wij il peso della sinapsi in ingresso nel neurone i eproveniente dal neurone j, e definendo il livello di attivazione di un neuronecome la somma di bias e degli input pesati

si = bi +∑j

xjwij (7)

tale rete ha le componenti non lineari dell’originale sostituite da guadagni co-stanti

gi = f ′i(si) (8)

dove f ′i e la derivata della funzione di attivazione associata al neurone i. Inol-tre la struttura viene trasposta invertendo la direzione delle sinapsi e dellediramazioni, sostituendo i nodi di somma in divergenze e viceversa.

La singola iterazione dell’algoritmo prevede quindi di applicare alla rete diback propagation i valori ∂Ek/∂oi e calcolare gli output dei neuroni con

yi = gi ·∑j

xjwji (9)

14

Page 15: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Le componenti del gradiente dei pesi posono essere ottenuti attraverso laseguente regola:

∂Ek∂wij

= yiyj (10)

Per l’equazione (5) le componenti del gradiente sono date dalla somma dellecomponenti valutate per ogni singolo esempio, con

∂E

∂wij=

∑k

∂Ek∂wij

(11)

Questi valori vengono quindi usati per aggiornare i valori dei pesi comeevidenziato nell’equazione (6). L’attributo batch dell’algoritmo sta proprio asignificare che prima di effettuare l’aggiornamento dei pesi vengono valutati glierrori, e quindi i gradienti, di tutti gli esempi dell’insieme di addestramento.

3.2.2 Parametrizzazione dell’algoritmo

L’algoritmo di back propagation converge per un learning rate η al di sottodi un certo valore ηmax. Tale massimo dipende dalla rete neurale, dall’insie-me di esempi e dalla funzione di costo, e non puo essere determinato a priori.Diminuendo il valore di η al di sotto di ηmax la velocita di convergenza puo ral-lentare notevolente, rendendo la scelta del learning rate uno degli aspetti criticidell’addestramento di una rete neurale.

Inoltre la superficie dell’errore puo presentare delle brusche variazioni, nellequali l’uso di un learning rate elevato porterebbe a oscillazioni divergenti intornoa queste aree. Una delle soluzioni adottate e l’utilizzo di learning rate ηij distintiper ogni peso, adattati ad ogni iterazione dell’algoritmo in base ai segni di duegradienti successivi.

Un’altra tecnica simula l’inerzia dello spostamento lungo la superficie del-l’errore, accumulando le direzioni dei gradienti precedenti. Aggiungendo untermine accumulatore all’equazione (6) si ottiene

wn+1 = wn − ( η · ∇E(wn) + α ·∆wn−1 ) (12)

Il termine 0 ≤ α < 1 consente di aumentare la velocita lungo discese ripideevitando movimenti oscillatori. Tuttavia quando troppa inerzia venisse accumu-lata, lo spostamento successivo porterebbe ad uscire dall’intorno di un minimolocale raggiunto.

3.3 Generalizzazione

Nell’addestramento di una rete neurale artificiale, spesso l’insieme di esempirappresenta un sottoinsieme relativamente piccolo dei possibili input che la retedovra riconoscere. Una volta addestrata deve essere in grado di classificarepattern non presenti nell’insieme di addestramento. La condizione ideale perl’addestramento sarebbe minimizzare la funzione di costo calcolata su tutti glielementi dell’universo degli input, ma cio risulta impossibile per universi infinitio non del tutto noti, o per un costo computazionale troppo elevato. Per questol’insieme di addestramento andrebbe selezionato in modo da rappresentare tuttele caratteristiche dell’universo degli input.

15

Page 16: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Una rete neurale che riconosca correttamente gli elementi dell’universo comequelli dell’insieme di addestramento ha ottenuto la capacita di generalizzare lapropria classificazione. Per valutare l’entita del livello di generalizzazione vieneutilizzato un insieme di esempi disgiunto da quello di addestramento, dettoinsieme di test. Si ha cosı modo di valutare la generalizzazione della rete neuralee adattare di conseguenza la struttura della rete o l’insieme di addestramento.

16

Page 17: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

4 Plugin Maven per multilayer perceptron

In seguito e presentato il funzionamento del plugin, assieme a una configurazionedi progetto di multilayer perceptron d’esempio.

Sono definiti due goal: il primo per l’addestramento del multilayer percep-tron, il secondo per verificarne la capacita di generalizzazione.

4.1 Layout di un progetto

Il plugin definisce una nuova tipologia di progetto:

multilayer-perceptron

Su un progetto avente questo tipo, Maven esegue i goal definiti dal plugin in-vece che quelli standard del lifecycle di default, cosı da effettuare l’addestra-mento della rete neurale e, dopo aver terminato, testare le sue capacita digeneralizzazione.

Per abilitarne l’esecuzione, il plugin va dichiarato nella sezione riguardantela build all’interno del descrittore di progetto pom.xml. Oltre alle sue coordi-nate Maven, sono fondamentali la sua configurazione e le dipendenze a tempodi esecuzione che gli vengono attribuite. La dichiarazione di dipendenze peril plugin e il meccanismo con cui altre librerie vengono aggiunte al classpathe rese disponibili durante la sua esecuzione, lasciando a Maven il compito direcuperarle automaticamente, da remoto se necessario.

Listing 1: dichiarazione del plugin per multilayer perceptron nel pom; le esten-sioni del plugin sono abilitate per permettere l’override del lifecycle Maven conil packaging multilayer-perceptron

1 <project>2 ...3 <packaging>multilayer-perceptron</packaging>4 <build>5 <plugins>6 <plugin>7 <groupId>dev.deadc0de.seshat</groupId>8 <artifactId>multilayer-perceptron-maven-plugin</artifactId>9 <version>0.2</version>10 <extensions>true</extensions>11 <configuration>12 <!-- configurazione del plugin -->13 </configuration>14 <dependencies>15 <!-- dipendenze da aggiungere durante l’esecuzione -->16 </dependencies>17 </plugin>18 </plugins>19 </build>20 </project>

Oltre alla configurazione del plugin, nel progetto vanno inseriti file contenentile strutture dati con cui operare. Si tratta di fornire i descrittori dei multilayerperceptron che si vogliono addestrare e gli esempi da utilizzare durante le fasidi addestramento e di test. La disposizione di tali file segue la convenzione7 dilayout di un progetto Maven: i file contenenti il codice dell’applicativo vannocollocati, a partire dalla root del progetto, nella cartella

src/main/source-type/

7 I parametri sono modificabili, tuttavia si incoraggia a mantenere la configurazionepredefinita come vuole il paradigma Convention over Configuration.

17

Page 18: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Project root

pom.xml

src

main

examples

examples-set-1.json

examples-set-2.json

multilayer-perceptron

network-a.json

network-b.json

network-c.json

test

examples

examples-set-3.json

examples-set-4.json

examples-set-5.json

Figura 4: possibile disposizione dei file all’interno di un progetto di multilayerperceptron; nell’esempio il loro contenuto e interpretato come json in quanto ilmarshaller di default del plugin fa uso di tale formato

mentre per i test in

src/test/source-type/

La cartella da cui il plugin recupera i descrittori per le reti neurali daaddestrare e multilayer-perceptron, mentre gli esempi sono cercati inexamples, sia nell’albero main che in quello di test. Un esempio di disposizio-ne dei file in un progetto per multilayer perceptron e rappresentato in Figura 4.

4.2 Addestramento

Il primo dei due goal definiti dal plugin e train. Il suo compito e caricarela struttura del multilayer perceptron e gli esempi per fornirli all’algoritmo diaddestramento, dopodiche persistere la nuova struttura con i pesi modificati.

La configurazione del goal di addestramento viene letta dal pom a partiredal tag <trainingMethod>. Qui vengono specificati il tipo di algoritmo dautilizzare, i suoi parametri e i collaboratori.

18

Page 19: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Listing 2: configurazione del servizio di training in cui vengono specificati tipoe parametri dell’algoritmo e quali collaboratori utilizzare; tra questi la funzioned’errore e il logger

1 <configuration>2 <trainingMethod>3 <name>batchBackPropagation</name>4 <configuration>5 <learningRate>0.001</learningRate>6 <momentum>0.5</momentum>7 <tolerance>0.1</tolerance>8 <maximumIterations>1000</maximumIterations>9 </configuration>10 <collaborators>11 <collaborator>12 <role>errorFunction</role>13 <name>meanSquaredError</name>14 </collaborator>15 <collaborator>16 <role>logger</role>17 <name>maven</name>18 </collaborator>19 </collaborators>20 </trainingMethod>21 ...22 </configuration>

4.3 Test

Il secondo goal test carica un multilayer perceptron addestrato precedente-mente da target/multilayer-perceptron/ e un insieme di esempi pervalutarne il livello di generalizzazione raggiunto dalla rete neurale. Di ogniesempio viene calcolato l’output e confrontato con quello atteso: il test passase l’errore, calcolato con una funzione impostata, non supera una certa sogliaprestabilita. Al termine viene dato un resoconto del numero di test passati efalliti.

Nonostante vi siano similitudini con i test unitari, la fase di test per un mul-tilayer perceptron non prevede il fallimento della build in quanto generalmenteci si aspetta un certo numero di esempi non riconosciuti.

Allo stesso modo del goal di addestramento, quello di test recupera dal pomla propria configurazione a partire dal tag <test>.

Listing 3: configurazione del servizio di test con specificati la sua tipologia eil logger da utilizzare

1 <configuration>2 ...3 <test>4 <name>errorFunctio</name>5 <configuration>6 <tolerance>0.1</tolerance>7 </configuration>8 <collaborators>9 <collaborator>10 <role>errorFunction</role>11 <name>meanSquaredError</name>12 </collaborator>13 <collaborator>14 <role>logger</role>15 <name>maven</name>16 </collaborator>17 </collaborators>18 </test>19 </configuration>

19

Page 20: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

4.4 Rappresentazione di multilayer perceptron

Per descrivere un’istanza di multilayer perceptron e stata definita una strutturadati versatile capace di rappresentare le informazioni con il massimo livello didettaglio ed avere un formato conciso nel caso piu generico. Ad esempio epossibile definire una funzione di attivazione diversa per ogni neurone, oppurespecificarne una sola per tutta la rete neurale, o ancora applicare certe funzionidi attivazione solo ad alcuni neuroni mentre ai rimanenti viene assegnata quellaglobale.

4.4.1 Funzioni di attivazione

L’entita base della struttura e il servizio generico, inteso come funzione diattivazione o come collaboratore. Un servizio e definito da tre parametri:

nameIl nome del servizio rappresentato come stringa.

configurationUna mappa di stringhe contenente i parametri che costituiscono i dati delservizio. Puo non essere specificata se non vi sono parametri o se il servizioprevede dei valori predefiniti.

collaboratorsUna mappa che associa ricorsivamente altri oggetti di questo a dei ruoli,come per la configurazione puo essere omessa.

Listing 4: definizione di una tangente iperbolica traslata nel tempo di 1

1 {2 "name": "shift",3 "configuration": {4 "shift": "1.0"5 },6 "collaborators": {7 "inner": {8 "name": "tanh"9 }10 }11 }

4.4.2 Neuroni

Il componente fondamentale di un multilayer perceptron e il neurone, definitoattraverso i parametri:

functionEntita di tipo servizio che rappresenta la funzione di attivazione del neu-rone. Se non specificata verra fatto riferimento ad una funzione definita aun livello superiore.

biasLivello di attivazione intrinseco del neurone che si somma alle sollecitazionidalle sinapsi, nullo se non specificato.

20

Page 21: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

weightsLista di pesi delle sinapsi che collegano il neurone a quelli del layer pre-cedente. Se specificati la lunghezza della lista deve corrispondere con ladimensione del layer precedente, mentre se omessi sono considerati nulli.

4.4.3 Layer

I neuroni sono aggregati in layer, la dimensione dei quali e definita come ilnumero di neuroni contenuti. Il formato di un layer presenta due alternative:contenere le definizioni di ciascun neurone oppure specificare solo la propriadimensione. Nel secondo caso tutti i pesi dei neuroni sono considerati nulli ela funzione di attivazione e quella globale. L’entita che definisce un layer ecomposta dai parametri:

functionFunzione di attivazione globale da usare come default per tutti i neuronicontenuti nel layer.

neuronsUna lista contenente le entita dei neuroni che vanno a comporre il layer.

sizeSpecifica direttamente il numero di neuroni contenuti, attribuendogli pesinulli e funzione di attivazione globale. Se specificato assieme alla listadi neuroni del punto precedente, il parametro viene ignorato in favore diquello contenente maggiori dettagli.

4.4.4 Multilayer perceptron

Infine l’entita di piu alto livello e il multilayer perceptron. Anche qui vi sonodue formati alternativi: uno consente di specificare ciascun layer mentre l’altropermette di indicare unicamente le loro dimensioni. L’entita espone i seguentiparametri:

functionFunzione di attivazione globale da usare dove ne il neurone ne il layer chelo contiene ne abbiano specificata una.

sourcesNumero di neuroni in ingresso, adibiti a ricevere la propria ativazione dasorgenti esterne. Interpreta il ruolo dell’input layer, anche se i suoi neuroninon possiedono una funzione di attivazione.

layersLista di layer che costituiscono il multilayer perceptron. Tutti i neuronidi un layer devono avere, dove specificate, un numero di sinapsi pari alladimensione del layer precedente, o del numero di sorgenti se si trattadel primo layer. La dimensione dell’ultimo layer definisce la dimensionedell’output del multilayer perceptron.

sizesLista di dimensioni che i layer devono avere, i cui neuroni hanno pesinulli e funzione di attivazione globale. Se specificato assieme alla lista di

21

Page 22: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

layer del punto precedente, il parametro viene ignorato in favore di quellocontenente maggiori dettagli.

In seguito e riportato un documento json contenente un multilayer percep-tron descritto usando la forma estesa della struttura dati, specificando i dettaglidi tutti i neuroni che lo compongono.

Listing 5: multilayer perceptron addestrato per riconoscere la funzionebooleana xor

1 {2 "sources": 2,3 "layers": [4 {5 "neurons": [6 {7 "function": { "name": "tanh" },8 "bias": -1.1656643239012312,9 "weights": [0.8590827611395182, 0.8583199921043884]10 }, {11 "function": { "name": "tanh" },12 "bias": -0.4244875431029639,13 "weights": [1.7354223753836655, 1.7325046953575243]14 }15 ]16 }, {17 "neurons": [18 {19 "function": { "name": "tanh" },20 "bias": -0.6540816448579929,21 "weights": [-1.730661310571226, 1.6476378061166113]22 }23 ]24 }25 ]26 }

Quando interessa definire unicamente le dimensioni della rete neurale, adesempio per indicare la struttura della rete da addestrare, e possibile utilizzarela forma contratta.

Listing 6: multilayer perceptron formato da un hidden layer ed un outputlayer avente come funzione di attivazione per tutti i suoi neuroni la tangenteiperbolica

1 {2 "function": { "name": "tanh" },3 "sources": 2,4 "sizes": [2, 1]5 }

22

Page 23: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

5 Servizi

I componenti fondamentali su cui si appoggia l’architettura del plugin Maven permultilayer perceptron sono i servizi. Essi rappresentano singole unita funzionaliconfigurabili e componibili tra loro. In questo capitolo e mostrato il modo incui vengono istanziati programmaticamente e come definire nuovi servizi.

Per evitare che librerie di reti neurali artificiali dipendano dal plugin nel-l’esporre i propri oggetti come servizi, quest’ultimi non devono implementareo estendere alcun componente del framework. In questo modo pero ottenereinformazioni sulle loro caratteristiche e renderli utilizzabili e possibile solo at-traverso la costruzione di un layer che faccia da collante tra i servizi e il plugin.Le definizioni dei servizi sono quindi delegate a factory che si occupano di attri-buire loro un nome, un tipo, un insieme di parametri e dei ruoli di collaboratorida cui un servizio dipende.

5.1 Motivazioni

Esistono gia librerie e framework che si occupano dell’inizializzazione di applica-tion context, in cui gli oggetti di un’applicazione vengono composti in manieradichiarativa attraverso dependency injection e resi disponibili al suo avvio. Ilpiu famoso tra quelli in ambiente Java e il framework Spring8.

Nelle prime fasi del progetto, Spring e stato utilizzato per la creazione ecomposizione dei servizi, ma la configurazione del progetto risultava prolissa,complicata e troppo legata all’effettiva implementazione dei servizi. Era inoltreimpossibile definire dei collaboratori di default.

Come passaggio successivo sono state introdotte le factory, ma non e sta-to trovato un modo che permettesse al meccanismo di generazione di essereconfigurato in maniera semplice.

Infine si e optato per l’implementazione di una libreria dedicata al partico-lare problema di inizializzazione di oggetti avente come obiettivi la minimizza-zione della configurazione, da fornire all’application context per la generazionedi un servizio, e la semplicita di definizione delle factory, attraverso un mecca-nismo dichiarativo di dependency injection e la possibilita di definire parametrie collaboratori di default.

5.2 Identificazione e configurazione

Il tipo associato ad un servizio rappresenta la categoria a cui appartiene ed edefinito come il tipo restituito dalla sua factory. Puo quindi essere un’interfacciache la classe del servizio implementa, una superclasse o la classe stessa.

Per distinguere servizi dello stesso tipo, ad ognuno di essi e attribuito unnome. Un servizio viene quindi univocamente identificato dal suo nome e dalsuo tipo.

Prima di poter essere utilizzato, il servizio potrebbe richiedere un’inizializ-zazione con argomenti i cui valori vadano a formare il suo stato. Tali argomen-ti possono essere puri dati, come numeri e stringhe, oppure oggetti dotati dicomportamento le cui funzionalita sono usate dal servizio.

I parametri sono i nomi attribuiti ai dati richiesti per l’inizializzazione, ed uninsieme di associazioni parametro-valore va a formare la configurazione del ser-

8 Spring: http://spring.io/

23

Page 24: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

vizio. I collaboratori appartengono invece alla categoria di oggetti con compor-tamento, utilizzabili attraverso l’associazione di ciascuno con un ruolo. Questioggetti sono a loro volta servizi.

5.3 Descrizione gerarchica

La composizione di servizi forma una struttura gerarchica ad albero dove neinodi si collocano nome, tipo e parametri, mentre i ruoli sono rappresentati dallerelazioni genitore-figlio. Come foglie vi sono istanze di servizi con un livello diastrazione sufficientemente basso da non richiedere collaboratori. Con questadisposizione risulta semplice trasporre la gerarchia in un documento puramentedescrittivo.

In seguito e mostrato l’oggetto necessario ad una factory per istanziare econfigurare il servizio.

Listing 7: un descrittore di servizio contiene il suo nome oltre ad una suaconfigurazione e associazioni tra ruoli e altri descrittori di collaboratori

1 public class ServiceDescriptor {23 public final String name;4 public final Map<String, String> configuration;5 public final Map<String, ServiceDescriptor> collaborators;6 }

L’informazione riguardante il tipo e assente, poiche e la factory a determi-nare il tipo del servizio generato. Lo stesso vale per i tipi di eventuali colla-boratori: ottenendo dal descrittore unicamente il nome vengono completate leinformazioni richieste per identificarli univocamente.

5.4 Generazione di servizi

Il compito per una factory di un servizio e generare un’istanza dello stessoa partire da un oggetto descrittivo, del tipo mostrato precedentemente. Ladefinizione di factory prevede un unico metodo create che usa la descrizionefornita per istanziare un servizio.

Listing 8: una factory di servizi ha un unico metodo il cui compito e generareun’istanza a partire da un oggetto descrittore

1 public interface ServiceFactory<S> {23 S create(ServiceDescriptor service);4 }

Oltre ad applicare una configurazione, la factory deve interagire con altre perrichiedere la generazione dei collaboratori da iniettare nel servizio. Allo scopodi rendere implicita la richiesta di generare i collaboratori necessari ad altrefactory, e stato sviluppato un’application context che funga da intermediarioaggregando in un unico oggetto la funzionalita di generazione dei servizi.

Listing 9: application context che si occupa di generare servizi usando lefactory

1 public interface Context {23 <S> S generate(Class<S> serviceType, ServiceDescriptor service);45 <S> Map<String, ServiceFactory<S>> load(Class<S> serviceType);6 }

24

Page 25: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

L’application context puo quindi generare un servizio a partire dal suo tipoe da un descrittore che ne descriva la composizione,

Listing 10: esempio di generazione di un servizio attraverso l’applicationcontext

1 Context context = ...23 Map<String, String> configuration = ...4 Map<String, ServiceDescriptor> collaborators = ...5 ServiceDescriptor trainingMethodDescriptor = new ServiceDescriptor(6 "batchBackPropagation",7 configuration,8 collaborators9 );1011 MultilayerPerceptronTrainingMethod trainingMethod = context.generate(12 MultilayerPerceptronTrainingMethod.class,13 trainingMethodDescriptor14 );

Ciascuna factory necessita pero di un riferimento all’application context perpoter generare collaboratori, e deve esporre il nome e il tipo del proprio servizioin modo da poter essere recuperata quando richiesta. E stato quindi aggiuntoun meccanismo di definizione delle factory attraverso una particolare scritturadi metodi all’interno di classi di configurazione, per ridurre l’interazione espli-cita tra factory nell’istanziazione dei collaboratori. La definizione di serviziattraverso questo metodo e spiegata nella sezione successiva.

5.5 Definizione di servizi

Attraverso la classe CofigurationContext, implementazione di applicationcontext, la definizione delle factory assume una forma del tipo dell’esempio datonel listato sottostante.

Listing 11: definizione di factory per funzioni di attivazione

1 public class ActivationFunctionConfiguration implements Configuration {23 public ActivationFunction tanh() {4 return new HyperbolicTangent();5 }67 public ActivationFunction logistic() {8 return new LogisticFunction();9 }1011 public ActivationFunction scale(12 @Role("inner") ActivationFunction inner,13 @Parameter("scale")14 @Parser(ParseDouble.class) @Default("1.0") Double scale) {15 return new Scale(inner, scale);16 }1718 public ActivationFunction shift(19 @Role("inner") ActivationFunction inner,20 @Parameter("shift")21 @Parser(ParseDouble.class) @Default("0.0") Double shift) {22 return new Shift(inner, shift);23 }24 }

Le factory cosı dichiarate sono interpretate nel seguente modo:

• il tipo di servizio e rappresentato dal tipo restituito dal metodo;

• il nome corrisponde col nome del metodo;

• gli argomenti annotati con @Parameter vengono mappati in base al nomespecificato nell’annotazione;

25

Page 26: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

• gli argomenti annotati con @Role vengono popolati con un collaboratoredel tipo dell’argomento;

• se un argomento ha come tipo Context, in questo viene passato l’appli-cation context nel quale si trova la factory.

Inoltre e possibile specificare un valore da utilizzare nel caso il parametro nonsia presente nella configurazione attraverso l’annotazione @Default. Essendoi valori della configurazione unicamente stringhe, l’annotazione @Parser per-mette di convertire automaticamente la stringa in un oggetto specificando laclasse con cui effettuare la trasformazione.

Attraverso l’uso di annotazioni e definendo ciascuna factory come un singolometodo risulta piu chiaro quale sia la sua parametrizzazione e piu semplice lasua implementazione, lasciando all’application context il compito di istanziarei suoi collaboratori.

5.6 Pubblicazione delle factory

Uno dei punti di forza del plugin Maven per multilayer perceptron e la mo-dularita dei servizi di cui puo disporre. In seguito viene brevemente spiegatocome le factory di servizi possono essere rese disponibili al plugin durante la suaesecuzione.

5.6.1 Recupero delle configurazioni dal classpath

Vi sono diversi modi per caricare classi dal classpath conoscendo solo alcunedelle loro caratteristiche, come l’interfaccia implementata, un’annotazione o unparticolare pattern cotenuto nel nome della classe. Il plugin in particolare fauso della funzionalita fornita da ServiceLoader9, appartenente a libreriastandard Java. Per dichiarare dei servizi10 di un determinato tipo, si aggiungenel percorso META-INF/services/ del jar un file che abbia per nome quellocompleto della classe in questione, comprensivo del package in cui e contenuta.All’interno del file si possono specificare i nomi, sempre includendo il package diappartenenza, delle classi che implementano o estendono il suddetto tipo, conla restrizione che abbiano il costruttore vuoto.

Utilizzando il metodo load di ServiceLoader, passando come parametrola classe del servizio, viene restituita la sequenza delle istanze di tutte le classidichiarate all’interno del rispettivo file.

Le classi sviluppate seguendo la convenzione di ConfigurationContext,delle quali ogni metodo viene trasformato in factory, non hanno pero alcunelemento distintivo che le renda caricabili attraverso ServiceLoader. Nellalibreria dei servizi e stata definita appositamente l’interfaccia Configurationpensata per il ruolo di marker interface11, da far implementare a tutte le classi diconfigurazione che definiscono al loro interno metodi per factory. Si possono cosıesporre al ServiceLoader le classi di configurazione che si intende esportare.

9 Per maggiori informazioni sul funzionamento di ServiceLoader si consulti ladocumentazione Java.http://docs.oracle.com/javase/7/docs/api/java/util/ServiceLoader.html10 In questo caso il termine servizi non si rifrisce a quelli delle sezioni precedenti, ma alle

classi caricate attraverso ServiceLoader (in questo caso le factory).11 Una marker interface e un’interfaccia, solitamente priva di metodi, il cui scopo e aggiun-

gere metadati alla classe che la implementa. Il ruolo delle marker interface e stato in seguitopreso in carico dalle annotazioni, ma nella libreria standard sono ancora presenti. Ad esempiosono dei marker le interfacce Serializable e Cloenable.

26

Page 27: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Oltre a caricare tutte le implementazioni di Configuration, il plugin iniet-ta nel context di cui fa uso una sua classe di configurazione contenente factorystrettamente correlate al suo funzioamento. Ad esempio e presente come servizioun adapter per il logger di Maven.

5.6.2 Recupero delle librerie

Alcune librerie di reti neurali artificali di terze parti si trovano gia in MavenCentral. Prima che il plugin per multilayer perceptron raggiunga una maturitatale da poter essere caricato nel repository centrale, e possibile eseguirlo instal-landolo localmente12 o su un repository Nexus. Lo stesso vale per le librerie diservizi.

5.7 Organizzazione delle dipendenze per il plugin Mavenper multilayer perceptron

Per disaccoppiare il plugin Maven dalle implementazioni di servizi, le interfacce egli oggetti rappresentanti dati sono stati inseriti in librerie separate dall’artefattodel plugin. Inoltre sono stati divisi tra due librerie distinte, una per gli elementiriguardanti le definizioni generali di factory e servizi, l’altra contenente tipispecializzati per i multilayer perceptron. In questo modo viene resa disponibilel’astrazione dei servizi ad altre librerie e plugin per altre tipologie di reti neuraliartificiali.

Alle due librerie fanno riferimento anche tutti gli artefatti contenenti fac-tory. Questi possono contenere al loro interno le implementazioni dei servizi,come la libreria di built-in fornita col plugin per i servizi base, oppure essere diadattamento per librerie gia esistenti.

Nel descrittore di progetto, tra le dipendenze del plugin e sufficiente indicarel’artefatto contenente le factory, in quanto le dipendenze transitive sono risolteautomaticamente da Maven. E necessario pero che tutte le dipendenze sianoreperibili in almeno uno dei repository che si vanno ad utilizzare.

12 Clonando i sorgenti ed eseguendo il comando mvn install nella home del progetto.

27

Page 28: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

multilayerperceptronservices

services

multilayerperceptron

mavenplugin

multilayerperceptronbuiltins

Services andfactorieslibrary

Serviceadapters

and factories

Multilayerperceptron

library

Mavenframework

Maven components

Interfaces declarations

Library code

Figura 5: grafo delle dipendenze che mostra come gli artefatti del plugin, deiservizi generali e di quelli per multilayer perceptron si pongono tra una libreriadi reti neurali artificiali e framework Maven (le librerie sviluppate sono quelleevidenziate con doppio contorno)

28

Page 29: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

6 Risultati sperimentali

In questa sezione e riportato come sia stato eseguito l’addestramento di unmultilayer perceptron per il riconoscimento di lettere prounciate dell’alfabetoinglese. La rete neurale classifica una lettera attivando maggiormente uno tra isuoi 26 nodi di output, secondo l’ordine alfabetico.

I risultati ottenuti servono poi come riferimento per il paragone tra multilayerperceptron e le altre tipologie di reti utilizzate: Hidden Markov Model e seriedi Volterra.

6.1 Dominio di apprendimento

Gli esempi di lettere pronunciate sono divisi in un insieme di addestramentoe uno di test. In quello di addestramento sono presenti per ogni lettera 10pronunce effettuate dalla setssa persona. Sono presenti gli alfabeti pronunciatida 16 persone diverse, di cui 8 donne e 8 uomini, per un totale di 4.160 esempi.Nell’insieme di test vi sono le pronunce delle stesse persone, ma diverse da quelledell’insieme di addestramento e in numero di 16, per un totale di 6.656 esempi.

Alla rete neurale in questione non sono dati in input le ampiezze del segnalecampionato rappresentante la pronuncia di una lettera, ma ciascun esempioviene preprocessato come segue.

1. In primo luogo la registrazione viene troncata in testa e in coda perrimuovere le parti che non comprendono il segnale d’interesse.

2. Per omogenizzare la dimensione dei segnali, questi vengono espansi ocompressi per avere la durata di un secondo.

3. Come ultimo passaggio vengono estratti i coefficienti cepstrali di ciascunsegnale, suddividendolo in 50 frame e prendendo 12 coefficienti per frame,per un totale di 600 coefficienti cepstrali per segnale.

Il vettore contenente i 600 coefficienti cepstrali e infine utilizzato come esem-pio per l’addestramento o per il test del multilayer perceptron, inserito all’in-terno del progetto in formato json.

6.2 Scelta della funzione d’errore

In un articolo, A. Waibel introduce una funzione d’errore che piu si adattaal riconoscimento di un dato insieme di suoni rispettio alla classica funzionedi errore MSE13. Il MSE compara i livelli di attivazione dell’output della reteneurale con quelli di un insieme ideale di attivazioni per un dato stimolo in input.L’obiettivo in questo caso e minimizzare ciascuna differenza per raggiungere lacorrispodenza tra attivazioni dell’output e quelle ideali.

La funzione introdotta, chiamata Classification Figure of Merit (CFM), usainvece le attivazioni ideali solo per identificare il nodo di output corrispondentecon la classificazione corretta. La funzione CFM cerca quindi di massimizzarela differenza tra l’attivazione del nodo corretto e quelle di tutti gli altri nodi.

13 Errore quadratico medio, dall’Inglese Mean Squared Error.

29

Page 30: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

La funzione CFM e definita come

CFM =1

N − 1·N∑n=1n 6=c

α

1 + e−(β∆n−γ)(13)

dove

• ∆n = Oc −On

• Oc e il livello di attivazione del nodo relativo alla corretta classificazionec (1 per a, 2 per b, ecc. . . )

• On e il livello di attivazione del nodo n relativo ad una classificazionesbagliata

• N e il numero di classi (in questo caso le 26 lettere dell’alfabeto inglese)

• α e l’ampiezza della sigmoide

• β e la rapidita con cui la sigmoide cresce, detta anche discontinuita dellasigmoide

• γ e il ritardo della sigmoide, che causa uno scostamento laterale del graficoverso destra quando positivo

Le derivate parziali rispetto all’output, necessarie per il metodo di discesadel gradiente, sono date da

∂CFM

∂On=−αβN − 1

· yn(1− yn) (14)

∂CFM

∂Oc=

αβ

N − 1·N∑n=1n 6=c

yn(1− yn) (15)

dove yn e la sigmoide

yn =1

1 + e−(β∆n−γ)(16)

Poiche l’obiettivo della funzione CFM e massimizzare la differenza tra livellodi attivazione del nodo corretto e quelli dei restanti nodi, va utilizzata invertendola variabile ∆n affinche porti a scendere anziche salire lungo il gradiente.

La funzione CFM cosı definita e monotona solo per N = 2, mentre per N ≥ 3e necessario applicare una modifica, ponendo

CFMM = CFMn(min ∆n) (17)

doveCFMn(∆) =

α

1 + e−(β∆n−γ)(18)

che rende la funzione monotona per output di dimensione maggiore di due, mariduce la rapidita della ricerca del minimo in quanto produce un gradiente dimagnitudine minore rispetto all’Equazione 13.

30

Page 31: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

6.3 Topologia del multilayer perceptron

La dimensione dell’input layer e quella corrispondente al numero di coefficienticepstrali calcolati per ciascun esempio, ovvero 600. L’output layer contiene 26nodi, ognuno associato ad una lettera dell’alfabeto inglese.

Le quantita di hidden layer e le loro rispettive dimensioni sono state ottenuteper prove successive, e i risultati di maggior generalizzazione sono stati ottenutiutilizzando un multilayer perceptron con due hidden layer rispettivamente di140 e 80 neuroni.

Listing 12: topologia finale del multilayer perceptron

1 {2 "function":{"name":"tanh"},3 "sources":600,4 "sizes":[140,80,26]5 }

Per l’addestramento e stato usato l’algoritmo di batch back propagation, coni parametri contenuti nella seguente configurazione.

Listing 13: parametrizzazione dell’addestramento

1 <configuration>2 <trainingMethod>3 <name>batchBackPropagation</name>4 <configuration>5 <learningRate>0.005</learningRate>6 <tolerance>0.15</tolerance>7 <momentum>0.5</momentum>8 <maximumIterations>1000</maximumIterations>9 </configuration>10 <collaborators>11 <collaborator>12 <role>errorFunction</role>13 <name>classificationFigureOfMerit</name>14 </collaborator>15 <collaborator>16 <role>logger</role>17 <name>maven</name>18 </collaborator>19 </collaborators>20 </trainingMethod>21 <test>22 <name>maximumActivation</name>23 <collaborators>24 <collaborator>25 <role>logger</role>26 <name>maven</name>27 </collaborator>28 </collaborators>29 </test>30 </configuration>

6.4 Risultati dell’addestramento

La funzione di test usata verifica quale sia il nodo col livello di attivazionepiu alto, determinando un successo se e quello associato alla lettera corretta.Il multilayer perceptron col quale si e raggiunto il maggior numero di esempiriconosciuti ne ha classificati correttamente 4.525 su 6.586, circa il 68.72%.14

In seguito si riportano i dati per le singole lettere.

14 Il numero di esempi di test e minore di quello riportato in precedenza in quanto alcuni filesono mancanti ed altri hanno causato errori nel processo di estrazione dei coefficienti cepstrali.

31

Page 32: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z0 %

10 %

20 %

30 %

40 %

50 %

60 %

70 %

80 %

90 %

100 %P

erce

ntu

ale

di

clas

sifi

cazi

oni

corr

ette

Nella Tabella 1 e riportata invece la matrice di confusione di questa reteneurale.

32

Page 33: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

AB

CD

EF

GH

IJ

KL

MN

OP

QR

ST

UV

WX

YZ

A17

61

10

10

126

05

34

00

01

00

00

30

23

00

0B

380

053

230

31

00

10

00

022

00

014

151

20

00

C4

2215

74

40

79

01

00

01

015

00

08

011

00

110

D0

321

7132

011

20

00

00

10

12

00

024

052

20

014

E0

70

917

70

93

00

00

00

012

00

031

03

01

00

F0

00

00

193

00

11

17

02

00

21

25

20

02

19

00

G2

51

1721

013

86

05

00

03

012

40

029

02

00

08

H30

40

04

00

196

01

50

00

00

00

61

02

13

00

I0

00

01

01

0248

00

00

00

00

10

00

01

03

0J

110

00

00

105

0159

50

10

30

01

00

20

24

50

1K

490

00

01

418

138

128

00

10

10

03

20

04

40

0L

00

00

00

00

10

0238

40

70

10

00

00

00

00

M0

00

00

00

00

30

12

170

60

00

12

10

00

20

00

N4

00

00

11

00

10

342

186

00

42

30

00

20

10

O0

00

01

00

03

00

30

0244

00

00

00

01

00

0P

313

014

500

910

00

30

02

093

30

238

112

10

00

Q0

02

01

06

10

00

42

30

1203

03

225

00

00

0R

00

00

00

00

70

02

10

00

0239

00

00

00

40

S0

10

10

260

60

02

60

13

50

0182

70

02

10

00

T1

242

1053

034

12

00

20

10

023

20

178

06

50

02

U0

00

03

05

00

00

03

20

019

00

1219

00

00

1V

126

042

120

64

00

00

00

017

00

010

0127

00

08

W1

00

00

01

21

10

10

01

00

00

01

3237

01

0X

00

10

014

07

00

70

05

00

00

28

00

00

194

00

Y0

00

00

00

02

00

00

01

00

20

00

00

0250

0Z

310

68

50

910

01

20

00

112

10

011

031

10

0143

Tab

ella

1:m

atri

ced

ico

fusi

one

che

mos

tra

ilnu

mer

od

ile

tter

ecl

ass

ifica

ted

al

mu

ltil

ayer

per

cep

tron

inb

ase

all

ale

tter

ap

ronu

nci

ata

data

inin

pu

t;le

righ

ein

dic

ano

lale

tter

ad

iin

pu

tm

entr

ele

colo

nn

equ

ella

inou

tpu

t

33

Page 34: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

7 Modelli di Markov nascosti (HMM)

Il metodo statistico maggiormente utilizzato per caratterizzare le proprieta spet-trali dei segnali acustici, in particolare vocali, e il modello di Markov nascosto(HMM, dall’inglese Hidden Markov Model). L’idea su cui si fonda l’uso di unsistema statistico, di questo o di altro tipo, e che i segnali possano essere op-portunamente modellizzati da un processo parametrico casuale, i cui parametripossano essere stimati con una certa precisione.

7.1 Introduzione ai processi stocastici

Per la classificazione di sorgenti sonore, mediante l’analisi di segnali divisi inblocchi, e possibile utilizzare i processi stocastici tempo discreti. In quest’ambitoil modello piu semplice e rappresentato dai processi di Markov, da cui gli HMMderivano.

Processi di Markov tempo discreti

Si consideri un sistema descrivibile, ad ogni istante, con lo stato in cui si trova, cisiano N stati distinti {1, 2, . . . , N}. Ad istanti di tempo regolarmente spaziati, ilsistema subisce un cambiamento di stato (ma puo esser preso in considerazioneanche il caso che rimanga nello stesso) in accordo ad un insieme di probabilitaassociate allo stato di partenza. Gli istanti di tempo associati alle variazionidi stato possono essere indicati con t = 1, 2, . . . e lo stato attuale al tempot con qt. Una descrizione probabilistica completa del sistema richiederebbe laspecificazione dello stato corrente e di tutti quelli precedenti. Nel caso chequesta descrizione possa venir troncata allo stato presente e ad un solo statoprecedente, il sistema prende il nome di catena o processo di Markov discretodel primo ordine. In altri termini:

P [qt = j|qt−1 = i, qt−2 = k, . . . ] = P [qt = j|qt−1 = i] (19)

Inoltre considerando i soli processi dove il secondo membro dell’equazione 19 eindipendente dal tempo, si arriva ad un insieme di probabilita di transizione distato aij della forma:

aij = P [qt = j|qt−1 = i] con 1 ≤ i, j ≤ N (20)

e che soddisfano alle seguenti proprieta:

aij ≥ 0 ∀i, j e

N∑j=1

aij = 1 ∀i (21)

in quanto obbediscono alle costrizioni stocastiche standard. Il processo stoca-stico visto puo essere chiamato modello di Markov osservabile, in quanto la suauscita coincide con lo stato al particolare istante di tempo, ed ogni stato cor-risponde ad un evento osservabile. In figura 6 viene riportato l’esempio di unacatena di Markov a 4 stati.

34

Page 35: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

1

2

3

4a11

a14

a41

a13a33

a32a21

a22

Figura 6: Catena di Markov a 4 stati

Modelli di Markov nascosti (HMM)

Finora si sono considerati modelli di Markov nei quali ogni stato corrispon-deva ad un evento osservabile; questi processi risultano inadatti ai fini dellamodellizzazione di molti problemi di interesse pratico. Risulta quindi neces-sario estendere la trattazione per includere il caso nel quale l’osservazione euna funzione probabilistica dello stato, cioe il modello risultante e un processodoppiamente stocastico. In questi casi vi sono due processi, uno visibile ed unonascosto, che puo essere osservato solo attraverso un altro insieme di processistocastici che producono la sequenza di osservazione.

EsempioUn classico esempio usato per spiegare la definizione dei modelli di Markovnascosti e il modello ad urne e palline. Ci siano N urne in una stanza, con-tenenti un grande numero di palline colorate, e siano M i colori distinti che lepalline possono assumere. Si puo pensare che il processo fisico per ottenere leosservazioni sia il seguente:

1. Con una procedura casuale viene scelta un’urna e da tale urna vieneprelevata una pallina a caso. Il colore e registrato come osservazione.

2. La pallina viene rimessa nell’urna e, a meno che non si voglia terminarecosı le osservazioni, si ripete il passo 1.

Questo processo genera una sequenza finita di colori che si possono pensare comel’uscita di un HMM. Un possibile HMM che modellizza il sistema urne-pallinee quello nel quale ogni stato corrisponde ad una specifica urna e, ad ogni stato,sono associate tante probabilita quanti sono i colori che la pallina puo assume-re. Siccome e possibile ritrovare gli stessi colori in tutte la urne a disposizione,l’unica differenza e la quantita di palline presenti relativamente ai vari colori.Un’osservazione isolata di una particolare pallina colorata non dice nulla sul-l’urna da cui e stata estratta, ma e possibile fare delle ipotesi probabilistiche.Si puo pensare ad un esperimento in cui una persona estrae una serie di pallinedalle urne, scegliendo quest’ultime a caso di volta in volta, e annota il coloredelle palline, ma non le urne dalle quali vengono estratte. Dai dati registrati

35

Page 36: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

sarebbe possibile indovinare, in termini probabilistici, la sequenza con la qua-le sono state scelte le urne. Sarebbe, cioe, possibile estrarre informazioni sulprocesso nascosto “scelta dell’urna” tramite il processo osservabile “estrazionedella pallina colorata”.

FormalizzazioneL’esempio visto da un’idea di cosa sia un HMM e di come possa essere applicatoad alcune semplici situazioni. Un modello di Markov nascosto, per osservazionidi simboli discreti, e caratterizzato dai seguenti aspetti:

• N , il numero di stati del modello. Sebbene gli stati siano nascosti, permolte applicazioni pratiche vi e un significato fisico attribuito agli stati oagli insiemi di stati del modello. Solitamente gli stati sono interconnessi inmodo tale che qualsiasi stato possa essere raggiunto da qualsiasi altro. Cisono comunque altre possibili connessioni interessanti anche nel campo delriconoscimento vocale. I singoli stati si possono indicare con {1, 2, . . . , N}e lo stato al tempo t con qt.

• M , il numero di simboli distinti d’osservazione per stato. I simboli d’osser-vazione corrispondono all’uscita fisica del sistema che viene modellizzato.I simboli individuali si possono denotare con V = {v1, v2, . . . , vM}.

• A = {aij}, l’insieme delle probabilita delle transizioni di stato, dove aij =P [qt+1 = j|qt = i] con 1 ≤ i, j ≤ N . Nel caso particolare in cui ognistato e raggiungibile da ogni altro in un singolo passo (modello ergodico),avremo aij > 0 ∀i, j. Per altri tipi di HMM avremo aij = 0 per una opiu coppie i, j.

• B = {bj(k)}, l’insieme delle distribuzioni di probabilita dei simboli d’os-servazione, dove bj(k) = P [Ot = vk|qt = j] e la probabilita che lo stato jproduca il simbolo k.

• π = {πi}, la distribuzione dello stato iniziale, dove πi = P [q1 = i] con1 ≤ i ≤ N .

Si osserva quindi che, per una completa descrizione di un HMM, e necessa-rio specificare i parametri N e M , dire quali sono i simboli di osservazione especificare i tre insiemi di distribuzione della probabilita A,B, π. Per indicareappropriatamente un modello e possibile utilizzare una notazione compatta deltipo λ = (A,B, π).

Dati tutti i parametri che lo caratterizzano, un HMM puo essere visto comeun generatore che fornisce una sequenza di osservazione O = (o1, o2, . . . , oT ),dove ot e uno dei simboli dell’insieme V , e T e il numero di osservazioni dellasequenza. La procedura di generazione puo essere schematizzata nei seguentipunti:

1. Scelta dello stato iniziale q1 in accordo con π.

2. Impostazione di t a 1.

3. Scelta di ot = vk in accordo alla bi(k).

4. Passaggio al prossimo stato secondo le aij .

36

Page 37: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

5. Se t < T , allora incremento di t e ritorno al passo 3, altrimenti fine dellaprocedura.

Tale procedura puo essere usata anche come modello, per comprendere comeuna data sequenza di osservazione sia stata generata.

7.2 I tre problemi principali degli HMM

Per l’utilizzo pratico degli HMM sorgono tre problemi basilari da risolvere:

1. Data la sequenza di osservazione O = (o1, o2, . . . , oT ) e un modello λ =(A,B, π), com’e possibile calcolare efficientemente la quantita P (O|λ), cioela probabilita che la sequenza O sia stata prodotta dal modello λ?

2. Data la sequenza di osservazione O = (o1, o2, . . . , oT ) e un modello λ =(A,B, π), com’e possibile scegliere una corrispondente sequenza di statiq = (q1, q2, . . . , qT ) che sia ottima secondo certi criteri scelti?

3. Com’e possibile aggiustare i parametri del modello λ = (A,B, π) in mododa massimizzare P (O|λ), data una certa O?

7.2.1 Il primo problema

Calcolo diretto di P (O|λ)

Il metodo piu semplice e diretto per risolvere il primo problema e l’enu-merazione di tutte le possibili sequenze di stati di lunghezza T . Tuttaviail calcolo diretto di P (O|λ) richiede circa 2T NT operazioni. Tale calcolodiventa inaccessibile anche per piccoli valori di N ed e dunque necessariol’uso di procedure piu efficienti.

Forward-backward procedure

Un sistema efficace per il calcolo di P (O|λ) si basa sulla cosidetta procedurain avanti o forward procedure. Si puo definire una variabile forward nelseguente modo:

αt(i) = P (o1o2 . . . ot, qt = i|λ) (22)

Basandosi su questa definizione e possibile elaborare un algoritmo indut-tivo per il calcolo di P (O|λ):

1. Inizializzazione: α1(i) = π bi(o1) con 1 ≤ i ≤ N

2. Induzione: αt+1(j) =

[N∑i=1

αt(i) aij

]bj(ot+1)

con 1 ≤ t ≤ T − 1 e 1 ≤ j ≤ N

3. Conclusione: P (O|λ) =

N∑i=1

αT (i)

37

Page 38: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Backward procedure

Un’altra tecnica utilizzabile per il calcolo di P (O|λ) e basata sulla pro-cedura all’indietro o backward procedure. La variabile backward βt(i) edefinibile nel seguente modo:

βt(i) = P (ot+1ot+2 . . . oT |qt = i, λ) (23)

Data questa definizione, il procedimento ricorsivo per il calcolo di P (O|λ)puo essere impostato come segue:

1. Inizializzazione: βT (i) = 1 con 1 ≤ i ≤ N

2. Induzione: βt(i) =

N∑j=1

aij bj(ot+1)βt+1(j)

con t = T − 1, T − 2, . . . , 1 e 1 ≤ i ≤ N

3. Conclusione: P (O|λ) =N∑i=1

π bi(o1)β1(i)

Anche in questo caso l’ordine computazionale dell’algoritmo e di sole N2 Toperazioni.

7.2.2 Il secondo problema

Per il secondo problema non esiste una soluzione esatta, ma un ventaglio di pos-sibili risultati che dipendono dai criteri di ottimalita scelti. Il criterio piu usatoconsiste nel trovare la migliore sequenza di stati (percorso) ossia massimizzareP (q|O, λ), che e equivalente a massimizzare P (q,O|λ). Una tecnica formale pertrovare questa sequenza di stati, basata sulla programmazione dinamica, e l’al-goritmo di Viterbi.

7.2.3 Il terzo problema

Il terzo e di gran lunga il piu difficile problema degli HMM e la determinazionedi un metodo per ricalcolare i parametri del modello λ = (A,B, π), con lo scopodi massimizzare P (O|λ). Non esiste nessun metodo per trovare analiticamentel’insieme dei parametri del modello, in modo da massimizzare in forma strettala probabilita della sequenza di osservazione partendo da un insieme finito didati di addestramento. E possibile, invece, scegliere un modello λ = (A,B, π)tale che la probabilita P (O|λ) sia massimizzata localmente. Un metodo di ot-timizzazione utilizzabile e noto come algoritmo di Baum-Welch ed e un proce-dimento iterativo che ristima i parametri del modello usando la minimizzazionedel gradiente.

Le formule per la ristima dei parametri di un HMM, sono:

πj = γ1(j) (Frequenza attesa dello stato j all’istante t = 1) (24)

38

Page 39: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

aij =Numero atteso di transizioni dallo stato i allo stato j

Numero atteso di transizioni dallo stato i=

T−1∑t=1

ξt(i, j)

T−1∑t=1

γt(i)

(25)

bj(k) =Frequenza attesa dello stato j e simbolo vk

Frequenza attesa dello stato j=

∑t:ot=vk

γt(j)

T∑t=1

γt(j)

(26)

dove

ξt(i, j) =P (qt = i, qt+1 = j,O|λ)

P (O|λ)=αt(i) aij bj(ot+1)βt+1(j)

P (O|λ)

=αt(i) aij bj(ot+1)βt+1(j)

N∑i=1

N∑j=1

αt(i) aij bj(ot+1)βt+1(j)

(27)

e

γt(i) =

N∑j=1

ξt(i, j) (28)

Utilizzando iterativamente la procedura descritta, usando λρ al posto diλ e ripetendo il calcolo delle restime, e possibile migliorare P (O|λ) fino alraggiungimento del punto limite.

7.3 Risultati sperimentali

L’addestramento di un modello di Markov discreto, utilizzando 8 stati, ha datocome risultato la capacita di classificazione riportata nel successivo grafico.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z0 %

10 %

20 %

30 %

40 %

50 %

60 %

Per

centu

ale

di

clas

sifi

cazi

oni

corr

ette

Nella Tabella 2 e riportata la matrice di confusione del HMM addestrato.

39

Page 40: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

AB

CD

EF

GH

IJ

KL

MN

OP

QR

ST

UV

WX

YZ

A68

23

14

013

1112

20

34

37

42

32

05

11

233

120

4B

324

322

270

143

419

33

71

011

20

116

915

41

13

24

C26

591

424

02

03

15

44

15

43

10

41

13

30

25

18

D5

183

3030

211

23

14

55

80

016

20

09

911

43

05

25

E11

310

1769

014

13

10

73

43

019

21

217

36

26

05

20

F16

22

12

571

611

917

21

912

52

40

27

27

222

711

1G

43

714

200

664

315

13

82

10

71

00

68

156

12

14

H47

22

08

19

426

19

30

10

64

03

22

51

31

25

012

16

I12

012

12

06

088

26

211

55

90

63

10

21

13

438

9J

322

33

31

124

457

39

64

20

42

110

03

328

025

8K

413

52

70

54

10

13

72

74

10

33

018

05

127

019

6L

1210

21

170

81

221

17

124

14

52

30

21

50

12

12

3M

124

51

110

12

15

12

68

73

32

33

10

02

30

46

17

8N

150

10

103

41

820

44

15

100

03

10

42

21

23

025

10

O13

11

413

03

21

611

23

15

115

24

61

01

11

310

46

P12

48

1834

011

33

18

11

65

30

32

31

019

82

37

02

16

Q9

12

16

11

16

64

12

110

06

47

03

455

155

214

8R

30

115

30

213

32

74

414

46

1118

21

32

90

039

S30

218

00

111

35

97

10

112

14

09

283

04

05

11

19

0T

57

1116

290

197

420

12

84

40

16

41

028

11

328

04

15

U15

00

213

02

19

13

64

310

05

00

20

105

058

04

4V

521

216

180

102

816

84

25

15

10

013

335

55

07

19

W11

35

18

00

11

23

46

05

09

40

14

72

145

16

9X

132

41

617

68

13

16

11

21

80

32

41

35

45

118

38

13

6Y

132

14

91

83

811

15

24

29

91

61

02

50

41

114

3Z

78

146

110

74

416

56

27

30

11

214

319

20

15

91

Tab

ella

2:m

atri

ced

ico

fusi

one

che

mos

tra

ilnu

mer

od

ile

tter

ecl

ass

ifica

ted

al

HM

Min

base

all

ale

tter

ap

ronu

nci

ata

data

inin

pu

t;le

righ

ein

dic

ano

lale

tter

ad

iin

pu

tm

entr

ele

colo

nn

equ

ella

inoutp

ut

40

Page 41: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

8 Volterra vs. NN

In un sistema lineare, si puo sempre definire una risposta impulsiva h(t) cherelaziona, tramite un integrale di convoluzione, il segnale di ingresso x(t) con ilsegnale di uscita y(t):

y(t) =

∫ +∞

−∞h(τ)x(t− τ)dτ (29)

Naturalmente questo viene interpretato nel seguente modo: l’uscita y(t) e da-ta dalla composizione degli effetti dell’ingresso x(t) in tutti gli istanti precedenti,pesati tramite una funzione peso h(t) denominata risposta impulsiva.

Nel caso di sistemi non lineari, Norbert Wiener penso di estendere la pre-cedente relazione utilizzando la serie funzionale di Volterra, ovvero esprimendol’uscita y(t) come una serie di funzioni (integrali):

y(t) =

∫ +∞

−∞h1(τ)x(t− τ)dτ+

∫ ∫ +∞

−∞h2(τ1, τ2)x(t− τ1)x(t− τ2)dτ1dτ2+∫ ∫ ∫ +∞

−∞h3(τ1, τ2, τ3)x(t− τ1)x(t− τ2)x(t− τ3)dτ1dτ2dτ3 + . . . (30)

Questa serie, detta ‘serie di Volterra’, converge alla soluzione sotto ipotesi nor-malmente verificate. Le funzioni hn(dτ1, dτ2, ..., dτn) possono essere viste comele risposte impulsive non lineari di ordine n e vengono chiamate Nuclei (kernel)di Volterra. L’espansione a tempo discreto e memoria limitata diventa percio:

y(t) =

+∞∑−∞

h1(l)x(t− l)+

+∞∑−∞

+∞∑−∞

h2(l1, l2)x(t− l1)x(t− l2)+

+∞∑−∞

+∞∑−∞

+∞∑−∞

h3(l1, l2, l3)x(t− l1)x(t− l2)x(t− l3) + . . . (31)

Consideriamo ora un neurone artificiale feedforward time delay. Per sem-plificare consideriamo una rete con cinque ingressi. Se rappresentiamo la nonlinearita con una sigmoide, allora g(x) = (1 + e−x)−1. Se la rappresentia-

mo con la tangente iperbolica, allora g(x) = ex−e−x

ex+e−x . In ogni caso, abbiamo

y(n) = g(∑4i=0 wix(n− i)). Introduciamo ora una approssimazione polinomiale

della nonlinearita. Si puo verificare che una buona approssimazione polinomialetra -4 e 4 e data da un polinomio di terzo grado: g(x) ≈ a3x

3 +a2x2 +a1x+a0.

Quindi:y(n) = a3[

∑4i=0 wix(n− i)]3 +a2[

∑4i=0 wix(n− i)]2 +a1[

∑4i=0 wix(n− i)]+a0 =

a3

∑4i

∑4j

∑4k wiwjwkx(n− i)x(n− j)x(n− k) + a2

∑4i

∑4j wiwjx(n− i)x(n−

j) + a1

∑4i wix(n − i) + a0 che e una serie discreta di Volterra non lineare nei

coefficienti.

41

Page 42: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Figura 7: Neurone artificile

Lo stesso tipo di approssimazione si ha quando consideriamo una intera reteneurale, visualizzata nella seguente figura. Naturalmente ogni nodo della figurarappresenta una sommatoria e una nonlinearita.

Figura 8: Semplice rete neurale time delayed

Questa rete e descritta dalle relazioni:

y(n) = f [∑i

qi5zi(n)]

zj(n) = f [∑i

wijx(n− i)]

Assumiamo ora che non ci sia nonlinearita sull’ultimo neurone ma solo sullostrato intermedio. Allora le equazioni diventano:

y(n) =∑j

qj5zj(n)

42

Page 43: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

zj(n) = f [∑i

wijx(n− i)] =

= a3[∑i

wijx(n− i)]3 + a2[∑i

wijx(n− i)]2 + a1

∑i

wijx(n− i) + a0 =

= a3

∑i

∑k

∑l

wijwkjwljx(n−i)x(n−k)x(n−l)+a2

∑i

∑k

wijwkjx(n−i)x(n−k)+

+a1

∑i

wijx(n− i)

Quindi:

y(n) =∑j

qj5zj(n) =∑j

qj5a3

∑i

∑k

∑l

wijwkjwljx(n− i)x(n− k)x(n− l)+

+∑j

qj5a2

∑i

∑k

wijwkjx(n− i)x(n− k) +∑j

qj5a1

∑i

wijx(n− i) =

=∑i

∑k

∑l

∑j

qj5a3wijwkjwljx(n− i)x(n− k)x(n− l)+

+∑i

∑k

∑j

qj5a2wijwkjx(n− i)x(n− k) +∑i

∑j

qj5a1wijx(n− i) (32)

In conclusione, Il calcolo della rete neurale di Figura 8 equivale approssima-tivamente al calcolo di una serie discreta di Volterra del terzo ordine. La seriedi Volterra non puo essere tuttavia usata per stimare i pesi della rete. Tuttaviase si inglobano i coefficienti e si stimano con una tecnica adattativa, il risultatodovrebbe essere lo stesso. Il vantaggio e che la stima dei coefficienti della serie diVolterra e velocissima nel caso che si consideri una serie lineare nei coefficienti.

Per provare quanto detto, e stato realizzato un sistema come illustrato nellaseguente figura.

Figura 9: Sistema adattativo realizzato

43

Page 44: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Il sistema e stato provato nel contesto del riconoscimento delle lettere del-l’alfabeto pronunciate a voce. Per motivi di tempo e stata fatta una provalimitata ad alcune lettere. Inoltre e stata provata una serie di Volterra del se-condo ordine, non del terzo. In sintesi, l’uso del sistema e stato il seguente: perogni lettera e stata stimata una serie di Volterra fornendo in ingresso il segnalecorrispondente alla lettera e un segnale desiderato pari a 1. In questo modoi coefficienti della serie venivano stimati in modo tale da fornire in uscita unvalore elevato, mentre per tutte le altre lettere veniva fornito un segnale nega-tivo. Pur nel contesto molto limitato che e stato provato, i risultati sono statile seguenti percentuali di riconoscimento delle lettere.

A B C D E F G H0 %

10 %

20 %

30 %

40 %

50 %

60 %

Per

centu

ale

di

clas

sifi

cazi

oni

corr

ette

44

Page 45: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

9 Conclusioni

Non tutti gli obiettivi citati nell’introduzione della tesi sono stati raggiunti. Deitre plugin preventivati, solo quello per multilayer perceptron e stato portato atermine e di quello per HMM e stata implementata una versione incompleta.Gli addestramenti su HMM e serie di Volterra sono stati eseguiti attraversoun’implementazione in C dei relativi algoritmi di addestramento.

9.1 Risultati ottenuti

Il modello di multilayer perceptron si e rivelato essere superiore, come qua-lita della classificazione, a quello di Hidden Markov Model. I risultati sonocomparati nel seguente grafico.

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z0 %

10 %

20 %

30 %

40 %

50 %

60 %

70 %

80 %

90 %

100 %

Per

centu

ale

di

clas

sifi

cazi

oni

corr

ette

Multilayer PerceptronHidden Markov Model

Il lavoro riguardante i sistemi volterriani necessita ancora di approfondimentiche, per motivi di tempo, non si sono potuti portare a termine.

9.2 Vantaggi dovuti all’uso di Maven

Il plugin sviluppato ha semplificato il processo di addestramento di multilayerperceptron. E stato possibile installare il plugin e le librerie su diverse macchi-ne su cui si trovasse Maven clonando i sorgenti ed eseguendo il comando mvninstall, rendendo immediatamente disponibile l’ambiente di addestramento.Alla prima esecuzione del plugin, le dipendenze ancora mancanti vengono scari-cate ed installate nel repository locale, senza dover preoccuparsi di recuperarlemanualmente.

Il progetto di multilayer perceptron presentato nella Sezione 6 non e statol’unico. Sono state addestrate anche reti a singolo neurone di output per ilriconoscimento di un’unica lettera, dando responso negativo nel caso di unadelle altre venticinque, per le quali si e dovuto unicamente cambiare i valori dioutput atteso per ciascun esempio.

45

Page 46: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Alcuni di questi progetti sono stati gestiti dallo strumento di continuousintegration Jenkins, menzionato nella Sezione 1.3. Gli addestramenti vengonoavviati manualmente attraverso l’interfaccia web del tool, oppure in rispostaad aggiornamenti dei repository Mercurial remoti in cui sono versionati i variprogetti. Al termine di ogni addestramento viene avviato uno step aggiuntivoper copiare la rete neurale addestrata in una cartella differente. Per gli adde-stramenti piu lunghi, al termine della build viene fatta inviare una notifica viamail includendo i log dell’esecuzione con i risultati dei test.

La possibilita di definire e integrare nuovi servizi puo permettere l’integra-zione con tool esistenti o di svilupparne di nuovi. Utilizzando un logger chescrive su file in formato csv, e stata creata una semplice pagina web che mostral’avanzamento dell’addestramento, attraverso un grafico rappresentante l’errorein una data iterazione.

Figura 10: semplice implementazione di una pagina web che mostra l’avanza-mento dell’addestramento, i cui dati vengono recuperati da un file csv scrittoda un apposito logger

9.3 Sviluppi futuri

Modularizzazione degli artefattiOltre al plugin per multilayer perceptron, alcuni sviluppi sono stati fatti suplugin per HMM e serie di Volterra. E risultato che, per riutilizzare partedelle componenti sviluppate per il primo plugin, la libreria contenente leinterfacce dei servizi per multilayer perceptron deve essere frammentata.Infatti risulta conveniente che funzioni, marshaller e altre tipologie di ser-vizi non strettamente legate ai multilayer perceptron risiedano in artefattiseparati.

Generalizzazione del pluginI servizi come metodi di addestramento o di test sono stati legati ad uti-lizzare l’oggetto MultilayerPerceptronDescriptor come formatosi scambio, passato esplicitamente ai servizi generati da parte del plugin.Aggiungendo un servizio che racchiuda questa particolare implementazio-ne e possibile astrarre il plugin in modo tale che possa eseguire qualsiasi

46

Page 47: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

metodo di addestramento, senza dover limitarsi all’ambito dei multilayerperceptron.

Questo suggerisce che una possibile estensione del framework vada, in-vece che in direzione dello sviluppo di molteplici plugin, in quella nellageneralizzazione di quello attuale.

Servizi integratiAl momento della stesura di questa tesi, l’unico caso di servizio fornitodirettamente dal plugin e l’implementazione di un logger che delega ilproprio compito a quello di Maven. Vi sono altre tipologie di servizi chepossono astrarre alcune carateristiche del contesto di esecuzione attraversoil framework Maven, come:

• astrazione delle risorse e delle gerarchie di cartelle all’interno delprogetto;

• accesso ai risultati di sottoprogetti per rendere possibile la combina-zione di piu classificatori in uno composito;

• logging orientato ai dati che utilizzi json come formato di scambio.

Validazione dei descrittori di servizioL’implementazione di application context cerca di generare un serviziobasandosi su un suo descrittore, istanziando ricorsivamente i collaboratoriattraverso le factory, e nel caso manchi una delle factory richieste la gene-razione del servizio viene interrotta con un’eccezione. Un tentativo fallitodi generazione di un servizio con un descrittore non valido, ad esempioa causa di una svista nella configurazione, in una fase diversa da quellainiziale potrebbe causare la perdita dei dati dell’esecuzione del plugin incorso, che in ogni caso verrebbe interrotta.

Dotare l’application context di un metodo che verifichi la coerenza diun descrittore con le factory inserite nel contesto, senza la necessita diistanziare servizio e collaboratori, garantirebbe al plugin di poter falliresubito nella fase di validazione del progetto.

ParallelizzazioneL’algoritmo di back propagation puo essere eseguito in parallelo per cia-scun esempio dell’insieme di addestramento, poiche i pesi del multilayerperceptron non vengono aggiornati fino a quando tutti i gradienti sianostati calcolati. Anche il calcolo delle attivazioni dei neuroni di un layer eun operazione parallelizzabile.

Nell’implementazione dell’algoritmo fatta per questa tesi la parallelizzazio-ne non e stata introdotta, ma con la successiva release di Java sono previstinuovi strumenti che la rendono implicita e di piu facile realizzazione. Si equindi scelto di attendere la nuova versione per passare ad implementazionidegli algoritmi che traggano vantaggio dal calcolo parallelo.

47

Page 48: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

A Esempio di progetto per multilayer percep-tron: xor

La funzione booleana xor, o or esclusivo, e un esempio classico usato per intro-durre i multilayer perceptron, in quanto le classi dei risultati non sono linear-mente separabili sul piano degli input e quindi non riconoscibili dal perceptron.Per la semplicita di descrizione del problema, e per seguire la tradizione, verrautilizzato anche come esempio di utilizzo del plugin.

Una possibile struttura di multilayer perceptron per il riconoscimento delloxor e composta da un singolo hidden layer di tre neuroni. Come funzione diattivazione si puo optare per la tangente iperbolica, una sigmoide che mappa Rnell’intervallo (−1, 1).

Listing 14: Struttura di multilayer perceptron per il riconoscimento dellafunzione xor

1 {2 "function": {"name": "tanh"},3 "sources": 2,4 "sizes": [3, 1]5 }

Riguardo gli esempi, che risultano essere le quattro combinazioni di v e frappresentabili con 1 e −1 rispettivamente, si richiedono come valori di outputdei numeri vicini agli estremi dell’intervallo invece che gli estremi stessi: inquesto modo si hanno degli output comunque distinguibili, evitando di avere ipesi delle sinapsi con modulo molto elevato al termine dell’addestramento.

Vista la semplicita della rete neurale, sara utilizzato lo stesso insieme diesempi sia durante l’addestramento che per i test.

Listing 15: Esempi usati per addestrare e testare il multilayer perceptron

1 [2 {"label":"(f,f)", "input":[-1, -1], "output":[-0.9]},3 {"label":"(f,v)", "input":[-1, 1], "output":[0.9]},4 {"label":"(v,f)", "input":[1, -1], "output":[0.9]},5 {"label":"(v,v)", "input":[1, 1], "output":[-0.9]}6 ]

Nella sezione build del descrittore di progetto viene inserita la configurazio-ne del plugin, dichiarando quali siano i servizi di addestramento e test, i loroparametri e collaboratori. Ad esempio, come metodo di addestramento si im-posta batchBackPropagation con alcuni collaboratori configurati, tra cuila funzione d’errore da applicare all’output per il calcolo del gradiente e il si-stema di logging su cui scrivere. Allo stesso modo si configura come metodo ditest errorFunction, che applica una funzione d’errore all’output della reteneurale e fa fallire un test se tale errore superasse una soglia impostata.

Nel Listato 16 e mostrata la configurazione dei servizi con i relativi col-laboratori. Tutti i collaboratori elencati, tranne il logger, sono definiti comedefault dei servizi batchBackPropagation e errorFunction e quindi sipuo rimuovere la loro dichiarazione nel descrittore di progetto, ma sono staticomunque inclusi per rendere piu chiaro l’esempio.

48

Page 49: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Listing 16: Configurazione del plugin per l’addestramento e i test

1 <project ...>2 ...3 <build>4 <plugins>5 <plugin>6 <groupId>dev.deadc0de.seshat</groupId>7 <artifactId>multilayer-perceptron-maven-plugin</artifactId>8 <version>0.2</version>9 <extensions>true</extensions>10 <configuration>11 <trainingMethod>12 <name>batchBackPropagation</name>13 <configuration>14 <learningRate>0.1</learningRate>15 <tolerance>0.1</tolerance>16 <maximumIterations>100</maximumIterations>17 </configuration>18 <collaborators>19 <collaborator>20 <role>errorFunction</role>21 <name>meanSquaredError</name>22 </collaborator>23 <collaborator>24 <role>logger</role>25 <name>maven</name>26 </collaborator>27 </collaborators>28 </trainingMethod>29 <test>30 <name>errorFunction</name>31 <configuration>32 <tolerance>0.1</tolerance>33 </configuration>34 <collaborators>35 <collaborator>36 <role>errorFunction</role>37 <name>meanSquaredError</name>38 </collaborator>39 <collaborator>40 <role>logger</role>41 <name>maven</name>42 </collaborator>43 </collaborators>44 </test>45 </configuration>46 </plugin>47 </plugins>48 </build>49 ...50 </project>

L’addestramento puo essere avviato con Maven specificando il goal compile,mentre per includere anche i test bisogna utilizzare il goal test. Un esempiodi output e mostrato nel Listato 17.

49

Page 50: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Listing 17: Output dell’esecuzione del plugin

1 [INFO] Scanning for projects...2 [INFO]3 [INFO] ---------------------------------------------------------------------4 [INFO] Building xor 0.1-SNAPSHOT5 [INFO] ---------------------------------------------------------------------6 [INFO]7 [INFO] --- multilayer-perceptron-maven-plugin:0.2:train (default-train) @xor8 [INFO]9 [INFO] training multilayer perceptron xor.json10 [INFO] [training] 1 1.057778936841056411 [INFO] [training] 2 0.988508355694034812 [INFO] [training] 3 0.945860341098354313 [INFO] [training] 4 0.920212424475588214 [INFO] [training] 5 0.9035534141494215 [INFO] [training] 6 0.891306007273976916 [INFO] [training] 7 0.880977324501067817 [INFO] [training] 8 0.8710208838147718 [INFO] [training] 9 0.860219883377207819 [INFO] [training] 10 0.847306565520851320 [INFO] [training] 11 0.830646794899025221 [INFO] [training] 12 0.80795483629137122 [INFO] [training] 13 0.776365015445881223 [INFO] [training] 14 0.734359950024079724 [INFO] [training] 15 0.687885706186592425 [INFO] [training] 16 0.650825021616793926 [INFO] [training] 17 0.6239912858220327 [INFO] [training] 18 0.599283085562515228 [INFO] [training] 19 0.57257698160756729 [INFO] [training] 20 0.541821361169644930 [INFO] [training] 21 0.505665066038736631 [INFO] [training] 22 0.4631908607399295432 [INFO] [training] 23 0.41425190279932933 [INFO] [training] 24 0.359876999465928934 [INFO] [training] 25 0.3027919936737285535 [INFO] [training] 26 0.2475501165593494436 [INFO] [training] 27 0.1987717954767580537 [INFO] [training] 28 0.1587294526204017238 [INFO] [training] 29 0.1272409602360480639 [INFO] [training] 30 0.1029644655311415740 [INFO] [training] 31 0.0843346071841120941 [INFO] multilayer perceptron xor.json trained42 [INFO]43 [INFO] --- multilayer-perceptron-maven-plugin:0.2:test (default-test) @xor44 [INFO]45 [INFO] testing multilayer perceptron xor.json46 [INFO] [test] [(f,f)] failed: error 0.13514183344893027 above tolerance 0.147 [INFO] [test] [(f,v)] passed: error 0.0454133282845814648 [INFO] [test] [(v,f)] passed: error 0.0937078311867446149 [INFO] [test] [(v,v)] passed: error 0.0630754358161920350 [INFO] test executed 4: passed 3, failed 151 [INFO] ---------------------------------------------------------------------52 [INFO] BUILD SUCCESS53 [INFO] ---------------------------------------------------------------------54 [INFO] Total time: 0.768s55 [INFO] Finished at: Sat Mar 01 16:12:53 CET 201456 [INFO] Final Memory: 6M/114M57 [INFO] ---------------------------------------------------------------------

Il file contenente il multilayer perceptron addestrato viene salvato nellacartella target/multilayer-perceptron. L’oggetto json che lo descriveconterra i pesi delle sinapsi calcolate durante l’addestramento.

50

Page 51: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Listing 18: La struttura del multilayer perceptron addestrato

1 {2 "sources":2,3 "layers":[4 {5 "neurons":[6 {7 "function":{"name":"tanh","configuration":{},"collaborators":{}},8 "bias":-0.737718409408805,9 "weights":[-0.287079403737907,0.636592260627277]10 },{11 "function":{"name":"tanh","configuration":{},"collaborators":{}},12 "bias":-0.319036398379351,13 "weights":[-1.015886690995409,-0.617654172805915]14 },{15 "function":{"name":"tanh","configuration":{},"collaborators":{}},16 "bias":-1.371909790612952,17 "weights":[1.2360994927055501,1.253533726132772]18 }19 ]20 },{21 "neurons":[22 {23 "function":{"name":"tanh","configuration":{},"collaborators":{}},24 "bias":-0.3955449936389208,25 "weights":[0.799872659949049,-1.040302630959267,-1.34014482170830]26 }27 ]28 }29 ]30 }

51

Page 52: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

B Implementazione dell’algoritmo di back-propagation

In seguito e descritta l’implementazione dell’algoritmo di back propagation, nel-la variante batch dove tutti i gli esempi del training set sono valutati prima diprocedere all’aggiornamento dei pesi. Inoltre e stato specializzato per il parti-colare caso dei multilayer perceptron, a partire dall’algoritmo per reti neuralifeedforward descritto nella Sezione 3.

Dal punto di vista implementativo, seppur nell’ambito di un linguaggio orien-tato agli oggetti come Java, si e optato per un approccio funzionale. Alla basedell’astrazione vi e il considerare il multilayer perceptron come una sequenza dimappature: tutte le operazioni sono legate alla trasformazione di un segnale du-rante l’attraversamento di un layer, avendo come dati l’input e la struttura (bias,pesi delle sinapsi e funzioni di attivazione). Diventa quindi possibile limitarsia considerare un layer per volta, semplificando notevolmente l’implementazio-ne. Un ulteriore vantaggio dato dal paradigma funzionale e la possibilita diparallelizzare alcune parti dell’algoritmo.

All’inizio dell’addestramento i pesi del multilayer perceptron vengono inizia-lizzati con valori casuali, in quanto se nulli non permetterebbero la propagazioedell’errore all’indietro. Dato un esempio dotato del vettore di input e di quellodi output desiderato, l’algoritmo si divide nelle due fasi esposte in seguito.

B.1 Fase feedforward

Le informazioni raccolte durante la fase feedforward sono:

• l’input in ingresso a ciascun layer;

• i valori delle derivate di ciascun neurone calcolate attraverso il livello diattivazione;

• l’output del multilayer perceptron.

Per ottenerle e sufficiente effettuare una riduzione15 sul multilayer perceptron,visto come lista di layer, applicando ad ogni layer una funzione che, dato unaccumulatore contenente i dati raccolti per i layer precedenti, vi aggiunga quellidel layer corrente.

La funzione combinante di feedforward e strutturata come segue:

• in input sono dati un accumulatore, contenente derivate e input di tutti ilayer precedenti, l’output del layer precedente e i dati del layer corrente:bias bi, pesi delle sinapsi wi e funzione di attivazione fi di ciascun neuronei;

• vengono calcolati i livelli di attivazione si del layer, con

si = bi +∑j

xjwij (33)

dove il vettore x rappresenta l’output generato dai neuroni del layer pre-cedente, e il peso wij e associato alla sinapsi che dal neurone j del layerprecedente arriva al neurone i;

15 Nella programmazione funzionale, l’operazione di riduzione consiste nella combinazionedi elementi di una struttura dati ricorsiva attraverso una funzione combinante: dato un valoredi partenza, detto accumulatore, la funzione viene applicata sistematicamente al successivoelemento usando il valore attuale dell’accumulatore ed aggiornandolo col nuovo valore appenacalcolato.

52

Page 53: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

• viene calcolata la derivata della funzione di attivazione per ciascun neu-rone, con gi = f ′i(si);

• viene infine calcolato l’output del layer con oi = fi(gi);

• l’input del layer, ovvero l’output di quello precedente, e le derivate sonoaggiunte all’accumulatore e viene restituito l’output del layer corrente.

I parametri iniziali della riduzione sono un accumulatore vuoto e l’input delmultilayer perceptron.

B.2 Fase di back propagation

Attraverso la funzione d’errore scelta per l’addestramento viene calcolato il suogradiente, confrontando l’output desiderato con quello ottenuto al termine dellafase feedforward. L’obiettivo e ottenere le componenti del gradiente per tutti ipesi del multilayer perceptron a partire dal gradiente dell’errore. Nella fase diback propagation, la lista contenente gli input e le derivate dei layer viene inver-tita ed utilizzata per propagare all’indietro l’errore, accumulando nel frattempole componenti del gradiente per ciascun layer visitato.

Come nel caso della fase feedforward, viene definita una funzione combinantedi back propagation, con il seguente comportamento:

• in input sono dati un accumulatore, contenente le componenti parzialidel gradiente per i layer successivi (considerati nell’ordine originale delmultilayer perceptron), l’output di back propagation del layer successivoe i dati del layer corrente;

• viene calcolata l’attivazione di backpropagation del layer, moltiplicandol’input per le derivate delle funzioni di attivazione calcolate nella fasefeedfroward, con si = xigi;

• il gradiente per i pesi delle sinapsi si ottiene moltiplicando l’attivazione diback propagation s per l’input della fase feedforward x

∆wij =∑j

sixj (34)

mentre il gradiente del bias ∆wi0 e dato semplicemente dall’attivazionesi;

• infine l’output viene calcolato percorrendo al contrario le sinapsi, con

oj =∑i

siwij (35)

• il gradiente del layer viene aggiunto all’accumulatore e viene restituitol’output da passare al layer precedente.

I parametri iniziali della riduzione sono un accumulatore vuoto e il gra-diente della funzione d’errore come input. Al termine l’output viene scartato,mentre le componenti raccolte nell’accumulatore vanno a formare il gradientedel multilayer perceptron.

53

Page 54: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

B.3 Aggiornamento dei pesi

I gradienti calcolati per ogni singolo esempio vengono sommati, attraveso unariduzione, ottenendo il gradiente ∆w per l’intero insieme di addestramento. Pri-ma che ai pesi del multilayer perceptron venga sottratta la relativa componentedel gradiente, questo viene moltiplicato per il learning rate η ed eventualmen-te sommato con il gradiente dell’iterazione precedente, pesato con il valore delmomentum α:

∆wn = η · ∇E(wn) + α ·∆wn−1 (36)

I pesi vengono quindi aggiornati attraverso l’equazione

wn+1 = wn −∆wn (37)

54

Page 55: Implementazione in Java di plugin Maven per algoritmi di addestramento per reti neurali artificiali

Riferimenti bibliografici

[1] David J.C. MacKay, Information Theory, Inference and LearningAlgorithms. Cambridge University Press, UK, 4th printing, 2005.

[2] Simon Haykin, Neural Networks, a Comprehensive Foundation. PrenticeHall International, Inc. , New Jersey, 2nd Edition, 1999.

[3] Luis B. Almeida, Multilayer Perceptrons. Handbook of Neural Computa-tion, 1997.

[4] Alexander H. Waibel, John B. Hampshire, A Novel Objective Function forImproved Phoneme Recognition Using Time-Delay Neural Networks. IEEETransactions on Neural Networks, vol. 1, no. 2, June 1990.

[5] Enzo Mumolo, Alberto Carini, Volterra Adaptive Prediction of Speech withApplication to Waveform Coding. 1995.

[6] Tim O’Brien, John Casey, Brian Fox, Bruce Snyder, Jason Van Zyl, EricRedmond, Maven: the Definitive Guide. Sonatype, 2008.

55