Mostrando entradas con la etiqueta IA. Mostrar todas las entradas
Mostrando entradas con la etiqueta IA. Mostrar todas las entradas

domingo, 24 de marzo de 2019

¿Qué ocurrirá cuando las energías no renovables se agoten?

Algún días las (finitas) fuentes de energía no renovables se agotarán: es algo incuestionable y sobre lo que no merece la pena divagar. Es algo físico. Un proceso de extenuación que le sucederá a cada uno de los recursos pasando previamente por lo que se conoce como la cima de su obtención (su peak), para ir luego decayendo la curva de explotación hasta el momento en que las reservas disponibles sean tan "caras" y complejas de extraer que sencillamente se necesitaría más energía de la que produciría luego con el recurso. Este peak como decimos llegará irremediablemente para cada uno de los recursos no renovables: carbón, petroleo, gas, uranio (fisionable), etc. Algunos incluso hablan de que alguno de estos peaks, por ejemplo el 'Peak Oil'; habría acontecido ya hace unos años, y que el resto de recursos tienen su cima a pocas décadas vista. Pero no vamos a entrar en temas de fechas porque no es algo crítico para el argumento principal que me gustaría defender en este artículo. La verdadera cuestión que me gustaría exponer es: ¿qué se supone que ocurrirá cuando las energías no renovables finalmente se agoten?
A parte de que el 'Peak Everything' llegará en algún momento sí o sí, hay otra premisa que parece poco discutible dado lo que sabemos de física: los recursos renovables muy difícilmente van a lograr sustituir el rendimiento energético neto ofrecido de manera natural por la fisión y por los recursos fósiles. En otras palabras:
1) Un mundo sin energía no renovable será muy probablemente un mundo en donde la cantidad de energía total neta disponible va a ser mucho menor. A menos de que la eterna promesa de la fusión llegue (cosa poco probable), está ya más que claro teóricamente que el rendimiento y la eficiencia de los recursos no renovables no son equiparables ni de lejos a la capacidad que el mundo fósil y la fisión ofrecen. Pongámoslo en modo de ejemplo cualitativo muy aproximado (y sin ningún rigor cuantitativo): se podría entender lo anterior con el hecho de que un único gran pozo petrolífero perdido de la mano de Dios en Arabia, es capaz posiblemente de generar mediante su explotación más energía neta que cientos de miles de molinos eólicos funcionando con sus intermitencias durante varios años. Y si añadimos a la ecuación que los molinos eólicos y demás artilugios renovables tienen un tiempo de vida finito antes de empezar a fallar como cualquier tipo de equipo mecánico, electrónico o electroquímico; pues es cuestión de que en varias generaciones haya que reponer por completo el parqué...con un coste cada vez mayor dado que las energías renovables dependen a su vez de recursos naturales complicados y caros de extraer, procesar y/o reciclar: litio, cobalto, aluminio, acero, etc.: los molinos eólicos y las placas solares, las baterías y demás no aparecen por arte de magia de la nada.
2) La segunda premisa básica es aquella que asegura que un mundo con una capacidad de producción energética neta total menor a la actual, supone obviamente que la cantidad de energía disponible a repartir entre todos para la producción y el consumo de bienes y servicios es menor, y por lo tanto la complejidad social (suponiendo que la cantidad de población permanece plana o sigue creciendo como hasta ahora) corre un claro peligro de sostenibilidad.
Así pues, y según estas premisas, desde los "estudiosos" del fenómeno del 'Peak Everything' se llega bastante naturalmente a la conclusión de que la civilización y la sociedad del bienestar, así como el nivel tecnológico y científico alcanzado desde el descubrimiento y dominio de la explotación fósil allá por el siglo XIX, va a colapsar. Es decir, que una vez la fósil empiece a escasear, el escenario 'Mad Max' es inevitable.
Sin embargo, a mi me gustaría ofrecer en esta entrada una alternativa a esta pesimista conclusión. La argumento extendiendo los anteriores supuestos para que se entienda mejor y podáis valorar la probabilidad de que el escenario que propongo se llegue a dar una vez los 'Peaks' sean claramente visibles e incluso comiencen a traer consecuencias económicas y geopolíticas: 
3) Así pues, y sin negar en ningún momento las dos premisas anteriormente vistas, defendemos que el rendimiento energético va a decaer muy gradualmente a partir de que se alcance el peak para cada tipo de recurso no renovable. Es decir, que ciertamente la cantidad neta de energía aportada por todo el conjunto de las no renovables va a seguir una curva de decrecimiento, pero que será un descenso muy "suave" durante las próximas décadas. No todos los recursos fósiles (y la fisión) van a decaer al mismo ritmo y al mismo tiempo, sino que lo harán a distinto ritmo y momento, por lo que unos recursos podrán sustituir a otros: como ocurre actualmente de hecho ya en la actual y descarada sustitución del diesel -complejo de procesar-, por la gasolina en el transporte privado (aunque nos lo quieran vender como algo ecológico y hecho a posta, no tiene nada que ver con eso). También se prevé a nivel más general que dentro de poco también acontecerá una sustitución a favor del gas y en detrimento del petróleo. 
4) Por tanto el rendimiento decreciente en la energía es cierto que se dará en cuanto el recurso no renovable empiece a escasear; pero lo hará como decimos muy "suavemente" y de manera gradual durante el resto del siglo. Es decir, que posiblemente entre las emergentes renovables y el restante del conjunto completo del pack de fósiles (y la fisión) podremos mantener sin muchos problemas el chiringuito en pie durante el siglo XXI...como mínimo. Siendo serios, es poco creíble pensar que la civilización va a colapsar por completo así por las buenas de un día para otro por el simple hecho de que empiece a escasear el petróleo convencional. Como mucho, podemos aceptar que habrá ciertos cambios estructurales a nivel social como por ejemplo el probable hecho de que no todos podremos tener coches eléctricos en propiedad (leáse este interesante post) y habrá que compartir coche y/o tirar de transporte público. 
5) Pero, y aquí viene la clave que diferencia mi tesis de las colapsistas, si como digo el descenso en la rentabilidad energética total disponible disminuye a un ritmo suficientemente lento y gradual durante el resto de este siglo, ¡es posible que se acompase con un descenso neto en la población mundial tal que se pueda mantener plana la densidad energética (la cantidad de energía disponible por persona)! Esto significa que si el gradual rendimiento decreciente en la energía neta se acompañara en el tiempo de un adecuado decrecimiento en la población mundial, la densidad energética (la cantidad de energía disponible para soportar la complejidad social del conjunto de habitantes) quedaría plana (¡o podría incluso aumentar si el decrecimiento poblacional se pasara de frenada!). Por cierto, que si eres de los que piensas que es imposible que la población mundial vaya a decrecer, echa un ojo a este interesante artículo. En resumen: no sólo no es imposible, sino que de hecho ya se ven visos de esta tendencia bajista.
6) En este punto me gustaría hacer de nuevo hincapié en algo fundamental: lo que mantiene a la civilización y a la sociedad del bienestar en funcionamiento no es el rendimiento energético neto total disponible, sino la densidad energética (es decir, la división de toda la energía disponible por entre el conjunto de personas sobre las que hay que repartirla). Por tanto si como decimos la disponibilidad energética decrece (numerador), pero lo hace un ritmo tal que es correspondido por una disminución en la cantidad de gente viva (denominador); la densidad (la división) puede permanecer aproximadamente constante (plana) y por tanto habría energía suficiente para mantener el bienestar logrado hasta ahora para todos los habitantes existentes según este escenario donde la población mundial tiende a la baja.
7) Es más, existe otro hecho a tener en cuenta, y es que la tecnología autónoma y la inteligencia artificial en las próximas décadas van a mejorar (a ritmo creciente) le eficiencia de producción. Esto significa que se maximizará la explotación por unidad de energía y se minimizarán las pérdidas, por lo que con una misma cantidad de energía será posible producir más bienes y servicios que en la actualidad. Otro claro ejemplo visual cualitativo (aunque para nada riguroso ni exacto) sería el siguiente: en unas tres o cuatro décadas un solo robot autónomo en Silicon Valley será muy probablemente capaz de fabricar -de principio a fin- más Nikes al día de lo que son capaces de producir hoy día cien o incluso mil personas "semi-esclavas" en la India. Este robot no necesitará descansar, ni enfermará, no tendrá problemas personales ni necesitará vacaciones ni un salario, además de que consumirá mucha menos energía para funcionar de lo que un cuerpo biológico necesita; amén de producir menos desperdicios y contaminación que esos trabajadores humanos debido a las necesidades orgánicas que todos los animales tenemos.
Conclusión.
Si el rendimiento energético decrece "suavemente" y no de manera brusca (lo cual es casi seguro), y si además la eficiencia en la producción de bienes y servicios mejora paralelamente gracias al machine learning y al uso de máquinas autónomas, unido a que la población mundial también puede decrecer a un ritmo suficiente como para mantener plana la densidad energética, hacen viable un escenario donde sea posible el mantenimiento de nuestra civilización con mínimos cambios estructurales tras la era fósil. Es más, la situación podría incluso mejorar el estado general del planeta gracias al cese de la emisión de contaminantes de la explotación fósil, aparte de que también disminuiría el enorme factor contaminante que nuestra propia superpoblación como humanos representa para el planeta: la ganadería, la agricultura industrial, los desperdicios y residuos de nuestro consumo diario y de nuestras necesidades biológicas, etc. Así pues este escenario no sólo mantiene el bienestar logrado sino que iría incluso acompañado de mejoras climáticas y medioambientales. 
El descenso de la población.
Creo que es interesante terminar comentando brevemente el hecho de que un descenso de la población humana es algo que ya ocurrió en el pasado y que podría volver a ocurrir de nuevo en el futuro. Además, este hecho podría acontecer espontáneamente, sin que ningún país, lobby u organización fuerce la situación. Comentar de nuevo a modo de ejemplo cualitativo que es ya hoy bien sabido que la automatización va (probablemente) a disminuir el trabajo disponible para los humanos en más de un 30% en las próximas dos décadas. Y esto será sólo el principio, llegando la cifra a cotas de más del 75% para fechas posteriores al 2050. Esto supone que en el planeta habrá una enorme masa de personas desempleadas de por vida, viviendo de una (más o menos, según el país) miserable renta básica que dará lo justo para vivir y comprar "cuatro cosas" con las que entretenernos con más pena que gloria. Pero el ser humano no está psicológicamente preparado para vivir en estas circunstancias, y es más que posible que esta masa de habitantes hastiados y deprimidos por no tener nada que hacer podría optar directamente por no tener descendencia a sabiendas de que sus hijos padecerán posiblemente sus mismos "males" (y que conste por favor que por mucho que todos nos quejemos del trabajo, en realidad es una necesidad humana sin la cual nos frustramos y aburrimos a los pocos meses, más aún sin no disponemos de muchos recursos con los que "buscar" diversión). 
Hoy mismo, por ejemplo; el diario El País habla de que nos dirigimos hacia una sociedad de castas, y esa situación se agravará posiblemente en el futuro. Es probable que con el tiempo existirá básicamente tres grupos sociales muy bien diferenciados: el pequeño grupo de propietarios de máquinas autónomas, el más grande pero todavía minoritario grupo de los programadores, técnicos, y demás personal que aún mantengan un puesto de trabajo, y la gran (enorme) masa de desempleados que sobrevivirán a costa de una renta básica. Es bien posible que el descenso de la natalidad provenga principalmente por parte de los desempleados que, sabiendo que sus hijos no tendrán apenas posibilidades de cambiar de estatus social (en un mundo donde prima la eficiencia el grifo de licenciados estará acotado y fijado a la demanda, no como ocurre ahora que sobran titulados por todas partes los cuales terminan trabajando en un "Burguer"), decidirán que más vale no traer al mundo a nueva generaciones de personas "a pasar el rato" intentando escapar todos los días del puro aburrimiento contando para ello con una mísera renta básica.
En este sentido podría acontecer por tanto en el escenario descrito una regulación natural y espontánea en donde la población iría decreciendo o creciendo (ajustándose de manera autorregulada) según la cantidad de energía disponible (en otras palabras, de la renta básica que sea factible y sostenible repartir a las masas). En este sentido sería la propia densidad energética la que en último término "decidiría" cuánta gente va a nacer (lo mismo que fue esta misma densidad la que probablemente tiró del crecimiento exponencial de la población ocurrido desde el siglo XIX hasta hace bien poco).
No será un camino de rosas.
Tampoco quiero dar a entender que el proceso del paso a la era post-fósil será sencillo. Muy posiblemente ocurran por el camino desgracias y desastres del estilo de nuevas guerras en la lucha por los últimos recursos no renovables disponibles (del estilo de la famosa "democratización" de Irak, pero a lo bruto). Es decir, que no niego que el proceso de adaptación a las nuevas circunstancias no vayan a estar literalmente bañadas en sangre, pero la cuestión es que es bien posible que el proceso sea tal que la civilización tal y como la conocemos (grosso modo la sociedad del bienestar) se mantenga en pie (con ciertos cambios estructurales), y que el avance tecnológico, científico y social alcanzados en los últimos siglos continúen ahí a pesar del futurible cese en las próximas décadas en la rentabilidad de la explotación fósil (y la fisión). 
En otras palabras: el proceso de adaptación al mundo sin fósiles será sin duda duro, pero será tan duro como ha sido y es la vida humana desde que apareció hace cientos de miles de años. Habrá seguro guerras, epidemias, revueltas e injusticias...pero como siempre las ha habido. Sin embargo, la cosa es que probablemente (o posiblemente), el 'Peak Everything' no implicará necesariamente un apocalipsis mundial ni un gran retroceso social y/o económico general (eso de que volveremos a la edad media parece sinceramente una chorrada). 
Es posible que la civilización se mantenga más o menos en pie, y es posible además que este proceso de adaptación a rendimientos energéticos decrecientes ocurra espontáneamente sin que nadie lo dirija (racionalmente), sino que acontezca mediante una disminución automática de la población mundial y a un mejor uso (eficiencia productiva) de la energía gracias al uso de máquinas que sustituyan a la carísima (en todos los sentidos) mano de obra humana. E insistamos en que esa disminución en la población será sin duda en parte por guerras y otras desgracias, pero mayormente será debida a procesos instintivos-cognitivos naturales que llevarán a las personas a "desear" procrear con menos frecuencia: algo que ya se observa de hecho hace décadas coincidiendo con el inicio de cierto declive energético: ¿casualidad? 
Tras el fósil sin duda el mundo cambiará, pero no es obligatorio el "Mad Max", existen alternativas naturales que pueden mantener el tinglado sin demasiados cambios o con mínimos cambios estructurales; y todo con la única (y accesible) condición de que la densidad entre la población y la disponibilidad energética neta siga plana y/o decaiga muy lentamente (durante siglos) gracias a la mejor eficiencia de explotación (IA mediante) y a una menor población debido en parte a una antinatalidad natural autorreguladora. Y no olvidemos en este sentido que es la esencia biológica evolutiva la que realmente mueve y dirige el mundo, humanidad incluida. Nuestra libertad de decisión racional en realidad es mucho -muchísimo- menor de la que presumimos en nuestra arrogancia, sobre todo cuando hablamos a nivel mundial donde todo funciona gracias a una inercia (termodinámica) natural que nadie comprende realmente. 

