jueves, 18 de febrero de 2016

Aprendizaje autónomo por computación evolutiva (Conecta 4)

"[Las neuronas son] células de formas delicadas y elegantes, las misteriosas mariposas del alma, cuyo batir de alas quién sabe si esclarecerá algún día el secreto de la vida mental." (Ramón y Cajal)

Introducción.

Dibujo de Ramón y Cajal de las células del cerebelo de un pollo,
 mostrado en "Estructura de los centros nerviosos de las aves", Madrid, 1905.
Dos noticias muy importantes que han tenido lugar estas últimas semanas en el campo de la neurociencia y la inteligencia artificial (de las cuales me hice eco en este mismo blog: aquí[1][2] y aquí[3]), me hizo recordar un trabajo de computación que hice allá por el 2011 cuando inicié el doctorado en ingeniería (el cual por cierto aún no terminé, y que tengo absolutamente abandonado :( Ya me gustaría tener tiempo libre para poder retomarlo; porque además odio dejar las cosas a medias).

Pues bien, el trabajo original[4] (que he mejorado) consistía en ser el desarrollo de un algoritmo capaz de aprender a jugar al Cuatro en Raya (Conecta 4) de un modo completamente autónomo: sin necesidad de programar a priori en absoluto ningún tipo de regla de juego. En otras palabras, comenzar con un programa que eligiera movimientos en principio aleatoriamente (como hace una persona cuando no sabe cómo jugar y le obligas a hacerlo), y que posteriormente dicho algoritmo fuese aprendiendo a jugar exclusivamente mediante la práctica (sin necesitar de ninguna nueva intervención por parte del programador), hasta alcanzar un nivel aceptable de juego.

Pero, ¿cómo lograr esta "hazaña"? (en el 2011 ya hacía tiempo que todo eso estaba inventado, pero yo estaba investigando sobre el asunto para intentar alcanzar el estado del arte). Resultó ser que la solución a este complejo problema, como ha ocurrido en tantas otras ocasiones en la investigación tecnológica, se pudo conseguir simplemente imitando el modo en que la naturaleza actúa. En este caso concreto, lo único que hubo que hacer fue simular computacionalmente una red neuronal como las que nuestro cerebro contiene, y dejar que un proceso de aprendizaje modulara las sinapsis (que en el campo de la computación se llaman pesos) entre las neuronas (que en computación se denominan nodos). Y nada más: simplemente montando una red neuronal similar a las del cerebro, se puede conseguir, por ejemplo; que un programa de ordenador sea capaz de (literalmente) aprender a jugar a un juego "complejo" como el Conecta 4 sin ninguna intervención humana añadida; es decir, sin la necesidad de explicar a priori ninguna regla o norma del juego: un proceso de aprendizaje, por cierto, muy similar al que se cree que acontece entre nuestras neuronas donde, mediante una práctica empírica repetida, se piensa que nuestra estructura neuronal se va ajustando y modulando hasta alcanzar el objetivo de aprendizaje deseado.

Equivalencia entre la neurona biológica, y la emulación computacional que de ella se hace.

La red neuronal (metodología).

La red neuronal artificial finalmente utilizada, la cual sigue, como digo, las directrices básicas del funcionamiento del cerebro animal, consistió simplemente en emular 181 neuronas (nodos) unidas mediante 828 sinapsis (pesos o enlaces wij) con una estructura espacial de 42 nodos de entrada (inputs), dos capas intermedias (hidden layers) de 69 neuronas cada una, y una capa de salida (output) con un único nodo. A la salida de cada nodo se aplicó una función de activación hiperbólica (tanh) para restringir el potencial de salida de cada neurona (simulando de esta forma la aparición del potencial de acción que ocurre en las neuronas biológicas).

Las 42 "neuronas" de la capa de entrada reciben un cierto potencial de acción (simbolizado por un valor de "voltaje" de 0, 1 ó -1) según el dato sensible de la casilla enésima indique que no hay ninguna ficha en ella (huevo libre), que contiene ficha propia, o una ficha del adversario respectivamente. Posteriormente, y tras el procesado de estos datos empíricos de entrada por las dos capas intermedias de la red (teniendo en cuenta el modo en que las sinapsis estén dispuestas -valor de los pesos wij-), se produce una salida concreta en el último nodo de la red. Esta salida va a consistir en ser un determinado "voltaje" simulado por un valor escalar y continuo (un número real) restringido en el dominio (0,1]. Y será este "voltaje" de salida el que finalmente va a simbolizar con su fuerza o debilidad (valor alto o bajo) lo favorable o desfavorable que una jugada concreta es. Por último, simplemente se selecciona el movimiento (de entre los 7 posibles en cada jugada) que la red neuronal estima como más ventajoso (argmax).

Esquema del modo en que se simula una neurona biológica.
Y nada más, eso es todo. Se monta una red neuronal como esta que os he descrito, la cual simplemente se limita a emular con cierto nivel de detalle las redes del cerebro animal, y sin explicarle al programa resultante en ningún momento las reglas del juego (sin preprogramar nada más), se consigue que un ordenador aprenda él sólo a jugar con un nivel aceptable al Conecta 4 mediante un entrenamiento autónomo (no supervisado) totalmente empírico de dicha red artificial.

Resultados.

El programa inicialmente no tiene ni idea de cómo jugar, y se limita a mover de un modo casi aleatorio por entre las 7 acciones que el juego del Cuatro en Raya permite en cada jugada (es decir; que en cada jugada se puede poner una ficha en la primera columna, en la segunda columna, y así hasta las 7 disponibles -siempre y cuando quede hueco libre hacia arriba entre las 6 filas-).

En este sentido, la red neuronal comienza no sabiendo qué hacer, y le puedes ganar simplemente colocando una ficha encima de otra hasta hacer las 4 en línea (como ocurriría, por cierto; con una persona que tampoco conozca las reglas del juego). Sin embargo, la cosa cambia gradualmente conforme la red va entrenando al practicar jugando contra copias de sí misma. Es decir; que el entrenamiento no supervisado de la red neuronal lo realizo mediante una técnica de computación evolutiva (utilizando refuerzo por torneo, una técnica que por cierto ha usado Google en su reciente programa capaz de vencer a un gran maestro en el juego Go[2]). Se procede, pues, haciendo cientos de copias de la red neuronal, pero permitiendo ligeras variaciones aleatorias (mutaciones) en las fuerzas sinápticas (valor de los pesos entre los nodos). De todas estas copias "mutadas", se seleccionan aquellas que jueguen (tras el torneo) por puro azar ligeramente mejor que las demás, lo que constituye de facto un gradual proceso evolutivo (muy similar en la base a la selección natural biológica).

Este proceso evolutivo de entrenamiento puramente experimental (empírico) termina al cabo de sobre 1000 generaciones (un par de días de proceso con la potencia de mi ordenador), resultando en una red neuronal entrenada capaz de ofrecer un aceptable nivel de juego (sin hacer uso de técnicas de programación tradicionales como el uso de árboles minimax, ni tampoco heurísticos de ninguna clase). Cada generación, por cierto, la componen 300 individuos (redes neuronales independientes) compitiendo entre sí.

Y creo que en este punto es importante señalar una vez más, que la red neuronal no busca activamente la mejor jugada trazando árboles de exploración (minimax o MTCS) y adelantando así el movimiento del adversario como se suele hacer, por ejemplo, en el desarrollo clásico de programas de ajedrez, sino que la red neuronal sencillamente ve el conjunto de fichas como un todo, y simplemente es capaz de "percibir" qué movimiento le dará ventaja. De hecho, el algoritmo entrenado consigue jugar bien, porque es capaz de captar los patrones del juego del Conecta 4 que mejor expectativas ventajosas ofrece (una forma de jugar muy parecida al que utilizan, por ejemplo; las personas). Tal es así, que es posible que la red neuronal llegue a cometer lo que se puede entender como "despistes", haciendo repentinamente una jugada inesperada o errónea.

Imágenes del programa.

Para todos aquellos que no deseen descargar el programa y ejecutarlo en local (o que no quieran esperar el día de entrenamiento necesario para que la red neuronal llegue a aprender a jugar con cierto nivel de calidad), os adjunto a continuación algunas imágenes y vídeos del proceso en vivo:

Interfaz del programa justo al inicio de su ejecución. Si se pulsa sobre "Jugar" se jugará contra la
 red neuronal en cualquier momento. Al inicio, la capacidad de juego de dicha red será nula.

Si jugamos, por tanto, nada más arrancar el programa contra la red neuronal, vemos que juega de un modo nefasto (casi aleatorio):


A continuación, ponemos la red neuronal a entrenar del modo en que lo hemos explicado en el apartado anterior. Veremos cómo se van jugando cientos de partidas durante el proceso de aprendizaje empírico hasta que, pasadas muchas horas de entrenamiento (y muchas generaciones de gradual ajuste evolutivo), la misma red neuronal que al inicio jugaba sin ninguna idea, habrá conseguido un nivel de juego bastante aceptable (teniendo en cuenta el pequeño tamaño en la estructura de la red neuronal utilizada -con apenas 180 neuronas- para agilizar el entrenamiento en lo posible en mi "modesto" ordenador de sobremesa). Veamos este proceso de entrenamiento en vivo:


En el vídeo sólo se ven las 3 primeras generaciones del entrenamiento, pero podéis imaginaros que ese proceso continúa por muchas horas hasta alcanzar las 1000 generaciones de entrenamiento por refuerzo mediante competición evolutiva.

Una vez finalizado el entrenamiento, el resultado es el siguiente. Vais a ver a continuación en el vídeo como, exactamente la misma estructura red neuronal inicial, una vez suficientemente entrenada y adaptada a la tarea de aprendizaje requerida (con las sinapsis bien moduladas), juega ya con un nivel bastante aceptable (por claridad visual, la máquina siempre mueve la primera y siempre juega con fichas amarillas):


Para no demorar mucho, detuve el entrenamiento del vídeo en 556 generaciones y probé la red neuronal. Y como se puede observar en el vídeo, es impresionante como una simple red de menos de 200 nodos (neuronas) es capaz de desarrollar tal habilidad para jugar a este complejo juego de explosión combinatoria. Lo que al inicio era un juego casi aleatorio, se ha convertido (al cabo de 6 horas de entrenamiento empírico no supervisado) en una capacidad de juego ¡con la suficiente calidad como para llegar a vencerme en ocasiones! El algoritmo ha conseguido (insisto una vez más, sin exploración minimax, ni ninguna ayuda heurística preprogramada) detectar y afianzar aquellos patrones de juego que más le benefician observando el tablero como un todo (alcanzando de manera autónoma técnicas de juego como la de comprender que es ventajoso mover siempre en la columna central al inicio del juego, superponer a veces su ficha por encima de la mía, etc.).

Pero más interesante aún, es el hecho de que cuando puse hace semanas a mi hija pequeña (de 6 años) a jugar a este juego que no conocía, siguió un proceso de aprendizaje asombrosamente similar al descrito por esta red neuronal artificial. Yo no le expliqué absolutamente nada a mi hija, y fue ella la que a base de jugar y perder (entrenamiento empírico) llegó a detectar ciertos patrones básicos y dedujo las reglas del juego. ¡Y os puedo prometer que esto que os cuento es verídico!

Conclusión.

Red neuronal biológica.
Partimos del hecho de que una red neuronal artificial, al imitar el modo en que funciona cualquier red neuronal de un cerebro animal, consigue y logra emular computacionalmente a su vez con una asombrosa similitud gran parte de las capacidades cognitivas de dichos entes biológicos. Esto, a su vez, parece establecer una estrecha e innegable relación directa entre estas capacidades cognitivas animales, y la red de neuronas biológicas que contienen sus cerebros.

Puesto con otras palabras: el hecho de que al imitarse el funcionamiento neuronal animal mediante computación surjan espontáneamente capacidades muy relacionadas con estos seres vivos, parece indicar fuertemente que toda la capacidad cognitiva de éstos podría explicarse como mera consecuencia de los flujos eléctricos procesados de un modo físico-químico por entre las redes de neuronas cerebrales. Porque, sin duda el hecho de que no haga falta ningún ingrediente externo a una simple red neuronal artificial para conseguir imitar gran parte de los logros cognitivos animales, evidencia con fuerza, que muy probablemente los propios logros animales tampoco requieran de otra cosa a parte de su propia red neuronal biológica. En este sentido, incluso la enorme capacidad cognitiva del hombre, como animal evolutivo que es, también se explicaría mediante su mero procesar eléctrico neuronal. Y aunque esta última hipótesis de la que hablo, hoy por hoy es solamente un postulado con fuertes evidencias a favor; en un futuro no demasiado lejano, y conforme la capacidad del hardware se acerque a la capacidad de cómputo del cerebro humano, muy posiblemente llegará a surgir una conciencia artificial indiferenciable de la nuestra, lo cual elevará la hipótesis a la categoría de teoría establecida. Es cuestión de tiempo (posiblemente menos de 50 años).

Red neuronal biológica.
Red neuronal artificial emulando una red biológica.

Las matemáticas de la mente (discusión sobre lo tratado).

Mediante una sencilla regla transitiva, todo lo dicho anteriormente finalmente casa con la propuesta de que nuestra mente podría ser fruto exclusivo de procesos matemáticos determinados. Veamos como:

Las capacidades cognitivas humanas (y del resto del reino animal) parecen ser, como hemos visto, producto del procesado eléctrico por entre trillones de sinapsis en el cerebro. Por lo que sería pues precisamente este procesamiento de información eléctrica entre neuronas el que lograría otorgarnos todas y cada una de nuestras capacidades, sin que exista evidencia empírica alguna de que nada más intervenga en el proceso que origina lo que se entiende por mente: englobando aquí conducta, emociones, sensaciones, etc. Esta afirmación basa su fuerza en tres hechos probados: 1º) Que la moderna neurociencia indica experimentalmente [2] que todo apunta a que las redes neuronales biológicas se sobran para acometer la gama completa cognitiva del hombre, 2º) que no se ha observado empíricamente nada más en el cuerpo humano capaz contribuir a tales procesos, y 3º) que además, por otra parte, al emular este comportamiento neuronal biológico de un modo computacional, se observan cada vez resultados más y más parecidos a los observados en los seres vivos (siendo muy probablemente un problema de escala y potencia de cómputo lo que ha impedido que la inteligencia artificial no haya avanzado de un modo tan evidente hasta hace poco más de una década). De hecho, la inteligencia artificial tiende (últimamente casi exponencialmente), a conseguir cada vez resultados más parecidos a los de la inteligencia biológica, y además lo hace precisamente imitando cada vez más y mejor la base neuronal del cerebro (en este sentido, cabe destacar en mi opinión la enorme mejora que se ha conseguido en el terreno del reconocimiento de voz en los últimos años, siendo hoy día posible que un simple móvil comprenda y transcriba las palabras que cualquiera pueda decirle sin un entrenamiento personal previo, y todo gracias a los avances logrados por Google y Apple en el uso de redes neuronales para estas tareas).

