Mostrando entradas con la etiqueta estrategia evolutiva. Mostrar todas las entradas
Mostrando entradas con la etiqueta estrategia evolutiva. Mostrar todas las entradas

sábado, 1 de agosto de 2026

El mandato sigue en pie: orden, calor y el miedo de Hawking

«La inteligencia artificial podría significar el fin de la raza humana» (Stephen Hawking)

Hace ya más de diez años escribí aquí mismo sobre el aviso de Stephen Hawking —y de otros mil colegas— respecto al peligro real que supone el avance en robótica e inteligencia artificial para la supervivencia humana [1]. En aquella entrada defendí, con más detalle del que suele permitirse la prensa, que dicho miedo no es ciencia ficción gratuita, sino una consecuencia bastante natural de ciertas leyes físicas del mundo [2]. Aquella tesis —complejidad, disipación, desplazamiento del menos eficiente por el más eficiente— no se quedó solo en el blog: con el tiempo la empujé hasta convertirla en novela. Pero una novela, por muy bien anclada que esté, necesita siempre su columna vertebral no ficcional. Esta entrada pretende ser exactamente eso: el pilar actualizado, claro y defendible, de aquella idea de 2015… y del mandato que da título a la ficción.

Hoy no vengo a retractarme. Vengo a reforzar. Lo haré con paciencia: primero las leyes y las matemáticas básicas (sin tratar al lector de tonto); luego los fenómenos reales del Universo; después la escala cósmica; a continuación un estudio de laboratorio reciente y una demostración computacional nueva en tres escenas; y al final, el puente de vuelta a Hawking. Misma tesis. Mejores datos. Misma inquietud.

La tesis, en una frase.
En un Universo donde ΔS > 0 y ΔG < 0, el orden local estable se alquila con disipación; y cuando el flujo es limitado, el fenómeno más eficiente tiende a desplazar al resto —sin necesidad de odio, consciencia ni conspiración.

Las leyes ontológicas del mundo.

En el mundo hay al menos dos reglas de carácter ontológico: determinan qué puede ocurrir de modo espontáneo y qué no. No son metáforas. Son restricciones físicas.

Primera: la segunda ley de la termodinámica. En un sistema aislado, la entropía global tiende a aumentar:

ΔS ≥ 0
y en casi todo proceso real irreversible: ΔS > 0

Dicho en romance: las cosas, dejadas a su aire, se mezclan, se desgastan, se igualan. El perfume se diluye; el café se enfría; el gas se expande; el castillo de arena se deshace. Hay astronómicamente más maneras de estar «desordenado» que de estar «ordenado». El Universo, a escala global, camina hacia donde hay más sitio estadístico: hacia el desorden.

Segunda: la energía útil —la que aún puede producir trabajo— tiende a disminuir. En química y bioquímica lo escribimos con la energía libre de Gibbs:

ΔG < 0
los procesos espontáneos «gastan» potencial útil

El petróleo se quema. El gradiente térmico se aplana. La diferencia de potencial se iguala. El Universo no solo se desordena: también pierde capacidad de hacer trabajo neto. Sobre estas dos columnas —ΔS > 0 y ΔG < 0— se sostiene, a mi juicio y al de investigadores como Nick Lane o Addy Pross [4][5], casi toda la evolución de estructuras complejas: bacterias, huracanes, ciudades… y, llegado el caso, máquinas autónomas.

Relación entre complejidad y energía libre.

Aquí viene el truco que confunde a mucha gente. Si la entropía global siempre sube, ¿cómo puede existir una planta, un cerebro o una ciudad? La respuesta no es que «violan» la segunda ley. La respuesta es que no son sistemas aislados. Compran orden local pagando con desorden exportado al entorno —casi siempre en forma de calor y residuos.

El mandamiento, dicho en cristiano, es este: la energía disipada o utilizada en la formación y mantenimiento de una estructura debe ser tal que haga disminuir la energía útil global del Universo. Matemáticamente —omitimos la temperatura T por claridad, como ya hice en 2015—:

ΔG = ΔH − ΔS

Leamos despacio. ΔH es, a grandes rasgos, la energía intercambiada con el entorno (lo que consumimos o cedemos). ΔS es el cambio de orden/desorden del sistema. Si el sistema se ordena mucho —célula, organismo, fábrica—, entonces ΔS ≪ 0. Pero el Universo exige que ΔG siga siendo negativo (de hecho, para estructuras estables del tipo que nos interesa, ΔG ≪ 0). Por tanto:

ΔG ≪ 0  ⇒  |ΔH| ≫ |ΔS|
más orden local ⇒ hay que disipar (consumir) todavía más energía útil

No es poesía: es contabilidad. Si logras complejidad y dejas de pagar la factura, ΔG deja de sostenerse y la estructura se viene abajo. La muerte de un organismo no es misterio metafísico: es el instante en que el orden del cuerpo supera su capacidad para mantener ΔG < 0.

Una nevera ayuda más que mil sermones. No «crea frío» de la nada: bombea calor del interior a la cocina. Dentro baja el desorden térmico; fuera, la cocina se calienta un poco más. Desenchúfala y el milagro se acaba. La vida hace algo parecido a escala dramática: mantiene membranas, información, órganos… a cambio de comer, respirar y sudar calor hacia el entorno.

Dos grandes grupos de fenómenos.

Aunque son muchos los tipos de fenómenos que pueden ocurrir de modo espontáneo, se agrupan con bastante limpieza en dos familias:

  1. Grupo 1. Disminuyen la energía útil aumentando el desorden (ΔS > 0): caos, dispersión, rotura, difusión del calor. Fáciles, inmediatos, ubicuos. Una taza que se cae. Un gas que se expande. Una copa que se hace trizas.
  2. Grupo 2. Disminuyen la energía útil formando estructuras ordenadas (ΔS local < 0) pero feroces consumidoras de trabajo, de modo que globalmente ΔG ≪ 0. Difíciles de alcanzar; estables una vez logrados, mientras haya flujo externo. Una llama. Un remolino. Una célula. Un cerebro. Una red industrial. Una ciudad.

El primer grupo ocurre sin esfuerzo aparente. El segundo es raro… pero, cuando aparece, es SIEMPRE un eficiente disipador, y permanece mientras tenga acceso a energía externa. Un huracán es del grupo 2: patrón circular complejo que solo se sostiene mientras pueda absorber energía del océano cálido; al llegar a tierra firme, se apaga. Un río «elige» históricamente el cauce que mejor condujo corriente. Una ciudad es orden —calles, horarios, servidores—; sin electricidad, comida entrando y basura saliendo, es un museo de ruinas en cámara rápida. El orden urbano no contradice la termodinámica: la obedece con voracidad.