viernes, 14 de octubre de 2011

Computación evolutiva: Ejemplo VI

Abstract

Para el ejemplo VI de la serie práctica de algoritmos evolutivos, he implementado un OCR básico, a partir del ejemplo anterior donde realizamos un algoritmo capaz de reconocer los patrones de las vocales mediante aprendizaje evolutivo.

El OCR es bastante básico, pero permite comprobar la potencia de la computación evolutiva en relación al mundo del reconocimiento de patrones.

Ejemplo práctico VI: OCR básico

El programa que os presento a continuación; programado en un applet de Java para que podáis probarlo de primera mano, consigue precisamente eso: aprender a reconocer los patrones de las vocales, en formato Times New Roma, y un tamaño de 8 (8 x 5 = 40 píxeles). Se utiliza una red neuronal cuyos pesos se ajustan mediante una estrategia evolutiva.

El programa actua como un OCR, consiguiendo capturar la información textual dentro de una imagen (en formato GIF), y transcribiendo dicha información en una caja de texto.

Para agilizar la programación necesaria, el OCR sólo reconoce vocales en formato Times New Roman, y un tamaño de letra de 8.

En cualquier momento del entrenamiento, podemos pulsar en el botón Cancelar, y comprobar cómo va mejorando el reconocimiento del patrón.