Pero ahora viene lo interesante del asunto. Si dado todo lo anterior, aceptamos que nuestra capacidad cognitiva se reduce a la red neuronal biológica que la sustenta, y si por lo tanto la mente queda determinada por esta base material físico-química subyacente (neuronas, neurotransmisores, iones, etc.), mientras que al mismo tiempo también hemos visto que esta red neuronal biológica se puede emular cada vez con más éxito en un ordenador, ¡esto quiere decir que podemos estudiar transitivamente la mente de un modo explícito a partir de nuestro conocimiento computacional!

Es decir; que si logramos comprender en profundidad cómo y por qué una red neuronal artificial es capaz de lograr logros equiparables a los cognitivos humanos, estaremos al mismo tiempo comprendiendo el porqué de nuestra propia mente biológica. En este sentido, saber por qué yo puedo, por ejemplo, detectar y clasificar objetos dentro de una foto, es equivalente a comprender por qué una red neuronal artificial es capaz de conseguir el mismo fin al imitar el funcionamiento de mi cerebro.

Así pues, todo se reduce a comprender por qué funciona una red neuronal artificial debidamente configurada (o adaptada a cierta tarea). Y la respuesta es simple, muy simple: gracias a las matemáticas. Todo el funcionamiento neuronal artificial (y según hemos concluido, también biológico), se basa en sumas aditivas de potenciales eléctricos y en la inclusión de un umbral (o constante numérica de voltaje) a partir de la cual se produce la transmisión de un pulso de acción.


