Reinventando las redes neuronales

Nov 10, 2011   //   by wpuser   //   Minería de Datos  //  2 Comments

Toda la información que manejamos constantemente, tanto consciente como inconsciente, esta integrada y mantenida en nuestras neuronas. Además, según van avanzando los estudios neurocognitivos, sabemos que estos enlaces se refuerzan o se disipan en el tiempo. Esto quiere decir que “olvidamos” lo que no ejercitamos, y “aseguramos” lo que hemos aprendido y practicamos, incluido el buen humor, o el malestar psicológico. Pero además, se ha demostrado que la estructura de las redes neuronales es variable, cambia, no sólo las conexiones, sino la forma en la dimensión espacio-temporal de las relaciones entre las neuronas. ¿Qué provoca estos cambios? Parece ser que todo, es decir, nuestro contacto con el medio ambiente, el aprendizaje evolutivo que vamos adquiriendo día a día, el olvido de cosas pasadas (independientemente de su importancia en el momento de su adquisición), y además, intervienen en el proceso de transformación proteínas puntuales que afectan a las neuronas, a su recubrimiento, e incluso, la generación celular y su código genético. (Todo esto que acabo de afirmar, lo iré documentando con el tiempo en una sección de referencias futuras).

Existe un video muy interesante en la red, que explica de forma muy sencilla todo lo anterior.

Sin embargo, actualmente, cuando “atacamos” un problema de predicción, clasificación o de tendencias, en base a un histórico de entradas y salidas y una red neuronal, uno de los principales problemas que tenemos es determinar la estructura de la red neuronal. Es decir, debemos hacer el trabajo que hace el cerebro ante un problema, sólo que al revés, primero ideamos qué o cuáles son las estructuras de redes neuronales que pueden, quizás, solucionarnos el problema, y luego pasamos a una fase de ensayo-error, hasta que ajustamos nuestra red.
De esta forma, si hemos decidido que nuestra red debe de ser red retroalimentada, con aprendizaje backpropagation, probamos con distintas capas intermedias, distintos tipos de activación, alternamos entre redes recurrentes, de base radial, y así, hasta que los resultados son satisfactorios.

Es cierto que podemos utilizar, como se está haciendo en muchos trabajos, algoritmos genéticos para que sean horas máquinas las que nos sugieran el tipo de red, las funciones de activación, los mejores umbrales y el número de capas intermedias, pero siempre tendremos redes totalmente conectadas (seguramente algunos enlaces jamás entren a formar parte de la solución), y un algoritmo de aprendizaje que va ajustando lo pesos de la estructura hasta llegar a un mínimo aceptable.

El cerebro no funciona de esta manera, sino que, más bien al contrario, el proceso de aprendizaje no sólo determina el peso y la estrategia de conexiones entre las neuronas, sino la estructura espacial de la matriz tridimensional de las mismas.

Otro factor que hay que tener en cuenta esla recursividad. Las redes artificiales utilizadas, usualmente son del tipo “hacía delante” o “feedforward”, es decir, las neuronas de entrada devuelven resultados a una capa de entrada, y estas a una capa de salida, siempre en la misma dirección. La estructuras de neuronas reales tienen bucles en los que la información, en un entorno tridimensional, puede volver a capas anteriores, para recalcular impulsos, es decir, existen conexiones “hacia atrás”. (También existen estrucuturas de redes artificiales con estos bucles, llamadas redes recurrentes (ART), , pero habitualmente, hay que definirlos estos enlaces con un objetivo final claro y probado, y hay que diseñar estos bucles “ad hoc”).