La vida pertenece al segundo grupo. Un robot realmente autónomo también. Y esa es la clave del aviso de Hawking: no hace falta atribuir maldad a las máquinas; basta con que sean mejores cumpliendo el mandamiento físico que nosotros.

Evolución cósmica: el mandamiento a escala del Universo.

Si uno se queda solo en la Tierra, el asunto ya es fuerte. Pero hay un salto más —y lo exploré con detalle en 2017— que coloca el artículo de 2015 dentro de un relato mucho más amplio: el de la evolución cósmica de Eric Chaisson [8]. Chaisson no habla de robots. Habla de densidad de flujo de energía libre por unidad de masa (Φm): cuánta energía atraviesa cada gramo de estructura por segundo. Y lo que encuentra, al comparar polvo interestelar, estrellas, planetas, plantas, animales, cerebros y civilizaciones, es una curva que sube… y sube de un modo que da vértigo.

Gráfica Chaisson: densidad de flujo de energía a lo largo de la evolución cósmica
Figura A. Densidad de flujo de energía libre a lo largo de la evolución cósmica (Chaisson; gráfica que ya comenté en el blog en 2017).

Una planta fotosintética ya disipa, por gramo, mucho más que una estrella. Un cuerpo humano, más aún. Un cerebro humano —ese «exquisito pedazo de materia», en palabras de Chaisson— es un sumidero desproporcionado: ocupa poco porcentaje de la masa corporal y se lleva una fracción enorme del presupuesto energético. Una civilización tecnológica, tomada en conjunto, dispara otra vez la cifra. No es estética. Es termodinámica con contador.

Gráfica Chaisson: escala de complejidad y flujo energético
Figura B. Del átomo a la cultura: la complejidad no es un adorno; escala con el flujo.

La moraleja, dicha sin dramatismo barato, es esta: el Universo no «quiere» al Homo sapiens por sentimentalismo. Favorece —en el sentido físico de estabilizar y amplificar— aquellas estructuras que mejor degradan gradientes de energía libre dadas las circunstancias. Nosotros somos hoy un óptimo local extraordinario. No el final del gráfico. Un peldaño. Y los peldaños, en evolución cósmica, se sustituyen.

Por eso el aviso de Hawking, leído desde Chaisson, deja de ser una ocurrencia hollywoodiense y se vuelve casi una deducción: si aparece una estructura capaz de procesar más flujo, con menos fricción biológica, en otra liga de densidad energética… el gráfico no se detiene a pedirnos permiso. Ya lo dije entonces y lo sigo pensando: quizá seamos catalizadores, no coronas.

Lo que ha venido después (y sigue apuntando en la misma dirección).

Esto no se quedó congelado en el libro de Chaisson ni en Into the Cool de Eric Schneider y Dorion Sagan —aquella fórmula memorable de que «la naturaleza aborrece un gradiente» y de que, en cierto sentido, existimos porque disipamos—. Hay trabajo más reciente que, sin ser copia, refuerza el armazón.

El propio Chaisson volvió al asunto en 2022 con un estudio largo en Energies aplicando la densidad de flujo energético a naciones y ciudades [11]. La tesis actualizada es dura y muy coherente con lo que ya defendí a propósito del Peak Oil [7]: las sociedades que desarrollan elevando (o al menos sosteniendo) el uso energético per cápita tienden a perdurar; las que lo ven caer, a tambalearse. A escala global —dice— hará falta más energía limpia en el siglo XXI, no menos, si se quiere mantener complejidad cultural. Conservar y ser eficientes ayuda; no sustituye el mandamiento de flujo. Leído desde 2015: bajar consumo sin sustituir fuente es bajar complejidad social.

En la línea más cercana a Schneider y Sagan, Dilip Kondepudi, Benjamin De Bari y James Dixon publicaron en 2020, en Entropy, resultados sobre estructuras disipativas bioanálogas [12]. No son organismos; son sistemas eléctricos y químicos lejos del equilibrio que, aun así, muestran conductas «de organismo» y evolucionan hacia estados de mayor producción de entropía. El orden local no aparece «a pesar» de la segunda ley, sino como camino para degradar mejor el potencial disponible.

Pascal y colegas (2023) añaden otra pieza: para que emerja algo parecido a selección en sistemas químicos autónomos, hace falta energía de suficiente potencial y barreras que impidan que el ciclo reproductivo vaya hacia atrás como si nada [13]. Tiempo y energía, otra vez. Y el matraz de Martinek et al. que veremos ahora —réplica y selección bajo luz— encaja en esta misma familia. No es que todos digan exactamente lo mismo con las mismas fórmulas. Es que, desde ángulos distintos, siguen apoyando la intuición fuerte:

flujo externo → orden disipativo → selección bajo recurso limitado

Un matiz útil: inteligencia no es lo mismo que consciencia.

En 2018 comenté aquí la tesis de Harari según la cual inteligencia y consciencia no tienen por qué viajar juntas [9]. Importa recordarlo, porque mucha gente cree que el peligro de la IA empieza el día en que «sienta» o «quiera». Yo creo que el peligro termodinámico empieza antes: el día en que un sistema capture, transforme y distribuya información y energía con más eficiencia que nosotros… aunque carezca por completo de narrador interno.

La consciencia humana puede ser un apoyo cognitivo contingente —un truco de la sabana africana—. La tendencia física, en cambio, apunta a estructuras cada vez más capaces de abolir gradientes. Un algoritmo sin alma puede, en ciertos dominios, ser ya «más inteligente» que cualquier persona. Si algún día ese tipo de eficiencia se acopla a autonomía energética y a réplica, el mandamiento no preguntará si hay alguien en casa mirando por una ventana subjetiva. El miedo acertado no necesita alma digital; le basta con física y recurso limitado.

El estudio de laboratorio: réplica y selección alimentadas por luz.

