Upload
alessandro-di-carlo
View
56
Download
1
Embed Size (px)
Citation preview
Università degli studi di Camerino
Corso di laurea in Informatica
Algoritmi e strutture dati
Hierarchical Memory Algorithms
A cura di:
Alessandro Di Carlo
Hector Martinez
Anna Biselli
Leonardo Caggianelli
Professore:
Matteo Rucco
Scopo del progettoLo scopo del nostro progetto consiste nell'analizzare algoritmi di hierarchical
tempory memory (da ora chiamati HTM) per la raccolta e l'analisi di onde
elettromiografiche impiegate per la realizzazione di un bracciale
elettromiografico.
ElettromiografiaL’Elettromiografia (EMG) è un esame strumentale neurofisiologico che riveste un ruolo
fondamentale nello studio e nella diagnosi delle malattie neuromuscolari.
L’Elettromiografia serve a valutare la funzionalità dei muscoli (mentre la elettroneuronografia
misura la velocità di conduzione dei nervi).Le fibre muscolari, quando attivate, generano il
MUAP(Motor Unit Action Potential).L’EMG si avvale di elettrodi monouso, che registrano
l’attività delle fibre muscolari in diverse condizioni: a riposo, durante una contrazione
volontaria e progressiva fino al massimo sforzo, e durante una contrazione media sostenuta.
Generalmente non si vale di stimoli elettrici, ma nei casi in cui si registra attraverso l’ago e si
stimola il nervo a distanza allora possiamo considerarla una variante dell’elettroneurografia.
Rilevazione onde
Il primo passo per la raccolta dei dati elettromiografici
è l’identificazione appropriata di quest’ultimi in un set
di movimenti. Per far ciò, si sono analizzati e utilizzati
gli algoritmi di:
Hodges Bui
Finite Moving Average (FMA)
L’algoritmo di Hodges e Bui fà parte di una classe di algoritmi chiamati FMA. Tali
algoritmi usano una finestra di ampiezza fissa che abbiamo usato per scannerizzare
il segnale EMG; una volta analizzato il segnale, si va a studiare la parte che si è
sollecitata con il movimento. Quando questo segnale supera l'ampiezza massima
della finestra corrente l’algoritmo si arresta e ritorna al primo indice della finestra
iniziale come valore stimato. Fondamentale importanza ha la deviazione standard.
Possiamo notare un esempio:
Artificial Neural NetworkUna rete neurale artificiale (ANN "Artificial Neural Network"), normalmente è chiamata solo "rete neurale"
(NN "Neural Network" in inglese), ed è un modello matematico/informatico di calcolo basato sulle reti
neurali biologiche. Tale modello è costituito da un gruppo di interconnessioni di informazioni costituite da
neuroni artificiali e processi che utilizzano un approccio basato su connessioni di calcolo. Nella maggior
parte dei casi una rete neurale artificiale è un sistema adattivo che cambia la sua struttura in base a
informazioni esterne o interne che scorrono attraverso la rete durante la fase di apprendimento.
In termini pratici le reti neurali sono strutture non-lineari di dati statistici organizzate come strumenti di
modellazione. Esse possono essere utilizzate per simulare relazioni complesse tra ingressi e uscite che
altre funzioni analitiche non riescono a rappresentare.
Una rete neurale artificiale riceve segnali esterni su uno strato di nodi (unità di elaborazione) d'ingresso,
ciascuno dei quali è collegato con numerosi nodi interni, organizzati in più livelli. Ogni nodo elabora i
segnali ricevuti e trasmette il risultato a nodi successivi.
Back-Propagation Based
Neural Network
initialize network weights (often small random values)
do
forEach training example ex
prediction = neural-net-output(network, ex) // forward pass
actual = teacher-output(ex)
compute error (prediction - actual) at the output units
compute for all weights from hidden layer to output layer // backward
pass
compute for all weights from input layer to hidden layer // backward
pass continued
update network weights
until all examples classified correctly or another stopping criterion satisfied
return the network
Complessità
O(n)
Fuzzy Mean Max Neural
Network(FMMNN)
Rete neurale ibrida
Esempio di rete FMMNNComplessità
O(n)
Modello di Markov nascosto
Un Modello di Markov nascosto (Hidden Markov Model
- HMM) è una catena di Markov i cui stati non sono
osservabili direttamente. Più precisamente:
• la catena ha un certo numero di stati
• gli stati evolvono secondo una catena di Markov
• ogni stato genera un evento con una certa
distribuzione di probabilità che dipende solo dallo stato
• l'evento è osservabile ma lo stato no
I modelli nascosti di Markov sono conosciuti
particolarmente per le loro applicazioni nel riconoscimento
dello schema temporale dei discorsi parlati, della scrittura a
mano, nel riconoscimento di textures e la bioinformatica
(per esempio HMMer).
Transizioni di stato in un modello di Markov nascosto (esempio)
x — Stato nascosto
y — Uscita osservabile
a — Probabilità di transizione
b — Probabilità di uscita
Esempio modello di Markov
Forward–backward algorithm
ForwardBackward(guessState, sequenceIndex):
if sequenceIndex is past the end of the sequence, return 1
if (guessState, sequenceIndex) has been seen before, return saved result
result = 0
for each neighboring state n:
result = result + (transition probability from guessState to n given
observation element at sequenceIndex)
* ForwardBackward(n, sequenceIndex+1)
save result for (guessState, sequenceIndex)
return result
stati = ('Pioggia', 'Sole')
osservazioni = ('camminare', 'shopping', 'pulire')
probabilità_iniziale = {'Pioggia': 0.6, 'Sole': 0.4}
probabilità_transizione = {
'Pioggia' : {'Pioggia': 0.7, 'Sole': 0.3},
'Sole' : {'Pioggia': 0.4, 'Sole': 0.6},
}
probabilità_emissione = {
'Pioggia' : {'camminare': 0.1, 'shopping': 0.4, 'pulire': 0.5},
'Sole' : {'camminare': 0.6, 'shopping': 0.3, 'pulire': 0.1},
}
Esempio in Python
Complessità
O(N2T)
Rete di BayesNel 2007 è stata implementata con un accelerometro
bidimensionale per la classificazione di molteplici gesti. La
combinazione di questa rete con il dispositivo ha
aumentato la precisione del 5/10%.
Nel 2008 invece venne implementata questa rete con il
classificatore KNN per lo sviluppo di un'interfaccia EMG:
quest'ultima è riuscita a raggiungere una precisione di
classificazione del 94% usando anche un solo sensore.
Hierarchical Temporal
MemoryLa tecnica dell’HTM è molto simile alle reti neurali. È
una tecnica di apprendimento basata sui pattern che è
stata sviluppata dalla società Numenta.
Struttura di una rete HTMUna rete HTM ha una gerarchia ad albero. La rete consiste in nodi dove ognuno
di essi nella gerarchia scopre da solo un set di cause in input attraverso un
processo di ricerca di pattern comuni che portano alla scoperta di pattern
temporali comuni.
L’immagine sotto mostra la struttura della rete utilizzata per le nostre onde
elettromiografiche:
Funzione dell’HTM
Le reti basate sull’Hierarchical temporal memory sono
meglio descritti come un sistema di memoria che
esegue deduzioni e prevede alcuni comportamenti. Le
deduzioni e le “predizioni” sono elaborate attraverso
una rete denominata nodi.
Apprendimento
Una regione HTM impara a conoscere il suo mondo
trovando modelli e quindi sequenze di pattern, in dati
provenienti da sensori. La regione non “sa” cosa i suoi
input rappresentano; lavora in un ambiente puramente
statistico.Sembra che lavori per combinazioni di
pattern in input che si verificano insieme, che noi
chiameremo pattern spaziali. Sembra poi che questi
modelli spaziali appaiano in una determinata
sequenza nel tempo, chiamati pattern temporali.
Fasi di apprendimento
Le reti HTM hanno due distinte fasi di apprendimento
che tratteremo in maniera approfondita:
• Fase di “Training”
• Fase di “Inference”
Algoritmi di “training” e di
“inference”
L’algoritmo di “training” e di “inference” sono basati su
due principi per ogni nodo:
• Comprendere le operazioni all’interno di un singolo
nodo;
• Comprendere come un nodo opera con gli altri nodi
della gerarchia.
Training
Gli strati sono numerati a partire dal livello più basso come mostrato nella
figura precedente e riproposta sotto.
Quando il primo livello è stato “istruito”, esso cambia modalità spostandosi in
“deduzione”. Questo avviene per ogni livello fino ad arrivare all’ultimo nodo.
Inference
Dopo che un HTM ha imparato gli schemi presenti nella sua
struttura, può dedicarsi alla deduzione di nuovi input.
Quando un HTM riceve un input, lo accoppierà agli schemi
temporali e spaziali precedentemente appresi.
Struttura di un nodo
Un nodo è l’unità di elaborazione di una rete HTM.
Consiste in due moduli che rendono possibile l’attività
di training e di inference:
• Spatial Pooler
• Temporal Pooler
Spatial Pooler
Lo Spatial Pooler approfitta,come ci suggerisce il
nome, della coerenza spaziale dei dati; apprende un
mapping da un numero potenzialmente infinito di input
per un numero finito di nodi.
La più importante funzione dello Spatial Pooler è
quella di convertire l’input delle “regioni” in pattern
sparsi. Questa funzione è molto importante perché il
meccanismo usato per apprendere le sequenze ed
effettuare una deduzione richiede pattern sparsi.
Implementazione dello
Spatial Pooler
L’implementazione dello Spatial Pooling può essere
suddivisa in tre parti distinte:
1. Calcolare la sovrapposizione tra un input iniziale e
ogni colonna;
2. Calcolare le colonne “vincenti” (con le sinapsi
attive) dopo l’inibizione;
3. Aggiornare i valori permanenti delle sinapsi.
Pseudocodice delle varie
fasi[1]1.Sovrapposizione
for c in columns
overlap(c) = 0
for s in connectedSynapses(c)
overlap(c) = overlap(c) + input(t, s.sourceInput)
if overlap(c) < minOverlap then
overlap(c) = 0
else
overlap(c) = overlap(c) * boost(c)
Prendendo un vettore iniziale, la prima fase è quella di calcolare la sovrapposizione di ciascuna colonna con il vettore dato. La sovrapposizione con ogni colonna è semplicemente il numero di dati comuni,chiamati sinapsi. Se questo valore è inferiore a
Pseudocodice delle varie
fasi[2]2.Inibizione
for c in columns
minLocalActivity = kthScore(neighbors(c), desiredLocalActivity)
if overlap(c) > 0 and overlap(c) ≥ minLocalActivity then
activeColumns(t).append(c)
In questa seconda fase si calcolano tutte le colonne “vincenti” dopo la fase d’inibizione.
Pseudocodice delle varie fasi
[3]3.Apprendimento
for c in activeColumns(t)
for s in potentialSynapses(c)
if active(s) then
s.permanence += permanenceInc
s.permanence = min(1.0, s.permanence)
else
s.permanence -= permanenceDec
s.permanence = max(0.0, s.permanence)
for c in columns:
minDutyCycle(c) = 0.01 * maxDutyCycle(neighbors(c))
activeDutyCycle(c) = updateActiveDutyCycle(c)
boost(c) = boostFunction(activeDutyCycle(c), minDutyCycle(c))
overlapDutyCycle(c) = updateOverlapDutyCycle(c)
if overlapDutyCycle(c) < minDutyCycle(c) then
increasePermanences(c, 0.1*connectedPerm)
inhibitionRadius = averageReceptiveFieldSize()
La terza fase è quella
dell’apprendimento; si aggiornano i
valori permanenti di tutte le sinapsi. Per
le colonne vincitrici, se la sinapsi è
attiva, il loro valore permanente si
incrementa, altrimenti si decrementa.
Temporal Pooler
Il Temporal Pooler approfitta della continuità temporale
dei dati in ingresso:esso apprende sequenze e
“predice”.Il principio di base è che quando una cella
diventa attiva, forma collegamenti con altre celle che
erano attive poco prima. Le celle possono quindi
prevedere quando diventeranno attive cercando tra le
loro connessioni. Se tutte le celle fanno questo, nel
loro insieme, possono archiviare e richiamare le
sequenze, e si può prevedere che cosa è probabile
che accada successivamente.
Implementazione del
Temporal Pooler
L’implementazione del Temporal Pooler può essere
suddiviso in due fasi distinte:
1. Si calcola lo stato attivo per ogni cella,
activateState(t).
2. Si calcola lo stato stimato per ogni cella,
predictiveState(t).
Pseudocodice delle varie
fasi[1]
Fase 1
for c in activeColumns(t)
buPredicted = false
for i = 0 to cellsPerColumn - 1
if predictiveState(c, i, t-1) == true then
s = getActiveSegment(c, i, t-1, activeState)
if s.sequenceSegment == true then
buPredicted = true
activeState(c, i, t) = 1
if buPredicted == false then
for i = 0 to cellsPerColumn - 1
activeState(c, i, t) = 1
La prima fase calcola lo stato
attivo per ogni cella.Per ogni
colonna uscita “vincitrice”
determiniamo quali celle
diventeranno attive.
Pseudocodice delle varie
fasi[2]
for c, i in cells
for s in segments(c,i)
if segmentActive(c,i,s,t) then
predictiveState(c,i,t)=1
La seconda fase calcola lo
stato di previsione per ogni
cella. Una cella avrà
predictiveState=1 se uno
qualsiasi dei suoi segmenti
diventa attivo.
Fase 2
Riassunto
Per riassumere le due fasi di Temporal Pooler e di Spatial Pooler mostriamo un
immagine:
Qui viene mostrata la struttura di un nodo: l’input del nodo corrisponde all’input
dello Spatial Pooler; l’output dello Spatial Pooler rappresenta l’input del
Temporal Pooler; l’output del Temporal Pooler è l’output del nodo stesso.
Operazione dei nodi nella
gerarchiaGuardando più in dettaglio come effettivamente operano i nodi nella
gerarchia in una rete HTM, notiamo che tutti i nodi sono istruiti di
livello in livello: per la classificazione del segnale EMG la rete
consiste in 8 nodi al livello 1, 2 nodi al livello 2 e un nodo
classificatore.
I benefici di una struttura gerarchica sono
evidenti: viene ridotto il tempo di
apprendimento e la memoria usata, perchè i
pattern appresi nel livello più basso vengono
poi riutilizzati quando vengono combinati
con i pattern dei livelli più alti.
Nodi al livello 1 in modalità apprendimento
Dopo aver ottenuto tutti gli input al primo livello, tutti i nodi del livello 1
della gerarchia vengono formati ed istruiti. Durante questo periodo tutti i
nodi del livello 2 sono disabilitati e poichè i nodi del livello 1 sono in
modalità apprendimento non inviano output ai nodi del livello 2.
Nodi al livello 2 in modalità appendimento
e
nodi al livello 1 in modalità deduzione.
Una volta che i nodi al livello 1 hanno finito la fase di apprendimento,
i nodi al secondo livello sono abilitati e modificano il loro stato in
modalità apprendimento. I nodi al livello 1 sono switchati dalla
modalità apprendimento alla modalità di deduzione.
Diagramma di apprendimento finale
Dopo il loro apprendimento i nodi al livello 2 saranno messi in
modalità di deduzione e tutto il processo di apprendimento
verrà ripetuto continuamente finché non sarà raggiunto il nodo
classificatore. I nodi al livello 1 e 2 completano il loro processo
di apprendimento ed entrambi vengono messi in modalità
deduzione.
Grazie per l’attenzione