Professional Documents
Culture Documents
Programación Declarativa
1
ÍNDICE
1. Introducción
2
ÍNDICE
3. Definición de Capas
• 3.1 Definición de una Capa
• 3.2 Definición de múltiples Capas
5. El perceptrón Simple
• 5.1 Introducción.
• 5.2 Ejemplo de entrenamiento
• 5.2.1 Entrenamiento 1ªiteración
• 5.2.2 Entrenamiento 2ªiteración
• 5.3 Otro Ejemplo de entrenamiento sobre la máquina.
3
ÍNDICE
7. NeuroScheme
• 7.1 Introducción
• 7.2 Seis Razones para elegir la programación funcional
• 7.3 Arquitectura de la Herramienta
• 7.4 Interfaz con el Sistema
• 7.5 Interfaz Gráfica de Usuario
• 7.6 Implementación de RNAS
• 7.7 Resultados Obtenidos
8. Conclusiones
• 8.1 Conclusiones Haskell
• 8.2 Conclusiones NeuroScheme
• 8.3 Trabajo Futuro
9. Referencias
4
1. Introducción
En la actualidad, la gran mayoría del software de simulación y entrenamiento
de redes neuronales es desarrollado mediante lenguajes imperativos como C+
+, Java...
5
1.1 Haskell y La computación
Numérica
La programación funcional ofrece la oportunidad de crear un código mucho
más comprensible y fácil de manejar gracias:
• La similitud sintáctica con la matemática.
• Los altos niveles de abstracción permiten crear un código más 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.
6
1.2 Computación celular
Este nuevo paradigma computacional suministra nuevas
formas de hacer la computación más eficiente (en
términos de velocidad, coste, disipación, almacenamiento
y calidad de la solución) para tratar grandes problemas
en dominios de aplicación específicos.
7
1.3 Redes Neuronales
Una red de neuronas artificiales está caracterizada por su:
8
1.3.1 Redes Neuronales
Celulares
Las redes neuronales celulares están 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 función que depende de
una combinación lineal de los estados de las unidades
vecinas. (potencial sináptico)
9
1.4 Objetivos
Mostrar que es posible aprovechar la potencia expresiva de Haskell
para la definición eficiente de las redes neuronales.
10
2. Construcción de una librería
de Redes Neuronales en Haskell
Para construir un algoritmo en programación funcional,
este debe ser visto como una función explicita, al cual
se le ingresa unos valores de entrada para retornar una
salida, de manera similar una red neuronal se comporta
como una función. La figura nos presenta de manera
esquemática la relación.
11
2.1 Estructura de datos
Al momento de representar una matriz haciendo uso de las programación
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 más importante de Haskell, además cuenta con un gran
número de funciones y operaciones para utilizarlas.
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 librería de operaciones
básicas de álgebra lineal para construir los algoritmos de entrenamiento.
Para ver el proceso de construcción observe en la siguiente figura, la
función zipmatriz se usa para definir funciones que respectivamente
sumen, resten y multipliquen elemento a elemento dos matrices, esta
abstracción hace uso del concepto de función de alto nivel.
Nota: Código de Cesar Augusto Acosta Minoli (estas funciones podrían sustituirse por funciones predefinidas en haskell)
13
2.3 Iteración y Recursión
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 criterio de parada.
fIter se define haciendo uso de sí
El modelomisma y hace
imperativo uso de valores
de programación enteros la iteración y la
implementa
actualización
parapor medio de ciclos
determinar y asignaciones.
el número de ciclos deSinla embargo la iteración y
la actualización de variables
iteración ( init. y se puede
final). En superar
la por medio de declaraciones
llamada
recursivas.
recursiva init aumenta en una unidad y el
La figura proceso
muestra latermina
funciónuna
fItervez init realiza
la cual sea igual a
un proceso Iterativo
mediante final, de lo contrario sigue modificando el
la recursión.
valor g a través de alguna función h.
14
2.3 Iteración y Recursión
Los elementos mencionados anteriormente son de suma importancia para
la construcción de los algoritmos de entrenamiento. A continuación se
mostrará algunos de los elementos implementados.
15
2.3 Iteración y Recursión
Por lo tanto es necesario declarar los siguientes tipos:
Los tipos Input y Target no son más que una redeclaración 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. Definición de una capa
Para simular una capa se definió la función simlayer:
17
3.1.1. Función de transferencia
Un hecho interesante estriba en que la función
de activación f puede ser definida en un
modulo anterior y luego ser llamada, bien se
puede definir una arquitectura perceptrón o
una Adalaine respectivamente como :
18
3.2 Definición de múltiples
capas
La función anterior nos permite definir una función para el
caso en el cual tenemos una arquitectura de cualquier
cantidad de capas y neuronas en cada capa.
19
4. Ventajas de usar Haskell
Un hecho interesante estriba en que la cantidad de código para la
creación de la librería es realmente pequeño en comparación con otros
lenguajes de programación. (No supera los 70K), para apreciar esto en
detalle observe el código la función trainperceptron.
Nota: Código de Cesar Augusto Acosta Minoli (Hay funciones que deberían estar mas optimizadas a la programación funcional)
20
5. El perceptrón Simple
5.1 Introducción.
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 perceptrón Simple
Introducción.
Dinámica de la computación:
• y=f(u)
• θ : umbral o sesgo
• h=
•
22
5.1 El perceptrón Simple
Introducción.
η(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
Patrones de entrada
• clase A={ (-0.5, -0.5), (-0.5, 0.5) }
• clase B={ ( 0.3, -0.5), (0.0, 1.0) }
24
5.2.1 Entrenamiento 1ªiteración
25
5.2.1 Entrenamiento 1iteración
Como h es menor que el umbral (u = 1 ) entonces el perceptron
pondrá a la salida uno 0
• El perceptrón estará determinado por la función paso, es decir si el
potencial sináptico es mayor que el umbral entonces pone a la
salida un 1, de lo contrario pondrá un 0.
26
5.2.2 Entrenamiento 2iteración
Ahora cogemos otro patrón cualquiera de entrada, por ejemplo
uno de la clase A : (-0.5, 0.5)
27
5.2.2 Entrenamiento 2iteración
Según expusimos anteriormente:
• n es el patrón de aprendizaje n=0.1
• wi(1): peso sináptico de la entrada i, durante la iteración 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 iteración i
28
5.2.2 Entrenamiento 2iteración
29
5.3 Otro Ejemplo de entrenamiento
sobre la máquina.
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]]
30
5.3 Otro Ejemplo de
entrenamiento sobre la máquina
El resultado es el siguiente:
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]
31
6. Estudio comparativo: Haskell vs. Matlab
El estudio comparativo muestra que el desempeño de la
librería es bastante bueno teniendo como referente a Matlab
para los problemas propuestos.
32
6. Estudio comparativo: Haskell vs. Matlab
Tiempos en Clasificación
3,5
2,5
T iem p o
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 librería en Haskell fue GHC compiler versión 5.04.3 para Windows y los
tiempos fueron capturados mediante la función getClockTime, una función pre-definida de
Haskell.
33
7. NEUROSCHEME
7.1 Introducción
34
7.2 Seis razones para elegir la
programación funcional.
1. La programación funcional es mucho más simple, ya que las expresiones
son construidas en forma natural inherentemente recursiva.
35
7.2 Seis razones para elegir la
programación funcional.
5. Es posible alternar el orden de evaluación de las expresiones en los
lenguajes funcionales.
36
7.3 Arquitectura de la Herramienta
El núcleo de la herramienta es un interprete de Scheme basado en un
montículo de memoria.
• Un compilador.
37
7.4 Interfaz con el sistema y usuarios
38
7.5 Interfaz gráfica de usuario
39
7.6 Implementación de RNAS
Se han implementado tres modelos de propagación hacia delante:
• Feedforward.
• Cascada correlación.
• Cascada hacia delante.
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 día
(matlab).
41
8. Conclusiones
En el transcurso del trabajo, podemos destacar las siguientes
conclusiones:
42
8.1 Conclusiones HASKELL
La implementación en Haskell permite que el código sea transparente y ver
la forma en que la librería está implementada.
43
8.1 Conclusiones HASKELL
• Como ejemplo de estas alianzas, muchos de los algoritmos de Matlab
están desarrollados en una eficiente librería de bajo nivel diseñada
para el álgebra lineal numérica (conocida como LAPACK)
44
8.2 Conclusiones NEUROSCHEME
El interprete implementado es altamente versátil, permitiendo construir
algoritmos para la manipulación y entrenamiento de RNAs, de tal
forma, que es posible automatizar procesos, y construir modelos
complejos de RNAs.
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
construcción de algoritmos precompilados de bajo nivel que
puedan ser usados por Haskell.
46
9. Referencias
1. Blas C. Ruiz Jiménez...[et al.], “Programación funcional
con Haskell” Málaga : Universidad, Secretariado de
Publicaciones, D.L. 1995
47
9. Referencias
5. Martín del Brío B., A. Sanz,(2001) “Redes neuronales y
Sistemas Borrosos”. Madrid : Ra-Ma, 2ª ed.
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]
49