You are on page 1of 65

XARXES NEURONALS ARTIFICIALS

Marc Junyent Martín

Tutora: Luz Arce


IES Francesc Macià

Cornellà de Llobregat
Juny 2010
INDEX
Abstract! 5

Introducció i Antecedents ! 6

Objectius! 6

Part Teòrica
Les Xarxes Neuronals Biològiques ! 7

Què és la Intel·ligència Artificial?! 10

Història de la Intel·ligència Artificial! 11

Què són les Xarxes Neuronals Artificials?! 12

Xarxes Neuronals i Ordinadors Convencionals! 13

Aplicacions Pràctiques de les Xarxes Neuronals! 15

Bases de les Xarxes Neuronals Artificials! 16


La Neurona! 16

Entrades! 17

Pesos Sinàptics! 17

Regla de Propagació! 17

Funció d'activació! 17

Funció de sortida! 18

Arquitectures! 18

Dinàmica d'actualització! 19

Entrenament! 19

El perceptró i el perceptró multicapa! 22


El perceptró! 22

Algoritme d'aprenentatge del perceptró! 23

Limitacions del perceptró! 24

El Perceptró Multicapa! 25
2
Algoritme de Retropropagació (Back-Propagation)! 27

Problemes de lʼaprenentatge! 32

Mapes Auto-organitzats de Kohonen! 36


Xarxes no supervisades hebbianes! 36

Xarxes no supervisades competitives! 36

Mapes de Kohonen! 37

Funcionament del Mapes Auto-organitzats de Kohonen! 37

Entrenament! 38

LʼAlgoritme dʼaprenentatge! 39

Part Experimental
Objectius! 41

Els Simuladors de Xarxes! 41

Organització de Colors amb els Mapes Auto-Organitzats de Kohonen


! 43
Introducció! 43

Implementació i Resultat! 44

Conclusions! 47

Detecció de Caràcters amb un Perceptró Multicapa ! 48


Objectius! 48

Implementació! 48

Resultats! 49

Conclusions! 50

Detector de parla amb un mapa auto-organitzat! 52


Introducció i objectius! 52

Preprocessament de dades! 52

Implementació! 54

Resultats! 56

3
Conclusions! 56

Conclusions! 57

Annex A! 58
Funcionament del Simulador de Perceptró Multicapa! 58

Funcionament del Simulador de Mapes Auto-organitzats de Kohonen! 61

Bibliografia! 64

4
Abstract
Les xarxes neuronals artificials són un dels mecanismes que ha trobat la ciència de la
computació per a crear programes intel·ligents. Els seu funcionament es basa en el del
cervell i una de les seves característiques principals és la capacitat dʼaprendre a partir
dʼexemples.

En aquest treball sʼestudien alguns dels tipus més comuns de xarxes artificials, les seves
semblances i diferencies amb el cervell i amb els ordinadors convencionals i les
avantatges i desavantatges que tenen sobre aquests. A més, sʼutilitza tota la informació
adquirida per crear i utilitzar xarxes en aplicacions pràctiques aplicables a la vida real.

5
Introducció i Antecedents
Marvin Lee Minsky diu “La Intel·ligència Artificial (IA) es troba en un estat irrisori ja que
podem fer que les màquines facin les coses que fa un “expert” però no podem fer que faci
la majoria de coses que fa un nen de 4 anys.”

Això és cert i ja fa temps que la IA no aconsegueix superar aquest estat tot i les constants
millores en el camp de la informàtica. Les Xarxes Neuronals Artificials són una branca de
la IA que intenta copiar els mecanismes adoptats per la naturalesa desprès de milers
dʼanys dʼevolució per a solucionar problemes complexos.

No estic dient que les xarxes neuronals siguin una solució al problema de la IA, les xarxes
existeixen des de fa molt de temps i també semblen estar estancades. Però si podem
solucionar problemes millor que un “expert” perquè costa fer que una màquina faci coses
que un nen de 4 anys ja sap fer? Potser sʼhauria de mirar com ho fem nosaltres per
aplicar-ho a la pràctica. I és que un ordinador té un funcionament molt diferent al dʼun
cervell.

Objectius
Aquest treball es divideix en dues parts. La primera, teòrica, té com a objectiu estudiar
alguns dels tipus més comuns de xarxes neuronals artificials, veure les seves semblances
i diferències amb la biologia, les semblances i diferències amb la informàtica
convencional, les seves aplicacions pràctiques i les seves avantatges i desavantatges.

La segona part, que és més pràctica i experimental, té com a objectiu implementar les
xarxes estudiades en programes informàtics amb finalitats útils i comprovar de primera mà
la fiabilitat i lʼeficàcia que tenen i els problemes que poden sorgir.

Lʼobjectiu global del treball és estudiar el funcionament de les xarxes neuronals artificials i
veure quina utilitat poden tenir avui en dia i en el futur.

6
Part Teòrica

Les Xarxes Neuronals Biològiques

Aquest treball tracta sobre els sistemes neuronals artificials. Aquests sistemes es basen,
en gran part, en el sistema nerviós animal. Per això, abans de començar a explicar el
funcionament dels sistemes artificials, explicarem una mica el funcionament dels sistemes
originals.

El sistema nerviós està compost per una xarxa de cèl·lules individuals, les neurones,
connectades entre si que és transmeten informació constantment. Aquesta xarxa és
immensa, el sistema nerviós humà està format per entre 1010 i 1011 neurones amb un
nombre similar de cèl·lules de suport.

Podem distingir tres tipus de neurones:


• Receptores o sensors: reben informació de lʼexterior i envien informació a altres
neurones.
• Interneurones: reben i envien informació a neurones.
• Motores: reben la informació de neurones i envien senyals als músculs.

Tot i que les neurones poden arribar a ser molt variades totes tenen aquestes tres parts:
• Soma: el cos de la cèl·lula, dʼentre 10 i 80 micres de longitud.
• Arbre dendrític: Ramificacions que surten del soma.
• Axó: fibra tubular allargada que surt de lʼarbre dendrític i que al final acaba
ramificant-se un altre cop. Pot tenir entre 100 micres i 1 metre. Els axons
constitueixen els nervis.

7
Una neurona es pot veure com un processador senzill on les dendrites són el canal
dʼentrada dʼinformació i l'axó nʼés el canal de sortida, passant pel soma.

La sinapsis és el punt dʼunió entre dues neurones. En les sinapsis les neurones no es
toquen, acostumen a estar separades unes 0,2 micres, i la informació només hi pot
circular en un sentit.

Els impulsos nerviosos es transmeten de dues maneres diferents. Per transmissió


elèctrica, dins les neurones, o per transmissió química, entre neurones.

Quan una neurona envia informació a una altra la punta de lʼaxó allibera
neurotransmissors que travessen lʼespai sinàptic. Al arribar als canals sensibles de la
neurona receptora produeixen un pas dʼions creant un corrent elèctric, que pot ser
excitador o inhibidor. Si hi ha suficient excitació i el potencial de la neurona sʼeleva per
sobre del llindar dʼactivació (-45 mV) la neurona sʼactiva passant del seu potencial normal
en repòs de -60 mV a uns +50 mV. Aquest potencial alliberat sʼanomena potencial dʼacció.
Això dura uns instants i desprès la neurona torna a la seva situació de repòs. Durant uns
moments després la neurona no pot tornar a activar-se.

8
Per aquest mecanisme és pot crear un tren dʼimpulsos elèctrics a una determinada
freqüència que variarà segons la intensitat dʼestimulació que rebi la neurona. El potencial
dʼacció que crea la neurona és desplaça des de la soma cap a la punta de lʼaxó on hi ha
unes vesícules amb neurotransmissors que transformen la senyal elèctrica en emissions
químiques de nou. La intensitat i el nombre de neurotransmissors dependran de la
freqüència dels impulsos elèctrics del potencial dʼacció.
La codificació en impulsos elèctrics fa que la senyal no perdi qualitat i que es pugui
transmetre a més distància.

Les xarxes neuronals tenen la capacitat dʼaprendre. Durant la vida dʼun ésser viu el cervell
es va modelant per adquirir nous coneixements. Les formes possibles de modelar el
cervell són:
• Establir noves connexions entre neurones.
• Trencar connexions entre neurones.
• Variar les intensitats sinàptiques.
• Destrucció de neurones.

La variació dʼintensitats sinàptiques és el mètode més usat per les xarxes neuronals
artificials.

9
Què és la Intel·ligència Artificial?

Podríem dir simplement que la Intel·ligència Artificial (IA) és la ciència, branca de la


informàtica, que s'encarrega de la creació de màquines intel·ligents. Però hi ha
controvèrsia sobre que ha de significar que una màquina sigui intel·ligent. John Searle
divideix els punts de vista sobre intel·ligència artificial a partir dels treballs dʼAlan Turing en
Intel·ligència Artificial Forta i Intel·ligència Artificial Dèbil.

La IA Forta defensa que una màquina pugui arribar a pensar a un nivell igual o superior a
l'humà. La defensa d'aquest argument és que "Tot és material i, per tant, pot emular-se".
Seguint aquest argument, i descartant l'existència de l'ànima, les màquines fins hi tot
podrien arribar a tenir consciència, que podria ser útil com un mètode d'autocontrol per a
millorar el seu rendiment. Que les màquines puguin tenir consciència, pot sobtar a primera
vista, però últimament, alguns estudis en neurociencia [Mark Hallett, http://
www.ncbi.nlm.nih.gov/pmc/articles/PMC1950571/?tool=pubmed] apunten que la nostra
pròpia consciencia és una sensació generada per el nostre cervell.

Així, segons els defensors de la IA Forta, si una màquina té les entrades correctes i dona
les sortides correctes, pensa. En resposta els defensors de la IA Dèbil diuen que no per
saber les respostes s'és més intel·ligent. Un humà és més intel·ligent que una calculadora
però tindria més dificultats a l'hora de dir el quadrat de 42. La IA Dèbil diu que les
màquines poden arribar a actuar com si fòssin intel·ligents, però no ho són.

Deixant de banda les distincions filosòfiques, la Intel·ligència Artificial intenta trobar


algorismes i mecanismes per a solucionar problemes de manera racional. I arriba a
combinar la informàtica amb la matemàtica, la física, la biologia o la psicologia. Ja que
s'inspira en els mecanismes que han adoptat els éssers vius.

10
Història de la Intel·ligència Artificial

Els processadors dels ordinadors actuals es basen en lʼArquitectura de von Neumann


creada per John von Neumann cap als anys 50. Aquesta arquitectura diferencia entre la
màquina que executa les accions (el hardware) i la llista dʼaccions a executar o algorisme
(software). El processador llegeix el programa que té emmagatzemat en la memòria i
nʼexecuta les instruccions que hi ha definides una rere lʼaltre, això permet molta versatilitat
ja que només cal canviar el programa per canviar la tasca a fer. En teoria amb suficients
recursos (processadors amb suficient capacitat de càlcul i suficient memòria) i amb un
algorisme idoni es podria resoldre qualsevol problema. En aquest principi es basa la
intel·ligència artificial convencional i sobretot la IA Forta.

La intel·ligència artificial va néixer als anys 60 amb lʼobjectiu dʼaconseguir crear


algorismes capaços de fer pensar les màquines. Es van fer grans avenços i hi havia un
gran optimisme. És en aquesta època que alguns investigadors, precedits per lʼesclat de
la ciència ficció, feien previsions dʼun futur no molt llunyà ple de màquines intel·ligents. Al
1969 un estudi va fer patents les limitacions dʼun tipus de xarxa neuronal artificial que
prometia molt, els perceptrons, i les xarxes neuronals artificials van quedar en un segon
pla mentre les investigacions es dirigien cap a altres solucions.

Als anys 70 van arribar els sistemes experts, programes on es codifica tot el coneixement
dʼexperts (gent amb amplis coneixements en un àrea) en una base de dades (base de
coneixement) en forma de regles de decisió i que, per mitjà de lʼanomenat motor
dʼinferència, efectua raonaments en base als coneixements que té adquirits. Aquests
programes són molt eficaços, però la creació dʼun sistema expert requereix molt dʼesforç i
temps per a poder abocar tots els coneixements de lʼexpert a la base de coneixement. Tot
i així són molt útils i s'utilitzen avui en dia per assessorar i ajudar als "experts humans" en
la presa de decisions. Però tots els programes que la IA havia fet fins la època fallaven a
la que sortien del seu marc de treball i també fallaven al enfrontar-se a problemes del
“mon real”.