Las redes neuronales artificiales se basan por así decirlo en el análisis, algo así como comenzar por una ídea fundamental y descomponerla hasta conocer todos sus componentes. Mientras que las redes biológicas basan su funcionamiento en la síntesis: se comienza por un comportamiento inicial y se trata de conformar la inteligencia mediante la unión de estos componentes. La causa de esta diferencia no parece estar debida ni a la velocidad de procesamiento ni a su propia capacidad de procesar, pues los procesadores con los que contamos hoy en día tienen una velocidad de procesamiento 10 exp 6 veces más rápida que los elementos procesadores básicos del cerebro, es decir, que las neuronas. Esto, unido al hecho de que la capacidad neuronal es mucho más simple nos lleva a la conclusión de que mientras que en un ordenador convencional las instrucciones se ejecutan secuencialmente por medio de un procesador complicado y rápido, el cerebro es una interconexión masiva y paralela de elementos de procesamiento (neuronas) relativamente simples y lentas, cuyas características, a día de hoy no han sido igualadas.

Por ello, hemos demostrado que en base a conexiones aleatorias, utilizando diversas técnicas de I.A., se puede construir un sistema que genere una estructura de neuronas que resuelva los problemas que se le presentan sin necesidad de un reajuste periódico de los pesos en función de los resultados (salidas), sino que la red se configurará de forma efectiva y automática en función del problema, con las conexiones, bucles y pesos necesarios para ello, de una forma evolutiva, rápida y sin necesidad de cálculos de corrección ni de ajuste a los resultados esperados. Después, habrá que demostrar que, ante estímulos desconocidos, la red responde de forma correcta, al igual que las redes clásicas, es decir, que sea capaz de predecir resultados correctos ante entradas desconocidas.

El cerebro es un conjunto de estructuras neuronales (entre otros componentes), que ha ido evolucionando hasta su actual configuración durante miles de años. Pero aún así, esta configuración es variable, se modifica constantemente, quizás no tanto en las ubicaciones de las neuronas en el espacio, (que también se modifica, con la muerte y creación de nuevas células), sino en las interrelaciones (conexiones) que mantienen con otras neuronas.

Una neurona puede tener conexiones con neuronas cercanas en el espacio, y a la vez, con neuronas que están muy alejadas, y además, sus conexiones puede ir en cualquier sentido, es decir, en la dirección de la salida, o hacía atrás. Además, la misma neurona, en cada una de las conexiones con el resto de neuronas, puede generar un impulso diferente, y la función que genera dicho impulso no tiene por qué ser la misma.

Estas propiedades difieren bastante de lo que son las estructuras neuronales artificiales, en las que las función que determina el impulso de un enlace entre neuronas es siempre la misma para toda la neurona, e incluso, para toda la red, y no existen conexiones de neuronas que no estén en capas solapadas.

Por lo tanto, debemos crear un sistema con los siguientes requerimientos:

La red neuronal ya no tiene capas intermedias, sino que será un estructura en la que:

a) Cada neurona podrá relacionarse con un número variable de neuronas de la red, independientemente de su posición.

b) Cada neurona podrá tener como origen (entrada) un número variable de conexiones con otras neuronas, independientemente de su posición.

c) Cada neurona podrá ser entrada de un número variable de neuronas independientemente de su conexión.

d) Cada conexión neurona-neurona (que puede ser múltiples), tendrá una función de activación y un peso de enlace independiente.

e) Las neuronas de salida se determinan automáticamente, y pueden ser cualquiera de las neuronas de la red (incluidas las de entrada, ya que pueden tener realimentación de otras neuronas), independientemente de su posición.

En definitiva, estamos generando un sistema totalmente abierto, en el que cada neurona se “comunica” con otras neuronas independientemente de su situación y cercanía, cada conexión es independiente en la fuerza del estímulo, y las salidas se asignarán a a aquellas neuronas que mejor satisfagan (si lo hacen) los requerimientos del problema. Y todo, se genera de forma aleatoria y evolucionará en función de sus resultados.

Para ello, se crea un programa en lenguaje C++, que nos pedirá en su ejecución los siguientes datos:

  • Número de neuronas de entradas (datos de entrada)
  • Número de neuronas de salida (nos sirve para evaluar los resultados de la red).
  • Número de neuronas en la capa intermedia (nos sirve para limitar el número de neuronas total de la red).

