Archivo de la categoría: matemática

Pi day España: Celebración a lo grande

 

 

logoCorría el año 1988 y en un mueso de ciencia cualquiera, el San Francisco Exploratorium, un físico de nombre Larry Shaw se propuso honrar al número PI y eligió la fecha del 14 de Marzo.  El 14 del 3… Todo cobra sentido cuando nos damos cuenta de que en el mundo anglosajón esa fecha se escribe 3-14.

Larry Shaw

Larry Shaw

En el año 2009 una directriz de la casa de Representantes de Estados Unidos proclamó el 14 de marzo como el día nacional de PI.

Por supuesto, la cosa no se quedó en Estados Unidos, la idea de celebrar el día de PI y dedicar un día a este número, a sus maravillas y a la matemática en general era demasiado buena como para no ser aprovechada.

En estas… Allá por el año 2016,  para las celebraciones del día de PI en Francia, con sede en Marsella, nuestra Clara Grima fue invitada a la celebración y participó como conferenciante.

Y volvió enamorada de la idea…

Así que, Clara, empezó a soñar con la idea de tener un día de PI en España donde se celebrara el acontecimiento como es debido procurando la participación especial de pequeñas y pequeños, chicas y chicos de secundaria y bachillerato y de sus profes.

Así es como ha nacido el proyecto Piday.es que este año tiene por mensaje:

“Si pi no soy nada”

pidaysp-banner

Y está lleno de actividades en las que puedes participar, tus estudiantes o tus profes. No te cortes y haz algo bonito sobre ese número hermoso que es PI.  Sigue leyendo y verás de cuántas formas puedes participar.

Sigue leyendo

Anuncios

¿Comprobar o resolver? Esa es la cuestión. ¿P=NP?

Esta entrada ha sido escrita en colaboración con Alberto Márquez @twalmar, sin cuya ayuda no podría haber afrontado tan titánica tarea.  ¿De qué va esta entrada?  Teniendo en cuenta que el título es bastante explícito tan solo diremos que está en nuestro ánimo aclarar de la forma más exquisita posible el problema P/NP.  Somos conscientes de que se han escrito miles de palabras sobre el tema a nivel de divulgación y popularización.  Desgraciadamente, también somos conscientes de que un alto porcentaje de las mismas son mamarrachadas de un considerable calibre.  Esperamos con anhelo no formar parte de ese excelso conjunto con esta, nuestra pequeña contribución.

Esta entrada se complementa con el programa 29,  de @Los3_Chanchitos (específicamente la tercera sección conducida por Alberto), por si eres aficionado al tema podcast:

#3chanchitos29

Y con este vídeo por si le das más al tema YouTube (también de Alberto):

El problema que pretendemos desgranar es bello, es hermoso, es complicado y es esencial para la matemática y para la física. Su solución en un sentido u otro, y aclararemos eso en esta entrada, supondrá una demostración de que hemos entendido algo del universo o bien que no habíamos entendido nada pero que será fácil empezar a entenderlo todo. (Estamos siendo crípticos en pleno uso de nuestras facultades mentales).  Vamos a establecer qué es eso del problema P/NP.

Si cuando hayas leído esto te encanta el tema y quieres agradecerlo estaría genial que pulsaras el botón que tienes abajo y votaras a los tres chanchitos (dirección: 3chanchitos.es) para el mejor podcast en el premio Bitácoras de este año:

Votar en los Premios Bitacoras.com

Vamos al lío… Nunca mejor dicho.

Sigue leyendo

Esta teoría es una catástrofe

René Thom, un matemático plantándole cara a su catástrofe

René Thom, un matemático plantándole cara a su catástrofe

Hay nombres demoledores, hay nombres atractivos y hay nombres nefastos para las teorías.  Podríamos hablar del Big Bang o la Relatividad y discutir sobre lo acertado o no de los nombres. Seguro que se generaría un apasionado debate. Pero de lo que me gustaría hablar hoy es de una teoría matemática que ha sufrido a causa de su nombre y a causa del abuso que se ha hecho de ella. Me refiero a la teoría de catástrofes.

Sí, el nombre es ciertamente sugestivo y estoy casi seguro de que ya nos hemos hecho todos una imagen mental de qué es lo que nos va a contar dicha teoría.  Esa fue su desgracia.

Intentaré explicar qué es la teoría de catástrofes y algunos de sus abusos.

Votar en los Premios Bitacoras.com

Sigue leyendo

Evolución al extremo

A la tercera va la vencida. Con esta entrada terminaremos la serie sobre robótica evolutiva. Las dos entradas anteriores se centraron en cómo un robot puede aprender comportamientos que nosotros deseamos, combinando aprendizaje por refuerzo con redes neuronales y algoritmos genéticos. Ahora, veremos que algunos investigadores han aplicado las ideas evolutivas hasta sus últimas consecuencias.

