Вы находитесь на странице: 1из 49

Redes Neuronales y Programacin

Declarativa

Francisco Jess Fernndez Burgos


Jos Manuel Corts Lpez

1
NDICE
1. Introduccin

1.1. Haskell y la Computacin Numrica


1.2. Computacin Celular
1.3. Redes Neuronales
1.3.1 Redes Neuronales Celulares
1.4. Objetivos

2. Construccin de una librera de Redes Neuronales en Haskell

2.1. Estructura de Datos


2.2. Anlisis lineal sin ndices
2.3. Iteracin y Recursin.

2
NDICE
3. Definicin de Capas
3.1 Definicin de una Capa
3.2 Definicin de mltiples Capas

4. Ventajas de Usar Haskell

5. El perceptrn Simple
5.1 Introduccin.
5.2 Ejemplo de entrenamiento
5.2.1 Entrenamiento 1iteracin
5.2.2 Entrenamiento 2iteracin
5.3 Otro Ejemplo de entrenamiento sobre la mquina.

6. Estudio Comparativo: Haskell vs. Matlab

3
NDICE
7. NeuroScheme
7.1 Introduccin
7.2 Seis Razones para elegir la programacin funcional
7.3 Arquitectura de la Herramienta
7.4 Interfaz con el Sistema
7.5 Interfaz Grfica de Usuario
7.6 Implementacin de RNAS
7.7 Resultados Obtenidos

8. Conclusiones
8.1 Conclusiones Haskell
8.2 Conclusiones NeuroScheme
8.3 Trabajo Futuro

9. Referencias

4
1. Introduccin
En la actualidad, la gran mayora del software de simulacin y entrenamiento
de redes neuronales es desarrollado mediante lenguajes imperativos como
C++, Java...

Usaremos Haskell, como alternativa para la implementacin de algoritmos de


simulacin y entrenamiento de redes neuronales aprovechando las
potencialidades que este ofrece.

Se mostrar que es posible evitar el uso de tablas e ndices para la


implementacin de redes neuronales feedforward multicapa, generando un
cdigo claro, simple y corto en comparacin con los lenguajes imperativos.

Se ver como Haskell puede ser adecuado para la experimentacin con


nuevos algoritmos de entrenamiento de redes neuronales gracias a su similitud
sintctica con la matemtica y las fortalezas del lenguaje.

5
1.1 Haskell y La computacin
Numrica
La programacin funcional ofrece la oportunidad de crear un cdigo mucho
ms comprensible y fcil de manejar gracias:
La similitud sintctica con la matemtica.
Los altos niveles de abstraccin permiten crear un cdigo ms estructurado y reusable.

No se pide obtener una alta eficiencia en tiempo por parte de Haskell, pues su
misma naturaleza como lenguaje de alto nivel lo impide.

La relativa juventud de este tipo de programacin ofrece un gran campo de


investigacin en el cual se puede pensar en buscar nuevas alternativas:
Para la construccin de compiladores ms eficientes.
Como tambin en la formacin de alianzas con lenguajes de bajo nivel para la optimizacin de
algunas
operaciones

Lo importante a destacar estriba en las posibilidades que tiene Haskell para la


creacin y experimentacin de nuevos algoritmos en el campo de la
computacin numrica.

6
1.2 Computacin celular
Este nuevo paradigma computacional suministra nuevas
formas de hacer la computacin ms eficiente (en
trminos de velocidad, coste, disipacin, almacenamiento
y calidad de la solucin) para tratar grandes problemas
en dominios de aplicacin especficos.

La computacin celular se basa en tres principios:


Simplicidad
Paralelismo inmenso
Localidad

7
1.3 Redes Neuronales
Una red de neuronas artificiales est caracterizada por su:

Arquitectura: Estructura o patrn de conexiones entre las unidades de proceso

Dinmica de la Computacin que nos expresa el valor que toman las


unidades de proceso y que se basa en unas funciones de activacin (o de
transferencia) que especifican como se transforman las seales de entrada de
la unidad de proceso en la seal de salida.

Algoritmo de Entrenamiento o Aprendizaje: Procedimiento para determinar


los pesos de las conexiones

Una caracterstica muy importante de estas redes es su naturaleza