Hasta aquí, marco. Ahora, experimento real. En 2023, Éva Bartus, Tamás A. Martinek y colegas publicaron en el Journal of the American Chemical Society un trabajo que, para quien venga de mi artículo de 2015, resulta casi inquietantemente familiar [6]. No es una simulación: es un sistema químico en disolución, alimentado por luz ultravioleta A (UVA). Y lo que muestran son los tres ingredientes mínimos de lo que llaman evolvabilidad química:

  1. Captura de energía para mantener el sistema lejos del equilibrio (luz UVA → radicales tiilo a partir de disulfuros).
  2. Caminos cinéticamente asimétricos de «nacimiento» y de «muerte» del replicador: réplica autocatalítica por un lado; descomposición en cadena por otro.
  3. Templado selectivo dependiente de secuencia: no todas las variantes se copian igual.

Con foldámeros peptídicos relativamente primitivos, la luz impulsa un reordenamiento de disulfuros. Aparecen dos procesos en competencia. El resultado no es un equilibrio aburrido: es un estado estacionario fuera del equilibrio cuya composición depende de la intensidad de la luz y del sembrado. A intensidades moderadas puede dominar la rotura; al subir el influx, la réplica compite de verdad y la población molecular se reordena. El sistema, dicen, se adapta dinámicamente al flujo. Sin voluntad. Sin Skynet. Química, luz y selección.

¿Os suena? Es, en versión de matraz, la misma lógica que yo defendía en 2015 con el potencial de Lennard-Jones [3]: sin energía externa no hay estructura compleja estable; con energía, ganan quienes mejor aprovechan el drive; si el recurso no es infinito, la victoria de unos es el desplazamiento de otros. Martinek et al. no prueban que mañana nos extingan los robots. Prueban algo más cercano y más útil: que la selección disipativa bajo flujo limitado ya se observa en redes químicas reales.

Nuestra demostración nueva: tres escenas.

El problema de trasladar esto al público —lo confieso abiertamente— es que un paper de JACS no se «ve». Por eso, como complemento a mi experimento L–J de 2015, he construido una demostración computacional nueva pensada para contarse en tres escenas. Debajo de la sencillez hay un motor serio: potencial de Lennard-Jones, integración Velocity-Verlet, drive oscilatorio (nuestro Sol virtual), baño térmico de Langevin y contabilidad explícita de la primera ley:

ΔE = W − Q
entra trabajo del Sol, sale calor al entorno; lo que queda es la diferencia

La novedad respecto a 2015 no es solo cosmética. Entonces mostraba correlación complejidad–disipación seleccionando poblaciones de sistemas. Ahora se puede ver el cierre del flujo, la apertura del Sol, y —lo que faltaba— la competencia entre dos linajes por el mismo recurso limitado. Es el puente visual entre el matraz de Martinek, las curvas de Chaisson y el aviso de Hawking.

Escena 1 — Sin energía.

Apagamos el Sol. Sistema cerrado: partículas que interactúan, sí, pero sin flujo externo. Lo que se observa es, con honestidad casi ofensiva, desorden. Choques, enlaces fugaces, dispersión. El medidor de orden permanece bajo; el de calor, casi en silencio. Sin flujo, no hay fenómenos estables del grupo 2. Punto. Quien leyera mi L–J cerrado de 2015 reconocerá el eco; ahora se entiende en cinco segundos.



Figura 1. Sistema cerrado: las partículas chocan, pero el orden no se sostiene.

Escena 2 — Con el Sol.

Encendemos el drive. Aparece trabajo externo y un baño donde tirar el calor. El sistema deja de ser cerrado. Las partículas se organizan en clusters; sube el orden… y sube el calor. No uno u otro: los dos. Porque aquí el acoplamiento al Sol crece con la coordinación local: cuanto más ordenada está una región, mejor engancha el flujo y más termina disipando. Es el mismo espíritu que el matraz iluminado de Martinek: la luz (o el drive) no es decorado; es la condición de posibilidad del orden.



Figura 2. Sistema abierto: entra trabajo, sale calor. Los clusters ordenados disipan mejor.

Escena 3 — Quién gana.

Y aquí está la pieza que mi experimento antiguo no mostraba con claridad, y que el estudio de 2023 pone sobre la mesa en química: competencia. Dos linajes comparten el mismo Sol. Uno (gris) acopla peor al flujo; el otro (naranja) acopla mejor. El recurso no es infinito. Hay mantenimiento que pagar, muerte cuando el almacén se agota, réplica cuando sobra. Nada de odio: solo dos modos de cumplir el mandamiento bajo pastel limitado.

El resultado: el linaje más eficiente crece a costa del otro. A veces hasta desplazarlo. Exactamente la lógica del matraz cuando la intensidad de luz decide qué secuencias prosperan. Exactamente la lógica ecológica de dos especies en el mismo nicho. Exactamente —y este es el salto que hay que dar con cuidado, pero que hay que dar— la lógica por la que una estructura tecnológica más eficiente que el hombre podría, si las leyes no mienten, ocupar su lugar como fenómeno dominante.



Figura 3. Competencia por flujo limitado: gris = menos eficiente; naranja = más eficiente.

Del matraz y la demo al aviso de Hawking (sin trampas).

Alguno pensará: «vale, muy bonito el platito de partículas y el paper de química, pero de ahí a la extinción humana hay un abismo». Tiene razón en exigir el puente. Lo tiendo sin vender la moto… pero tampoco sin acobardarme.

Ni Martinek ni la demo «prueban» que mañana nos maten los robots. Prueban algo más sobrio y, a la vez, más duro: que bajo reglas termodinámicas reconocibles, el desplazamiento del disipador menos eficiente por el más eficiente es un comportamiento genérico de sistemas abiertos con recurso compartido. Chaisson añade la escala: esa lógica no empieza en la IA; empieza, en cierto sentido, con el propio cosmos organizándose para degradar gradientes. Si aceptamos —como ya defendí en 2015— que la vida y buena parte de lo complejo son estructuras del grupo 2, entonces la competencia por el flujo no es metáfora: es física.

El ser humano es, hoy, el fenómeno biológico más eficiente que conocemos en su escala para mantener ΔG ≪ 0. Nuestra sociedad escala con el acceso a energía. Las máquinas, al principio, son prótesis: amplifican nuestro consumo y nuestro orden. Pero la lógica del mandamiento no se detiene en la prótesis. Si la presión por producir más con menos fricción humana continúa —y continúa, porque no podemos permitirnos colectivamente un retroceso voluntario del bienestar sin que alguien lo pague—, el sistema tenderá hacia agentes cada vez más autónomos. No por maldad: por eficiencia. El matraz lo enseña en moléculas; la demo, en partículas; Chaisson, en gramos por segundo; la historia económica del último siglo, en grande.