Votar en los Premios Bitacoras.com

Diseño de robots por evolución

Ya hemos comentado que la robótica evolutiva, al margen de las técnicas utilizadas, trae un cambio de paradigma a la robótica: ¿para qué programar a mano un robot, si él mismo puede aprender? Pues bien, en vez de quedarse en la mera idea de programar comportamientos, hay quien se ha preguntado por qué deberíamos seguir diseñando robots. Es decir, por qué tenemos que pensar nosotros si un robot dado necesita un par de brazos, unas ruedas y una configuración concreta para llevar a cabo una tarea.

Si miramos a la naturaleza, la evolución ha esculpido todas las formas de vida, no solo sus comportamientos, sino también su morfología. La variedad de seres vivos es impresionante, siendo cada uno de ellos una solución para sobrevivir y reproducirse en sus entornos. Y la verdad es que las soluciones generadas por evolución funcionan muy muy bien.

Algunos investigadores han intentado reproducir esos resultados que vemos en la naturaleza. Claro, hacer eso con robots reales es algo muy complicado hoy en día. Pero por suerte, podemos construir simuladores en los que las condiciones son las que nosotros queremos. Podemos definir unas piezas básicas, unas articulaciones para juntar esas piezas e inducir movimentos, podemos definir la gravedad, la fricción y otros aspectos que hagan que los robots simulados se asemejen a la realidad.

Esta corriente de hacer evolucionar robots virtuales en simuladores nos ha traído ya resultados bastante curiosos. Mirad bien el siguiente video. Veréis cómo van evolucionando unas criaturas extrañas con el objetivo de desplazarse de forma más rápida por su entorno simulado. Algo muy interesante del video es que comparan las morfologías de distintas generaciones, enseñando claramente cómo se da una evolución en la forma de la criatura artificial consiguiendo una mayor eficiencia. El “bicho”, además, es puesto a prueba en terrenos desiguales. Os dejo con el video:

A continuación os pongo otro ejemplo de hacer evolucionar criaturas virtuales. En este caso, se pueden ver criaturas para entornos acuosos y terrestres. Criaturas cuyo objetivo es perseguir una señal luminosa que un usuario puede ir moviendo por el entorno virtual. Pero lo que a mí más me gusta es la competición que se montan entre distintas criaturas evolucionadas para poder ver quien de ellas puede hacerse con una pieza cuadrada (a partir del minuto 2:10). Vamos, como si esto fuera Pokemon. Y la criatura que más me gusta es ésa que olvidándose de la pieza ¡se centra en atacar directamente al oponente! Lo podéis ver en el minuto 3:20 más o menos:

En el caso de las competiciones, no solo evoluciona la morfología de las criaturas, sino también las estrategias que usan para ganar. A esta clase de evolución por competición, se le llama co-evolución.

Esto no es solo un juego

Puede quedar la impresión de que lo que hemos mostrado hasta ahora es solo un juego para unos cuantos investigadores ociosos. No es así. Es investigación básica sobre una rama de la robótica que además de generar resultados interesantes, genera un conocimiento sobre algoritmos evolutivos muy importante. En un curso de robótica evolutiva al que asistí, el ponente nos explicó que ya habían usado estas técnicas de diseño para un robot que tenía que limpiar cascos de barcos. Los hacían evolucionar en entornos simulados y cuando llegaban a una solución buena, construían el modelo real y lo mejoraban probándolo en situaciones reales. Lamentablemente, no he podido encontrar información sobre ese proyecto.

Como un ejemplo de cómo estas criaturas virtuales evolucionadas pueden trarse al mundo real, tenemos el proyecto Golem. En él intentan crear máquinas que se puedan mover de forma eficiente en la realidad. Para ello, definen unas piezas básicas en el simulador, con unas articulaciones específicas. Esas piezas, tienen pequeñas redes neuronales integradas que son las que implementan la estrategia de control de las articulaciones. Haciendo evolucionar esas redes neuronales y la configuración de distintas piezas, llegan a crear robots reales que se mueven en entornos reales. El salto entre la criatura virtual y el robot real se realiza gracias a impresoras 3D. Pero mejor lo veáis vosotros mismos:

Todavía queda un enorme trabajo para aplicar de forma generalizada estas estrategias de diseño robótico. Éste es un área de la robótica al que no se le dedican tantos esfuerzos como a otros, pero poco a poco se van conseguiendo resultados asombrosos. La idea en sí a mí me parece espectacular. Espero que a vosotros también os haya gustado.