adaptativa, donde el "aprendizaje con ejemplos" sustituye a la
"programacin" en la resolucin de problemas.

8
1.3.1 Redes Neuronales
Celulares
Las redes neuronales celulares estn constituidas
por un conjunto de unidades de proceso, llamadas
neuronas, cuyos valores posibles pueden ser discretos
o continuos y el valor que presenta cada unidad
neuronal viene dado por una funcin que depende de
una combinacin lineal de los estados de las unidades
vecinas. (potencial sinptico)

Es por esta definicin funcional que vamos a utilizar un


lenguaje funcional para describirlas.

9
1.4 Objetivos
Mostrar que es posible aprovechar la potencia expresiva de Haskell
para la definicin eficiente de las redes neuronales.

Mostrar que es posible crear una aplicacin, a partir de la semntica


de un lenguaje funcional, para trabajar con redes neuronales y
estudiarlas.

10
2. Construccin de una librera
de Redes Neuronales en Haskell
Para construir un algoritmo en programacin funcional,
este debe ser visto como una funcin explicita, al cual
se le ingresa unos valores de entrada para retornar una
salida, de manera similar una red neuronal se comporta
como una funcin. La figura nos presenta de manera
esquemtica la relacin.

11
2.1 Estructura de datos
Al momento de representar una matriz haciendo uso de las programacin
funcional es necesario construir una estructura de datos que haga uso de listas
en vez de tablas e ndices por los siguientes motivos:

Las listas son la estructura lineal ms importante de Haskell, adems cuenta con un gran
nmero de funciones y operaciones para utilizarlas.

A parte de la poca expresividad, la representacin de una matriz indexada en Haskell es


poco eficiente, ya que los valores al ser atrapados en el constructor de datos Array, son de
difcil acceso y esto tiene un costo computacional.

La siguiente figura muestra como se representa una matriz por medio de listas
de listas, donde cada una de ellas representa una fila de la matriz.

12
2.2 lgebra Lineal sin ndices
El siguiente paso consiste en desarrollar una librera de operaciones
bsicas de lgebra lineal para construir los algoritmos de entrenamiento.
Para ver el proceso de construccin observe en la siguiente figura, la
funcin zipmatriz se usa para definir funciones que respectivamente
sumen, resten y multipliquen elemento a elemento dos matrices, esta
abstraccin hace uso del concepto de funcin de alto nivel.

Nota: Cdigo de Cesar Augusto Acosta Minoli (estas funciones podran sustituirse por funciones predefinidas en haskell)

13
2.3 Iteracin y Recursin
El entrenamiento de una red neuronal es un proceso iterativo en el
cual la red actualiza sus pesos y umbrales hasta que se cumpla un
fIter se define haciendo uso de s
criterio de parada.
misma y hace uso de valores enteros
El modelopara determinar
imperativo de el nmero de ciclos
programacin de la la iteracin y la
implementa
iteracin
actualizacin ( init. yde
por medio final).
ciclosEnylaasignaciones.
llamada Sin embargo la
iteracin recursiva
y la actualizacin de variables
init aumenta se puede
en una unidad y superar por medio
de declaraciones
el proceso recursivas.
termina una vez init sea igual
a final, de lo contrario sigue modificando
La figuraelmuestra
valor g alatravs
funcindefIter la cual
alguna realiza
funcin h. un proceso Iterativo
mediante la recursin.

14
2.3 Iteracin y Recursin
Los elementos mencionados anteriormente son de suma importancia para
la construccin de los algoritmos de entrenamiento. A continuacin se
mostrar algunos de los elementos implementados.

La implementacin llevada a cabo se realiz pensando en los algoritmos


de entrenamiento de redes feedforward multicapa, la arquitectura de una
capa de este tipo de red luce como en la siguiente figura:

15
2.3 Iteracin y Recursin
Por lo tanto es necesario declarar los siguientes tipos:

Los tipos Input y Target no son ms que una redeclaracin de una


matriz de tipo Float.
Por su parte el tipo NeuralNetwork se define como una pareja
ordenada donde el primer componente corresponde a la matriz de
pesos y la segunda componente corresponde a la matriz de
umbrales de la capa, es decir (W,b).