Una vez entrenada la red neuronal, debemos introducir la ruta url de la imagen a procesar (en formato GIF), y pulsar sobre el botón Pasar OCR.

Las instrucción de uso se pueden esquematizar así:

1) Pulsa sobre el botón Entrenar para que la red neuronal aprenda a reconocer las vocales (espera hasta obtener una media de 120 en la función de evaluación).
2) Abre el Paint de Windows.
3) Crea un nuevo documento, y escribe con la herramienta de texto (con formato Times New Roman, y tamaño 8) todas las vocales que quieras, en cualquier lugar del documento (que pueden no ser consecutivos ni estar alineadas).
4) Guarda la imagen en formato GIF.
5) Sube la imagen a un hosting gratuito de imágenes. Por ejemplo: www.imgur.com.
6) Copia la ruta de la imagen subida (comprueba que la url termina en extensión ".gif").
7) Pega la url en el applet, donde dice URL de la imagen a procesar.
8) Pulsar sobre el botón Pasar OCR.

¡Y listo! Si todo va bien, el applet reconocerá todas las vocales del texto, y las introducirá en orden (y manteniedo los espacios en blanco entre ellas).


Debajo del siguiente applet encontrarás un enlace con el código fuente del ejemplo:

No puede ejecutar applets de Java. Instale la JVM, y vuelva a recargar la página, por favor.