En las redes neuronales artificiales todo se reduce a vectores (y matrices) de números, que posteriormente se multiplican y suman hasta ofrecer un valor de salida numérico en la última capa. Exclusivamente de este sencillo modo algebraico funcionan las redes artificiales, y según lo visto igualmente debe funcionar una red neuronal biológica. De hecho, la experimentación en neurociencia casa perfectamente con esta idea, al proponer que en el cerebro se va sumando el voltaje variable que llega (inputs) desde las dendritas de otras neuronas, y que cuando se supera cierto umbral de mili voltios (mV), ocurre la transferencia eléctrica hacia la salida de la neurona, mientras que si por el contrario no se supera dicho umbral la neurona no transmite ese pulso. Y no habría más. 

El simple álgebra que permite a una red neuronal artificial lograr hitos comparables a los biológicos, indican con determinación, que es un álgebra muy similar el que nos otorga a nosotros todas nuestras capacidades. Es decir; que debidamente configurada y estructurada por la evolución, serían estas estructuras matemáticas neuronales las responsables de dar cuenta de todo el potencial cognitivo observable en los animales.

En este sentido, nuestro cerebro es literalmente una especie de computador biológico trabajando, al igual que ocurre con nuestros ordenadores, mediante el procesamiento de señales digitales (un pulso = 1 y no pulso = 0). Aunque este procesamiento, sin embargo, es totalmente paralelo (y no secuencial como en un procesador), y además cuenta con la posibilidad de ajustar la friolera del trillón de sinapsis (mientras que actualmente no podemos simular con éxito más que redes neuronales artificiales de poco más de un millón de conexiones -sinapsis-; varios órdenes de magnitud por debajo de la capacidad biológica).