Nos seguimos leyendo…

¡Que siga aprendiendo!

En esta entrada retomaremos el tema de la robótica evolutiva en el punto en el que lo dejamos. Vamos, que antes de seguir leyendo, conviene que os paséis por la entrada anterior (si es que no lo habéis hecho ya):

¡Que aprenda él mismo!

Terminamos aquella entrada con la pregunta de cómo es posible encontrar los valores de los pesos de la red neuronal con tal de conseguir que el robot haga lo que nosotros queramos. Vamos a ponernos manos a la obra.

Votar en los Premios Bitacoras.com

Un problema de optimización

Intentemos ir paso a paso. Nuestro sistema está compuesto por los siguientes elementos:

  1. Tenemos un robot con dos brazos y un detector de luz.
  2. Tenemos una red neuronal feedforward que enlaza las mediciones del detector de luz con los motores de los brazos robóticos. Obviamente, esta red corre en un ordenador al que enchufamos el detector de luz y los brazos del robot.
  3. Tenemos una función objetivo del robot, que es la de maximizar el refuerzo que recibe.
  4. Finalmente, tenemos una función de refuerzo, que evalúa las acciones del robot y envía un refuerzo acorde a la bondad de la acción ejecutada por el robot.

Para poder generar el comportamiento adecuado, la clave está en buscar los valores adecuados de los pesos de cada neurona de nuestra red. Eso se hace inicializando los pesos con valores aleatorios, así sin más. Entonces, cuando el robot realice una acción acorde al valor transmitido por el detector de luz y los pesos aleatorios de su red, nuestra función de refuerzo le asignará una nota. Como se puede intuir, estos valores aleatorios no deberían obtener una buena nota. Más bien lo contrario. Entonces, se volverán a calcular de nuevo los valores de los pesos y se repetirá el proceso. Se recibirá otra nota, en principio algo mejor que la anterior, y seguiremos así con el proceso hasta llegar a notas muy altas.

Seguramente os estéis preguntando: ¿cómo se recalculan esos valores? Y como no, aquí llegan los algoritmos genéticos. El proceso que acabamos de describir es un proceso de optimización. Queremos encontrar los valores óptimos de los pesos para maximizar el refuerzo – la nota -. Es decir, una vez nuestra red haya generado unas acciones, la nota de esas acciones se compara con la nota deseada. La diferencia entre ambas notas es el error de nuestra red. Iremos optimizando los valores de los pesos para ir minimizando la diferencia entre la nota recibida y la deseada. Y como algoritmo de optimización, usaremos los algorittmos genéticos.

Por fin los algoritmos genéticos

Los tan manidos algoritmos genéticos son un algoritmo de optimización como otro cualquiera. Sin embargo, tienen algunas ventajas que los hacen especialmente atractivos para los casos que nos ocupan.

Lo primero de todo es entender cómo funcionan estos algoritmos. Una explicación sencilla y brillante, con el ejemplo del problema del viajante, la podemos leer en Ciencia Xplora (@cienciaxplora) de la mano de Clara Grima (@ClaraGrima):

Algoritmos genéticos by Clara Grima

Como yo no tengo ni la mitad de arte que Clara, no voy a volver a explicar lo que tan bien explicado está. Solo vamos a rescatar lo más importante para nuestro caso. Nuestra población, es decir, las posibles soluciones, está compuesta por diferentes combinaciones de pesos de la red. La función objetivo será minimizar la diferencia entre la nota esperada (un 10, claro está) y la nota asignada por la función de refuerzo a una solución concreta.

Tened en cuenta que nuestro espacio de soluciones es realmente gigantesco. Por hacer unos números: si tenemos 1 neurona de entrada, 4 neuronas en la capa oculta y 2 en la salida, los parámetros a ajustar (pesos + los parámetros libres) ascienden a 4×2 + 2x(4+1) = 18. Esto quiere decir que el espacio de las soluciones posibles es un espacio de 18+1 = 19 dimensiones, donde tenemos que encontrar los valores óptimos (la dimensión adicional es el eje del error). Y os aseguro que incluso para un problema tan simple como el nuestro, una red tan pequeñita no serviría. Cada vez que incorporamos una neurona, la dimensión del espacio asciende mucho, ya que implica muchos pesos nuevos. Por lo tanto, imaginad a lo que nos enfrentamos.

En todo este tinglado hay una pregunta obligada: ¿por qué usamos algoritmos genéticos? Podría ser un capricho, pero no lo es. Nuestro gran espacio de soluciones se compone de los pesos de la red y el error de la red. Si tuviéramos solo un peso, podríamos dibujar ese espacio así:

espacio-soluciones