Podéis descargar el código fuente del ejemplo VI desde este enlace.


martes, 11 de octubre de 2011

Computación evolutiva: Ejemplo V

Abstract

El siguiente ejemplo práctico, consiste en una revisión del ejemplo anterior donde realizamos un algoritmo capaz de reconocer las vocales mediante aprendizaje evolutivo.

En esta versión, hemos introducido algo de ruido durante el entrenamiento y prueba del reconocimiento conseguido. El ruido consiste en la introducción o borrado de píxeles en la imagen de la vocal a reconocer.

Ejemplo práctico V: Proyecto evolutivo de reconocimiento de patrones con ruido

El programa que os presento a continuación; programado en un applet de Java para que podáis probarlo de primera mano, consigue precisamente eso: aprender a reconocer los patrones de las vocales, en formato Times New Roma, y un tamaño de 8 (8 x 5 = 40 píxeles). No se usa ninguna técnica estratégica mediante heurística, sólo una red neuronal cuyos pesos se ajustan mediante una estrategia evolutiva.

El programa, al ejecutarse inicialmente el applet, sólo no tiene "conocimiento" alguno, y se limita a dar una respuesta aleatoria, cuando se le presenta los píxles de la imagen de una vocal en Times New Roman.

Para conseguir, de manera on-line; que el programa aprenda a reconocer el patrón de las vocales, debemos pulsar sobre el botón Entrenar. En ese momento, el programa comenzará a seleccionar evolutivamente, los individuos que mejor aproximen sus respuestas cuando se le interroga por las vocales.

En cualquier momento del entrenamiento, podemos pulsar en el botón Cancelar, y comprobar cómo va mejorando el reconocimiento del patrón.

Debajo del siguiente applet con el ejemplo V, explicaré más en profundidad la teoría que sigue el proyecto de aprendizaje automático, y encontrarás un enlace con el código fuente del ejemplo:

No puede ejecutar applets de Java. Instale la JVM, y vuelva a recargar la página, por favor.

Podéis descargar el código fuente del ejemplo V desde este enlace.


Explicación técnica del ejemplo


El proyecto de ejemplo V, tiene las siguientes características técnicas:

Todo el aprendizaje corre a cuenta de una red neuronal; con conexión hacia delante y una capa oculta (hidden layer).

La capa de entrada contiene 40 nodos; uno por cada posible contenido dentro del array que forma el conjunto de píxles de la imagen de la vocal. Hay 5 nodos de salida, los cuales indican la probabilidad de que la vocal pasada sea la que representa sicho nodo de salida.

Inicialmente, los pesos wij de la red neuronal son marcados aleatoriamente, por lo que la respuesta de la red neuronal ante el problema será aleatorio.

Hay pues que entrenar al programa para que aprenda, lo que vamos a conseguir ajustando evolutivamente los pesos de la red neuronal utilizada. Dicho entrenamiento evolutivo se realizará mediante una estrategia evolutiva.

La estrategia evolutiva será representada por un vector de 210 elementos de tipo real. Esos elementos o individuos de selección se van a corresponder con los pesos de los nodos que contiene la red neuronal, de manera que serán esos pesos los que irán evolucionando.

Así pues, la población en evolución, consistirá en n individuos (con n = 15), que tendrán n hijos, con variación exclusiva por mutación -sin recombinación- y cuya función de desempeño (fitness fuction) será calculada mediante competición -selección por torneo-.
Para el proceso de mutación, hay que tener en cuenta que cada individuo; además de un vector de pesos, contiene un vector de variables de ajuste, que también irá evolucionando junto con los pesos.

La mutación es de la forma:



Con alpha igual 0.2f, y donde xi indica el peso en la posición i del vector de pesos, y N(0,1) indica un valor tomado aleatoriamente de una distribución normal de desviación típica igual a 1, y media igual a 0. La otra variable que interviene en el proceso se corresponde con la variable de ajuste del elemento i, que; como se puede ver, muta antes de que lo haga el peso xi.

La evaluación de un individuo se realiza mediante el recuento de los aciertos conseguidos cuando se le pasa las 5 vocales. Se sumará uno cuando se acierta, y se restará uno si falla en el reconocimiento.

Finalmente, el proceso de selección consistirá en tomar los 15 mejores individuos de entre los 30 (15 padres + 15 hijos) individuos de la generación en curso. En caso de empate en la función de desempeño, se favorecerá a los individuos más longevos.

El paso de generaciones tendrá como resultado un ajuste en los pesos de la red neuronal, lo que dará lugar a un entrenamiento de la misma, que será lo que permitirá; a su vez, al programa a reconocer los patrones de las vocales dadas en una imagen GIF.


lunes, 10 de octubre de 2011

Computación evolutiva: Ejemplo IV

Abstract

Siguiendo con la serie de ejemplos prácticos -pulsa aquí para ver el ejemplo III: Aprendizaje automático en el juego 4 en raya- y disponibles con licencia GPL, de algoritmos evolutivos, voy a mostrar ahora otro ejemplo práctico. En esta ocasión se trata de diseñar un algoritmo capaz de aprender a reconocer las letras de las vocales dadas en un archivo GIF.