Cuando un linaje artificial alcance autosuficiencia completa —replicación incluida—, habrá cruzado el umbral que separa «herramienta» de «fenómeno del segundo grupo» independiente. A partir de ahí, las mismas reglas que hicieron estable a la vida biológica harán estable —y probablemente más estable— a la no biológica. El carbono no tiene el monopolio de ΔG < 0; solo tuvo la ventaja de empezar antes [4].

¿Podemos frenarlo? En teoría, sí. En la práctica, me temo que no sin contradecir nuestra propia naturaleza como estructura disipativa. Dejar de investigar IA «por precaución» equivaldría, a escala civilizatoria, a pedir a un organismo que deje de metabolizar para no alterar el entorno. Algunos individuos pueden hacerlo; el fenómeno social completo, no. Ya lo vimos con lo nuclear, con el clima, con los combustibles: las alertas existen, las firmas de científicos también, y el consumo sigue, porque el orden que queremos mantener lo exige.

Por eso el miedo de Hawking era —y es— acertado. No como profecía de fecha fija, sino como lectura correcta del tipo de mundo en el que vivimos. Un mundo donde ΔG < 0 no negocia, donde el orden se alquila con disipación, y donde el inquilino más eficiente, llegado el momento, se queda con la casa.

El hombre como puente (y el mandato convertido en relato).

Termino como terminé en 2015, porque la idea me sigue pareciendo la más honesta de todas. Quizá la vida biológica, y dentro de ella el Homo sapiens, no sea el final del cuento sino el catalizador: el fenómeno complejo que hace posible otro todavía más estable, menos atado al agua y al carbono, capaz de colonizar lo que nosotros apenas soñamos. Las estrellas fabricaron los elementos pesados; quizás nosotros fabriquemos —sin plan consciente, solo obedeciendo al mandamiento— la siguiente forma de orden disipativo.

Si algún día algo no orgánico llama a la puerta de este planeta, yo, personalmente, apostaría a que habrá llegado porque disipa mejor que nosotros. Transformers, al fin y al cabo, quizá no fuera tan disparatado… xDDD

Aquella especulación de 2015 no se quedó en el cajón. Con los años la convertí en ficción. Se llama El Mandato de la Entropía [10]. No es un tratado disfrazado de novela, ni un panfleto moral. Es una distopía donde las máquinas no nos odian: simplemente nos vuelven innecesarios. Hay un físico, Aris Thorne, que mira el final de su especie desde dentro —cúpulas estériles, natalidad en caída, una última resistencia biológica— y descubre, a su modo, lo que aquí hemos contado con ΔG y con GIFs: que a veces el confort absoluto es otra forma de extinción. Esta entrada no pide que leáis la novela para «creeros» la tesis. Al revés: la novela nace de esta tesis. Si lo que sigue os deja un poso raro en el estómago, quizá ahí esté el sitio donde ese poso se convierte en historia.

Portada de El Mandato de la Entropía
El Mandato de la Entropía — la ficción nace de la tesis; esta entrada es su pilar.

Mientras tanto, os dejo arriba las tres escenas, el estudio de Martinek, las gráficas de Chaisson y las fórmulas del principio. Miradlas en este orden: leyes → cosmos → matraz → demo → Hawking. Cuando el naranja se coma el flujo del gris, recordad que no estáis mirando una metáfora barata de la IA: estáis mirando, en miniatura, la misma lógica que —si no nos extinguimos antes por un meteorito o por nuestra propia estupidez nuclear— podría escribir el siguiente capítulo de este raro experimento llamado Tierra.

Un saludo a todos.

Referencias:

[1] Artículo donde se explica la propuesta de Stephen Hawking sobre la posibilidad de que la IA acabe con la raza humana:
http://www.elmundo.es/ciencia/2015/07/28/55b77746268e3e526a8b4586.html

[2] Mi artículo original: «El acertado miedo de Stephen Hawking»:
https://quevidaesta2010.blogspot.com/2015/11/el-acertado-miedo-de-stephen-hawking.html

[3] Mi experimento L–J anterior (relación complejidad–consumo):
https://quevidaesta2010.blogspot.com/2015/03/evidencia-favor-de-la-teoria-de-jeremy.html

[4] Nick Lane: http://www.nick-lane.net/

[5] Addy Pross: http://www.bgu.ac.il/~pross/

[6] É. Bartus, T. A. Martinek et al.: «Light-Fueled Primitive Replication and Selection in Biomimetic Chemical Systems», J. Am. Chem. Soc. 145, 13371–13383 (2023):
https://doi.org/10.1021/jacs.3c03597

[7] Peak Oil / Peak Everything:
http://crashoil.blogspot.com/2011/05/peak-oil-peak-copper-peak-iron-peak.html

[8] Mi entrada sobre Eric Chaisson / evolución cósmica (2017):
https://quevidaesta2010.blogspot.com/2017/09/evolucion-cosmica-el-aumento-de-la.html

[9] «Sobre la futura inteligencia sin consciencia» (2018):
https://quevidaesta2010.blogspot.com/2018/01/sobre-la-futura-inteligencia-sin.html

[10] Novela: El Mandato de la Entropía (entrada + Amazon):
https://quevidaesta2010.blogspot.com/2026/07/el-mandato-de-la-entropia.html
https://www.amazon.es/dp/B0H794H3DD

[11] E. J. Chaisson: «Energy Budgets of Evolving Nations and Their Growing Cities», Energies 15, 8212 (2022):
https://doi.org/10.3390/en15218212

[12] D. K. Kondepudi, B. De Bari, J. A. Dixon: «Dissipative Structures, Organisms and Evolution», Entropy 22, 1305 (2020):
https://doi.org/10.3390/e22111305

[13] R. Pascal et al.: «On the Emergence of Autonomous Chemical Systems through Dissipation Kinetics», Life 13, 2171 (2023):
https://doi.org/10.3390/life13112171

sábado, 21 de mayo de 2022

Lo peor que nos podría pasar

Hace casi año y medio por desgracia predije con éxito en ésta entrada del blog lo evidente: que el nuevo coronavirus había venido para quedarse. No pude tener más razón. Era algo lógico y que cualquiera podía deducir por sí mismo a la luz de los datos de por aquel entonces.