La informació que rebem del nostre entorn és massiva, imprecisa, incompleta,


redundant… i a un ordinador li costa treballar amb aquesta informació imprecisa, sotmesa
a soroll de fons (errors en les percepcions) i on no tot es pot quantificar. Per exemple, un
dels problemes que ens trobaríem primerament a l'hora de fer un programa de diagnosi

11
mèdica seria com quantificar les respostes vagues de l'usuari com molt, poc, bastant… No
seria difícil (tot i que seria laboriós) abocar en el programa tot el coneixement mèdic
existent, en canvi si que representaria un repte quantificar adequadament el dolor del
pacient.

Així, després de lʼèxit dels sistemes experts, es van adonar que tot i que la capacitat de
computació havia augmentat exponencialment des dels inicis de la IA, els programes no
havien augmentat tant la seva intel·ligència i que la informació del món real seguia sent
molt superior a la capacitat de càlcul. Es comença a mirar cap a altres alternatives i
apareix el que és denomina com Soft Computing o Intel·ligència computacional, un
conjunt de tècniques inspirades sobretot en la natura que inclouen les Xarxes Neuronals
Artificials, la lògica difusa i els algorismes genètics, entre dʼaltres.

Què són les Xarxes Neuronals Artificials?

Les Xarxes Neuronals Artificials (XNA) són una de les tècniques de computació
inventades des de la intel·ligència artificial que copia l'estructura adoptada per l'evolució
per solucionar problemes que el cervell humà resol amb relativa facilitat i tenen la
particularitat d'aprendre i generalitzar conceptes a partir d'exemples (són entrenables).

Les XNA són un sistema de computació format per un gran nombre de processadors
simples (neurones) interconnectats entre si, imitant el sistema nerviós dels animals. Cada
neurona artificial produeix una sortida en funció de totes les entrades que rep. Les
connexions entre neurones tenen un pes que pot variar i que modifica el valor de sortida
respecte el valor d'entrada de les neurones que connecten, donant més  o menys
importància a unes connexions que a dʼaltres.

Així quan una xarxa neuronal opera, el que fa es processar el conjunt de dades d'entrada
a traves de les múltiples neurones que la formen i dóna una sortida X com a resultat. El
valor de la sortida depèn del valor de l'entrada, del tipus de xarxa i de neurona i, dels
pesos de les connexions.

Les xarxes son dispositius entrenables, és a dir, els valors dels pesos i, a vegades, les
distribucions de les connexions i les neurones varien per ajustar-se a realitzar la tasca que
ens interessa. L'entrenament es fa a partir d'exemples i seguint uns algoritmes i és una
part molt important de les xarxes.

12
Xarxes Neuronals i Ordinadors Convencionals

Tot i que es sol comparar els ordinadors amb el cervell, a nivell operatiu són bastants
diferents. Com hem dit abans, un ordinador convencional basat en lʼArquitectura de Von
Neumann té un processador que executa instruccions  dʼun programa seqüencialment
manipulant símbols i utilitzant una memòria fixa. En canvi una xarxa neuronal utilitza molts
processadors simples que actuen paral·lelament interconnectats entre si que sʼauto-
organitzen i aprenen dʼexemples, a més tenen el seu coneixement distribuït per tota la
xarxa.

Una de les avantatges de les XNA respecte els ordinadors és el processament en


paral·lel. Un ordinador processa instruccions, una rere lʼaltre. Si el volum de dades a
processar és molt gran, el temps de resposta pot ser molt llarg. Hi ha ordinadors amb
varis processadors que reparteixen les tasques entre aquests per augmentar la velocitat
de resposta, però a lʼhora de programar és més complicat distribuir les tasques entre tots
els processadors i no sempre es pot fer. En canvi, en una xarxa neuronal hi pot haver
milers de neurones operant al mateix temps. Això fa que en molts casos les xarxes
neuronals puguin oferir respostes a temps real mentre que un ordinador no.

Una altra de les característiques de les XNA és la memòria distribuïda, en un ordinador la


informació ocupa un lloc determinat. En canvi en les xarxes neuronals artificials la
informació es troba repartida per totes les connexions. Això fa que el sistema pugui
suportar la pèrdua dʼuna neurona sense que es perdi gran quantitat d'informació i que
resulti tolerant a errors. En el nostre cervell moren moltes neurones diàriament sense que
el funcionament d'aquest se'n ressenteixi fins al cap de molts anys.

Per últim és important veure que les xarxes neuronals no segueixen un algorisme o
programa en el sentit que ho fa un ordinador. El coneixement de les XNA està
emmagatzemat en els pesos de les connexions i les xarxes tenen la capacitat dʼaprendre
a partir dʼexemples i de la experiència i dʼextrapolar conceptes a partir dʼaquests, són
adaptatives i entrenables.

13
El pare de la IA, Alan Turing, va idear un model de màquina teòrica capaç de tractar
informació seguint un programa. La Màquina de Turing és
capaç de desplaçar-se per una cinta infinita i llegir i escriure
informació en cada casella. Les accions que duu a terme estan
escrites en un programa o algoritme que la màquina segueix.
La màquina de Turing pot tractar informació a nivell analític i pot
resoldre qualsevol problema computable. La majoria de
problemes són computables, un exemple de problema no
computable serien els problemes indecidibles, com el problema
de decisió (Entscheidungsproblem) que consisteix en saber si
una fórmula de càlcul de primer ordre és un teorema.

Un ordinador convencional és una màquina de Turing. Així doncs, un ordinador pot


simular la acció d'una xarxa neuronal, clar que perdent moltes de les virtuts d'aquestes
com el processament en paral·lel.

De la mateixa manera, les xarxes neuronals són també màquines de Turing. Això es
demostra veient que una xarxa neuronal pot realitzar qualsevol tasca que faci un circuit
digital ja que una xarxa neuronal es capaç d'implementar qualsevol funció booleana.

Tant un ordinador, com una xarxa neuronal son maquines de Turing però no tenen la
mateixa eficàcia en les mateixes tasques. Un ordinador convencional és molt més eficaç
en tasques d'alt nivell com lògica, càlcul o raonament. En canvi les xarxes neuronals són
millors per a resoldre tasques de baix nivell com percepció o classificació de patrons i per
a tractar amb grans quantitats d'informació.

14
Aplicacions Pràctiques de les Xarxes Neuronals
Les XNA són bastant útils en aplicacions on no es coneix lʼalgoritme o funció a programar
però es disposen de múltiples exemples dʼentrada. Són útils a la hora de donar respostes
a temps real i són útils a lʼhora de realitzar processos susceptibles a soroll de fons i
imperfeccions en les entrades.

Per tot això, sʼutilitzen en programes de reconeixement de veu, detecció òptica de


caràcters (OCR), reconeixement de vehicles en els peatges de les autopistes,
processament de senyal, predicció, economia, estadística... Tasques que normalment
utilitzen el reconeixement de patrons.

Sʼha de tenir molt en compte que les xarxes no són la solució directa a un problema. La
implementació dʼuna xarxa en una aplicació sol anar acompanyada dʼaltres mecanismes
per optimitzar les dades dʼentrada i simplificar la tasca de la xarxa.

15
Bases de les Xarxes Neuronals Artificials
La unitat bàsica d'una xarxa neuronal artificial és la neurona, les neurones es poden
organitzar en capes i un conjunt de capes forma la xarxa neuronal. La xarxa neuronal,
juntament amb les entrades i sortides i els processos auxiliars que siguin necessaris per
adaptar les entrades i sortides constitueixen el sistema neuronal de processament.

A més de les neurones, un sistema neuronal necessita un patró que marqui les
connexions de les neurones (arquitectura) i un patró que marqui l'ordre en què les
neurones s'activen, a més d'una regla d'aprenentatge.

Esquema simplificat de xarxa neuronal artificial. Adaptat i extret de es.wikipedia.org

La Neurona

Una neurona és un processador simple que a partir d'un vector d'entrada procedent de
l'exterior o d'altres neurones proporciona una resposta o sortida.

Esquema complet dʼuna neurona artificial. Adaptat i extret de en.wikibooks.org


16
El model general de la neurona artificial, representat a lʼesquema, si bé acostuma a ser
més simple, esta compost per:

Entrades
Les entrades, igual que les sortides, poden ser binaries (discretes), normalment 0 o 1, o
bé contínues depenent del tipus de xarxa. Les sortides de les neurones continues
solen estar limitades dins d'un interval definit.

Pesos Sinàptics
Per les connexions, sinapsis, que uneixen les neurones, la informació només pot
circular en un únic sentit. Així podem parlar de neurones presinàptiques, les que envien
la informació, i postsinàptiques, les que la reben.

Els pesos són valors que tenen les connexions entre neurones i que modifiquen
l'entrada de la neurona postsinàptica. Representen la intensitat d'interacció entre la
neurona presinàptica i la neurona postsinàptica. Si el pes és positiu és, amb més o
menys grau, excitador. Si és negatiu es inhibidor. Si una connexió és excitadora o
inhibidora sʼacostuma a decidir durant l'entrenament, no de manera explícita a l'hora de
planificar la xarxa.

Regla de Propagació
La regla de propagació és una funció que obté el potencial postsinàptic, el potencial
total que arriba a la neurona, a partir de les entrades i els pesos.

La funció més habitual és la suma de les entrades multiplicades cada una pel seu pes
corresponent. O el que és el mateix, el producte escalar dels vectors entrada i pes
sinàptic:

On w és el vector de pesos i x el vector dʼentrada.

Funció d'activació
Dóna com a resultat l'estat d'activació actual a partir del potencial postsinàptic i de
l'estat d'activació anterior, tot i que moltes vegades l'estat d'activació anterior no es té
en compte (només tindria rellevància si la xarxa tingués en compte el factor temps a
lʼhora d'operar).

Acostuma a ser monòtonament creixent i contínua, com passa en les neurones


biològiques. A vegades els algoritmes d'aprenentatge necessiten que aquesta funció

17
sigui derivable, com en el cas de l'algoritme de retropropagació del perceptró multicapa,
que veurem més endavant.

Funció de sortida
Proporciona la sortida final de la neurona en funció de l'estat d'activació. Normalment, o
bé la funció d'activació es considera com la sortida final o bé la funció de sortida és de
tipus esglaó, fent que la neurona es dispari a partir d'un cert valor.

Arquitectures

L'arquitectura d'una xarxa és l'estructura o patró amb que es connecten les neurones
d'aquesta. Aquesta estructura de connexions determina el comportament de la xarxa, és a
dir, si es canvia, les respostes i, possiblement, les capacitats de la xarxa canviaran.

Com ja hem dit les neurones s'agrupen en capes, i les neurones de les capes es poden
subdividir en altres grups.

De la mateixa manera que abans hem distingit tres tipus de neurones biològiques, també
podem, amb el mateix criteri, distingir diferents tipus de capes:

- Capa d'entrada: Les neurones d'aquesta capa reben dades de l'entorn.

- Capa de sortida: Les neurones d'aquesta capa proporcionen la resposta de la


xarxa.

- Capa Oculta: Les neurones reben informació d'altres neurones i envien les seves
sortides a altres neurones. Es la única capa de la que n'hi pot haver mes d'una i
cada capa oculta dóna la possibilitat a la xarxa de trobar representacions internes
pròpies i diferents de l'entrada donada, és a dir, tenir un altre punt de vista de les
dades d'entrada, cosa que dóna més capacitat i llibertat a la xarxa (com veurem
amb el perceptró).

Les connexions entre neurones també es poden classificar en tres grups:

- Connexions entre capes: entre neurones de diferents capes.

- Connexions laterals (intercapa): entre neurones de la mateixa capa.

- Connexions realimentades: que tenen un sentit contrari al de la resta de


connexions (en cada connexió la informació només pot circular en un sentit, com ja
hem dit).