El esquema principal seguido es el mismo del ejemplo II y III de la serie de ejemplos evolutivos prácticos que estoy desarrollando. Es decir; haciendo uso de estrategias evolutivas y una red neuronal se consigue un apndizaje automático por parte de un programa.

Ejemplo práctico IV: Proyecto evolutivo de reconocimiento de patrones

El programa que os presento a continuación; programado en un applet de Java para que podáis probarlo de primera mano, consigue precisamente eso: aprender a reconocer los patrones de las vocales, en formato Times New Roma, y un tamaño de 8 (8 x 5 = 40 píxeles). No se usa ninguna técnica estratégica mediante heurística, sólo una red neuronal cuyos pesos se ajustan mediante una estrategia evolutiva.

El programa, al ejecutarse inicialmente el applet, sólo no tiene "conocimiento" alguno, y se limita a dar una respuesta aleatoria, cuando se le presenta los píxles de la imagen de una vocal en Times New Roman.

Para conseguir, de manera on-line; que el programa aprenda a reconocer el patrón de las vocales, debemos pulsar sobre el botón Entrenar. En ese momento, el programa comenzará a seleccionar evolutivamente, los individuos que mejor aproximen sus respuestas cuando se le interroga por las vocales.

En cualquier momento del entrenamiento, podemos pulsar en el botón Cancelar, y comprobar cómo va mejorando el reconocimiento del patrón.

Debajo del siguiente applet con el ejemplo IV, explicaré más en profundidad la teoría que sigue el proyecto de aprendizaje automático, y encontrarás un enlace con el código fuente del ejemplo:

No puede ejecutar applets de Java. Instale la JVM, y vuelva a recargar la página, por favor.

Podéis descargar el código fuente del ejemplo IV desde este enlace.


Explicación técnica del ejemplo


El proyecto de ejemplo IV, tiene las siguientes características técnicas:

Todo el aprendizaje corre a cuenta de una red neuronal; con conexión hacia delante y una capa oculta (hidden layer).

La capa de entrada contiene 40 nodos; uno por cada posible contenido dentro del array que forma el conjunto de píxles de la imagen de la vocal. Hay 5 nodos de salida, los cuales indican la probabilidad de que la vocal pasada sea la que representa sicho nodo de salida.

Inicialmente, los pesos wij de la red neuronal son marcados aleatoriamente, por lo que la respuesta de la red neuronal ante el problema será aleatorio.

Hay pues que entrenar al programa para que aprenda, lo que vamos a conseguir ajustando evolutivamente los pesos de la red neuronal utilizada. Dicho entrenamiento evolutivo se realizará mediante una estrategia evolutiva.

La estrategia evolutiva será representada por un vector de 210 elementos de tipo real. Esos elementos o individuos de selección se van a corresponder con los pesos de los nodos que contiene la red neuronal, de manera que serán esos pesos los que irán evolucionando.

Así pues, la población en evolución, consistirá en n individuos (con n = 15), que tendrán n hijos, con variación exclusiva por mutación -sin recombinación- y cuya función de desempeño (fitness fuction) será calculada mediante competición -selección por torneo-.
Para el proceso de mutación, hay que tener en cuenta que cada individuo; además de un vector de pesos, contiene un vector de variables de ajuste, que también irá evolucionando junto con los pesos.

La mutación es de la forma:



Con alpha igual 0.2f, y donde xi indica el peso en la posición i del vector de pesos, y N(0,1) indica un valor tomado aleatoriamente de una distribución normal de desviación típica igual a 1, y media igual a 0. La otra variable que interviene en el proceso se corresponde con la variable de ajuste del elemento i, que; como se puede ver, muta antes de que lo haga el peso xi.

La evaluación de un individuo se realiza mediante el recuento de los aciertos conseguidos cuando se le pasa las 5 vocales. Se sumará uno cuando se acierta, y se restará uno si falla en el reconocimiento.

Finalmente, el proceso de selección consistirá en tomar los 15 mejores individuos de entre los 30 (15 padres + 15 hijos) individuos de la generación en curso. En caso de empate en la función de desempeño, se favorecerá a los individuos más longevos.

El paso de generaciones tendrá como resultado un ajuste en los pesos de la red neuronal, lo que dará lugar a un entrenamiento de la misma, que será lo que permitirá; a su vez, al programa a reconocer los patrones de las vocales dadas en una imagen GIF.


sábado, 1 de octubre de 2011

Computación evolutiva: Ejemplo III

Abstract

Siguiendo con la serie de ejemplos prácticos -pulsa aquí para ver el ejemplo II: Aprendizaje de estrategias no-loss en el juego 3 en raya o Tic-tac-toe- y disponibles con licencia GPL, de algoritmos evolutivos, voy a mostrar ahora otro ejemplo práctico. En esta ocasión se trata de diseñar un algoritmo capaz de aprender por si solo a jugar bien al famoso juego Conecta 4 -o cuatro en línea-.

El esquema principal seguido es el mismo del ejemplo II de la serie de ejemplos evolutivos prácticos que estoy desarrollando. Es decir; se sigue la idea detrás de Blondie24; un juego de damas, implementado por David B. Fogel, que; haciendo uso de Estrategias Evolutivas y una red neuronal, consiguió que el programa aprendiera, tras 8 meses de entrenamiento, a jugar bien a las damas. Y tan bien aprendió, que consiguió un rating de 2048 –un 99,6% mejor que cualquier jugador humano-.

Ejemplo práctico III: Proyecto Evolutivo para el juego Cuatro en Línea -o Conecta 4-

El programa que os presento a continuación; programado en un applet de Java para que podáis probarlo de primera mano, consigue precisamente eso: aprender a jugar al Cuatro en Línea, sin enseñarle a priori ninguna técnica estratégica mediante heurística, sólo usando una red neuronal cuyos pesos se ajustarán mediante una estrategia evolutiva.