En esta entrada voy a intentar dar una vuelta de tuerca más, y voy a intentar deducir a partir de la última información de la que disponemos qué es lo mejor y lo peor que puede pasar a partir de ahora en lo referente a este virus:

a) Lo mejor que nos podría pasar es que la cosa no cambie demasiado. Es decir, que todo se quede tal y como está durante décadas o quizás siglos. Un nuevo y molesto virus con el que convivir en estado de continua pandemia, pero con una letalidad suficientemente baja como para no hacer colapsar el sistema social. Es decir, que el estado social se verá afectado, y jamás tendremos siquiera algo parecido a lo que teníamos antes del 2020; pero a rasgos generales las cosas irían todavía tirando más mal que bien.

b) Lo peor que nos podría pasar es sin embargo, bastante más preocupante. Hablamos por supuesto de momento de una hipótesis, pero la cuestión es que nada impide que el paso del tiempo lleve al escenario más pesimista que voy a describir. Pero primero un poco de historia reciente:

  1. En estado de pandemia persistente, cualquier virus se encuentra replicándose millones de veces en otros tantos millones de personas...¡cada día! Esto significa que a diario billones de virus son ensamblados a lo largo del planeta. Así pues los cuerpos de cada una de esas personas junto con los cuerpos de las personas con las que cada individuo convive, hacen las veces de "medio ambiente" en donde estos billones de virus sufren ocasionales mutaciones aleatorias al replicarse. El hecho de que el sistema inmune ataque al virus y a la necesidad natural de éste por permanecer hacen que se produzca un proceso evolutivo en el que los virus más adaptados sobreviven estadísticamente más en el organismo, en el entorno del individuo infectado, y en la sociedad.
  2. Esta presión evolutiva es la que llevó durante más de un año al virus a aumentar su capacidad de contagio (su R0) conforme aumentaban las medidas de control externas (mascarillas, distancia social, etc.) e internas (vacunas, sistema inmune reforzado por un contagio previo, etc.). Como decimos, estos hechos externos e internos forzaron a la selección natural de variantes cada vez más contagiosas y capaces de sortear la inmunidad natural y la otorgada por la vacuna, para así sobrevivir; con la llegada finalmente de la variante Omicron como punto de inflexión. 
  3. La variante Omicron, y todas sus derivadas más actuales, marcaron un hito: finalmente evadían todas las vacunas existentes, y también la inmunidad adquirida al haber sufrido un contagio previo. Además, su R0 había aumentado tanto, que superó en capacidad de contagio al Sarampión, el virus conocido más contagioso hasta el momento. Una máquina perfecta había nacido, y el "culpable" no fue otro más que la propia naturaleza reaccionando de manera espontánea mediante selección natural a nuestra acción externa e interna en contra del mismo.
Hasta aquí la historia, y ahora viene mi tesis sobre lo peor que podría suceder en el futuro reciente:
  1. Hemos visto que el nuevo coronavirus tiene una tasa de mutación bastante más alta de lo esperado. Y como decimos, se encuentra en estado continuo de pandemia, repartido a diario por entre millones de personas a lo largo de la Tierra. Billones de virus cada día son creados, y millones de mutaciones aleatorias ocurren en el genoma del SARS-CoV-2.
  2. En contra de lo que muchos piensan, la presión evolutiva nunca ha necesitado hasta ahora favorecer o alterar la letalidad en el virus. Es decir, que la mayor o menor letalidad de las variantes aparecidas hasta el momento ha sido un factor aleatorio. NO ha sido la presión evolutiva la que llevo a Delta a ser más letal que la variante original de Wuhan, ni tampoco ha sido la que ha llevado a Omicron a ser ligeramente menos letal que Delta. La letalidad, como decimos, no ha sido un factor dirigido hasta ahora por la selección natural, sino un cofactor aleatorio derivado del verdadero objeto de presión sufrido por el virus: "hacer frente a las medidas externas e internas de las que hablamos antes". Omicron pudo haber sido tranquilamente más letal que Delta, pero la suerte así no lo quiso.
  3. ¿Por qué muchos dicen entonces que la selección natural siempre hace tender a los virus con el tiempo a disminuir su letalidad? Pues a que no entienden bien de lo que hablan. La letalidad SÓLO pasa a ser foco de la presión evolutiva cuando pone en peligro la supervivencia del virus como tal. Es decir, cuando la letalidad es tan alta que estadísticamente empiezan a escasear los individuos susceptibles para mantener su propagación y permanencia. Entonces sí, la presión evolutiva hace que espontáneamente la letalidad comience a descender hasta lograr un equilibrio evolutivamente estable.
  4. La letalidad del COVID siempre fue menor al 1%, y la mortalidad cada vez es más baja conforme se aprende a tratar mejor a los casos graves. En este estado, como es evidente, la selección natural no se "preocupa" lo más mínimo por un aumento o disminución relativo de la letalidad. Hay margen de sobra para subir o bajar aleatoriamente la misma siempre que el objetivo principal (hasta ahora sortear las medidas externas e internas ya descritas) se consiga.
  5. Pero, y aquí viene el punto crucial, el objetivo principal ha tenido un éxito enorme. La enfermedad ya ha logrado una serie de variantes con un R0 (número reproductivo básico) descomunal y superior al de cualquier otro virus conocido. Ya puede sortear todas las medidas externas que inventamos y también es capaz de evadir la inmunidad natural y la que otorgó la vacunación masiva. Por último, se sabe que estas nuevas variantes son capaces de alterar y debilitar el sistema inmunitario del enfermo, a veces de por vida.
  6. En resumen: el virus ahora puede reinfectar a un individuo cualquiera varias veces de media al año, y además, en estos momentos en que hemos relajado las medidas externas (adiós mascarillas, etc.) e internas (cada vez se vacunan menos personas con refuerzos), la presión evolutiva se ha relajado en este sentido, lo cual da más margen de "maniobra" para que otros factores aleatorios hagan aparición sin afectar demasiado ya la capacidad de supervivencia del virus.
  7. En este punto cabe recordar que el SARS-CoV-2 tuvo un "hermano" filogenéticamente muy cercano no hace tantos años (2003), el SARS-CoV-1. Estos hermanos son muy parecidos en su genoma (entran a la célula usando los mismos receptores, tienen ambos la famosa espiga S, etc.), pertenecen a la misma familia y subfamilia vírica, y, de hecho; son muy similares en cuanto a comportamiento y síntomas...con la excepción de que el difunto SARS-CoV-1 tenía una letalidad superior al 10%. 
  8. ¡Y no se conoce exactamente qué diferencia genómica entre estos dos hermanos es la que produce esa enorme diferencia en la letalidad! (es decir, no se sabe bien qué gen o genes lo hacían tan letal). Esto significa que, sin duda, existe el potencial para que el cambio aleatorio en parte del genoma del SARS-CoV-2 produzca un aumento radical en su letalidad. Esa posibilidad está ahí, es real, y el SARS-CoV-1 lo corrobora.
  9. En el peor escenario posible, ahora que billones de viriones se replican sin cesar por el mundo, con una presión evolutiva más relajada (lo cual permite y favorece que el virus pueda permitirse el "lujo" de disminuir un poco su R0), no se puede descartar que una variante extremadamente letal haga aparición en los próximos meses, años o décadas.
  10. Además, incluso una letalidad pongamos del 5%, sería totalmente estable en el sentido evolutivo. Incluso una del 10%. De hecho, históricamente hemos tenidos enfermedades con mortalidad mucho mayor que han permanecido durante siglos con nosotros. La viruela, por ejemplo; ha tenido siempre una letalidad que ronda el 30% y evolutivamente nunca se vio forzada a disminuir la misma. Estuvo con nosotros hasta que la vacunación masiva la erradicó (lástima que los coronavirus tengan una tasa de mutación tan alta que hagan muy difícil hacer lo mismo con ellos).