18
Podem classificar les xarxes segons les seves capes en xarxes monocapa (amb una sola
capa) i xarxes multicapa (dividides en varies capes). I segons les seves connexions en
xarxes unidireccionals, on la informació circula en un únic sentit, i xarxes realimentades
(feedback) on la informació pot circular en qualsevol sentit. Lʼesquema dʼuna xarxa
neuronal artificial que hem presentat abans correspondria a una xarxa realimentada i
multicapa.

A més les xarxes es poden dividir en heteroassociatives, on un patró d'entrada A s'associa


amb una sortida B, i autoassociatives on l'entrada d'un patró A s'associa amb la sortida A.
Pot semblar que aquestes últimes no tenen gaire utilitat, però són útils a l'hora d'identificar
patrons d'entrada distorsionats, amb soroll.

Dinàmica d'actualització

La dinàmica d'actualització és el patró que segueixen les neurones a l'hora d'activar-se,


d'actualitzar el seu estat, la seva sortida. Dues xarxes idèntiques però amb diferent
dinàmica d'actualització produiran, segurament, respostes diferents per a entrades iguals.
Es distingeix entre dues dinàmiques principals:

• Dinàmica asíncrona: les neurones s'activen sense tenir en compte quan ho fan les
altres. Normalment les dinàmiques asíncrones s'utilitzen amb neurones de resposta
contínua, model que s'apropa més al biològic.

• Dinàmica síncrona: Les neurones s'actualitzen seguint un cert rellotge i ordre.


Normalment les activacions es fan per capes, actualitzant totes les neurones d'una
capa alhora. Tot i que la dinàmica asíncrona és la que correspon al model biològic, la
síncrona és la més usada en les xarxes neuronals artificials ja que és més simple.

A més d'aquestes dinàmiques n'hi ha una altra no determinista (estocàstica) on la sortida


de la neurona té un caràcter probabilístic. Per exemple en el model neuronal de La
Màquina de Boltzmann la sortida de les neurones s'interpreta com la probabilitat que la
sortida de la neurona sigui 1 (activa).

Entrenament

L'entrenament és el procés pel qual s'ajusten alguns dels paràmetres de la xarxa neuronal
per què realitzi un processament determinat utilitzant un conjunt de patrons d'entrada
establerts com a exemples.
19
Normalment aquests paràmetres a ajustar són els pesos de les connexions tot i que
l'entrenament també es pot fer creant i destruint neurones o connexions. Escollir
l'arquitectura adequada per a la xarxa, és a dir, escollir la distribució de neurones i
connexions també es pot considerar part de l'entrenament, si bé això no es fa de manera
automàtica.

Per a fer un sistema neuronal s'escolleix un model de neurona i un tipus d'arquitectura.


Els pesos de les connexions, en canvi, són en un principi nuls o aleatoris i es deixa en
mans de l'entrenament donar-los els valors adequats. Una xarxa abans d'entrenar no té
cap utilitat ja que les seves sortides seran o nul·les o aleatòries.

L'entrenament se sol fer utilitzant una regla d'aprenentatge (construïda a partir de


l'optimització de la funció d'error de la xarxa) que va modificant poc a poc els pesos i
reduint l'error. L'entrenament és iteratiu, en cada iteració es presenta una entrada exemple
a la xarxa a partir del qual la regla d'aprenentatge modifica el pes de cada connexió. Això
es repeteix fins que la xarxa “aprèn” dels exemples. Si la xarxa té una bona capacitat de
generalització, al final de l'entrenament donarà les sortides correctes no només per a les
entrades utilitzades durant l'entrenament sinó per a qualsevol entrada.

Cal veure que si normalment l'únic que és modifica durant l'entrenament són els pesos,
són aquests els que tenen, d'alguna manera, emmagatzemada tota la informació que
permet a la xarxa operar correctament. Durant cada iteració, en què es planteja una
entrada exemple, el que la regla d'aprenentatge fa és guardar informació sobre aquesta
entrada en els pesos. D'aquesta manera, a més, la informació queda distribuïda per tota
la xarxa.

Clàssicament els algoritmes d'aprenentatge s'han dividit en dos grups, tot hi que seʼn
poden diferenciar més:

• Aprenentatge Supervisat: A més del conjunt d'entrades d'exemple, a la xarxa també


sʼindiquen les sortides desitjades per a cada entrada. La xarxa calcula la sortida per a
l'entrada donada i la compara amb la sortida desitjada, utilitzant l'error comés
s'ajusten els pesos. L'aprenentatge supervisat és més complex però sol ser més
exacte.

20
• Aprenentatge No Supervisat: Aquí no es proporciona més informació apart de les
entrades. El que fa la xarxa es organitzar d'alguna manera les diferents entrades.
Troba regularitats, extreu característiques comuns o organitza les entrades segons
algun tipus de similitud (fa clustering). Normalment aquestes xarxes realitzen una
estimació de la funció densitat de probabilitat, p(x). p(x) és la funció que defineix la
distribució que tenen els patrons x de l'espai d'entrada a partir de mostres.
L'aprenentatge no supervisat s'utilitza normalment per organitzar grans quantitats de
dades i en estadística.

Un cop la xarxa ha estat correctament entrenada i es comença a utilitzar amb usos


pràctics es deixa d'entrenar. Quan la xarxa funciona amb normalitat els pesos són
constants invariables. En les xarxes unidireccionals, sense connexions realimentades,
s'introdueixen les dades per la capa d'entrada, cada neurona es va activant quan toca i al
final la xarxa dóna una resposta per la capa de sortida. Les xarxes amb feedback, en
canvi, presenten algun problema a la hora de donar una resposta ja que les dades no
circulen en un únic sentit i poden formar bucles, són sistemes dinàmics no lineals.
Necessiten unes certes condicions per a que acabin donant una resposta. Hi ha un seguit
de teoremes que estudien quines són aquestes condicions basant-se en la funció
d'energia de Lyapunov que estudia la estabilitat d'un sistema dinàmic. Però en aquest
treball no tractarem cap xarxa amb realimentació, així que no hi aprofundirem més.

21
El perceptró i el perceptró multicapa

El 1959 Rosenblatt va introduir el model del perceptró simple inspirat en les primeres
etapes de processament dels sistemes sensorials biològics. El perceptró va gaudir de molt
èxit durant els anys seixanta, però la publicació del treball de Minsky i Papert Perceptrons
l'any 1969 en va evidenciar les limitacions. La solució per a les limitacions del perceptró
era afegir més capes ocultes de neurones, creant el perceptró multicapa, però no se sabia
com entrenar una xarxa amb capes ocultes. El problema de l'entrenament dels
perceptrons multicapa es va resoldre per primer cop el 1974 per Werbos en la seva tesis
doctoral. Però el seu descobriment no va transcendir, segurament perquè en aquella
època els ordinadors encara no eren suficientment potents per a demostrar totes les
possibilitats dels perceptrons multicapa. Més tard, al 1984 D. Parker va redescobrir
l'algoritme d'entrenament, però qui li va donar la fama va ser el grup PDP (Parallel
Distributed Processing Research Group, Universitat de Califòrnia), que també va
redescobrir l'algoritme el 1985 i el va utilitzar en la resolució de problemes complexos.

Els perceptrons són xarxes neuronals unidireccionals i tenen un entrenament supervisat.


Actualment el 70% de les aplicacions pràctiques de les xarxes neuronals implementen
l'arquitectura de perceptró multicapa amb un entrenament de retropropagació o algun
derivat d'aquest.

El perceptró
El perceptró està format per dues capes, una d'entrada i una de sortida. Cada neurona de
la segona capa esta connectada a totes les de la primera, que no realitzen cap càlcul,
només serveixen com a entrada de la informació de l'exterior. La sortida de les neurones
de la segona capa és la sortida de la xarxa. En principi, el perceptró només accepta
entrades i sortides binaries (0 o 1 o bé -1 o 1 depenent de la funció d'activació de les
neurones).

22
Les neurones de cada capa s'actualitzen al mateix temps i les capes s'executen en ordre
des de l'entrada fins a la sortida. La tasca que duu a terme el perceptró es pot resumir
amb la formula:

On n són les neurones dʼentrada, m les de sortida, w es el vector de pesos, Θ els llindars i
x el vector dʻentrada de la xarxa.

