Evolución y Redes Neuronales (Parte 1)

FabioBci IA
Ciencia y Datos
Published in
5 min readAug 25, 2019

Esta entrada consta de dos partes, ya que me ha quedado más largo de lo que quería, en esta primera parte explicare que son los algoritmos genéticos.

Las redes neuronales están recibiendo una gran atención en los últimos años, esto se debe al gran éxito que están teniendo a la hora de clasificar y extraer conocimiento. El éxito en gran medida viene determinado por la gran cantidad de información que podemos obtener de Internet y en la mejora de la potencia de cálculo de los ordenadores actuales, sobretodo con el uso de GPUs, es por ello que muchas personas intentan aplicar las redes neuronales para resolver problemas diversos, desde clasificación de imágenes a reconocimiento de voz o incluso como hago yo en mi tesis doctoral para extraer patrones en las señales electroencefalográficas.

Ahora bien, cuando una persona entra por primera vez en el mundo de las redes neuronales, suele aprender sobre su funcionamiento a base de ejemplos. La base de datos MNIST — se suele considerar el Hola Mundo de las redes neuronales— es un buen punto de partida. La base de datos MNIST consta de imágenes de números del 0 al 9.

MNIST dataset

El problema es encontrar una red neuronal que clasifique correctamente las imágenes, es decir que dada una imagen nos diga a que número pertenece.

Si empezamos a practicar con las redes neuronales, pronto nos daremos cuenta que no es fácil encontrar una red que clasifique correctamente, o mejorar el accuracy dada una red determinada.

Entonces nos preguntamos existe alguna forma de encontrar automáticamente redes neuronales para un problema dado? Y la respuesta es SII!, si bien podemos encontrar distintos tipos de soluciones, yo en este artículo voy a centrarme en el uso de los Algoritmos Genéticos.

Que son los algoritmos genéticos?

Con este nombre muchas veces pensamos en cosas raras, pero los algoritmos genéticos no son más que un tipo de algoritmo de búsqueda, nos permiten buscar soluciones en un espacio de búsqueda n-dimensional, para ello se basa en el concepto de selección natural de Charles Darwin.

Es decir deberemos codificar las posibles soluciones y evaluar qué solución se ajusta mejor al resultado que deseamos y seleccionar N soluciones y descartar las demás, esto es en parte el procedimiento de adaptación al medio, los individuos que mejor se adapta transmiten sus genes y los que peor se adaptan no, por lo tanto aquellas soluciones que más se acerquen al resultado óptimo que deseamos serán seleccionadas para continuar y las que peor resultados ofrezcan se descartaran, ahora bien, hacen falta mecanismos para seleccionar los individuos y para evaluarlos, aquí es donde entran en juego los conceptos de función de fitness, operador de mutación, operador de cruce y operador de selección.

Voy a explicar brevemente cada concepto.

La función de fitness:

La función de fitness es una función que dado un individuo (una posible solución al problema) nos indica que bueno es, imaginemos lo siguiente, nuestro objetivo es construir la palabra HOLA, y tenemos una posible solución que es JKLA y otra que sería HULA, y debemos saber que palabra es mejor, es decir, que palabra se acerca más a la palabra objetivo HOLA, para hacerlo podemos utilizar una función que nos diga cuantas palabras coinciden con la palabra objetivo, de esta forma tendríamos que:

F(JKLA) = 2 y F(HULA) = 3 por lo tanto el individuo HULA tiene un valor de fitness mayor que el de JKLA.

Pero podríamos definir cualquier otro tipo de función de fitness para evaluar los individuos, y dependiendo qué función escojamos, el algoritmo genético tendrá un comportamiento mejor o peor. Por lo tanto la función de fitness es una cuestión importante y debe meditarse profundamente a la hora de diseñar un algoritmo genético.

Operador de mutación:

El operador de mutación actúa sobre un individuo y concretamente sobre sus genes.

Normalmente codificamos las posibles soluciones en vectores de números binarios, pero también se pueden utilizar otros tipos como, números reales, caracteres o cualquier otro tipo.

Pero imaginemos que tenemos un vector de números binarios, pues bien, el operador de mutación lo que hace es cambiar el valor de un gen de dentro del vector. Por ejemplo, tenemos 1001 al aplicar la mutación, el vector resultante puede ser 1101, hemos mutado el segundo bit de la cadena. Esta operación viene determinada por un valor de probabilidad, que nos indica que probabilidad hay de que se produzca una mutación.

También se puede implementar este operador de otras formas. Por ejemplo una forma alternativa seria intercambiando dos genes.

Este operador es importante ya que nos permite hacer saltos en el espacio de búsqueda y no quedarnos estancados en una zona, añade diversidad.

Operador de cruce:

Esta operación también se le llama de reproducción, ya que tiene una analogía directa con la reproducción sexual de las especies. Este operador coge dos individuos y los cruza, generando uno o dos individuos distintos que heredan material genético de los individuos padres.

Normalmente se realiza un corte a partir de un punto determinado y se intercambia la información.

Imaginemos que tenemos la cadena 100001 y otra que es 110001 el operador de cruce podría generar el nueve individuo 001001 , que se ha generado cortando a partir de la posición 4 de cada cadena, la posición 4 hasta el final de la primera que es 001 y de la otra que es también 001 y generamos el nuevo individuo que es 001001 que tiene propiedades distintas a la de los padres.

Ejemplo de operación de cruce, i y j son los padres y n y m son los hijos que se han generado al intercambiar la información genética de los padres.

El operador de selección:

Este es un operador que nos permite escoger N mejores individuos para seguir iterando con ellos, suelen haber distintas estrategias, una de las más usadas es el método de la ruleta, que establece una probabilidad de ser seleccionado proporcional al valor de fitness del individuo.

Pero también podemos escoger los N mejores cromosomas. Este seria el método elitista.

Bien una vez explicado muy por encima el funcionamiento de los algoritmos genéticos, la pregunta es, y esto para qué narices nos puede servir con las redes neuronales?

Pues bien, como ya he comentado anteriormente, no es fácil encontrar una red neuronal que resuelva un problema determinado, y es aquí donde los algoritmos genéticos entran en juego, ¿porque no codificar una red neuronal en un array que llamaremos cromosoma o individuo y aplicar la lógica de le evolución para ver si encontramos una red neuronal que resuelva el problema que deseamos y no estar perdiendo tiempo en ir probando distintas estructuras de redes?

Y esto es lo que veremos en la segunda parte de esta entrada.

--

--