El programa, al ejecutarse inicialmente el applet, sólo "conoce" las reglas básicas del juego, cuándo termina la partida y el resultado de la misma, y sólo sabe prever si tu próximo movimiento la hará perder. Pero no entiende de estrategias, ni es capaz de jugar demasiado bien.

Si pulsamos en el botón Estadísticas, podremos ver cuántas partidas empata o pierde en este momento el programa tras jugar 150 veces contra un jugador que puede ver 6 jugadas hacia delante (ply =6).

Si pulsamos sobre el botón Jugar, veremos que, en cuanto pensamos un poco y aplicamos una estrategia correcta, comenzamos a ganar partidas.

Para conseguir, de manera on-line; que el programa aprenda a jugar, debemos pulsar sobre el botón Entrenar. En ese momento, el programa comenzará a competir consigo mismo una y otra vez, mejorando con el paso de tiempo –de las generaciones- de manera automática su juego. Irá aprendiendo buenas estrategias de juego.

En cualquier momento del entrenamiento, podemos pulsar en el botón Cancelar, y comprobar cómo va mejorando el juego del programa. Si jugamos contra él, veremos que estrategias con las que antes le ganábamos, ahora ya no son efectivas, o que, si pulsamos sobre el botón Estadísticas, el porcentaje de partidas perdidas va disminuyendo.

Debajo del siguiente applet con el ejemplo III, explicaré más en profundidad la teoría que sigue el proyecto de aprendizaje automático, y encontrarás un enlace con el código fuente del ejemplo:

No puede ejecutar applets de Java. Instale la JVM, y vuelva a recargar la página, por favor.

Podéis descargar el código fuente del ejemplo III desde este enlace.


Explicación técnica del ejemplo


El proyecto de ejemplo III, tiene las siguientes características técnicas:

Toda la estrategia de juego, corre a cuenta de una red neuronal; con conexión hacia delante y una capaa oculta (hidden layer).

La capa de entrada contiene 42 nodos; uno por cada posible contenido dentro del array que forma el tablero de juego –con un 1 si la ficha de una casilla es propia, un -1 si la ficha es del adversario, y un 0 si la casilla está vacía-, y un nodo de salida, responsable de devolver el resultado del proceso neuronal: expresando lo bueno o malo que un movimiento concreto es.

Inicialmente, los pesos wij de la red neuronal son marcados aleatoriamente, por lo que la respuesta de la red neuronal ante el problema sobre qué buena o mala es una jugada será también aleatoria.

Hay pues que entrenar al programa para que aprenda a evaluar las jugadas, lo que vamos a conseguir ajustando evolutivamente los pesos de la red neuronal utilizada. Dicho entrenamiento evolutivo se realizará mediante una estrategia evolutiva.

La estrategia evolutiva será representada por un vector de 1848 elementos de tipo real. Esos elementos o individuos de selección se van a corresponder con los pesos de los nodos que contiene la red neuronal, de manera que serán esos pesos los que irán evolucionando.

Así pues, la población en evolución, consistirá en n individuos (con n = 15), que tendrán n hijos, con variación exclusiva por mutación -sin recombinación- y cuya función de desempeño (fitness fuction) será calculada mediante competición -selección por torneo-.
Para el proceso de mutación, hay que tener en cuenta que cada individuo; además de un vector de pesos, contiene un vector de variables de ajuste, que también irá evolucionando junto con los pesos.

La mutación es de la forma:



Con alpha igual 0.2f, y donde xi indica el peso en la posición i del vector de pesos, y N(0,1) indica un valor tomado aleatoriamente de una distribución normal de desviación típica igual a 1, y media igual a 0. La otra variable que interviene en el proceso se corresponde con la variable de ajuste del elemento i, que; como se puede ver, muta antes de que lo haga el peso xi.

La evaluación de un individuo se realiza mediante q partidas (con q = 15), jugadas entre el individuo a evaluar, y otro individuo de la población, tomado aleatoriamente sin reemplazamiento. Cada partida ganada le sumará 1 punto, las perdidas le restará 2, y los empates no suman nada. El valor final será su función de desempeño.

Finalmente, el proceso de selección consistirá en tomar los 15 mejores individuos de entre los 30 (15 padres + 15 hijos) individuos de la generación en curso. En caso de empate en la función de desempeño, se favorecerá a los individuos más longevos.

El paso de generaciones tendrá como resultado un ajuste en los pesos de la red neuronal, lo que dará lugar a un entrenamiento de la misma, que será lo que permitirá; a su vez, al programa a jugar bien, sin intervención heurística alguna.

Detalles adicionales


1º) Para que el aprendizaje automático tenga lugar, es necesario; al menos, prever un movimiento del contrario por adelantado -qué hará él si yo muevo aquí-. Esto se consigue mediante el uso de un árbol min-max de profundidad 2 (ply=2 ), lo que es insuficiente para que la máquina comprenda estrategias, pero que sí permite una base para el ajuste de pesos de la red neuronal. Pero siempre evaluar lo bueno o malo de una jugada será objeto de la red neuronal. Es decir; aunque hay un árbol min-max de ply igual a dos, la evaluación de la tabla de tu movimiento y el mejor movimiento del contrario, la desempeña la red neuronal y no ninguna regla a priori.

2º) La red neuronal utilizada va a devolver siempre un valor real en el rango [-1,1]. Un -1 sólo cuando el movimiento a evaluar termina siendo una victoria del adversario, un 1 si la victoria es suya, y un valor entre (-1, 1) indicando lo bueno que es una jugada para el programa (valores cercanos a 1) o para el contrario (valores cercanos a 1).

3º) El campo llamado Info, en el lateral superior derecho del applet, contiene información sobre el estado del entrenamiento. Conforme pasan las generaciones, la pantalla se actualiza, y muestra datos sobre el mejor individuo de la última generación: su función de desempeño, su edad -cuanto tiempo lleva en el pool evolutivo-, y la media de su juego -resultados/edad-. Cuando juegues contra la máquina, te mostrará la misma información, pero sobre jugador contra el que estás jugando -el mejor que se encontró-.