És a dir, cada neurona de la segona capa realitza la suma de totes les entrades (de totes
les entrades de la xarxa, ja que cada neurona està connectada a totes les neurones
d'entrada) multiplicades pel seu pes. A el valor obtingut hi resta el llindar. El llindar és com
els pesos de les connexions, un valor lliure que es calibra durant l'entrenament de la
xarxa. I al resultat de la resta s'hi aplica la funció d'activació, que en el perceptró sol ser la
funció unitària de Heaviside:

El perceptró és útil com a classificador de patrons o per a representar funcions booleanes


(funcions matemàtiques amb variables binaries unides mitjançant àlgebra de boole).

Algoritme d'aprenentatge del perceptró


L'algoritme ideat per Rosenblatt permet determinar automàticament els pesos sinàptics i
els llindars que classifiquen un conjunt de patrons. Com ja hem dit, el perceptró té un
aprenentatge supervisat, per tant aquest patrons per a l'entrenament han d'anar
acompanyats de les sortides que esperem de la xarxa.

L'aprenentatge del perceptró es basa en anar corregint l'error de la xarxa (comparant la


sortida que dóna davant d'un determinat patró amb la que hauria de donar), modificant els
pesos i els llindars en funció d'aquest.

23
Per a l'entrenament necessitem una xarxa amb els pesos i llindars aleatoris i un conjunt
de n patrons xu amb les sortides ideals tu on u = (1,...,n). El procés d'aprenentatge
consistiria en entrar un patró patró xu a la xarxa. Si la sortida de la xarxa no coincidís amb
tu actualitzaríem els pesos de la xarxa seguint la regla:

On yi és la sortida de la neurona i de la segona capa i xj és la sortida de la neurona j de la


primera capa.

ε és un valor arbitrari que representa el ritme d'aprenentatge. A l'hora de realitzar


l'entrenament s'ha de pensar en quin és el més adient, ja que un valor massa baix
alentiria l'aprenentatge i un de gran, faria que els pesos oscil·lessin d'una iteració a l'altre
esborrant, l'aprenentatge d'iteracions anteriors.

L'aprenentatge és iteratiu, així que aquesta tasca s'ha de realitzar amb tots els patrons xu
fins que el perceptró quedi ben ajustat. Com les entrades i les sortides són discretes, les
actualitzacions en els pesos també ho seran.

Limitacions del perceptró


Però el perceptró només pot resoldre problemes separables linealment, és a dir, el
problema es pot resoldre dividint tot el mapa d'entrades amb un hiperpla (una línia recta si
estem en dos dimensions), separant-lo en dues regions de decisió, una en la que el
perceptró respondria 0 i l'altre en la que respondria 1.

Regions de decisió del pla separades Problema no separable linealment.


per una linia de discriminació. Irresoluble per a un perceptró

24
Per tant, el perceptró pot resoldre amb èxit qualsevol problema separable linealment, però
fracassarà en els que no ho són. Si el problema és separable linealment l'algoritme
d'aprenentatge acabarà trobant una solució en un nombre finit d'iteracions, si no, anirà
oscil·lant indefinidament.

Un problema de l'aprenentatge del perceptró és que la línia o hiperpla de discriminació


que separa els dos grups de mostres en l'espai pot quedar més aprop d'un que de l'altre i
no en mig com seria correcte. Hi ha alguns algoritmes que solucionen això com l'Adatron.

El Perceptró Multicapa
Com ja hem dit, la manera de solucionar les limitacions del perceptró és afegint capes
ocultes. La següent imatge mostra les diferents regions de decisió possibles en funció de
si el perceptró té dues, tres o quatre capes.

Extret de http://www.willamette.edu/~gorr/classes/cs449/Classification/perceptron.html

Si les neurones són de resposta discreta els contorns de les regions de decisió tindran els
costats rectes, amb cantonades marcades. Si les neurones en canvi són de resposta
continua, els contorns no tindran cantonades.

S'ha demostrat matemàticament que un perceptró multicapa amb una capa oculta pot
aproximar qualsevol funció arbitraria donada. Això és molt important perquè, normalment,
quan es parla de resoldre un problema del món real el que es vol és trobar una funció que
transformi les entrades donades en les sortides desitjades.

25
En un perceptró multicapa cada neurona està connectada a totes les de la capa anterior
(excepte les dʼentrada, que tampoc realitzen cap càlcul). La operació és igual que en el
perceptró simple, però repetint-se per a cada capa i utilitzant com a entrada les sortides
de la capa anterior. Per a obtenir la sortida dʼuna capa donada que no sigui la d'entrada, el
calcul que duria a terme la xarxa seria:

On n són les neurones de la capa anterior, m les de la capa actual, w es el vector de


pesos entre aquestes dues xarxes i x el vector dʻentrada de la capa. Lʼequació és la
mateixa que en el perceptró simple.

I si volem calcular, per exemple la sortida d'un perceptró de 3 capes,

On k és el nombre de neurones de la tercera capa, j el de la segona i i el de la primera, z


és la sortida de la xarxa, x lʼentrada, w els pesos entre la primera i la segona capa, wʼ els
pesos entre la segona i la tercera capa, Θ els llindars de la primera capa i Θʼ els de la
segona capa

La sortida de lʼanterior és lʼentrada de la següent i així es poden anar encapsulant una


dins lʼaltra, tantes capes com es vulgui.

La funció f(x) acostuma a ser de tipus sigmoide:

La funció sigmoide és continua i perfectament creixent. En el primer cas té dues


asímptotes horitzontals, en x=0 i en x=1, i en el segon en x=-1 i en x=1. És a dir,
proporciona una sortida continua de domini R i de recorregut limitat cosa que la fa molt
útil. A més, la derivada de la funció sigmoide és molt simple, cosa que facilita els càlculs a
lʼhora dʼentrenar la xarxa.
26
Algoritme de Retropropagació (Back-Propagation)
Lʼalgoritme de retropropagació serveix per entrenar xarxes de perceptró multicapa. En
aquest aprenentatge, també supervisat, per a una entrada dʼexemple donada a la xarxa,
seʼn calcula la sortida, que es compara amb la sortida desitjada obtenint un error δ que es
propaga cap enrere per totes les capes ocultes de la xarxa obtenint lʼerror parcial de cada
neurona per després actualitzar tots els pesos i llindars dʼacord amb aquest error.

Per mostrar més fàcilment el funcionament de lʼalgoritme dʼaprenentatge farem un


exemple pas a pas il·lustrat amb esquemes. Extret i adaptat de la web de la Akademia
Górniczo-Hutnicza de Polònia, els esquemes utilitzats també són dʼaquesta web [http://
galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html].

Suposem una xarxa de quatre capes, una capa dʼentrada de dues neurones, dues capes
ocultes de tres i dues neurones i una de capa sortida dʼuna neurona. Amb uns pesos wmn
on m es la neurona presinàptica i n la postsinàptica. I amb una entrada x i una sortida y.

27
Cada neurona suma el producte de les seves entrades pels seus pesos obtenint e i aplica
la funció f(x) a e obtenint la sortida y.

Presentem una entrada i calculem successivament les sortides de totes les neurones
(capa a capa) fins a la última capa. Com a mostra, en la primera imatge es veu com
calcula la sortida y1 de la neurona 1 i en la segona la sortida y (la total) de la neurona 6.

28
Un cop hem calculat la sortida de la xarxa busquem lʼerror total.

Lʼerror total surt de restar a lʼobjectiu z la sortida de la xarxa y. Ara propaguem lʼerror cap
enrere. A mostra dʼexemple posem el càlcul de lʼerror de la sortida de la neurona 4 i de la
neurona 3.

Lʼerror només es propaga per les capes ocultes. Un cop tenim tots els errors propagats
comencem a actualitzar els pesos de cada capa. La formula per actualitzar els pesos és:

29
On wʼmn és el pes actualitzat, wmn el pes antic, δn és lʼerror en la neurona n, dfn(e)/de és la
derivada de la funció activació en e. e és el potencial postsinàptic, es a dir, la suma de
totes les entrades de la neurona multiplicades pels seus pesos, que ja ha estat calculat
quan buscàvem la sortida de la xarxa. xm és la sortida de la neurona presinàptica m i η és
un valor que determina la velocitat de lʼaprenentatge, com en el perceptró simple es
decideix arbitràriament.

En aquesta última imatge sʼhan actualitzat els pesos entre la primera capa i la neurona 1,
w(x1)1 i w(x2)1. El procés es repeteix amb tots els pesos fins a lʼultima capa.

La xarxa de lʼexemple no utilitza llindars. Lʼactualització dels llindars és realitza de la


mateixa manera, al mateix temps i amb la mateixa formula que els pesos, però
considerant-se lʼentrada xm = -1:

30
Les regles dʼaprenentatge sʼacostumen a deduir a partir dʼalguna funció dʼerror o
dʼoptimització de la xarxa. En la retropropagació la formula és dedueix a partir de lʼerror
quadràtic mitjà. Lʼerror quadràtic és el quadrat de lʼerror total. Ens interessa anular per
igual tant lʼerror per excés com lʼerror per defecte, podríem aplicar el valor absolut de
lʼerror per eliminar el signe, però matemàticament el valor absolut és difícil de tractar i per
tant resulta més fàcil elevar al quadrat lʼerror. La formula de lʼerror quadràtic mitjà en
funció dels pesos i dels llindars és:

On W és el vector de pesos de tota la xarxa, Θ és el vector de pesos de tota la xarxa, k és


el nombre de neurones de la última capa, t la sortida desitjada i y la sortida actual de la
xarxa.

La regla dʼaprenentatge sʼobté de lʼoptimització dʼaquesta funció dʼerror. La optimització


és duu a terme mitjançant el descens per gradient, consistent en buscar la pendent més
alta de la funció respecte la situació actual dels pesos i modificar aquests i els llindars per
anar en direcció contraria, baixant la pendent i minimitzant lʼerror.

31
Aquesta gràfica (extreta de Redes Neuronales y Sistemas Borrosos, Martín del Brío y
Sanz Molina 2006) representa una funció dʼError E(w). Mitjançant el descens per gradient
es busca en quina direcció hi ha un gradient més elevat i es mou la posició actual en
sentit contrari, baixant cap al fons de la vall. La regla dʼaprenentatge sempre acabarà
arribant a un mínim local de la funció dʼerror, però aquest mínim no té perquè ser el mínim
global de la funció. Pot passar que durant lʼaprenentatge sʼarribi a un mínim local (com la
vall de lʼesquerra en el gràfic) i que lʼalgoritme es quedi estancat sense disminuir més
lʼerror.

El procediment global dʼun entrenament consistiria en:


1) Iniciar pesos i llindars amb valors aleatoris. Si els pesos fossin nuls l'aprenentatge no
funcionaria ja que les sortides de les neurones i lʼincrement de pesos sempre seria nul.
2) Per a cada entrada dʼun patró a la xarxa, calcular la sortida, propagar lʼerror cap enrere
i calcular lʼincrement dels pesos.
3) Actualitzar pesos: Els canvis en els pesos es poden actualitzar de dues maneres.
Lʼaprenentatge es pot fer per lots (batch), calculant les variacions de pesos (pas 2) per
a tots els exemples donats i actualitzar els pesos amb la suma de tots els increments.
O bé es pot fer en sèrie (on line), actualitzant els pesos després de presentar cada
patró. Lʼaprenentatge en sèrie proporciona millor rendiment, sobretot en casos on hi ha
molts patrons dʼexemple. És important que en lʼaprenentatge en sèrie els patrons
dʼexemple es presentin en un ordre aleatori per tal de no discriminar alguns patrons i
evitar caure en alguns mínims locals.
4) Si lʼerror actual de la xarxa no es satisfactori, repetir des de 2.

Problemes de lʼaprenentatge
A part de la possibilitat dʼestancar-se, lʼalgoritme de retropropagació té dos problemes
més, lʼentrenament és lent i hi ha la possibilitat de sobreaprenentatge, ja que si sʼentrena
massa la xarxa, aquesta sʼadapta massa als patrons dʼexemple i perd capacitat de
generalització.

Per resoldre alguns dʼaquest problemes es plantegen correccions i variants de la


retropropagació. Però les mesures fonamentals per evitar molts del problemes de la
retropropagació no passen per modificar lʼalgoritme. Un bon preprocessat de les dades
dʼentrada a la xarxa i uns pesos inicials convenients ajuden bastant.
32
Una de les modificacions consisteix en afegir a lʼalgoritme un factor d'inèrcia, proporcional
a lʼincrement dels pesos en la iteració anterior.

Aquesta és lʼequació dels increments dels pesos afegint-hi el paràmetre d'inèrcia. α és un


factor arbitrari entre 0 i 1 que determina la influencia de la inèrcia, acostuma a ser proper
a 1.

La inèrcia fa que si un pes té sempre un increment amb el mateix signe aquest sigui cada
vegada més gran. En cas contrari si el signe va variant, ara més ara menys, la inèrcia
tindrà un efecte contrari tendint a anular aquestes variacions. Millora la velocitat de
lʼaprenentatge i, a més, en alguns casos pot evitar caure en mínims locals.

Hi ha altres algoritmes que utilitzen un ritme dʼaprenentatge diferent per a cada pes que a
més a més va canviant amb el temps. Uns altres analitzen el ritme de canvi del pendent
fent la segona derivada. Aquests algoritmes poden reduir bastant el temps dʼexecució,
però són molt més complexos.

Abans hem mencionat que lʼentrenament té el perill de sobreaprenentatge de la xarxa i


que això en deteriora la capacitat de generalització. Abans de res, la capacitat de
generalització és la capacitat que té la xarxa per donar una resposta correcta a patrons
dʼentrada que no han estat utilitzats durant lʼentrenament. El que nosaltres esperem dʼuna
xarxa és que a partir dʼentrenar-la amb uns quants patrons dʼexemple en serveixi per a
processar pràcticament qualsevol altre patró correctament. Així que la capacitat de
generalització és una característica fonamental en una xarxa neuronal.

Al principi la xarxa sʼadapta progressivament al conjunt dʼexemples. El sobreaprenentatge


és deu a què a partir dʼun cert punt el sistema sʼajusta massa als patrons utilitzats en
lʼentrenament, el que fa es memoritzar-los, augmentant lʼerror davant de patrons que no
siguin els dʼentrenament. A partir dʼun cert punt, com més es redueixi lʼerror dels
paràmetres dʼexemple més augmentarà lʼerror amb patrons diferents.