Recordad que el error mide la diferencia entre la nota que obtiene la red de la función de refuerzo y la nota deseada. El objetivo del algoritmo es minimizar ese error. Pero, ¿qué pinta tiene ese error? Normalmente, la superficie del error respecto a los pesos suele tener una pinta bastante horrible, cuando se usan las redes neuronales y el aprendizaje por refuerzo. Pongamos un ejemplo:

espacio-soluciones-1

Claro, tenemos que imaginarnos una superficie así en un espacio de 19 dimensiones (18 pesos + el error). A ver quién es el guapo que encuentre el mínimo global allí. Justamente, los algoritmos genéticos son muy buenos en estos espacios. No aseguran encontrar el mínimo global, pero sí que aseguran converger a una solución cercana al mínimo global. De alguna forma, los algoritmos genéticos son capaces de hacer dos cosas:

  1. Mejorar las soluciones existentes cruzándolas entre ellas: usando el cruce de las mejores soluciones, se logran soluciones mejores. Este proceso se puede visualizar como bajar la pendiente en cualquier punto de la superficie del error.
  2. Explorar todo el espacio de soluciones: si solo cruzáramos las soluciones, bajaríamos la pendiente y tendríamos el peligro de quedar atascados en un mínimo local. Para evitar eso, hay que ser capaz de saltar de una zona del espacio a otra. Los algoritmos genéticos consiguen esto introduciendo mutaciones en las soluciones. Las mutaciones son aleatorias y ayudan a explorar bien todo el espacio de soluciones.

Mejorando y explorando, al final el algoritmo genético es capaz de dar con una solución quasi-óptima.

espacio-soluciones-2

 

¿Por qué es esto tan chulo?

Hombre, hay muchísimas razones para que todo esto que acabamos de ver se pueda calificar como chulo. Por un lado, tanto las redes neuronales artificiales como los algoritmos genéticos, son algoritmos matemáticos que se inspiran en la naturaleza. Los primeros en nuestro propio cerebro, que es el ejemplo más sofisticado y brutal de red neuronal natural. Los segundos, en la teoría de la evolución, que explica como las especies se van adaptando a sus medios y logran reproducirse mejorando la especie. Poder utilizar algoritmos de este calibre para hacer que un robot aprenda por sí solo me parece una auténtica gozada.

Otra de las razones es que somos capaces de replicar un proceso de aprendizaje natural. El aprendizaje por refuerzo se da en la naturaleza. Lo usamos los humanos para aprender, y también los animales. Aplicar esquemas de aprendizaje natural a un robot, usando además algoritmos inspirados en la naturaleza, que seguramente tengan mucho que ver con nuestros propios procesos internos, ya me parece la rehostia.

Pero todo esto también tiene un componente más práctico desde el punto de vista de los robots. Hay ciertos comportamientos muy útiles que son muy díficiles de programar a mano. Por ejemplo, voltear una tortilla en una sartén.

En este ejemplo, para inicializar el proceso de aprendizaje, usan otro tipo de aprendizaje: el aprendizaje por demostración. Pero por ahora eso nos da igual. Si os fijáis, el robot al principio es bastante torpe. Al cabo de probar varias veces, alcanza una gran maestría. Tener que programar a mano los movimientos de un brazo con tantos grados de libertad, con todas las variables externas relacionadas con el movimiento de la tortilla, es un auténtico suplicio. Y probablemente, no se podría conseguir un resultado tan bueno.

Para terminar

Recapacitad un poco sobre lo que hemos visto en estas dos entradas. Hemos cogido un robot con unos sensores, unos actuadores y un ordenador. Le hemos metido una red neuronal con unos pesos aleatorios, que enlazaban los sensores con los actuadores. Le hemos dicho que tiene que maximizar el refuerzo obtenido, y con una función de refuerzo, hemos fijado cual es el comportamiento que nosotros queremos que el robot aprenda. Con procesos de prueba y error, un algoritmo genético ha sido capaz de encontrar la configuración de pesos de la red neuronal para que el robot haga lo que nosotros queríamos.

Ya me permitiréis la licencia, pero yo, cuando veo a un bebé, veo en parte todo esto que acabamos de ver. Sale al mundo con una red neuronal descalibrada, hace pruebas como un loco y al cabo de mucho tiempo aprende a hacer cosas. Ya sé que la distancia entre lo que hace el bebé y hacemos con los robots es todavía enorme, y que hay muchísimos más factores que los que hemos visto aquí, pero no me negaréis el parecido.

En fin, olvidaos del último párrafo y pensad que hemos aprendido algo de robótica evolutiva, redes neuronales y algoritmos genéticos.

Nos seguimos leyendo…