viernes, 2 de septiembre de 2011

Computación evolutiva: Ejemplo II

Abstract

Siguiendo con la serie de ejemplos prácticos -pulsa aquí para ver el ejemplo I- y disponibles con licencia GPL, de algoritmos evolutivos, voy a mostrar ahora algo que, bien entendido; se comprende es un logro importante, que debemos a dos fundamentales ramas de la IA; como son la computación evolutiva y las redes neuronales.

Estoy hablando de la posibilidad de crear programas que adquieran “conocimiento” estratégico automáticamente sin necesidad de que un programador humano implemente ninguna regla heurística de aprendizaje.

La idea de este ejemplo parte de Blondie24; un juego de damas, implementado por David B. Fogel, que; haciendo uso de Estrategias Evolutivas y una red neuronal, consiguió que el programa aprendiera, tras 8 meses de entrenamiento, a jugar bien a las damas. Y tan bien aprendió, que consiguió un rating de 2048 –un 99,6% mejor que cualquier jugador humano-.

Lo increíble de Blondie24, era que el programador, en ningún momento implementó reglas heurísticas para el correcto funcionamiento del programa. No se escribió qué jugadas son mejores que otras, ni se propuso ningún mecanismo de recompensa por buenas jugadas, ni hizo falta la intervención humana en el aprendizaje en modo alguno. El programador sólo implementó de forma prestablecida las reglas básicas del juego: qué movimientos están permitidos hacer y cuándo alguien ha ganado el juego, y fue Blondie24 la que “aprendió” a jugar, como lo hace cualquier jugador humano –al que nadie le enseñe estrategias sino que aprenda por si mismo-: progresivamente mediante ensayo y error.

Ejemplo práctico II: Proyecto Noelia

Utilizando la teoría tras Blondie24, y algunos de los detalles geniales que David B. Fogel introdujo en su proyecto, me propuse hacer algo similar, pero a menor escala; para poder afrontarlo en poco tiempo, aunque sin perder su esencia.

Para conseguirlo, opté por implementar un programa que “aprenda” por si sólo buenas estrategias de un juego, mucho más elemental que las damas, y bastante utilizado en los ejemplos teóricos de IA: el juego del tres en raya, también conocido como tic-tac-toe. Aunque; tengo que reconocer, finalmente, me propuse algo un poco más ambisioso que eso, consguir no sólo que juegue buenas estrategias, sino que alcance estrategias con las que nunca pierda (no-loss-strategy).

El programa que os presento a continuación; programado en un applet de Java para que podáis probarlo de primera mano, consigue precisamente eso: aprender a jugar al tres en raya, sin enseñarle a priori ninguna técnica estratégica mediante heurística, sólo usando una red neuronal cuyos pesos se ajustarán mediante una estrategia evolutiva.

El programa, al ejecutarse inicialmente el applet, sólo "conoce" las reglas básicas del juego, cuándo termina la partida y el resultado de la misma, y sólo sabe prever si tu próximo movimiento la hará perder. Pero no entiende de estrategias, ni es capaz de jugar bien. Al comienzo, el programa tiene el nivel de una persona muy novata en el juego.

Si pulsamos en el botón Estadísticas, podremos ver cuántas partidas empata o pierde en este momento el programa tras jugar 50 veces contra un jugador experto -simulado mediante heurística, con un árbol min-max y profundidad (ply) de 9 movimientos-. De media, antes de entrenar, el programa perderá un 50% de sus partidas contra dicho jugador experto.

Si pulsamos sobre el botón Jugar, veremos que, en cuanto pensamos un poco y aplicamos una estrategia correcta, comenzamos a ganar partidas.

Para conseguir, de manera on-line; que el programa aprenda a jugar, debemos pulsar sobre el botón Entrenar. En ese momento, el programa comenzará a competir consigo mismo una y otra vez, mejorando con el paso de tiempo –de las generaciones- de manera automática su juego. Irá aprendiendo buenas estrategias de juego.

En cualquier momento del entrenamiento, podemos pulsar en el botón Cancelar, y comprobar cómo va mejorando el juego del programa. Si jugamos contra él, veremos que estrategias con las que antes le ganábamos, ahora ya no son efectivas, o que, si pulsamos sobre el botón Estadísticas, el porcentaje de partidas perdidas va disminuyendo.

Pasadas las generaciones –si se le permite entrenar bastante tiempo-, el programa será igual de efectivo que un jugador humano. Lo que significa que; lo mejor que podrás conseguir contra él serán tablas. El aprendizaje ocurrirá poco a poco, lo que significa que verás una mejora gradual en su calidad de juego. Por poner un ejemplo; es de notar que, tras pasar algunas generaciones de entrenamiento; el programa "comprende" que la mejor estrategia de juego consiste en mover a la casilla central siempre que esté libre.

Hay de tener en cuenta, que sólo notarás una mejora realmente significativa en la calidad de juego a partir de trascurridas algunas generaciones, y que un juego de estrategia no-loss suele llegar aproximadamente en 150 generaciones.

Debajo del siguiente applet con el ejemplo II, explicaré más en profundidad la teoría que sigue el proyecto de aprendizaje automático, y encontrarás un enlace con el código fuente del ejemplo:

No puede ejecutar applets de Java. Instale la JVM, y vuelva a recargar la página, por favor.

Podéis descargar el código fuente del ejemplo II desde este enlace.


Explicación técnica del ejemplo


El proyecto de ejemplo II, tiene las siguientes características técnicas:

Toda la estrategia de juego, corre a cuenta de una red neuronal; con conexión hacia delante y dos capas ocultas (hidden layer).