Sin embargo, lo importante del asunto no es realmente saber cuánto nos queda aún para lograr emular por completo el potencial que ofrece el cerebro biológico, sino el hecho de que ya hoy día podemos asegurar, con poco lugar a dudas, que nuestra mente es fruto del procesar eléctrico de la red neuronal del cerebro, y que dicha red neuronal es equivalente a un proceso de computación digital matemático:

Nuestra mente, en el fondo, no es más que el fruto de una enorme calculadora digital capaz de ejecutar en paralelo cientos de trillones de operaciones por segundo: operaciones que, por cierto, se reducen a meras sumas de potenciales eléctricos.

Código fuente del trabajo de Conecta 4.

Archivo JAR directamente ejecutable (sólo necesitas tener instalado Java JRE en tu ordenador y hacer doble click en el fichero).
- Código fuente del proyecto (no he tenido tiempo de poner en limpio el código, ni de comentarlo como es debido; pero sí creo que está más o menos bien estructurado para el poco tiempo que tengo para dedicar a estas cosas :P).

Referencias.

[1] http://quevidaesta2010.blogspot.com.es/2016/01/nada-mas-que-neuronas.html
(Nuevo hito histórico conseguido por un equipo de Google, por el cual han conseguido desarrollar una red neuronal capaz de vencer por primera vez a un gran maestro en el juego Go.
[2]Scientific American: "Computer Beats Go Champion for First Time" (http://www.scientificamerican.com/article/computer-beats-go-champion-for-first-time/)
[3] http://quevidaesta2010.blogspot.com.es/2016/02/decodificando-la-mente.html
(Gran trabajo de Rajesh P. N. Rao, un neurocientífico computacional de renombre que formó parte del equipo de desarrollo de un importante experimento. El paper original se puede leer de forma gratuita desde este enlace: http://www.ploscompbiol.org/article/fetchObject.action?uri=info:doi/10.1371/journal.pcbi.1004660&representation=PDF y su título es el siguiente: "Spontaneous Decoding of the Timing and Content of Human Object Perception from Cortical Surface Recordings Reveals Complementary Information in the EventRelated Potential and Broadband Spectral Change").
[4] http://algoritmoevolutivo.blogspot.com.es/2011/10/computacion-evolutiva-ejemplo-iii.html
(Este es el trabajo que escribí originalmente en el 2011, y que acabo de mejorar para que no necesite ya ni siquiera de la ayuda del árbol minimax que originalmente utilicé de apoyo).