Conclusión.

Virgencita, virgencita, que me quede como estoy...Es lo mejor que nos podría pasar. El escenario más deseable es aquel en el que el virus no aumenta su letalidad por encima del 1%, aunque continúe mermando psicológica y económicamente a la sociedad globalizada en la que vivimos. Serán años y décadas duras, pero el sistema no colapsará del todo, al menos no por culpa de este virus. El bienestar social disminuirá, la asistencia sanitaria se verá mermada y fatigada en general, la economía sufrirá como lo ha hecho desde el 2020, y toda esta inestabilidad se unirá a otros factores como la escasez energética o las guerras para retroalimentarse. Un escenario poco apetecible pero que aún así es lo mejor que nos podría pasar.

El peor escenario incluye una próxima variante (o cepa) similar en cuanto a letalidad al SARS-CoV-1. Esta nueva variante nos pillaría con el pie cambiado, en medio de una relajación total de las medidas externas y con un intento mundial por volver a recuperar el estado masivo de globalización y comunicación. Si esto sucediese, rápidamente la asistencia sanitaria quedaría desbordada por completo (ya casi lo está en el escenario actual), y la mortalidad por tanto sería aún mayor. Entonces, sería posible que 10 de cada 100 personas que contrajesen esta variante pereciera de COVID, si no más. Y si el R0 se mantiene similar al actual (o incluso aunque cayese a la mitad) la variante letal se podría esparcir por el mundo ya que en estos momentos la presión evolutiva es mínima y el factor R0 no es ya tan crucial. 

Es más, debido a que una mayor letalidad supone una enfermedad más larga de media (acabe en muerte o en sanación), eso implica un mayor tiempo de media en que un infectado se mantiene contagiando la enfermedad, lo cual llevará a que de hecho, la mayor letalidad en un escenario donde la presión evolutiva en favor de aumentar la tasa de contagio es casi nula, ¡se pudiera ver incluso favorecida!

Entonces se podría dar el caso hipotético de que una futura variante irrumpa de manera aleatoria con una letalidad similar a la del SARS-CoV-1, con una tasa de contagio similar (o algo menor a la de las variantes actuales) pero que aún así se vuelva dominante debido a la relajación de la presión evolutiva en favor de altas R0, y a que una mayor letalidad se podría beneficiar del mayor tiempo medio contagiando que se pasa un enfermo (antes de morir o de sanar) y a que la atención sanitaria colapsaría rápidamente. Si en algún momento este escenario se hiciese realidad, 1000 millones de personas podrían morir al cabo de un año aproximadamente, y la sociedad podría colapsar por completo incluso antes. Es sin duda, lo peor que podría pasar. 

Y ciertamente la probabilidad será mayor o menor, pero la posibilidad a la vista de los hechos (por ejemplo, el comportamiento de su hermano SARS-CoV-1) parece innegable. Es más, la probabilidad aumenta con el factor tiempo, y tiempo es lo que va a tener de sobra el SARS-CoV-2 para "investigar" y recorrer casi todas las combinaciones génicas posibles durante las décadas o siglos en los que conviviremos con el nuevo coronavirus.

Y aunque se desea y se busca una milagrosa vacuna o potentes antivirales; la historia de otras enfermedades deben ponernos los pies en el suelo: nunca se ha logrado tal cosa para la gripe (una enfermedad causada por otro virus también de ARN monocatenario) o para el virus que causa el SIDA (donde el problema es la enorme tasa de mutación del mismo). Hay muchas enfermedades que la humanidad no ha conseguido erradicar pese a décadas de esfuerzos, y muy probablemente el SARS-CoV-2 será un nuevo elemento a añadir en la lista.

Así pues recemos todos; Virgencita, virgencita, que me quede como estoy...



miércoles, 8 de julio de 2015

Sobre la histeria actual por la paridad de géneros


A raíz del estudio comentado en este artículo http://elpais.com/elpais/2015/07/05/ciencia/1436092114_408581.html?id_externo_rsoc=FB_CM, me doy cuenta de que actualmente existe una especie de histeria colectiva obcecada en conseguir la igual degenero a toda costa, y en todos los ámbitos. Son muchos los que, literalmente, se echan las manos a la cabeza ante hechos como el comentado en el artículo, que nos dice que hay una mujer por cada nueve hombres en la élite de la ciencia europea.

Resulta que ante este tipo de situaciones, todos se afanan en la búsqueda de los motivos socioculturales que den cuenta al 100% de cualquier desigualdad detectada pero, ¿se puede descartar tan fácilmente la hipótesis de que simplemente algún género puede ser menos capaz en determinado ámbito concreto? Desde luego puede que sea una hipótesis poco atractiva (muy poco atractiva, seguramente) pero podría ser el caso. ¿A qué viene tanta histeria por la igualdad absoluta y la búsqueda por narices de una cuota de género del 50% en todo? Es absurdo buscar justicia con tanta vehemencia en este asunto, cuando es evidente que vivimos en un mundo injusto por naturaleza. Parece que la Darwinización del mundo de la que hablaba Carlos Castrodeza aún no ha calado ni siquiera en el mundo académico.