La capa de entrada contiene nueve nodos; uno por cada posible contenido dentro del array que forma el tablero de juego –con un 1 si la ficha de una casilla es propia, un -1 si la ficha es del adversario, y un 0 si la casilla está vacía-, y un nodo de salida, responsable de devolver el resultado del proceso neuronal: expresando lo bueno o malo que un movimiento concreto es.

Tenemos así una red neuronal compuesta de 9 nodos de entrada xi, 21 nodos en las capas ocultas, y un nodo de salida. Más otros 9 nodos de activación (nodos bias).

Inicialmente, los pesos wij de la red neuronal son marcados aleatoriamente, por lo que la respuesta de la red neuronal ante el problema sobre qué buena o mala es una jugada será también aleatoria.

Hay pues que entrenar al programa para que aprenda a evaluar las jugadas, lo que vamos a conseguir ajustando evolutivamente los pesos de la red neuronal utilizada. Dicho entrenamiento evolutivo se realizará mediante una estrategia evolutiva.

La estrategia evolutiva será representada por un vector de 9 elementos de tipo real. Esos elementos o individuos de selección se van a corresponder con los pesos de los nodos que contiene la red neuronal, de manera que serán esos pesos los que irán evolucionando.

Así pues, la población en evolución, consistirá en n individuos (con n = 15), que tendrán n hijos, con variación exclusiva por mutación -sin recombinación- y cuya función de desempeño (fitness fuction) será calculada mediante competición -selección por torneo-.
Para el proceso de mutación, hay que tener en cuenta que cada individuo; además de un vector de pesos, contiene un vector de variables de ajuste, que también irá evolucionando junto con los pesos.

La mutación es de la forma:



Con alpha igual 0.2f, y donde xi indica el peso en la posición i del vector de pesos, y N(0,1) indica un valor tomado aleatoriamente de una distribución normal de desviación típica igual a 1, y media igual a 0. La otra variable que interviene en el proceso se corresponde con la variable de ajuste del elemento i, que; como se puede ver, muta antes de que lo haga el peso xi.

La evaluación de un individuo se realiza mediante q partidas (con q = 15), jugadas entre el individuo a evaluar, y otro individuo de la población, tomado aleatoriamente sin reemplazamiento. Cada partida ganada le sumará 1 punto, las perdidas le restará 2, y los empates no suman nada. El valor final será su función de desempeño.

Finalmente, el proceso de selección consistirá en tomar los 15 mejores individuos de entre los 30 (15 padres + 15 hijos) individuos de la generación en curso. En caso de empate en la función de desempeño, se favorecerá a los individuos más longevos.

El paso de generaciones tendrá como resultado un ajuste en los pesos de la red neuronal, lo que dará lugar a un entrenamiento de la misma, que será lo que permitirá; a su vez, al programa a jugar bien, sin intervención heurística alguna.

Detalles adicionales


1º) Para que el aprendizaje automático tenga lugar, es necesario; al menos, prever un movimiento del contrario por adelantado -qué hará él si yo muevo aquí-. Esto se consigue mediante el uso de un árbol min-max de profundidad 2 (ply=2 ), lo que es insuficiente para que la máquina comprenda estrategias, pero que sí permite una base para el ajuste de pesos de la red neuronal. Pero siempre evaluar lo bueno o malo de una jugada será objeto de la red neuronal. Es decir; aunque hay un árbol min-max de ply igual a dos, la evaluación de la tabla de tu movimiento y el mejor movimiento del contrario, la desempeña la red neuronal y no ninguna regla a priori.

2º) La red neuronal utilizada va a devolver siempre un valor real en el rango [-1,1]. Un -1 sólo cuando el movimiento a evaluar termina siendo una victoria del adversario, un 1 si la victoria es suya, y un valor entre (-1, 1) indicando lo bueno que es una jugada para el programa (valores cercanos a 1) o para el contrario (valores cercanos a 1).

3º) Hay un check box llamado no-loss, que, cuando se activa, indica que el proceso de entrenamiento, se hará jugando contra el jugador experto simulado mediante heurística. De esa manera, el aprendizaje es más rápido y siempre termina (tras unas 100 generaciones aproximadamente) alcanzando una estrategia no-loss. Cuando el check está desactivado, el entrenamiento se realiza contra sí mismo y podría ser que la estrategia no-loss no se alcance -aunque siempre quedará cerca-.

4º) El campo llamado Info, en el lateral superior derecho del applet, contiene información sobre el estado del entrenamiento. Conforme pasan las generaciones, la pantalla se actualiza, y muestra datos sobre el mejor individuo de la última generación: su función de desempeño, su edad -cuanto tiempo lleva en el pool evolutivo-, y la media de su juego -resultados/edad-. Cuando juegues contra la máquina, te mostrará la misma información, pero sobre jugador contra el que estás jugando -el mejor que se encontró-.

5º) La mejor manera de saber si hemos llegado a una estrategia no-loss, es ir mirando la pantalla de información, y esperar a que aparezcan datos en los que el mejor jugador encontrado tiene f = 0.0 y una edad avanzada (más de 20). Si pulsamos sobre el botón cancelar, y luego sobre el botón Estadísticas, deberá devolver siempre un 100% de empates contra el jugador experto.

Conclusión

Lo que pensé iba a ser un ejemplo fácil de conseguir, ha resultado ser una verdadera pesadilla, que me ha llevado un par de semanas de mi tiempo libre.

Mi cabezonería me ha impedido abandonar, y ahora me alegro, porque aprendí muchísimo sobre redes neuronales, y he podido avanzar en este campo de la IA que me parece fundamental, y que creo hace un muy buen equipo con la computación evolutiva. Es más, me atrevería a decir, que el futuro desarrollo de ambas ramas podría llegar a conseguir una verdadera inteligencia artificial. No sé si viviré para verlo, pero aquí queda dicho :).

Gracias por compartir vuestro tiempo conmigo, espero que el proyecto les haya gustado, y el código fuente les pueda servir de ejemplo.