33
!"#$%&'()( ( *+%,&-.//01("('23(4",423(+2.,&+"'3(

!
!
"#$%!&%&%!'()*+,)!-./01!(12(1!1*3!45)267#88#0$!9432)+491-1!1!/01!(12(1!3)0!)082)01-1%!
!
!
La gràfica (extreta de http://upcommons.upc.edu/) mostra una relació entre lʼentrada i la
:400)(#409!
sortida! dʼuna xarxa. Els punts marquen entrades dʼexemple. La línia contínua seria fruit
;),!</)!71!1!,1!=400)=8#5#818>!/01!0)/2401!+48!)9812!=400)=81-1!1!/0)9!+4</)9!
dʼun entrenament correcte, ja que ha captat la forma que transmeten els patrons. En canvi
5)?0)9>! 1! 848)9! ,)9! 0)/240)9! -)! ,1! =1+1! +2@5#1! 4! 1! 848)9! ,)9! 0)/240)9! -)! ,1!
(12(1%!
la línia A42*1,*)08!
discontinua )9! -#99)0B)0!
representa una xarxa (12()9! 40! /01! 0)/2401!
sobre-entrenada ja que )98C! 8481,*)08!
sʼadapta massa als
#08)2=400)=81-1!1*3!,)9!0)/240)9!-)!,)9!=1+)9!=409)=/8#5)9!+)2D!04!E4!)98C!
patrons, perdent la forma general.
1*3!,)9!-)*F9!0)/240)9!-)!,1!9)51!*18)#(1!=1+1%!!
G01!(12(1!40!),!7,/(!-H#0742*1=#I!F9!-H/01!0)/2401!=1+!1!/01!1,821!</)!+)2810B!
1!,1!=1+1!+498)2#42!F9!/01!(12(1!J7))-6742K12-L!4!-)!=400)(#409!=1+!)0-15108!
Per controlar quin és el punt òptim on sʼha de deixar dʼentrenar la xarxa és fa una
M7#$%!&%NO%!
P1*3F!
validació )(#98)#()0!
creuada 9#98)*)9! 2)=/22)089>!
(cross-validation), </)! dos
tenint en compte =408)0)0!
errors, =400)(#409! =1+! amb
lʼerror de la xarxa
)0-122)21%! '0! 1</)98! 8#+/9! -)! (12()9! +4-)0! )(#98#2! 81*3F! =400)(#409! -)! ,)9!
els patrons utilitzats per a lʼentrenament i lʼerror de generalització de la xarxa amb altres
0)/240)9!1*3!),,)9!*18)#()9%!
!
patrons. Sʼagafen dos conjunts dʼexemple, un sʼutilitzarà per a lʼentrenament i lʼaltre
!
sʼutilitzarà per controlar lʼerror de generalització de la xarxa. A la que lʼerror de
Q+2)0)0818$)!
!
generalització comenci a augmentar vol dir que ja sʼestà sobre-entrenant la xarxa.
RH1+2)0)0818$)! -H/01! (12(1! 0)/2401,! F9! ),! +24=F9! +),! </1,! 1-</#2)#(! ),!
=4*+4281*)08! -)9#8S18>! 1! 8215F9! -)! 512#12! ),9! +)949! -)! =400)(#I! )082)!
Per al 0)/240)9%!'(#98)#()0!-49!8#+/9!-H1+2)0)0818$)T!
sobre-entrenament de la xarxa també sʼhan de tenir en compte les dimensions
!
dʼaquesta. Una xarxa molt gran necessitara molts més patrons exemple que una més
6!R.1+2)0)0818$)!9/+)25#918>!40!,1!(12(1!9.)082)01!1*3!-1-)9!-.)0821-1!#!1*3!
petita.-1-)9!-)!9428#-1!1994=#1-)9%!;)2!1!2)1,#8U12!1</)98!1+2)0)0818$)!F9!0)=)9912#!
Una xarxa gran amb pocs exemples, tindrà el risc de sobre-entrenar-se molt més
/0! =40S/08! -.),)*)089! 2)+2)9)0818#/9! -),! =4*+4281*)08! -)9#8S18>! -)! +12),,)9!
ràpid-.)98V*/,!
que una que té més +)2!
6! 2)9+4981! exemples o que,1!
1! )09)0B12! és(12(1%!
més petita. Sʼestima
'0! +2#*)2! ,,4=! la
E#!següent relació entre
E1! /0! +)2V4-)!
-H)082)01*)08%!W/2108!1</)981!719)!9H1-1+8)0!),9!+)949!-)!,1!(12(1!)0!7/0=#I!
els patrons dʼexemple, lʼerror i els factors lliures de la xarxa (pesos i llindars):
-)!,)9!-1-)9!1+4281-)9!1!8215F9!-)!*#0#*#8U12!/01!7/0=#I!-.)2242!)0!),!=40S/08!
-)! -1-)9! -.)082)01*)08%! :4*+12108! ,1! 2)9+4981! -)! ,1! (12(1! 1*3! ,1! 2)9+4981!
-)9#8S1-1! )9! *4-#7#</)0! ),9! +)949! -)! *10)21! </)! *#0#*#8U#0! 1</)98! )2242!
*#8S10X108!2)824+24+1$1=#I%!R.1+2)0)0818$)!=408#0/1!7#09!</)!,.)2242!F9!*)042!1!
/0!51,42!)9813,)28!4!7#09!</)!F9!*V0#*%!Q!=408#0/1=#I>!-/2108!,1!719)!-.)()=/=#I>!
,1!(12(1!0)/2401,!7/0=#401!1*3!),9!+)949!7#(189%!
On p !és el nombre dʼexemples dʼentrenament, w els factors lliures i ε lʼerror desitjat.

( 34 56
Això és un problema, ja què si per exemple volem una xarxa amb un error del 10%
(ε=0,1). Això vol dir que necessitem deu vegades més patrons que el nombre de factors
lliures per establir correctament el mapa de decisió. Normalment és necessitaran més
exemples dels que es poden disposar. Així que la tendència serà a reduir la mida i els
factors lliures de la xarxa. Hi ha varies tècniques per reduir els pesos de la xarxa com
compartir pesos entre varies neurones, eliminar els pesos que aporten poc a la xarxa...

35
Mapes Auto-organitzats de Kohonen
El perceptró i el perceptró multicapa tenen uns algoritmes dʼentrenament supervisats
(sʼespecifiquen les sortides desitjades durant lʼentrenament), els mapes de Kohonen, en
canvi, tenen un entrenament auto-organitzat o no supervisat.
En lʼentrenament no supervisat no sʼindiquen les sortides objectiu per a cada patró
dʼentrada. La sortida de la xarxa reflexa les similituds i diferències entre els patrons
dʼentrada. Els models no supervisats solen ser més simples, monocapa i amb algoritmes
senzills i ràpids que sʼapropen més als models biològics. Es solen dividir en dos grups:

Xarxes no supervisades hebbianes


Es caracteritzen per tenir moltes neurones de sortida. Lʼaprenentatge dʼaquestes xarxes
és de tipus Hebb.

Donald Hebb va postular el 1949 un mecanisme dʼaprenentatge per a les neurones


biològiques que deia: “quan un axó presinàptic causa la activació dʼuna neurona
postsinàptica la eficàcia de les sinapsis que les relaciona es reforça”. Dit dʼuna altra
manera, quan una neurona sʼactiva, les connexions cap a aquella neurona es veuen
reforçades. Traslladat a les xarxes neuronals artificials, durant lʼaprenentatge els pesos és
modifiquen proporcionalment al producte de lʼentrada de la neurona per la sortida
dʼaquesta neurona. Aquest és un aprenentatge simple i realitzat a nivell de cada neurona,
però és pren com a punt de partida per molts altres algoritmes dʼaprenentatge.

Treballs experimentals posteriors han demostrat que aquest tipus dʼaprenentatge està
present en les neurones biològiques juntament amb altres mecanismes.

Xarxes no supervisades competitives


Les neurones utilitzen inhibicions laterals per anular la resta. Sʼestableix una competició
entre totes les neurones al final de la qual una sola neurona quedarà activada, la neurona
guanyadora. Les neurones guanyadores tenen com a premi un reforç de les seves
connexions sinàptiques. És solen utilitzar en tasques dʼagrupament de patrons o
categorització. Els mapes auto-organitzats de Kohonen, introduïts als anys vuitanta pel
físic finlandès Teuvo Kohonen, pertanyen a aquesta categoria.

36
Mapes de Kohonen
Sʼha observat que en el cervell alguns tipus de neurones detectores es distribueixen
ordenades topològicament, representant la informació espacialment. Per exemple les
neurones que reben senyals de llocs pròxims de la pell també estan properes en el
cervell. Els mapes de trets auto-organitzats (Self-Organizing Feature Maps, SOFM)
tracten dʼimitar això.

Funcionament del Mapes Auto-organitzats de Kohonen


Els SOFM sʼutilitzen per a la visualització de dades. Quan les dades són dʼaltes
dimensions no podem, o ens resulta molt difícil poder visualitzar-les, entendre-les,
processar-les i trobar patrons comuns o semblances. Lʼobjectiu dels SOFM és organitzar
en un mapa de dimensions més reduïdes tot un espai dʼentrada agrupant patrons similars.
Els SOFM tendeixen a representar la funció densitat de probabilitat p(x) i els patrons x que
apareixen amb més freqüència tendeixen a ocupar més neurones del mapa.

Per la primera capa entren dades, mostres estadístiques de lʼespai dʼentrada i en la


segona capa queda plasmat un mapa on cada neurona representa un patró dʼentrada
concret i on els patrons semblants són propers en lʼespai.

Els mapes de Kohonen són unidireccionals i estan formats per dues capes. La primera
capa, dʼentrada, està formada per m neurones que, com en el perceptró no realitzen cap
càlcul. Cada neurona de la primera capa està connectada a totes les de la segona capa
mitjançant pesos sinàptics.

La segona capa, de sortida, està formada habitualment per un rectangle de nx neurones


dʼample per ny neurones de profunditat. Les neurones de la segona capa formen el mapa
on es representa, a escala reduïda i ordenant els patrons presents, lʼentrada. Depenent
del que vulguem representar les neurones de la segona capa poden estar ordenades en
forma de rectangle, de circumferència, de quadrat, etc.

37
Durant la fase dʼexecució no es modifiquen els pesos. Per a un vector p dʼentrada cada
neurona calcula la similitud entre p i el seu propi vector de pesos sinàptics utilitzant una
mesura de distància o algun criteri de similitud. La neurona amb més semblança és
declara vencedora i és la única que sʼactiva, donant una sortida binaria, 1. Mentre que les
altres queden inhibides i donen com a sortida 0. Els pesos de cada neurona de la segona
capa fan que aquesta es relacioni amb un determinat patró de lʼentrada, i quan aquesta
neurona sʼactiva, ens indica la presencia dʼaquest.

Entrenament
Aquests pesos que fan que cada neurona detecti uns trets concrets sʼassignen durant
lʼentrenament.

Lʼentrenament es realitza presentant patrons dʼentrada a la xarxa, per a cada entrada es


calcula la neurona guanyadora, que serà la que tingui uns pesos amb més semblança
amb lʼentrada donada, i és premiada reforçant les seves connexions de tal manera que
sʼassemblin encara més a lʼentrada presentada. Les neurones properes a la guanyadora
també són premiades de la mateixa manera. Premiar les neurones veïnes a la
guanyadora és un sistema que imita les interaccions laterals de les neurones del cervell,
que activen les neurones properes i inhibeixen les llunyanes. Això és la causa que els
patrons semblants es situïn propers en el mapa.

38
LʼAlgoritme dʼaprenentatge
No nʼhi ha un algoritme estàndard, i, a més, la regla dʼaprenentatge varia segons el
mètode usat per calcular la distància o similitud entre el patró dʼentrada x i els pesos w.
Nosaltres utilitzarem la distància euclídia per a mesurar la separació entre els dos vectors:

On n és el nombre de neurones de la primera capa i j i i són lʼidentificador de la neurona


de la segona capa (determinen les posicions horitzontal i vertical en el mapa). La distància
euclídia es dedueix del teorema de Pitàgores.

En començar lʼentrenament sʼinicien els pesos sinàptics, que poden ser nuls, aleatoris o
predeterminats. A partir dʼaquí comença el procés iteratiu, es van presentant patrons, per
a cada patró:
1) Cada neurona calcula la distància (en el nostre cas utilitzant la distància euclídia) entre
el patró dʼentrada x i els pesos wij, és declara guanyadora la neurona amb menor
distància.
2) Sʼactualitzen tots els pesos de totes les neurones seguint la norma:

On wijk és el pes entre la neurona k de la primera capa i la neurona (i,j) de la segona, t


és la iteració actual de lʼentrenament.

La funció α(t) és el ritme dʼaprenentatge, és una funció monòtonament decreixent amb


les iteracions. Una funció α(t) habitual i que és la que hem utilitzat en la part pràctica
és:

On α0 és el ritme dʼaprenentatge inicial i αf el final (sempre <1 i decidits arbitràriament) i


tα és el nombre dʼiteracions fins arribar a αf.

39
La funció h(|I-g|, t) és la funció de veïnatge que crea un entorn al voltant de la neurona
guanyadora on totes les neurones també actualitzen els seus pesos. |I-g| és la
distància entre la neurona on sʼestan actualitzant els pesos (I=(i,j)) i la neurona
guanyadora, g. Hi ha diferents tipus de funcions de veïnatge, nosaltres utilitzarem la
més simple, una de tipus esglaó o Heaviside:

R(t) és la funció radi que dona el radi del veïnatge. Si la distància és major al radi h=0 i
lʼactualització dels pesos serà nul·la. En cas contrari, h=1 i els pesos sʼactualitzaran. El
radi és una funció monòtonament decreixent amb les iteracions. La funció R(t) que hem
utilitzat en la part pràctica és similar a la funció α(t) :