Un ejemplo de esta red sería el siguiente gráfico:

– Los círculos en azul indican las neuronas de entrada.
– Los círculos en rojo indican la capa intermedia.
– Los círculos en verde indican las neuronas de salida.
– Las líneas en azul indican enlaces “hacia delante”.
– Las líneas en rojo indican enlaces “hacia atrás”, es decir, retroalimentaciones.

Ejemplo 1. XOR

XOR es el “Hello Word” de las redes neuronales. Intentamos resolver con esta nueva morfología estetípico problema de clasificación compleja.  Para ello, vamos a empezar generando estructuras simples de redes, hasta más complejas, viendo cuáles son los resultados, tiempo de proceso y necesidad de neuronas para dar con una solución válida.

En una red neuronal típica, la morfología para resolver este problema se puede ver en la siguiente figura:

Se necesitan 5 neuronas para dar una solución válida.

Si ejecutamos nuestro modelo con un mínimo de neuronas (al menos 2 de entrada para los datos de entrada, y una de salida, para determinar la solución 1/0):

patrón [0] neurona ganadora [0] error [0.126387]

patrón [1] neurona ganadora [2] error [0.000000]

patrón [2] neurona ganadora [2] error [0.572814]

patrón [3] neurona ganadora [0] error [0.037127]

Red número [36]…………Error total de la red: [0.184082]

Explicación:

La red se constituye con tres enlaces entre las neuronas, uno “hacia delante” (1->2), y dos “hacía atrás”, (1->0 y 2->0).

Para determinar el resultado, en el caso de los patrones de entrada (0,0) y (1,1), debemos tomar como salida la neurona 0, (que también es neurona de entrada), y en el caso de los patrones (0,1) y (1,0), debemos tomar como salida válida el resultado de la neurona 2 (sólo de salida).

 Con esta configuración de red resolvemos el problema XOR. en resumen, con una red de tres neuronas (la mitad que la red clásica), damos solución al mismo problema.

Para llegar a esta configuración, se han calculado 36 distintas morfologías de redes, en un tiempo inferior al segundo.

Otras configuraciones:

 

  Red con 4 neuronaspatrón [0] neurona ganadora [1] error [0.371758]patrón [1] neurona ganadora [2] error [0.000000]

patrón [2] neurona ganadora [2] error [0.000000]

patrón [3] neurona ganadora [1] error [0.350334]

1 búsqueda.

 

Red con dos enlaces “hacia atrás” (1->0 y 2->1), y otros dos enlaces recurrentes (sobre la misma neurona) en las neuronas 1 y 2   Red con 4 neuronaspatrón [0] neurona ganadora [1] error [0.046164]

patrón [1] neurona ganadora [2] error [0.371517]

patrón [2] neurona ganadora [2] error [0.369700]

patrón [3] neurona ganadora [1] error [0.046041]

 

17 búsquedas

 

Red con dos enlaces “hacia adelante” (0->1 y 0->2), y otros dos enlaces recurrentes (sobre la misma neurona) en las neuronas 1 y 2   Red con 4 neuronaspatrón [0] neurona ganadora [1] error [0.008047]patrón [1] neurona ganadora [0] error [0.724141]

patrón [2] neurona ganadora [0] error [0.000000]

patrón [3] neurona ganadora [1] error [0.007806]

 

16 búsquedas

 

Red con dos enlaces “hacia adelante” (0->1 y 2->3), un enlace “hacía atrás” (2->1) y otros tres enlaces recurrentes (sobre la misma neurona) en las neuronas 0, 1 y 2

 

 

 ¿Cuál es la mejor selección? La que calcule un menor error cuadrático en el conjunto de sus respuestas, con el menor número de neuronas utilizadas.

Mas información: ai.moreno@ibermatica.com

2 Comments

  • I’d perpetually want to be update on new posts on this site, saved to fav! .

  • You’re the one with the brains here. I’m wathcnig for your posts.