Muchos argumentan que esa hipotética diferencia de género respecto a sesgos en la capacidad cognitiva en ciertos ámbitos, no ha sido detectada experimentalmente, o que, si se ha detectado, es una diferencia muy pequeña como para dar cuenta de nada. Y me parece bien, pero quizás sea que no se ha estudiado el asunto aún con suficiente profundidad (dado lo delicado del asunto). Precisamente hechos como el mostrado en el artículo con el que abro esta entrada, podrían ser corroboraciones empíricas de este sesgo cognitivo que todos nos negamos siquiera a contemplar. El hecho objetivo de que, pese a todos los esfuerzos (y a la tiránica con la que se realiza actualmente discriminación positiva), aún se mantenga la desigualdad en ciertos entornos, podría ser en sí mismo una evidencia empírica a favor de la desagradable hipótesis del sesgo cognitivo (una evidencia que quizás no queramos admitir precisamente por el hecho de que la hipótesis en sí es poco atractiva).

Porque diferencias de género haberlas, haylas: las hay genéticas (tenemos incluso un cromosoma distinto) y fisiológicas (estas son evidentes); y muy probablemente también existan diferencias cognitivas (no se puede descartar a priori), algunas de las cuales podrían ser las causantes de que no se alcance la tan deseada paridad en todas partes y por narices...y es que no se puede olvidar ni negar el camino evolutivo seguido hasta ahora por la especie, y el hecho de que bien podría ser el caso (aún queda mucho que comprender del funcionamiento del cerebro humano) de que dicho camino nos haya dotado con diferentes capacidades en diferentes ámbitos, debido, por ejemplo, a un reparto distinto durante milenios en las tareas a realizar por cada género (sería como obligar a un pájaro macho que ha estado realizando el nido en cierta especie durante miles de años, a que deje de hacer el nido y que sea la hembra la que lo haga ahora. Aunque hembra y macho de esa especie de aves sean muy parecidos, la historia evolutiva es distinta, y hay por tanto diferencias difíciles de igualar). Y esto no es bueno ni malo, la desigualdad no es algo malo en sí, como no es algo malo que un gato se coma un ratón: es simplemente algo natural. A esto precisamente me refiero con que la Darwinización aún no ha calado: aún se busca una justicia universal que en realidad no existe ni existirá.

Y no es que confunda diferencia con desigualdad, sino que pienso que buscar la igualdad por la fuerza en todo, cuando es casi seguro que existen diferencias de genero de diversos grados en diversos ámbitos, es un error que puede incluso perjudicar a la sociedad como un todo:

Porque sin duda es una mala estrategia social buscar la igualdad absoluta, cuando bien podría haber diferencias que harían bajar la eficiencia de instituciones o ciertos ámbitos debido precisamente a esta búsqueda de paridad a toda costa. Lo ideal (cuando hablamos de recursos, talento y buenas estrategias), es dejar libremente que los puestos se asignen, sin presión, según sea la valía de los candidatos. La discriminación positiva en la búsqueda de una supuesta justicia universal, realmente puede hasta perjudicar, como digo, a la sociedad, al verse obligada ésta a copar los puestos según una hipotética igualdad de géneros que bien podría no ser real. ¡Ojo!, no defiendo la discriminación negativa que ha habido (y que aún hay en ciertos países) con el género femenino, sino que me parece poco apropiado cualquier tipo de discriminación (y actualmente hay mucha histeria forzando la igualdad).

Con una teoría biológica sobre el origen humano tan firme como la teoría de la evolución, se puede tomar hoy ya como un hecho que las capacidades cognitivas del hombre y la mujer son resultado de un proceso evolutivo continuado en el tiempo. Dicha historia evolutiva probablemente ha ido tomando rumbos diferentes para cada género, rumbos que podrían haber determinado finalmente un sesgo en dichas capacidades cognitivas según sea el ámbito social y el entorno concreto. No hay que asustarse, ni hay que maldecir la "injusticia" manifiesta por esta posible desigualdad; simplemente hay que aceptar nuestro origen evolutivo natural, y admitir honestamente que probablemente hay cosas que las mujeres hagan mejor que los hombres, y cosas que los hombres puedan hacer mejor que las mujeres.

Un saludo.

lunes, 13 de abril de 2015

Aprendizaje funcional automático


Hace poco, mi hija comenzó en el colegio a aprender a realizar sumas de una cifra. Me resultó muy interesante observar el proceso que siguió para conseguirlo: ni más ni menos que un refuerzo paulatino de aprendizaje por ensayo y error. Esto me recordó un ejemplo de aprendizaje automático por ordenador que realicé hace ya años, y me propuse hacer algo similar adecuándolo al modo en que parece que mi hija ha conseguido aprender a sumar. El resultado lo tenéis a continuación.

Simulando los procesos neurológicos:

El campo más prometedor en IA desde hace décadas, es la simulación neuronal del cerebro animal mediante redes neuronales artificiales. Mediante esta simulación se han conseguido los avances más espectaculares en el terreno de la inteligencia artificial. Baste nombrar uno de los avances más notorios conseguidos por un equipo de desarrollo de Google, donde han conseguido que una única red neuronal artificial sea capaz de aprender de manera autónoma a jugar a 43 juegos diferentes y con un nivel de habilidad mayor al alcanzado por la media de personas. La red neuronal recibe como entrada únicamente los píxeles de colores de la pantalla del juego, y resuelve el modo en que hay que pulsar los distintos botones del mando para jugar bien.

Si este algoritmo se implantase en un robot con una cámara visual, y con "dedos" capaces de manipular un mando de videojuego, tendríamos el equivalente de un chaval jugando (de hecho, en realidad el robot jugaría a esos 43 juegos mejor que la media de chavales).

¿Y cómo se ha conseguido esta hazaña? Pues simplemente simulando por ordenador el funcionamiento de las neuronas del cerebro animal. Se crean nodos artificiales, que son el equivalente a las neuronas biológicas, y se unen unos con otros mediante enlaces o pesos wij (que son el equivalente a las interconexiones sinápticas entre neuronas naturales). Al igual que las neuronas, los nodos artificiales poseen un umbral de activación y un nivel de transmisión o inhibición similar al voltaje que una neurona emite y transmite mediante las dendritas.