On R0 és el radi inicial i Rf el final (decidits arbitràriament) i tR és el nombre dʼiteracions


fins arribar a Rf.
3) Si no hem arribat al nombre dʼiteracions establert, tornem al punt 1).

El nombre dʼiteracions a fer depèn del nombre de neurones del mapa i és independent del
nombre de patrons dʼentrada. Sʼestima que una xifra ideal són 500 iteracions per neurona,
tot i que normalment nʼhi ha prou amb entre 50 i 100 per a la majoria de problemes. Això
representa més iteracions que en els algoritmes de retropropagació, però aquí els càlculs
a realitzar són molt més simples i ràpids.

Sʼha demostrat que els mapes de forma quadrada poden ser inestables i és recomanen
mapes rectangulars. Tot i això, la forma rectangular del mapa fa que en els extrems la
funció de veïnatge trobi menys veïnes i poden quedar patrons aïllats. Per això a vegades
sʼutilitzen mapes en forma dʼesfera o toroide que eliminen els extrems i les cantonades.

40
Part Experimental
Objectius
De la teoria a la pràctica hi ha un salt. Els objectius de la part experimental són posar en
pràctica tota la informació obtinguda durant aquest treball, intentar realitzar aplicacions
útils i veure de primera mà els algoritmes utilitzats i els problemes que poden sorgir ja
que , per exemple, per a obtenir un bon rendiment sʼha dʼafinar el nombre de neurones de
la xarxa i durant lʼentrenament sʼha de tenir molta cura amb el nombre dʼexemples, el
nombre dʼiteracions i els paràmetres assignats i no hi ha cap regla exacta per a
determinar aquestes variables que a més poden variar molt dʼun cas a un altre.

Els Simuladors de Xarxes


Per a poder realitzar implementacions pràctiques de xarxes neuronals es necessita primer
un simulador dʼaquestes per tal de fer lʼentrenament i calcular la sortida.

Com ja he dit un ordinador convencional és una màquina de Turing i per tant pot simular
xarxes neuronals tot i que perdent la capacitat de processament en paral·lel. Poder
simular les xarxes en un ordinador és molt més ràpid i barat que realitzar implementacions
especifiques en xips.

Ja existeixen varis simuladors de xarxes neuronals al mercat molt complerts i que


ofereixen moltes característiques. Però lʼobjectiu de crear els simuladors no només és
experimentar amb ells i crear aplicacions tangibles, també és acabar dʼaprendreʼn el seu
funcionament i no hi ha millor manera dʼaprendre com funciona un algoritme que
programant-lo.

Tant per al simulador de xarxes de Kohonen com per al de perceptrons multicapa he creat
tres programes.
- Un programa sʼencarrega de la fase dʼexecució de la xarxa.
- Un altre, el més complex, de lʼentrenament.
- I un últim sʼencarrega dʼinicialitzar les xarxes.

Hi ha, a més, un arxiu que conté la informació referent a la xarxa: nombre de capes,
nombre de neurones per capa i els valors dels pesos. Aquest arxiu es crea amb el

41
programa encarregat dʼinicialitzar les xarxes segons el que lʼusuari demani. El programa
dʼentrenament en llegeix tota la informació i en varia els pesos, i el programa dʼexecució
tan sols nʼextreu la informació.

Vaig començar creant el simulador de perceptrons multicapa. En la seva primera versió,


vaig decidir programar-lo en PHP, un llenguatge dʼalt nivell utilitzat en servidors web. Vaig
escollir PHP per tres raons, és un llenguatge que conec, és bastant senzill dʼutilitzar i
ofereix molta facilitat per interactuar amb bases de dades MySQL ja que està pensat per a
la web. Les bases de dades MySQL semblaven un mètode senzill i fàcil per
emmagatzemar i accedir a la informació sobre la xarxa i els pesos.

El problema era que, degut a lʼalt nivell de PHP i a que cada cop que necessitava un pes
sʼhavia de connectar amb la base de dades, lʼentrenament de xarxes una mica grans
trigava hores en completar-se.

Així, vaig decidir què, ja que havia de refer el programa, el faria en C++. Un llenguatge
orientat a aplicacions dʼordinador i de més baix nivell que PHP. A més, per agilitzar el
procés, el nou programa carregaria tot lʼarxiu amb els pesos a la memòria en un inici,
evitant haver dʼanar a buscar cada pes cada vegada que es necessiti. Això estableix un
límit en la mida de la xarxa (determinat pels límits de memòria del sistema), però un límit
suficientment gran com per a no plantejar cap problema per a les aplicacions que sʼhan fet
posteriorment. Recordem que com més gran és una xarxa més capacitat té, però més
exemples és necessiten. El programa en C++ reduïa el temps dʼinicialització dʼuna xarxa
gran respecte al de PHP en una proporció de 16 a 1. A lʼannex A hi ha una explicació
detallada del funcionament de tots els programes en pseudocodi, i en el CD hi ha el codi
font de tots els programes.

Un cop tenim els simuladors fets, què? És poden fer petits experiments com entrenar una
xarxa per simular les funcions booleanes. Però, ja que tenim els simulador, no podríem fer
implementacions una mica més tangibles i grans de les xarxes neuronals? En vaig fer
tres:

42
Organització de Colors amb els Mapes Auto-Organitzats
de Kohonen
Introducció
Vaig trobar una web [Tom Germano, 1999, http://davis.wpi.edu/~matt/courses/soms/] que
per explicar de manera gràfica el funcionament dels mapes de Kohonen fa aquesta
implementació i vaig decidir repetir-la ja que crec que mostra molt clarament el
funcionament dels mapes auto-organitzats. Però aprofitant que els ordinadors han
avançat molt des del 1999 en la meva implementació el mapa és molt més gran i utilitza
molts més colors.

Els colors en lʼordinador es representen seguint lʼesquema RGB. Hi ha tres paràmetres


que determinen la intensitat de Vermell (R), Verd (G) o Blau (B) i que defineixen el color.
Cada paràmetre és un numero entre 0 i 255. On 0 vol dir que no hi és present i 255 vol dir
que hi és amb la màxima intensitat. Per exemple, si volguéssim fer el color vermell seria
(255,0,0), el blanc seria (255,255,255) i el negre (0,0,0).

43
Hi ha tres paràmetres, hi ha tres dimensions, els colors, per tant, es podrien representar
en un espai tridimensional, en un cub.

Però aquesta representació dels colors no ens permet veureʼls amb claredat (no podem
veure lʼinterior del cub).

Els mapes de Kohonen serveixen per reduir les dimensions i escalar lʼespai dʼentrada,
representant ordenadament els patrons dʼentrada. Així que, perquè no provem dʼordenar
els colors amb un mapa de Kohonen?

Implementació i Resultat
La implementació va ser la següent. Lʼentrada de la xarxa consta de tres neurones (una
per a cada paràmetre de color). La sortida és un mapa rectangular de 150 x 75 neurones.
El mapa sʼinicia amb uns pesos aleatoris entre 0 i 255. El mapa té per tant 11.250
neurones i 33.750 connexions.

44
Si a cada neurona assignem un color segons els pesos que té. La visió del mapa seria
una cosa així després de donar valors aleatoris a les connexions:

El mapa té 11.250 neurones, lʼidoni és realitzar uns 5,6 milions dʼiteracions (unes 500 per
neurona). Però, tenint en compte que les entrades són bastant simples, lʼentrenament
realitzat al final ha estat de: 4 milions dʼiteracions, un radi inicial de 17, una velocitat
dʼaprenentatge inicial de 0,99 i una velocitat final de 0,02.

Lʼentrenament ha durat 6 hores i 40 minuts en un ordinador amb processador Intel Core 2


Duo a 2 GHz exclusivament dedicat a aquesta tasca (funcionant sobre una Linux Arch a
64 bits i sense interfaç gràfica). I el resultat és:

45
Aquest és el resultat si assignem el valor Blue a la primera neurona, el Green a la segona
i el Red a la tercera. Aquests valors és poden variar arbitràriament un cop fet
lʼentrenament ja que no hem especificat a la xarxa a quin paràmetre correspon cada
neurona, s'obtindrien imatges diferents, però només variarien els colors, no els canvis de
colors. Podem aplicar un filtre dʼescala de grisos a la imatge. Així es pot apreciar on es
concentren els punts amb més o menys lluminositat. A més aquesta imatge serà igual
independentment de com assignem els valors RGB.

46
També podem aplicar un filtre Posterize per a limitar el nombre de colors en la imatge tal
que:

Així, es pot veure millor la ordenació que ha seguit la xarxa. Aproximadament ha distribuït
tots els colors al voltant de dos focus, un de blanc i un de negre, seguint lʼordre en sentit
horari: verd, groc, vermell, blau. Tant al voltant del focus blanc com al voltant del focus
negre (en el negre és més difícil de veure ja que ha quedat a la vora del mapa).

Conclusions
Realment la utilitat dʼaquesta implementació és poca. Però resulta una manera molt
gràfica de veure la tasca que fan els mapes de Kohonen. També ha servit per veure les
limitacions dʼun mapa rectangular ja que al quedar el negre en un costat hem perdut una
mica la ordenació. Això es podria arreglar utilitzant un mapa esfèric o toroïdal o bé repetint
lʼentrenament a veure si amb sort queda una posició més favorable.

En el CD, dins lʼapartat “Colors Kohonen” hi ha una aplicació que permet veure diferents
passos entre la primera i lʼúltima iteració que sʼhan donat durant lʼentrenament i a més hi
ha el codi font de les aplicacions utilitzades.

47
Detecció de Caràcters amb un Perceptró Multicapa

Objectius
Lʼobjectiu dʼaquesta implementació és que una xarxa de Perceptró Multicapa pugui
detectar la presència dʼun caràcter determinat en una entrada.

Implementació
El caràcter sʼescriu en una quadrícula de 15x15. Cada punt de la quadrícula és una
entrada a la xarxa i pot tenir dues posicions, 0 (vuit) o 1 (escrit). Això proporciona 225
dades dʼentrada a la xarxa. La mida de la quadrícula sʼha decidit arbitràriament, una més
gran hagés requerit una xarxa molt més gran (i més exemples) i una més petita potser
hagués perdut alguns detalls importants.

La sortida de la xarxa és de tan sols una neurona i utilitza la funció sigmoide (interval 0,1),
així que la sortida pot interpretar-se com la probabilitat que lʼentrada sigui el caràcter
desitjat.

Utilitzant Processing, una implementació de Java dedicada a crear fàcilment programes


gràfics, vaig crear un programa (XnCapture) encarregat de passar el que sʼescriu en un
requadre a una quadricula de 15x15 (mitjançant una classe que també vaig crear
anomenada Area) i guardar-ho en un arxiu.

Lʼobjectiu dʼaquest programa és aconseguir els exemples necessaris per a lʼentrenament.


La xarxa detectarà només un caràcter, així que decidim entrenar la xarxa per que
reconegui el caràcter A. Utilitzant el programa XnCapture es creen molts exemples de
diferents tipus de A majúscula i també dʼaltres lletres i caràcters que no siguin A ja que és
necessiten també contraexemples per a que la xarxa pugui extrapolar que no és una A.

Un cop tenim totes les mostres dʼexemple podem començar a entrenar la xarxa. Arribats a
aquest punt trobem problemes. La xarxa té 225 neurones dʼentrada. Si tenim en compte la
norma de p = w / e (p = nombre dʼexemples, w = nombre de pesos i e = error desitjat).
Sabem que la xarxa tindrà per força moltes més de 225 connexions i, per tant,
necessitaríem més de 2.250 exemples per tenir un error del 10%. No podem tenir tants
exemples, així que durant lʼentrenament tindrem molt de risc de sobre-entrenar la xarxa.

Cal dir que en altres implementacions de detecció de caràcters (com la feta per Kohonen
amb mapes auto-organitzats) el que es fa és entrar a la xarxa els traços que componen
els caràcters no el dibuix del caràcter com es fa aquí. Això redueix molt el nombre de
neurones dʼentrada, però la detecció de traços és més complexa, requereix més
tractament de les dades dʼentrada i queda fora del tema que volem tractar, així que
seguirem amb aquest mètode.

Desprès de provar amb diferents combinacions de capes i neurones, una de les que ha
donat millors resultats és una estructura de 3 capes: 225 neurones dʼentrada, 225 en la
capa oculta i 1 de sortida. El que ens dona un total de 50.850 connexions. Com hem dit
abans el risc de sobre-entrenament és molt alt. També ha funcionat correctament una
xarxa sense cap capa oculta, però donava més error que aquesta.

Durant lʼentrenament he realitzat una validació creuada manualment. És a dir, cada x


iteracions comprovava el resultat de la xarxa amb els exemples i amb altres entrades i
seguia si lʼerror encara no era satisfactori.

Resultats
Un cop la xarxa està entrenada sʼha creat un nou programa, que es diu XnPlay, a partir de
XnCapture amb la diferència què, en lloc de guardar la informació del caràcter escrit en un
arxiu, carrega els arxius de pesos resultants de lʼentrenament, agafant com a entrada de
la xarxa les dades sobre el caràcter, simula una xarxa, calcula la sortida i la mostra en
pantalla.

49
Abans el requadre on ara hi ha una A tipogràfica servia per indicar al programa quina lletra
sʼestava escrivint. Ara el requadre serveix per a que el programa indiqui quina lletra sʼha
escrit. El número que hi ha al costat és la sortida de la xarxa. Després de fer varies proves
hem establert el tall a 0,75. Si la sortida és superior a 0,75 és considera que lʼentrada
conté el caràcter (en aquest cas A). Si la xarxa no reconegués el caràcter escrit en
lʼentrada tornaria un ?.

Conclusions
La xarxa sʼha entrenat només per a detectar el caràcter A. Si sʼentrena un conjunt de
xarxes com aquesta de la mateixa manera, assignant a cada xarxa un caràcter diferent i
desprès sʼimplementen totes en un programa com aquest, es pot obtenir fàcilment un
programa que detecti tots els caràcters.

50
Tot i que el nombre total de pesos utilitzats és molt gran, lʼerror en els resultats és
acceptable, però es corre el risc, bastant infreqüent, que davant determinats dibuixos el
programa respongui de manera totalment errònia.

A més el programa necessita unes capacitats de processament relativament altes i la


mostra dʼexemples necessita ser amplia (i, sobretot, de varies persones) per evitar que el
programa reconegui només cal·ligrafies concretes. Tot i això te lʼavantatja, comparat amb
el realitzat per Kohonen amb mapes auto-organitzats, o amb implementacions comercials
basades en els traços, que no li influeix la manera com es dibuixi el caràcter.

Tant el programa XnCapture com el XnPlay estan dins el CD.

51
Detector de parla amb un mapa auto-organitzat

Introducció i objectius
Lʼobjectiu dʼaquesta implementació era crear un programa que detectés la parla dʼuna
persona per un micròfon i que la transcrigués a temps real en caràcters a lʼordinador.
Degut a les dificultats en el preprocessament de dades i a lʼhora dʼobtenir uns bons
exemples vaig limitar el programa a la detecció de les vocals castellanes ja que només
són cinc i són més diferenciades que les catalànes, que són 8 (en el català central).

Per fer el programa em vaig basar en el mapa fonètic del finlandes fet per Teuvo Kohonen.
Com va fer éll, utilitzo una xarxa auto-organitzada que distribuirà els diferents fonemes per
tot lʼespai del mapa, amb els fonemes similars en posicions properes.

Sabem que si passem els paràmetres de cada fonèma a un mapa de Kohonen aquest els
organitzarà i els reconeixerà, però quins paràmetres són els que sʼhan dʼenviar a la xarxa?

Preprocessament de dades
A través del programa dʼordinador podem obtenir les dades del só captat pel micrófon. A
lʼordinador el só es representa en un vector que conté les altures de la ona en cada
instant de temps. El nombre dʼaltures per segón és la freqüència de mostreig (o sample
rate).

Aquesta freqüència ha de ser superior al doble de la màxima freqüència a representar per


no perdre informació, però utilitzar més sample rate del necessari no aporta més qualitat i
simplement comporta més utilització de memòria. Així, en els telèfons el sample rate és de
8 KHz, en la ràdio és de 22 KHz i en CDʼs i altres formats dʼaudio (com lʼmp3) acostuma a
ser de 44,1 KHz.

52
Ona original i mostres de lʼona.

Però no podem entrar les mostres de lʼona directament a la xarxa neuronal bàsicament
per dos motius: en primer lloc són masses (per representar 10 mseg en un sample rate de
8 KHz sʼutilitzen 80 mostres) i en segón lloc són dades que están molt subjectes a
variacions independentment del fonema que es pronuncii (volum de la veu, timbre del
parlant, soroll de fons...).

En definitiva, la representació de la ona és massa complexa per a passarla directament a


la xarxa. Per a obtenir-ne una més entenedora cal fer una transformada de Fourier sobre
lʼona. Explicat dʼuna manera poc formal, la transformada de Fourier ens permet obtenir el
conjunt de freqüències que formen la ona, de manera semblant com fa lʼoida humana.

Però no hi ha prou amb fer la transformada de Fourier, també es necessiten algunes


operacions per normalitzar la ona i per eliminar la informació que ens pot molestar.

Després de provar varis mètodes de preprocessament de la senyal dʼaudio vaig decidir-


me per una combinació entre el que explica Kohonen en el seu article The “Neural”
Phonetic Typewriter [Computer, Volum 21, pagines 11-22, Març 1988] i el treball
Reconocimiento de la voz mediante una red neuronal de Kohonen [Merlo, G; Fernández,
V.; Caram, F.; Priegue, R. i García Martínez, R, Universidad de Buenos Aires,
Departamento de Informática - Facultad de Ciencias Exactas, 1997].

Lʼimplementació, com el reconeixedor de caràcters, sʼha fet amb Processing, utilitzant la


llibreria dʼaudio Minim.

53
Finalment, les tasques que duu a terme el programa abans de passar lʼentrada a la xarxa
són:
• Captura del micròfon a 44,1 KHz de sample rate1 i un buffer de 512 samples.
• Sʼaplica un filtre LowPass a la freqüència de 5,3 KHz per reduir el soroll de fons.
• Per a cada vector de 512 samples de senyal (corresponents a 11,6 milisegons):
• Se li resta la mitjana estadística del vector.
• Dividim el vector per la seva màxima amplitud (per a eliminar la influència del
volum de la veu).
• Es passen les dades per una finestra Hamming, reduïnt el soroll de fons.
• Es calcula la Transformació complexa discreta de Fourier utilitzant lʼalgoritme que
proporciona la llibreria Minim.
• Sʼagrupen logarítmicament les freqüències obtingudes de la transformació en 21
grups (3 grups per octava començant a partir dels 200 Hz).

Finalment sʼobté un vector de 21 paràmetres que serà el que entrarà a la xarxa.

Implementació
Com en el detector de caràcters he realitzat dos programes, un per obtenir els exemples i
lʼaltre simular la xarxa i donar les sortides, i he utilitzat el simulador de xarxes de Kohonen
per a entrenar la xarxa.

El programa Speak_Capture sʼencarrega de guardar els exemples. Simplement realitza


totes les tasques de preprocessat, però enlloc de passar el vector a la xarxa el guarda en
un arxiu, i repeteix el procés amb el següent buffer de dades. A més, el programa mostra
a temps real lʼona (en color blanc), lʼona amb la mitja estadística restada (en blau), lʼona
totalment modificada (en vermell), la màxima amplitud (en blanc, a la dreta), la mitjana
estadística (en blanc, a lʼesquerra) i la transformada de Fourier agrupada logarítmicament
(en vermell).

1En el nostre programa en tindriem suficient amb un sample rate de 8 KHz però com ens sobra la capacitat
de processament hem utilitzat el sample rate per defecte, evitant perdre possible informació important,
(Kohonen en va utilitzar un de 13,02 KHz).
54
El programa Speak_Play sʼencarrega de processar lʼentrada i mostrar la sortida de la
xarxa, que té la informació guardada en lʼarxiu info.ko, resultat del simulador. La seva
aparença és mol similar al Speak_Capture però mostra a més la sortida de la xarxa.

Mostra el mapa complet de la sortida, cada cuadre representa una neurona, i il·lumina la
neurona guanyadora en cada instant. Per acabar el programa sʼhauria de comprovar
(manualment) amb quin fonema correspon cada neurona i mostrar la lletra a la que
correspon la neurona guanyadora enlloc del mapa complet. Però aquestes assignacions
poden variar a cada entrenament, i com la finalitat del programa no és lʼaplicació pràctica
en si no he cregut convenient fer-ho.

55
Resultats
El programa detecta sense problemes les vocals a i i en la majoria dels casos i en la
majoria dʼentrenaments. La u sʼacostuma a confondre amb la i, el mateix passa amb la e i
la o que es poden confondre o entre elles o amb la a. Desprès de varis entrenaments i la
millor opció ha estat un mapa de 5 neurones en una fila.

Lʼentrenament ha constat de 2500 iteracions amb una velocitat inicial de 0.4, final de
0.001 i un radi inicial de 2. La xarxa resultant ha pot diferenciar sense problemes les
vocals a, e i i i té dificultats per identificar la u, que confon amb la i i la o que confon amb
la a.

A més, com els exemples i la validació de lʼentrenament sʼhan fet únicament amb la meva
veu, el programa presenta més dificultats davant de veus dʼaltres persones.

Es comprova que el to i el volum amb que es pronuncia la vocal o el soroll de fons (si no
és gaire elevat) no afecten a la detecció.

Conclusions
Els resultats obtinguts no són gaire satisfactoris. Una de les causes principals de les
mancances del programa és el preprocessat de dades, que sens dubte sʼhauria de
millorar.

Una altra causa és lʼentrenament de la xarxa i els exemples utilitzats. En lʼaplicació feta
per Kohonen la xarxa sʼentrenava dos cops, primer amb lʼalgoritme normal dels mapes
auto-organitzats i després amb lʼalgoritme LVQ (Learning Vector Quantization) per afinar
(supervisadament) el comportament del mapa.

Perquè el programa pogués escriure les paraules pronunciades correctament no nʼhi


hauria prou amb la xarxa, que només detecta els fonemes, sʼhauria de processar la
sortida. Una possibilitat és utilitzar una altra xarxa (perceptró multicapa o mapa auto-
organitzat) entrenat en fer la transcripció fonètica dʼacord amb les normes ortogràfiques.

56
Conclusions
El camp de les xarxes neuronals artificials ja és un camp força madur, prova dʼaixò és que
sʼutilitzen en moltes aplicacions amb finalitats no experimentals. Per altra banda, si mirem
més la part biològica, sembla un camp amb molt de terreny per investigar, i és que encara
desconeixem molt del nostre cervell. La investigació en xarxes artificials i la investigació
del cervell semblen estar molt lligades i potser una pot donar la clau per entendre lʼaltre.

El fet que una xarxa sigui capaç dʼaprendre dʼexemples és molt més del que pot semblar
quan veiem els algoritmes dʼaprenentatge que sembla que només modifiquin errors i
pesos. Quan una xarxa aprèn, entén un concepte i nʼextrapola dʼaltres. Mostra, dʼalguna
manera, un comportament intel·ligent. I podem dir que una xarxa és intel·ligent ja que
troba la solució a un problema, a diferència dʼun programa dʼordinador convencional on
prèviament sʼha programat la solució.

Però queda clar, que les xarxes neuronals no són la solució a qualsevol problema ni ara ni
quan estiguin més avançades. Per a moltes tasques, com operacions aritmètiques,
lʼestructura convencional de Von Newmann és molt més eficient. A més, per exemple, tot i
que un perceptró multicapa pot aproximar qualsevol funció, en alguns casos la mida de la
xarxa és massa gran o no hi ha suficients exemples.

La clau per a solucionar problemes complexos és descompondreʼls en parts més petites i


buscar la millor manera de resoldre cada part. Les xarxes són una eina molt potent, però
sense una bona preparació de les dades dʼentrada, en molts casos, poca cosa farien. Ara
per ara la solució a problemes complexos és també complexa.

57
Annex A
Funcionament del Simulador de Perceptró Multicapa
Començarem explicant el funcionament del programa encarregat dʼinicialitzar la xarxa, el
mlp_creator.cpp.

El programa crea varis arxius amb la informació de la xarxa a partir dels designis de
lʼusuari. El primer arxiu és diu rna.info i conté la informació sobre les capes i les neurones
que hi ha dins cada capa. Cadascun dels altres arxius (anomenats n.weights) conté un
seguit de nombres aleatoris que corresponen als pesos entre la capa n i n+1.

Lʼesquema que segueix és el següent:

Demanar a lʼusuari el nombre de capes↵

Obrim lʼarxiu “rna.info” i escrivim el nombre de capes↵

Per a cada capa demanar a lʼusuari el nombre de neurones i guardar-lo a


rna.info↵

Tanquem lʼarxiu “rna.info”↵

Per a cada capa n (menys per a lʼúltima) obrim lʼarxiu “n.weights” i hi creem x
nombres aleatoris on x és el producte del nombre de neurones de la capa n pel
nombre de neurones de la capa n+1↵

Finalitza el programa↵

El programa mlp_calculate.cpp és lʼencarregat de calcular la sortida de la xarxa per a una


entrada determinada. Lʼentrada es presenta en un arxiu que sʼindica al programa i la
sortida sʼescriu directament a la pantalla. Totes les xarxes que he creat tenen tan sols una
neurona de sortida, per això és més còmode que escrigui la sortida a la pantalla que no
en un arxiu.

58
Obrim lʼarxiu “rna.info” i llegim el nombre de capes↵

Per a cada capa llegim el nombre de neurones que té↵

Tanquem lʼarxiu “rna.info”↵

Carreguem tots els pesos de tots els arxius “n.weights”↵

Demanem a lʼusuari lʼarxiu que conté lʼentrada de la xarxa↵

Carreguem lʼarxiu amb lʼentrada↵

Calculem la sortida de la capa 2 amb la sortida de la primera capa que és


lʼentrada. Amb la sortida de la capa 2 calculem la de la capa 3 i així per a
qualsevol nombre de capes que tingui la xarxa.↵

Quan calculem la sortida de lʼúltima capa la imprimim en la pantalla i finalitzem el


programa.↵

Per últim el programa mlp_trainer.cpp és lʼencarregat dʼentrenar la xarxa. El programa


demana a lʼusuari un fitxer que conté una llista amb els noms de tots els fitxers que
contenen una entrada exemple per a la xarxa i els fitxers que contenen la sortida desitjada
per a cada entrada.

59
Obrim lʼarxiu “rna.info” i llegim el nombre de capes↵

Per a cada capa llegim el nombre de neurones que té↵

Tanquem lʼarxiu “rna.info”↵

Carreguem tots els pesos de tots els arxius “n.weights”↵

Demanem a lʼusuari lʼarxiu que conté la llista dʼexemples↵

Demanem a lʼusuari el nombre dʼexemples en lʼarxiu↵

Demanem a lʼusuari el nombre dʼiteracions a fer↵

Demanem a lʼusuari si els exemples sʼhan de presentar ordenadament o


aleatòriament↵

Demanem a lʼusuari el valor de la velocitat de lʼentrenament↵

Comencem lʼentrenament↵

Carreguem una entrada de la llista i la presentem a la xarxa↵

Calculem la sortida de la xarxa com hem fet en mlp_calculate.cpp↵

Calculem lʼerror comparant la sortida de la xarxa amb la desitjada↵

Propaguem lʼerror cap enrere, capa a capa↵

Per a cada pes apliquem la formula i lʼactualitzem↵

Mostrem lʼerror comés en aquesta iteració en pantalla↵

Repetim el procés fins que sʼarribi al nombre dʼiteracions demanat↵

Finalment escrivim els pesos modificats als arxius↵

Finalitzem el programa↵

Lʼentrenament és on line ja que, tot i que els pesos només sʼescriuen en els arxius al final
per estalviar temps, els pesos que sʼutilitzen en cada iteració són els que estan a la
memòria i sʼactualitzen en cada iteració. Estrictament no és un perceptró multicapa ja que
aquesta implementació no utilitza llindars, tan sols pesos.

60
Funcionament del Simulador de Mapes Auto-organitzats de Kohonen
Seguirem el mateix ordre que amb el perceptró multicapa per a explicar els programes.
kohonen_creator.cpp, encarregat dʼinicialitzar la xarxa, és més senzill que el del perceptró
multicapa ja que aquí sempre hi ha dues capes. Només permet la implementació de
mapes quadrats o rectangulars. Les dades és guarden en lʼarxiu “info.ko” seguint lʼordre:

Neurones en la primera capa↵


Amplada del mapa↵
Alçaria del mapa↵
Pes de la neurona 1 dʼentrada a la neurona 1,1 de sortida↵
Pes de la neurona 2 dʼentrada a la neurona 1,1 de sortida↵
... ... ... ...
Pes de la neurona 1 dʼentrada a la neurona 1,2 de sortida↵
Pes de la neurona 2 dʼentrada a la neurona 1,2 de sortida↵
... ... ... ...
Pes de la neurona 1 dʼentrada a la neurona 2,1 de sortida↵
Pes de la neurona 2 dʼentrada a la neurona 2,1 de sortida↵
... ... ... ...

El funcionament del programa seria:

Demanar a lʼusuari el nombre neurones dʼentrada, k↵

Demanar a lʼusuari el nombre neurones dʼamplada del mapa, i↵

Demanar a lʼusuari el nombre neurones dʼalçada del mapa, j↵

Obrim lʼarxiu “info.ko” i escrivim k, i i j↵

Escrivim n nombres aleatoris on n=k*i*j↵

Tanquem lʼarxiu↵

Finalitza el programa↵

61
El programa kohonen_calculate.cpp, sʼencarrega de calcular la sortida de la xarxa que es
presenta també en pantalla (dient les coordenades de la neurona guanyadora). Això no és
gaire útil per als mapes de kohonen, però aquest programa serveix per a controlar que la
sortida de la xarxa és més o menys correcte. Per a visualitzar els mapes correctament en
cada cas especific ja és dissenyarà una aplicació especial. Lʼentrada de la xarxa també és
presenta en un arxiu.

Obrim lʼarxiu “info.ko” i llegim la informació de la xarxa↵

Carreguem els pesos↵

Demanem a lʼusuari lʼarxiu amb lʼentrada↵

Carreguem lʼentrada↵

Calculem la distància dels pesos de la neurona 1,1 amb lʼentrada i la guardem


com a distància mínima M↵

Calculem la distància dels pesos de totes les altres neurones amb lʼentrada un a
un. Si la distància és menor que M, guardem aquesta distància com a M↵ (de tal
manera que un cop calculada la distància de totes les neurones la distància M
serà la menor).

Declarem guanyadora la neurona amb distància M i ho mostrem a lʼusuari↵

Finalitzem el programa↵

62
Per últim kohonen_trainer.cpp:

Obrim lʼarxiu “info.ko” i en llegim la informació↵

Carreguem els pesos en memòria↵

Tanquem lʼarxiu “info.ko”↵

Demanem a lʼusuari lʼarxiu que conté la llista dʼexemples↵

Demanem a lʼusuari el nombre dʼexemples en lʼarxiu↵

Demanem a lʼusuari el nombre dʼiteracions a fer↵

Demanem a lʼusuari el valor inicial del radi del veïnatge↵

Demanem a lʼusuari el valor inicial de la velocitat dʼentrenament↵

Demanem a lʼusuari el valor final de la velocitat dʼentrenament↵

Comencem lʼentrenament↵

Carreguem una entrada de la llista (aleatòriament) i la presentem a la xarxa↵

Busquem la neurona guanyadora i en guardem les coordenades (i,j)↵

Actualitzem els pesos de Totes les neurones↵

Repetim el procés fins que sʼarribi al nombre dʼiteracions demanat↵

Finalment escrivim els pesos modificats als arxius↵

Finalitzem el programa↵

Per a la implementació pràctica dels mapes de kohonen que vaig realitzar (lʼordenament
dels colors), vaig modificar el programa dʼentrenament per a que presentes
automàticament nombres aleatoris entre el 0 i el 255 com a entrada, i el programa
dʼinicialització perquè inicies la xarxa amb valors aleatoris entre 0 i 255 i no amb valors
petits (entre -1 i 1) com fa normalment. Per a la implementació pràctica del transcriptor
fonètic vaig crear un petit programa kohonen_examples.cpp que escriu automàticament
lʼarxiu que conté tots els exemples, va ser necessari ja que en ocasions el nombre
dʼexemples arribava a desenes de milers i fer lʼarxiu dʼexemples manualment resultava
impossible.

63
Bibliografia
-AGH University, Department of electronics, Virtual laboratory of artificial intelligence,
(2005), <http://galaxy.agh.edu.pl/~vlsi/AI/index_nowy_en.html>

-Estupinya, P., “Tu libertad es una ilusión del cerebro”, (2009), <http://
lacomunidad.elpais.com/apuntes-cientificos-desde-el-mit/2009/2/19/tu-libertad-es-ilusion-
del-cerebro>

-Herbert Schildt, (1996), C++ Para Programadores.

-Hilera González, J.R.; Martínez V.J., (1995) Redes Neuronales artificiales: fundamentos,
modelos y aplicaciónes.

-jjguy, self-organizing maps in processing, (8, Nov, 08), <http://www.jjguy.com/som/>

-Jochen Fröhlich, Neural Networks with Java, (2004), <http://www.nnwj.de/>

-Junyent, M., (2009) Introducció a la Intel·ligència Artificial, <http://euridies.com/IA.pdf>

-The MathWorks, Reducing the Number of Colors in an Image, (2010), <http://


www.mathworks.com/access/helpdesk/help/toolbox/images/f8-15484.html>

-Martín del Brío, B.; Sanz Molina, A., (2006) Redes Neuronales y Sistemas Borrosos, (3a
Edició), Ra-Ma, Madrid.

-Merlo, G; Fernández, V.; Caram, F.; Priegue, R. i García Martínez, R, Reconocimiento de


la voz mediante una red neuronal de Kohonen, (1997), Universidad de Buenos Aires,
Departamento de Informática - Facultad de Ciencias Exactas.

-Minim, Code Log, (2010), <http://code.compartmental.net/tools/minim/>

-Processing, Processing Reference, (2010), <http://processing.org/>

-Salvador Figueras, M.; Gargallo, P. (2003): “Análisis Exploratorio de Datos”, [en línea]
5campus.com, Estadística <http://www.5campus.com/leccion/aed/>

-Teuvo Kohonen, Teuvo Kohonen, (2010), <http://www.cis.hut.fi/teuvo/>

-Teuvo Kohonen, “The “Neural” Phonetic Typewriter”, (Març 1988), Computer, Volum 21,
pagines 11-22, <http://www.computer.org/portal/web/csdl/abs/mags/co/1988/03/
r3011abs.htm>

-Teuvo Kohonen, “The Self-Organizing Map”, (Setembre 1990), Proceeding of the IEEE,
vol. 78, Num. 9.

-Tom Germano, Self-Organizing Maps, (13 de Març de 1999), <http://davis.wpi.edu/~matt/


courses/soms/>

-UB, Error quadràtic mitjà, <http://www.ub.edu/stat/GrupsInnovacio/Statmedia/demo/


Temas/Capitulo7/B1C7m1t7.htm>
64
-UPC Commons, Introducció a les xarxes neuronals, Capítol 3, (2009) <http://
upcommons.upc.edu/>

-UPF, Sibila Estruch, Màquina de Turing, (2008), <http://www.upf.edu/pdi/dcom/


xavierberenguer/recursos/fig_calc/_9_/estampes/3_3.htm>

-Wikipedia, (2010), <http://wikipedia.org>

Imatge de la portada extreta de la Demo “STS-06: Microdots” del grup Synesthetics,


(minut 3:20), Assembly 2007, <http://www.pouet.net/prod.php?which=31579>

65

You might also like