16
3. Definicin de una capa
Para simular una capa se defini la funcin simlayer:

Podemos observar la gran similitud entre la descripcin terica de la red


neuronal y su implementacin en haskell.
Una capa de la red multicapa que estamos desarrollando se puede
expresar como:

17
3.1.1. Funcin de transferencia
Un hecho interesante estriba en que la funcin
de activacin f puede ser definida en un
modulo anterior y luego ser llamada, bien se
puede definir una arquitectura perceptrn o
una Adalaine respectivamente como :

simLayer p (w,b) hardlim

simLayer p (w,b) pureline

18
3.2 Definicin de mltiples
capas
La funcin anterior nos permite definir una funcin para el
caso en el cual tenemos una arquitectura de cualquier
cantidad de capas y neuronas en cada capa.

Nota: Cdigo de Cesar Augusto Acosta Minoli

19
4. Ventajas de usar Haskell
Un hecho interesante estriba en que la cantidad de cdigo para la
creacin de la librera es realmente pequeo en comparacin con otros
lenguajes de programacin. (No supera los 70K), para apreciar esto en
detalle observe el cdigo la funcin trainperceptron.
Nota: Cdigo de Cesar Augusto Acosta Minoli (Hay funciones que deberan estar mas optimizadas a la programacin funcional)

20
5. El perceptrn Simple
5.1 Introduccin.

Se usan en problemas de clasificacin


y prediccin, minimizando los errores
de clasificacin incorrectos.

Arquitectura de la Red :
N sensores de entrada : x1,x2,,xN pertenecientes a R
1 unidad de proceso: y perteneciente a {0,1} {-1,1}
Regla de aprendizaje:
Memorizamos p pares de patrones : {x1,z1}, {x2,z2},,{
xp,zp}

21
5.1 El perceptrn Simple
Introduccin.
Dinmica de la computacin:
y=f(u)
: umbral o sesgo
h=

wi : pesos sinpticos asociados a xi


funcin de transferencia paso y pertenece a {0,1}
f=
funcin de transferencia signo y pertenece a {-1,1}


22
5.1 El perceptrn Simple
Introduccin.
(k) : tasa de aprendizaje, que optimiza la convergencia de la red.

23
5.2 Ejemplo de entrenamiento
Vamos a tener dos clases de patrones de entrada posibles
los de CLASE A
los de CLASE B

Se desea que nuestro perceptron despus de un proceso de


aprendizaje pueda diferenciar patrones de ambas clases.

Patrones de entrada
clase A={ (-0.5, -0.5), (-0.5, 0.5) }
clase B={ ( 0.3, -0.5), (0.0, 1.0) }

Para ello se desea que cuando le llegue un patrn de la clase A


devuelva un 1 y cuando llegue un patrn de la clase B devuelva un 0.
Z(Clase A) = 1
Z(Clase B) = 0

24
5.2.1 Entrenamiento 1iteracin

Inicialmente nuestra matriz de pesos sinpticos va a ser:


w1 = -0.3 w2 = 0.5 umbral = 1
Estos valores son dados aleatoriamente, podran haberse dado otros
cualesquiera.

1 Selecciono un patrn de entrada aleatorio, por ejemplo el patrn de


la clase B = (0.0, 1.0).

2 Calculo el potencial sinptico que le ha llegado al perceptron.


El potencial sinptico es el resultado de sumar cada una de las entradas
del perceptron multiplicadas por el peso sinptico correspondiente para
cada entrada.
h (x1, x2) = w1*x1 + w2*x2
En este caso h=-0.3*0.0 + 0.5*1.0 = 0.5

25
5.2.1 Entrenamiento 1iteracin
Como h es menor que el umbral (u = 1 ) entonces el perceptron
pondr a la salida uno 0
El perceptrn estar determinado por la funcin paso, es decir si
el potencial sinptico es mayor que el umbral entonces pone a la
salida un 1, de lo contrario pondr un 0.