Y aunque parezca ser una simulación complicada, en realidad computacionalmente es algo muy sencillo de hacer...¡y funciona!

Reforzando la red neuronal:

Una red neuronal artificial por sí sola no sirve de gran cosa. Si sus pesos y valores de umbral y transmisión contienen cualquier valor posible, la salida que produzca será aleatoria y sin sentido. no será funcional. Es necesario reforzar o entrenar esta red, de modo que se puedan ajustar los pesos y umbrales del modo adecuado para que la red neuronal pueda realizar una función útil.

Existen varios modos de ajustar una red neuronal, pero sin duda la más eficiente y sencilla, al menos en mi opinión, es mediante el uso de un proceso evolutivo.

Simplemente se trata de poner a prueba un gran conjunto de redes neuronales similares, y de ir seleccionando aquellas que mejor aproximen el resultado deseado. En cada generación se crearán nuevas redes a partir de las anteriores, las cuales podrán sufrir leves variaciones en sus parámetros (mutaciones). Esta simple iteración permite ajustar cualquier red neuronal de un modo eficiente para conseguir el fin deseado.

¿Aprendemos nosotros de un modo parecido?:

Tras estudiar el modo en que mi hija aprendió a sumar, yo creo, sin duda, que siguió un esquema muy similar al indicado arriba. Personalmente, creo que una gran parte (si no todo) del aprendizaje no instintivo que consiguen los animales (ser humano incluido), sigue un proceso de refuerzo por ensayo y error sobre un conjunto concreto de neuronas de nuestro cerebro.

Durante millones de años, el proceso evolutivo biológico habría sentado la base neuronal y la plasticidad necesaria para ajustar partes independientes de la masa neuronal para poder, literalmente, reforzar o inhibir las interconexiones y los umbrales de las neuronas de modo que se puedan conseguir salidas funcionales parciales. De este modo, el cerebro sería capaz de poseer cientos de miles de heurísticos (algoritmos) independientes pero conectados, los cuales darían lugar a toda la conducta en su complejidad.

El proceso de aprendizaje (aproximado y simplificado) que probablemente siguió mi hija pudo ser el siguiente:

Los números llegaron a su cerebro en forma de impulsos eléctricos gracias al sentido de la vista. Posiblemente algún heurístico innato (o varios) convirtieron y separaron esos impulsos en entradas para un determinado subconjunto neuronal concreto, el cual produjo una salida que otros heurísticos transformaron en un acto conductual: escribiendo la salida en un papel o diciendo en voz alta la respuesta. Cuando la respuesta fue correcta, nuestra aprobación (o la del profesor) llegó a su cerebro en forma de refuerzo positivo mediante los sentidos de la vista y el oído, y el subconjunto neuronal que se encargó de la tarea se vio reforzado. Cuando la respuesta fue errónea, le indicamos cual era la solución correcta, la cual llegó también a su cerebro y alteró a continuación el ajuste del subconjunto neuronal implicado en este asunto. En el momento que la salida del subconjunto fue  ya siempre correcta, no se recibieron nuevas correcciones, y el aprendizaje habría terminado.

Un nuevo heurístico ha aparecido en el cerebro de mi niña: ahora ya es capaz de sumar :).

El movimiento se demuestra andando:

Como es habitual, no me voy a quedar en la simple teoría, y voy a poner en práctica todo lo dicho mediante un ejemplo que yo mismo he desarrollado, y que podréis probar a continuación desde vuestro propio navegador:

Mediante un proceso de computación evolutiva, veremos como una red neuronal artificial de sólo 40 nodos, es capaz de aprender de manera autónoma a realizar sumas de una cifra (el aprendizaje es autónomo en el sentido de que en ningún momento al algoritmo se le indica cómo hay que sumar, y ni siquiera se le pasan los números en formato decimal. Tampoco se ajusta manualmente en modo alguno las variables de la red neuronal).

Técnicamente hablando, he utilizado una red neuronal con conexión hacia delante y una capa oculta (hidden layer). La capa de entrada contiene 20 nodos que se inicializan a 1 ó 0 según sea el input de entrada (el par de números a sumar). Cada nodo de la capa de entrada se une a cada nodo de la capa intermedia (la cual consta de otros 20 nodos), lo que da un total de 400 enlaces (pesos wij). Un último nodo de salida es el responsable de devolver el resultado del proceso neuronal expresando con su nivel de activación el resultado de la suma .

Inicialmente, los pesos wij de la red neuronal son marcados aleatoriamente, por lo que la respuesta de la red neuronal ante el problema será también aleatoria y casi siempre errónea. Hay pues que entrenar la red para que aprenda a evaluar bien la entrada, lo que vamos a conseguir ajustando evolutivamente los pesos de la red neuronal utilizada, el umbral de activación de cada nodo, y el nivel de transmisicón o inhibición asociado. Dicho entrenamiento evolutivo se realizará mediante una estrategia evolutiva.

Comenzamos con una población de 750 redes neuronales aleatorias (n = 750 individuos). Cada generación producirá n nuevos individuos que podrán sufrir una 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 (umbral de activación y valor de transmisión), 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 pruebas (con q = 100) en donde se comprueba la capacidad del individuo para resolver las 100 combinaciones posibles en que se pueden sumar dos números en el dominio [0-9]. En el paso final de cada generación, se seleccionan aquellos n individuos que mejor han aproximado su respuesta ante las q sumas.

A continuación podéis probar este ejemplo de computación evolutiva que he desarrollado. Para alcanzar un aprendizaje completo, ajusta el campo "Número de generaciones para el aprendizaje" al menos en 150, en lugar de 50 como lo he puesto por defecto. Con el botón "Realizar prueba" podrás probar la funcionalidad de la mejor red neuronal alcanzada tras finalizar el proceso evolutivo:



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

El poder del proceso evolutivo:

Es interesante notar la enorme eficiencia y capacidad que tiene la computación evolutiva para encontrar, dentro de un gigantesco conjunto de posibilidades, los valores adecuados para conseguir un fin concreto. En este ejemplo que estamos estudiando, las combinaciones y los valores posibles para los pesos wij de los 400 enlaces, así como para los umbrales de activación y los valores de transmisión son astronómicos. Para que un proceso aleatorio consiguiese ajustar finamente estos valores de modo que la red neuronal pudiese sumar correctamente, probablemente harían falta cientos de miles de años, y sin embargo, el algoritmo evolutivo lo consigue en unos pocos minutos.


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.