En este caso el PERCEPTRON HA ACERTADO (ya que le hemos


introducido un patrn de la clase B y lo ha clasificado correctamente
devolviendo un 0, luego NO SUFRE PROCESO DE
ENTRENAMIENTO.

Si se hubiese equivocado, entonces se producira el proceso de


aprendizaje, mediante el cual se producirn cambios oportunos en los
pesos sinpticos, con objetivo de aceptar en el prximo patrn.

26
5.2.2 Entrenamiento 2iteracin
Ahora cogemos otro patrn cualquiera de entrada, por ejemplo
uno de la clase A : (-0.5, 0.5)

el Potencial sinptico ser:


h= (-0.3)*(-0.5) + 0.5 * 0.5 = 0.4

h < umbral luego entonces se devuelve un 0.


(Esto no coincide con la salida deseada, pues para patrones de la
clase A, es un 1.)

Puesto que se ha equivocado nuestro perceptron ha de


aprender de sus errores y modificar su matriz de pesos
sinpticos W, para asi realizar una mejor clasificacin de
patrones.

27
5.2.2 Entrenamiento 2iteracin
Segn expusimos anteriormente:
n es el patrn de aprendizaje n=0.1
wi(1): peso sinptico de la entrada i, durante la iteracin 1.
xi : valor de la entrada i
zi : Salida deseada para la entrada i
yi : Salida Obtenida para la entrada i
u(i): umbral durante la iteracin i

Wi(2) = wi(1) + [SalidaDeseada - SalidaObtenida]* xi

sea nos quedara que:


w1(2) = -0.3 + (1-0)*(-0.5) = -0.35
w2(2) = 0.5 + (1-0)*0.5 = 0.55
u(2) = 1 + (1-0)* (-1) = 0.9

28
5.2.2 Entrenamiento 2iteracin

Ahora se ha producido un error en la clasificacin y por lo tanto el


perceptrn aprender y modificara los valores de sus pesos sinpticos
y su umbral.

De forma que en sucesivas iteraciones introduciendo nuevos valores


de x1 y x2 (y -1 en el umbral) el perceptrn ir aprendiendo hasta
conseguir unos ptimos valores de w1, w2 y u , que permitan
clasificar correctamente cualquier valor introducido en la entrada.

29
5.3 Otro Ejemplo de entrenamiento
sobre la mquina.
module ParityProblem where
import Transfer
import NeuralNetwork
import Interface

p::Input
p= [[0.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0],
[0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0],
[0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0]]

t:: Target
t= [[0.0,1.0,1.0,0.0,1.0,0.0,0.0,1.0]]

main = entrenarPerceptron p t (inicializar 75 [3,3,1]) 3

30
5.3 Otro Ejemplo de
entrenamiento sobre la mquina
El resultado es el siguiente:

"TrainPerceptron, Epoca 0"


"TrainPerceptron, Epoca 1"
"TrainPerceptron, Epoca 2

Simulacion :
[0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0;
0.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0]

Supervision :
[0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0;
0.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0]

Desea guardar La red? y / n

31
6. Estudio comparativo: Haskell vs. Matlab
El estudio comparativo muestra que el desempeo de la
librera es bastante bueno teniendo como referente a Matlab
para los problemas propuestos.

El uso de un lenguaje funcional tambin muestra un cdigo


claro, corto en comparacin con los lenguajes imperativos y
sin la necesidad de usar tablas e ndices.

Sin embargo se observa que requiere de mucho ms tiempo


para realizar las operaciones. Lo anterior permite formular la
siguiente pregunta: Cul puede ser el papel de Haskell
frente a la computacin numrica en la actualidad?

32
6. Estudio comparativo: Haskell vs. Matlab
Tiempos en Clasificacin

3,5

2,5
Tiempo

2 Haskell
1,5 Matlab

0,5

0
Perceptron Adalina BAM Perceptron BGM
multicapa
Tipo de Red

Todas las pruebas se realizaron en un PC con procesador AMD-ATHLON de 850 Mhz con 256
Mb de memoria, utilizando Windows 98 como sistema operativo.

El compilador para la librera en Haskell fue GHC compiler versin 5.04.3 para Windows y los
tiempos fueron capturados mediante la funcin getClockTime, una funcin pre-definida de
Haskell.

Para la comparacin se us Matlab versin 6.1.0.450 release 12.1.

33
7. NEUROSCHEME

7.1 Introduccin

Un lenguaje para el modelado de redes neuronales artificiales.

Para el desarrollo de la herramienta se ha seleccionado como


lenguaje base al dialecto Scheme.

Scheme define el mbito de sus definiciones lxicamente, es


estructurado en bloques, soportando funciones y continuaciones como
objetos de datos que pueden ser pasados como parmetros a
funciones, retornados como el valor de una funcin, y permanecer
indefinidamente en memoria.

34
7.2 Seis razones para elegir la
programacin funcional.
1. La programacin funcional es mucho ms simple, ya que las
expresiones son construidas en forma natural inherentemente
recursiva.

2. La programacin funcional es mucho ms fcil de entender, ya que


cada pieza de cdigo ejecuta una tarea especfica, facilitando el
seguimiento del cdigo.

3. Es posible ejecutar pruebas para validar el programa.

4. Las variables locales se declaran directamente como parmetros de las


funciones, inicializndose siempre al ser invocada una funcin, y
representa ms el nombre para un valor que una localizacin en
memoria, tal como ocurre en C o Pascal.

35
7.2 Seis razones para elegir la
programacin funcional.
5. Es posible alternar el orden de evaluacin de las expresiones en los
lenguajes funcionales.

6. Pueden construirse complejas instrucciones con retornos no locales, lo


que facilita complejas estructuras de control.

36
7.3 Arquitectura de la Herramienta
El ncleo de la herramienta es un interprete de Scheme basado en un
montculo de memoria.

La herramienta se divide en cuatro grandes partes:

Un mdulo de interfaz con el usuario, encargado de administrar las


entradas del usuario y los mensajes del sistema, y utilitarios como la
historia de comandos.

Un pre-procesador de cdigo fuente

Un compilador.

Una mquina virtual que ejecuta las instrucciones de bajo nivel

37
7.4 Interfaz con el sistema y usuarios

38
7.5 Interfaz grfica de usuario

39
7.6 Implementacin de RNAS
Se han implementado tres modelos de propagacin hacia delante:

Feedforward.
Cascada correlacin.
Cascada hacia delante.

Los algoritmos de entrenamiento implementados incluyen:

Regla delta generalizada.


Regla delta con momento.
Gradiente descendente.
Estrategias de evolucin.
Temple simulado.
As como versiones de algunas de ellas combinadas con mnimos cuadrados.

40
7.7 Resultados Obtenidos
La red neuronal se modela como un tipo de dato propio del lenguaje,
lo que implica que se encuentra codificada en lenguaje Scheme,
haciendo que la velocidad de los algoritmos de entrenamiento sea tan
alta como en las aplicaciones de usuario final disponibles hoy en da
(matlab).

La utilizacin de dilogos como mecanismo primario de comunicacin


con el usuario de la aplicacin, permite que este con unas pocas
horas de entrenamiento, y an sin tener un conocimiento previo del
lenguaje Scheme, pueda estar entrenando modelos de redes
neuronales artificiales.

41
8. Conclusiones
En el transcurso del trabajo, podemos destacar las siguientes
conclusiones:

Se demuestra que no es necesario usar ndices y tablas para el


diseo e implementacin de algoritmos que simulen y entrenen redes
neuronales.

Haskell posee grandes posibilidades para el diseo y evaluacin


experimental de nuevos algoritmos de forma rpida gracias al
parecido que tiene con la especificacin del problema a implementar y
su similitud sintctica con la matemtica.

Los ejemplos usados para el entrenamiento mostraron que las


respuestas son de buena calidad, es confiable y se puede usar como
cualquier otro simulador de redes neuronales para resolver problemas
de tamao moderado.

42
8.1 Conclusiones HASKELL
La implementacin en Haskell permite que el cdigo sea transparente
y ver la forma en que la librera est implementada.

Haskell permite expresar algoritmos de forma clara y simple, esto es


til en el momento de desarrollar y de derivar versiones ms eficientes
a bajo nivel.

Comparacin Haskell vs. Matlab:


Haskell como lenguaje de programacin funcional puro, an no est
preparado para competir por la eficiencia en tiempo, su caracterstica de
lenguaje de alto nivel le impide tal rapidez, por tal motivo:

Es necesario la generacin de alianzas con lenguajes de bajo nivel que se


encarguen de hacer el trabajo pesado y menos significativo (es el caso del
producto de matrices.)

43
8.1 Conclusiones HASKELL
Como ejemplo de estas alianzas, muchos de los algoritmos de
Matlab estn desarrollados en una eficiente librera de bajo nivel
diseada para el lgebra lineal numrica (conocida como
LAPACK)

Adicionalmente Matlab hace un uso cuidadoso de C y


ensamblador en muchas de sus rutinas.
Estas alianzas han logrado optimizar significativamente las
operaciones que se pueden realizar en Matlab (vanse graficas
comparativas)

Un detalle a destacar de la librera mostrada es que no aprovecha


toda la potencia expresiva de la programacin funcional, haciendo
caso omiso al sistema de clases y no aprovechando las funciones
predefinidas del lenguaje
44
8.2 Conclusiones NEUROSCHEME
El interprete implementado es altamente verstil, permitiendo construir
algoritmos para la manipulacin y entrenamiento de RNAs, de tal
forma, que es posible automatizar procesos, y construir modelos
complejos de RNAs.

Los resultados obtenidos hasta ahora, permiten concluir que debe


continuarse con el desarrollo de la herramienta, e incorporarse otros
paradigmas como Redes Neurodifusas, y Sistemas Borrosos, para
habilitar la herramienta para construir sistemas hbridos para solucin
de problemas.

45
8.3 Trabajo Futuro
Se hace necesario un estudio sobre las posibilidades de hacer
una alianza entre lenguajes de bajo nivel y Haskell para la
construccin de algoritmos precompilados de bajo nivel que
puedan ser usados por Haskell.

Es necesario desarrollar una interfaz visual en Haskell que


muestre de manera ms amigable los resultados de
entrenamiento,(as como plot en Matlab) donde se puedan
apreciar graficas que muestren la evolucin.

A nivel terico es necesario observar las posibilidades que


Haskell ofrece para el diseo de nuevos algoritmos de redes
neuronales puramente funcionales, explicando la teora de las
redes desde el lambda clculo.

46
9. Referencias
1. Blas C. Ruiz Jimnez...[et al.], Programacin funcional
con Haskell Mlaga : Universidad, Secretariado de
Publicaciones, D.L. 1995

2. Acosta Minoli, C. A. Artculo sobre implementacin de


Redes Neuronales.(2004) Universidad del Quindo,
Colombia.

3. Hudak et al . (2000), A Gentle Introduction to Haskell ,


Tutorial. http://www.haskell.org/tutorial/

4. FREEMAN, J.A. Y SKAPURA D.M,(1993) Redes


Neuronales: Algoritmos, aplicaciones y tcnicas de
programacin. Addison Wesley. 1993

47
9. Referencias
5. Martn del Bro B., A. Sanz,(2001) Redes neuronales y
Sistemas Borrosos. Madrid : Ra-Ma, 2 ed.

6. HUGHES, J. (1990) Why Functional Programming


Matters, Institutionen fr Datavetenskap, Chalmers Tekniska
Hgskola, 41296 Gteborg, SWEDEN.

7. Mark P Jones, Alastair Reid, the Yale Haskell Group, and the
OGI School of Science & Engineering at OHSU, (1994-2002)
The Hugs 98 User Manual, web:
http://cvs.haskell.org/Hugs/pages/hugsman/index.html

48
9. Referencias
8. Jos R. Hilera y Victor J Martinez."REDES NEURONALES
ARTIFICIALES". Madrid : Ra-ma, [1995]

9. VELSQUEZ J. D., NEUROSCHEME: UN LENGUAJE PARA EL


MODELAMIENTO DE REDES NEURONALES ARTIFICIALES,
Grupo de Inteligencia Artificial, Facultad de Minas, Universidad
Nacional de Colombia, Junio de 2005.

10. Muoz J., APUNTES DE LA ASIGNATURA MODELOS


COMPUTACIONALES, www.lcc.uma.es/LCCTemario/Asignatura.jsp?idasignatura=22,
Escuela Superior de Ingeniera Informtica, Universidad de Mlaga, Abril 2006.

49

Вам также может понравиться