¡Cómo sois! ¡Pedid por esa boquita! (otra tabarra con el premio bitácoras)

Hoy han salido las 3º clasificaciones parciales de los premios Bitácoras de este año.  Os recuerdo que os había pedido el voto sutilmente y bueno, esperaba pasar de la posición 8 a la 7, tal vez a la 6 — en realidad pensaba que llegaría a la primera posición –.  Y resulta que miro la clasificación hace un rato y estamos en la 2º posición.

podium

La acogida ha sido fantástica, no quepo en mí de gozo. Pero gozo, gozo…

Ahora en serio

Muchas gracias por los votos a este blog, me hace mucha ilusión saber que lo que se hace aquí le llega a la gente y gusta.  Y me consta que todos los colaboradores de este sitio de cuentos y cuentistas estarán la mar de felices con los resultados obtenidos.

Thank-you-post-it

Y bueno, como es de recibo dar algo a cambio, aunque ya sabemos por aquí que lo hacéis de todo corazón y tal, se me ha ocurrido lo siguiente…

PIDE POR ESA BOQUITA

Escribiré entradas sobre siete temas a petición popular.

¿Cómo se eligen esas entradas?

Fácil, se escribirá sobre los siete temas propuestos en los siete primeros comentarios (por personas diferentes) que reciba esta entrada.

¿Os hace?

Ea, pues a pensar temas y no lo pongáis muy difícil que ya nos conocemos.

Ah, por cierto… ¿Has votado ya por Cuentos Cuánticos en el Bitácoras? :P

Votar en los Premios Bitacoras.com
Nos seguimos leyendo…

Mecánica de Fluidos — Definiciones y aparato matemático

Esta entrada ha sido escrita por Alonso (@AlonsoFdez)y forma parte de un curso técnico de introducción a la dinámica de fluidos.  Queda advertido que es un curso técnico, así que se presupone un conocimiento previo de calculo de una y varias variables. Muy adecuado para estudiantes de física, ingenierías y matemáticas aplicadas.  Los fluidos son un campo interesante y que plantea enormes problemas físicos y matemáticos.

A lo largo de una serie de entradas presentaremos los fundamentos más básicos de la mecánica de fluidos en su formulación clásica o macroscópica, esto es, basada en la hipótesis del medio continuo. Dicha hipótesis asume que las longitudes características del movimiento estudiado son mucho mayores que las distancias intermoleculares del medio que estamos analizando; dicho de otro modo: por muy cerca que miremos nunca veremos el fluido como si estuviera compuesto por moléculas individuales.

El estudio de la mecánica de fluidos es fundamental en muchos aspectos de la física aplicada y de la ingeniería ya que, a poco que nos paremos a pensar, nos damos cuenta de que:

  • El 70% (aproximadamente) de la superficie de la Tierra está cubierta por agua.
  • El 100% de la superficie de la Tierra está cubierto por aire.

Los dos puntos anteriores muestran que todo aquello que desarrolla su movimiento en este planeta lo hace sumergido en, o rodeado por, un fluido.

Más allá del ejemplo anterior, que es un poco de perogrullo, el interés teórico del estudio de la mecánica de fluidos es enorme. Próximamente veremos que uno de los campos de investigación más activos hoy en día dentro del ámbito de la física clásica es el estudio de la turbulencia en el flujo de fluidos, ya que se trata de un problema que a día de hoy no está totalmente cerrado. Más allá de la turbulencia, existen múltiples líneas de investigación en el tema de la micro y la nano-fluídica, así como en el campo de la física de flujos eléctricamente cargados. Por último, si nos vamos a las escalas más grandes, con la mecánica de fluidos podemos estudiar tanto la dinámica de la atmósfera como de las grandes corrientes oceánicas. A escalas aun mayores, la mecánica de fluidos nos sirve para comprender el movimiento a gran escala de los plasmas en interior de las estrellas.

¿Qué es un fluido? Fluidos newtonianos y no-newtonianos

Pero antes de todo lo anterior debemos pararnos un momento. Para empezar, lo más conveniente es que definamos qué es un fluido. Bien, aquí va:

Un fluido es un medio continuo que que es incapaz de resistir esfuerzos cortantes.

Bueno, ahora vayamos por partes. Lo del medio continuo ya lo hemos comentado antes. Fijémonos entonces en la segunda parte de la definición, y más concretamente en lo de esfuerzos cortantes. Para ello, imaginemos que tenemos una superficie; en principio esta superficie puede tener cualquier forma, sin embargo, para fijar ideas, centrémonos en un plano. En cualquier punto de ese plano podemos definir un sistema de ejes en el que hay un vector normal (perpendicular) a la superficie y dos vectores tangentes a la superficie. Algo como esto:Figura1

Ahora imaginemos que sobre la superficie aplicamos una fuerza. En cada punto de la superficie podremos entonces descomponer la fuerza aplicada en las componentes que vienen dadas por el sistema de ejes que hemos definido antes. Si lo hacemos veremos algo como esto (las componentes de la fuerza aplicada se representan como segmentos sobre los ejes en vez de como flechas para no embarrullar demasiado la figura):

Figura2Por último podemos sumar las dos componentes tangentes al plano para calcular su resultante:

Figura3Como vemos, hemos descompuesto la fuerza aplicada, que a partir de ahora llamaremos esfuerzo (ya que en realidad una fuerza nunca se aplica sobre un punto, sino que se distribuye sobre una superficie, por muy pequeña que sea), en dos componentes (notemos que representamos los vectores por caracteres en negrita):

  • El esfuerzo normal, que es perpendicular a la superficie, y que en la figura se denota por \boldsymbol{f_n}
  • El esfuerzo cortante, que es tangente a la superficie, denotado por \boldsymbol{f_\tau}.

Ahora que tenemos claro lo que es el esfuerzo cortante podemos volver a la definicíón de fluido. Para ello, imaginemos que tenemos un cubito de hielo, sólido, apoyado sobre una mesa. El cubito, normalmente, estará sometido a su peso, que se distribuye de manera uniforme en su volumen:

Figura4Si hacemos un pequeño esfuerzo, podemos ver cómo el cubito de hielo está lleno de vectores apuntando hacia el suelo. Si lo partimos por la mitad, podemos ver claramente como en cada una de las paredes verticales que han aparecido en nuestro corte hay una componente cortante (en este caso no hay componentes normales aplicadas sobre las superficies verticales). Por tanto, el cubito de hielo está soportando esfuerzos cortantes en todo su dominio. Como respuesta a esos esfuerzos, el cubito se comba imperceptiblemente, deformándose. Esto es lo característico de los sólidos: Ante una solicitación, tienen la capacidad de deformarse para responder a ella (la famosa ley de Hooke).

Ahora imaginemos que tenemos un cubito de agua líquida sobre la mesa. Efectivamente, hagamos el esfuerzo de imaginarlo, ya que el agua líquida se desparrama en cuanto tiene oportunidad. El imaginario cubito de agua no puede soportar los esfuerzos cortantes que tiene dentro, por lo que se nos derrama por toda la mesa, poniéndolo todo perdido. Esto es lo que define un fluido, o mejor, es lo que distingue a los sólidos de los fluidos.

Otra forma de decir esto es que, al contrario que los sólidos, los fluidos no presentan resistencia a la deformación.

Además de lo anterior, experimentalmente se observa que los fluidos, pese a no oponerse a la deformación, sí que se oponen a la velocidad con la que se deforman (después de todo el agua no se desparrama a una velocidad infinita). Para ver esto, pensemos que tenemos una lámina de fluido encerrada entre dos paredes, estando la inferior quieta y moviéndose la superior con una velocidad \boldsymbol{v}. En estas condiciones, la parte del fluido que está en contacto con la pared inferior posee una velocidad nula, mientras que la que está en contacto con la pared superior se mueve también a velocidad \boldsymbol{v}. En el interior del dominio, aparecerá un perfil de velocidades que irá desde la velocidad nula en la pared inferior hasta la velocidad \boldsymbol{v} en la superior.

Figura5Como vemos, el perfil de velocidades cambia con la altura, por lo que podemos calcularle la derivada. Al mismo tiempo, podemos calcular el esfuerzo cortante sobre la pared inferior (que es la que “retiene” al fluido. Si medimos esto experimentalmente y comparamos los valores obtenidos, veremos que se cumple una relación del tipo (\boldsymbol{\tau} denota el esfuerzo cortante, e y denota la coordenada vertical, respecto a la que derivamos):

\boldsymbol{\tau}\propto \left(\frac{d\boldsymbol{v}}{dy}\right)_{  y=0}

Esta es la expresión matemática, denominada de forma más exacta Ley de Comportamiento que muestra lo que hemos afirmado antes: La resistencia del fluido a la velocidad de deformación se manifiesta a través de la relación proporcional entre la variación del perfil de velocidades y el esfuerzo cortante.

La ley de comportamiento anterior puede manifestarse de varias formas, según sea el fluido analizado. Toda la casuística posible se divide en dos grandes grupos:

  • Aquellos en las que la proporcionalidad se manifiesta mediante una ley lineal.
  • Aquellos en los que dicha ley es no lineal.

En el caso de la ley lineal de comportamiento, la relación es de la forma:

\boldsymbol{\tau} = \mu \left(\frac{d\boldsymbol{v}}{dy}\right)_{y=0}

Donde la constante de proporcionalidad \mu se llama viscosidad dinámica del fluido. Sustancias como el agua líquida o el aire tienen una ley de comportamiento de ese tipo. A todos los fluidos que siguen una ley lineal se les llama Fluidos Newtonianos.

Si la ley de comportamiento no es lineal, entramos en el mundo de los Fluidos No Newtonianos. Un fluido no newtoniano muy común es la pasta de dientes (todos hemos comprobado como no empieza a fluir hasta que la fuerza con la que apretamos el tubo no supera un cierto valor). La casuística (a menudo mucho más contraintuitiva que la de los fluidos newtonianos) de los fluidos no newtonianos responde a una descripción matemática mucho más compleja que la de los newtonianos, y tradicionalmente su estudio es objeto de una disciplina aparte denominada Reología.

A lo largo de esta serie de entradas nos ceñiremos a la descripción del movimiento de los fluidos newtonianos.

Descripción lagrangiana y euleriana. Derivada sustancial, material o convectiva

A la hora de estudiar el movimiento de los fluidos pueden adoptarse dos grandes marcos de descripción:

Por una parte podríamos usar una descripción en la que la única variable independiente a la hora de analizar la evolución de una magnitud característica cualquiera del campo fluido, \phi, sea el tiempo:

\phi=\phi(t)

En este tipo de descripción, tradicionalmente denominada lagrangiana, podemos asimilar el estudio del movimiento del fluido al análisis de la evolución temporal de las trayectorias de todos los “puntos materiales” que forman parte del medio continuo. Por sus características, la variable fundamental a calcular en este tipo de descripción es la posición de las partículas fluidas.

Sin embargo, salvo en situaciones muy particulares (análisis de sedimentación, transporte de partículas, dispersión de aerosoles, etc.), esta descripción no es la habitualmente utilizada. No es difícil imaginar el por qué: La descripción del movimiento de cada partícula provoca que la complejidad matemática del problema crezca tanto que su uso para fines prácticos está totalmente desaconsejado. En su lugar, podemos usar una descripción en la que tanto el tiempo, como la posición, sean variables independientes. De este modo, una variable cualquiera se definiría mediante una función del tipo:

\phi=\phi(\boldsymbol{r},t)

Esta es la conocida como descripción euleriana, que es la que habitualmente se utiliza para plantear las ecuaciones de la mecánica de fluidos. En esta descripción, resolver el problema equivale a encontrar el campo de velocidades.

Una vez expuestas las descripciones posibles, es lícito preguntarse cómo se define el cambio de una magnitud en cada una de ellas, o lo que es lo mismo, cómo se calculan las derivadas. En el caso de la descripción lagrangiana la derivada simplemente es la derivada temporal:

\dfrac{d\phi}{dt}

En el caso de la descripción euleriana, el cálculo de las derivadas no es tan inmediato. Efectivamente, a la hora de describir cómo cambia una magnitud del campo fluido, debemos tener en cuenta que posición y tiempo son variables independientes. Si tenemos esto en cuenta, y calculamos la variación temporal de una magnitud asociada a un punto material a medida que dicho punto material se mueve, debemos operar como sigue:

d\phi = \phi(\boldsymbol{x}+d\boldsymbol{x},t+dt)-\phi(\boldsymbol{x},t)

d\phi = d\boldsymbol{x} \cdot \nabla\phi + \frac{\partial\phi}{\partial t} dt

\frac{d\phi}{dt} = \frac{\partial\phi}{\partial t} + \boldsymbol{v} \cdot \nabla\phi

En la expresión anterior se ha tenido en cuenta que \frac{d\boldsymbol{x}}{dt} es precisamente la velocidad a la que se mueve la partícula que estamos siguiendo, que no es otra que la velocidad a la que se mueve el fluido.

Finalmente, para distinguirla de las derivadas convencionales (no parciales) respecto al tiempo, hacemos el siguiente cambio de notación: \frac{d\phi}{dt} \equiv \frac{D\phi}{Dt}, para representar nuestra derivada, que a partir de ahora llamaremos derivada siguiendo al punto material o, mejor aún, derivada sustancial. También conocida como derivada material o derivada convectiva.

El operador de la derivada sustancial es, ateniéndonos al desarrollo anterior, el siguiente:

\frac{D}{Dt} = \frac{\partial}{\partial t} + \boldsymbol{v} \cdot \nabla

La interpretación de la derivada sustancial puede resultar un tanto extraña, pero rápidamente se aclara si tenemos en cuenta que, para calcularla, y teniendo siempre presente que posición y tiempo son variables independientes, en todo momento hemos seguido a un punto material que se mueve con el fluido; por tanto, las componentes del campo fluido cambiarán no sólo por que el tiempo avance, sino también porque la posición de la partícula que hemos ido siguiendo ha ido cambiando.

Una última puntualización sobre la notación y la interpretación del operador que hemos definido. Como hemos visto, la derivada sustancial tiene dos sumandos. El primero de ellos:

\frac{\partial}{\partial t} — Se denomina aceleración local, y, como es natural, recoge las variaciones en las magnitudes al avanzar el tiempo.

\boldsymbol{v} \cdot \nabla — Este término tiene la información de las derivadas espaciales y recoge las variaciones en las magnitudes cuando pasamos de un punto a otro del dominio fluido.

Conviene observar que el término de la derivada convectiva introduce una no linealidad en las ecuaciones que estamos tratando de plantear. A ese término se debe, fundamentalmente, la tremenda variedad y complejidad de los movimientos de los fluidos, así como las soluciones, a menudo caóticas, de los problemas que se plantean en esta disciplina.

El teorema del transporte de Reynolds

Acabamos de presentar una de las herramientas matemáticas fundamentales en las que se basa el desarrollo de la mecánica de fluidos. Ahora vamos a presentar otra herramienta, complemento de la anterior, con la cual seremos capaces de completar el aparato matemática necesario para plantear las ecuaciones fundamentales del movimiento de los fluidos: el teorema del transporte de Reynolds.

¿Por qué nos hace falta algo con ese nombre tan rimbombante? Veréis, para plantear las ecuaciones generales necesitamos evaluar cómo cambian una serie de magnitudes encerradas en lo que llamaremos un volumen de control, es decir, una región del fluido en la que ponemos nuestra lupa para mirar lo que entra en él, lo que sale, y lo que cambia en su interior. Rápidamente nos damos cuenta de que, al contrario de lo que pasa en un sólido, la forma del volumen de control se distorsionará mucho con el tiempo, por lo que necesitamos realizar esos balances teniendo a mano una herramienta que nos permita evaluar la evolución de los parámetros de interés a medida que el propio volumen de control evoluciona con el tiempo. Eso es precisamente lo que nos permite el teorema del transporte de Reynolds. Veámoslo:

Llamemos a la región contenida en nuestro volumen de control en un instante cualquiera \Omega_c (t). La superficie frontera de nuestro volumen de control en ese mismo instante, que es cerrada, será \Sigma_c (t). Nuestro objetivo es evaluar cómo cambia con el tiempo una magnitud \phi en el interior de dicho volumen.

\frac{d}{dt} \int_{\Omega_c (t)} \phi(\boldsymbol{x},t) d\varpi

Para evaluar lo anterior, podemos optar por dos caminos:

  • Podemos sustituir la derivada como un límite, hacer un par de desarrollos en serie de Taylor truncada en la primera derivada y, finalmente, evaluar el límite de la forma usual. Esta es la forma rigurosa y formal de demostrar el teorema, pero tiene el inconveniente de que, entre tantos pasos intermedios, podemos perder de vista la física de lo que hay detrás.
  • O bien, para mantener la física delante de nuestros ojos, podemos proceder utilizando una “conjetura razonable” que nos llevará al mismo resultado, que es lo que vamos a hacer.

1.-  No es difícil darse cuenta de que la derivada de la integral que queremos calcular no es más que un caso general de la derivada sustancial. En efecto, la derivada de la integral es un balance aplicado a un volumen finito. Por su parte, la derivada sustancial es también un balance, pero aplicado sobre una partícula material, un punto. En el límite, una partícula material no es más que un volumen infinitamente pequeño. Por tanto, podemos tratar de reconstruir la integral a partir de la derivada, teniendo en cuenta que la mayor diferencia entre los volúmenes de control es que, mientras que en el punto material el volumen de control y la superficie que lo envuelve colapsan en la misma entidad geométrica (el propio punto), en el caso de la integral dicho colapso no se produce. Por tanto:

\frac{d}{dt} \int_{\Omega_c (t)} \phi(\boldsymbol{x},t) d\varpi \leftrightarrow \frac{D\phi}{Dt}

Donde, en la expresión anterior, d\varpi es el elemento diferencial del volumen sobre el que realizamos la integral.

2.-  La derivada sustancial tenía un primer término que era la aceleración local de la magnitud al evolucionar el tiempo. Esto es asimilable en la integral a calcular la variación de la magnitud dentro del volumen de control, independientemente del movimiento del volumen:

\int_{\Omega_c (t)} \frac {\partial \phi}{\partial t} d\varpi \leftrightarrow \frac {\partial \phi}{\partial t}

3.-  Debemos evaluar ahora la derivada convectiva. Si recordamos el significado de la derivada convectiva, lo que expresaba era el cambio en la propiedad cuando seguíamos a una partícula inmersa en el fluido. Ahora, en vez de una partícula, lo que tenemos es un volumen finito, por lo que podemos imaginar fácilmente que cuando el volumen de control se mueve en el fluido, el flujo atravesará su superficie. De este modo, cualquier magnitud transportada con el fluido atravesará también el volumen de control. Este razonamiento nos lleva a equiparar la derivada convectiva con una operación que, en el caso de un volumen de control finito, pueda medir cuánto de esa magnitud que nos interesa está entrando y saliendo del mismo. Y ese, precisamente, es el concepto de flujo a través de una superficie. En este momento, y para ayudar a la interpretación de este concepto, conviene que mostremos el teorema de la divergencia:

\int_{\Omega} \nabla \cdot \boldsymbol{\Phi} d\varpi = \int_{\Sigma} \boldsymbol{\Phi} \cdot d\boldsymbol{\sigma}

Que viene a decir que toda cantidad que surge o se consume, pues la divergencia equivale a una fuente o a un sumidero, según sea el signo que tenga, en el interior de un volumen, (miembro izquierdo de la igualdad), es igual a la cantidad que atraviesa la frontera de dicho volumen (segundo término). Esto se ve más claro en la imagen siguiente, donde V denota el volumen y S la superficie que delimita dicho volumen:

Figura6El segundo término del teorema de la divergencia define precisamente el flujo de una magnitud a través de una superficie. A la hora de aplicar el teorema de la divergencia hay que notar que tanto la magnitud que está fluyendo como la superficie tienen carácter vectorial. En el caso de la superficie esto puede resultar chocante, pero para tratar una superficie de forma vectorial no tenemos más que definir un vector que tenga como módulo el valor de la superficie y, como dirección y sentido, los dados por la normal que apunta hacia fuera de la superficie: d\boldsymbol{\sigma} = \boldsymbol{n}d\sigma.

Una vez hecho este pequeño inciso, para volver al teorema del transporte de Reynolds nos queda definir la derivada convectiva en un volumen como un flujo a través de una superficie. Para ello, sólo debemos usar que una magnitud transportada en un fluido tiene carácter vectorial si nos damos cuenta de que, al ir inmersa en el fluido, es transportada por el campo de velocidades de este. Usando la notación anterior,

\boldsymbol{\Phi} = \phi \boldsymbol{v}

Por tanto, el término de la derivada convectiva en forma integral nos queda como sigue:

\int_{\Sigma_c (t)} \phi \boldsymbol{v} \cdot \boldsymbol{n} d \sigma \leftrightarrow \boldsymbol{v} \cdot \nabla \phi

El teorema del transporte de Reynolds, por tanto, toma la forma:

\frac{d}{dt} \int_{\Omega_c (t)} \phi d\varpi = \int_{\Omega_c (t)} \frac{\partial \phi}{\partial t} d\varpi + \int_{\Sigma_c (t)}\phi \boldsymbol{v}\cdot\boldsymbol{n}d\sigma

La versión del teorema del transporte de Reynolds que hemos obtenido, pese a todo, no corresponde al caso más general, sino que sólo podemos aplicarlo cuando la velocidad a la que se mueve el volumen de control coincide con la propia velocidad del fluido. Si existe un movimiento relativo entre volumen de control y fluido (recordemos que el volumen de control se establece de forma arbitraria, por lo que ya puestos también se le puede dar un movimiento arbitrario, más rápido o más lento que el del fluido), se demuestra que la expresión del teorema debe modificarse de la siguiente forma:

\frac{d}{dt} \int_{\Omega_c (t)} \phi d\varpi = \int_{\Omega_c (t)} \frac{\partial \phi}{\partial t} d\varpi \int_{\Sigma_c (t)}\phi (\boldsymbol{v}-\boldsymbol{v_c})\cdot\boldsymbol{n}d\sigma

Donde \boldsymbol{v} es la velocidad del fluido y \boldsymbol{v_c} es la velocidad del volumen de control.

Conservación en fluidos

En esta entrada hemos definido el concepto básico de fluido, así como un par de herramientas matemáticas básicas para poder plantear de forma teórica el estudio del movimiento de los fluidos. Para hacerlo, debemos tener en cuenta que, como siempre se hace en física, se buscan cantidades que se conserven con el tiempo, para ver cómo afecta dicha conservación global a las diferentes magnitudes y propiedades que pueden ser medidas. Al encuadrarse dentro de la física clásica, las ecuaciones de conservación básicas que estudia la mecánica de fluidos son:

  • Conservación de la masa.
  • Conservación de la cantidad de movimiento.
  • Conservación de la energía.

Continuaremos con el tema de los fluidos en próximas entradas.

Nos seguimos leyendo…

Referencia   Para profundizar o completar os recomendamos esta introducción a la dinámica de fluidos:

¡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…

¡Que aprenda él mismo!

Una de las ramas de la robótica que siempre me han encantado es el de la robótica evolutiva. En esta entrada intentaremos explicar por qué es tan atractiva, presentando una de las direcciones en las que se trabaja. Concretamente, veremos cómo se combinan redes neuronales con algoritmos genéticos y aprendizaje por refuerzo. ¡Casi nada!

Votar en los Premios Bitacoras.com

Pero vayamos por partes. La robótica evolutiva supone un cambio en la forma en la que se programan los robots. Si habéis seguido las entradas de robótica de este blog, os habréis dado cuenta de que en general, los robots se programan a mano para ejecutar ciertas tareas como navegar, coger objetos y manipularlos etc.  ¿Qué queremos decir con a mano? Que existe un programador que va escribiendo todas las instrucciones concretas para que el robot pueda hacer lo que hace. Sin embargo, en robótica evolutiva se cambia el enfoque. ¿Por qué deberíamos programar un robot si él mismo puede aprender a hacer las cosas?

Aprendizaje por refuerzo

Para que el robot aprenda, vamos a usar un método de aprendizaje bien conocido por todos: el aprendizaje por refuerzo. Muy llanamente, este tipo de aprendizaje se basa en premiar el comportamiento adecuado y en castigar el comportamiento poco adecuado. Imaginemos por ejemplo, que queremos que nuestro robot levante el brazo derecho cada vez que encendamos una luz. Bien. El robot necesitará un detector de luz para percibirlo y unos brazos. Encenderemos la luz y veremos qué hace el robot. Si no levanta el brazo que nosotros queremos, le mandaremos un refuerzo negativo. Si lo levanta, un refuerzo positivo. Repitiendo este proceso muchas veces, el robot aprenderá que cuando encendamos la luz tiene que levantar el brazo.

Hasta aquí bien, pero ¿cómo se hace eso con un robot? ¿Le tenemos que pegar con un palo cada vez que la pifie? Obviamente no. Esto del castigo y premio en la robótica es mucho más sutil, mucho más matemático. Lo que se hace es definir una función de refuerzo, que no es más que una función matemática que evalúa la acción del robot. Por ejemplo, podemos coger una escala del cero al diez y puntuar las acciones del robot en función a nuestro objetivo. El objetivo del robot será buscar la acción que le haga obtener siempre un 10.

Ya, pero ¿cómo busca el robot esas acciones? ¿Cómo es capaz de decidir qué hacer cada vez que ve una luz? Aquí es donde entran las redes neuronales y los algoritmos genéticos.

 Redes neuronales

No es mi intención entrar aquí a explicar en detalle las redes neuronales, las distintas clases de redes que existen, la forma de entrenarlas, etc. Eso, en todo caso, ya lo haremos otro día. Pero en esta entrada sí que veremos algo sobre estas redes, de forma muy simple.

La unidad básica de una red neuronal es la neurona o el perceptrón. Una red neuronal no es más que la unión de varias neuronas. ¿Y qué hace una neurona? Nada del otro mundo: recibe unas señales de entrada, las suma y propaga una señal de salida.

neurona

Vamos a detallar esto un pelín más. Las entradas de una neurona son unos números reales. La neurona de la imagen anterior puede procesar por lo tanto vectores de tres dimensiones, ya que tiene tres entradas. Podemos escribir las señales de entrada de una neurona como \bar{x} = (x_0, x_1, x_2). La salida de la neurona es típicamente un número real. Para obtener dicha salida se aplican dos funciones sobre las entradas:

  1. Función de transferencia: no es más que la combinación lineal de las entradas con unos pesos dados, es decir, f(\bar{x}) = \bar{w} \bar{x} + b. Para nuestro caso anterior, f(\bar{x}) = w_0 x_0 + w_1 x_1 + w_2 x_2 + b. Las w son los pesos de la neurona y ya volveremos a ellas pronto. b representa el parámetro libre, y también veremos su significado en breve.
  2. Función de activación: es una función que calcula una salida en función del resultado de la función de transferencia. Hay muchas clases de funciones de activación. Ahora veremos un ejemplo para entederlo mejor.

Usando las funciones de transferencia y activación, una única neurona es capaz de aprender cosas simples. Imaginad que tenemos dos entradas (x_0, x_1). Sabemos que dependiendo del valor de esas dos entradas, tenemos una cara o no. Es decir, asumamos – aunque sea mucho asumir – que somos capaces de distinguir una cara solo con dos números reales. En ese caso, una única neurona es capaz de aprender, para cualquier valor de x_0, x_1 si es una cara o no. ¿Cómo?

Miremos la gráfica a continuación.

linear-classification-0

Hemos puesto x_0 en un eje y x_1 en otro. A continuación, hemos puesto algunos puntos y su clasificación, es decir, si representa una cara o no. Recordad que todo esto es una grandísima simplificación, pero nos ayudará a entender el comportamiento de una neurona.

Una forma simple de ser capaces de distinguir entre caras y no caras, sería trazar una línea recta en el gráfico anterior, de tal forma que las caras queden a un lado de la línea, y las no caras al otro lado. Algo así:

linear-classification-1

Curiosamente, la función de transferencia que hemos definido antes, no es más que una línea en el espacio de las entradas f(x_0, x_1) = w_0 x_0 + w_1 x_1 + b. Para caracterizar la línea que hemos dibujado, solo hace falta elegir los valores adecuados de w_0, w_1 y b. Estos valores se eligen en un proceso de entrenamiento que por ahora, vamos a dejar en el aire. Pero vaya, nuestra simple neurona es capaz de aprenderse esta línea que distingue a las caras de las no caras. Si enchufamos esta función de transferencia en una función de activación que diga que si un punto dado (x_0, x_1) está por encima de la línea aprendida, entonces ese punto es una cara, ya tenemos un clasificador lineal. Nuestra neurona sabe distinguir entre caras y no caras.

Ahora que sabemos la capacidad de una neurona, pensemos en una red neuronal. Tenemos muchas neuronas, cada una de ellas capaz de aprender un clasificador lineal. Las salidas de unas se convierten en las entradas de otras, tejiendo una red todo lo compleja que queramos. Pero aquí hay un problema: si enganchamos entre sí millones de neuronas de la forma que hemos descrito hasta ahora, nuestra red neuronal no será más que otro clasificador lineal. Dicho más formalmente, la composición lineal de un número arbitrario de funciones lineales, resulta en otra función lineal. Y una función lineal no es capaz de aprender relaciones complejas entre entradas y salidas. ¡Vaya fiasco!

Hay una solución muy simple a este problema. En vez de usar la función de activación que hemos descrito (que es lineal), usemos una función no-lineal. En redes neuronales una de las funciones más usadas es la función sigmoide:

S(x) = \frac{1}{1 + e^{-x}}

Esta función tiene este aspecto si lo ponemos en un gráfico:

sigmoid-function

Vamos, que según el valor de la función de transferencia para un punto dado, la función sigmoide nos dará el valor que aparece en el gráfico para ese punto dado. Introduciendo una función de activación no-lineal en cada una de las neuronas, ahora nuestra red neuronal es capaz de hacer cosas mucho más chulas.

Redes feedfoward

Ya sabéis que a los informáticos nos mola eso de usar términos ingleses. Una de las redes neuronales más simples es la llamada feedforward. La podemos ver en la siguiente imagen:

red-feedforward

Tenemos 3 neuronas de entrada,  4 neuronas en la llamada capa oculta y 2 neuronas de salida. Todas las neuronas de una capa están conectadas con todas las neuronas de la siguiente capa. Cada neurona recogerá las entradas que le lleguen, aplicará la función de transferencia con los pesos concretos y propagará la salida a las siguientes neuronas usando la función de activación – en nuestro caso, la función sigmoide -. Sencillo, ¿verdad?

Lo más alucinante de esta red neuronal feedforward  es que según matématicos sesudos, es capaz de aproximar con un error arbitrariamente pequeño cualquier función no-lineal entre las entradas y las salidas. A esto le llaman el teorema de aproximación universal. Poniéndolo en palabras más de andar por casa, quiere decir que una red feedforward, con una única capa oculta y un número finito de neuronas, es capaz de aprender cualquier relación entre unas entradas y unas salidas. En la práctica, hay relaciones que se aprenden mejor añadiendo más capas ocultas, y esto nos llevaría a tratar el tema del tan famoso deep learning. Pero por ahora, dejemos las cosas como están: una única capa oculta nos sirve para lo que queremos.

¿Y todo esto para qué?

Llevemos esto de las redes neuronales a nuestro problema anterior del robot que tenía que levantar el brazo derecho cuando se encendía una luz. Hemos comentado que el robot necesitaba un detector de luz. Dicho detector, seguramente, nos dará la intensidad de la luz que percibe, en una unidad adecuada. Ese valor de intensidad será la entrada a nuestra red. Las salidas serán los comandos que se necesiten para mover los motores de los brazos robóticos. Nos da igual cómo son esos comandos. Habrá unos valores reales que hagan que los brazos se muevan de diversas formas. Pues nada, ya tenemos nuestra red feedforward que es capaz de controlar los movimientos de unos brazos en función de la intensidad de la luz.

Como la red neuronal es capaz de aprender cualquier relación entre las entradas (intensidad de la luz) y las salidas (comandos de los brazos), eso quiere decir que existen unas combinaciones de pesos en nuestra red neuronal que harán que el robot alce el brazo derecho cuando encendamos la luz, y no haga nada cuando se apaque. La clave ahora es saber cómo buscar los valores de todos esos pesos. Y es allí donde van a surgir los algoritmos genéticos y el aprendizaje por refuerzo.

Pero todo eso lo dejaremos para la siguiente entrada. Al final me he enrollado mucho con el tema de las redes neuronales y será mejor dejar esta entrada aquí mismo. En la(s) siguiente(s) entrada(s) veremos cómo los algoritmos genéticos combinados con aprendizaje por refuerzo nos sirven para buscar los valores de los pesos de la red neuronal. Y os pondré algun que otro vídeo guay -refuerzo positivo ;) -

Nos seguimos leyendo…

¿Está el neutrino? Que se ponga

gilaEl neutrino es esa partícula que es capaz de contarnos los secretos del universo a base de susurros.  Es esa partícula que un día consideramos indetectable y que ahora la lanzamos en cañones.  El neutrino es la clave para muchas respuestas y la llave para las preguntas más emocionantes a las que nos vamos a tener que enfrentar en física en los próximos años.    Todo eso y más es el neutrino.

Pero en esta ocasión vamos a hablar sobre la posibilidad de usar esas partículas como canal de comunicación. Esta entrada está inspirada en las charlas que he tenido el placer de escuchar de Juan José Gómez Cadenas (@JuanJoseGomezC1).  Juan José es un físico especialista en física de neutrinos de reconocimiento mundial, ahora desarrolla su investigación y su docencia en el Instituto de Física Corpuscular (IFIC – @IFICorpuscular), centro mixto del CSIC (@CSIC) y de la Universidad de Valencia.  Además de físico se dedica a juntar letras, y ciertamente lo hace con estilo y con criterio, sus obras las podéis encontrar mencionadas aquí.  Además es uno de los autores de la publicación  Jot Down Spain.  Y si todo ello no fuera suficiente, ahora está a la cabeza de uno de los experimentos mejor situados para dilucidar si el neutrino es su propia antipartícula o no lo es, el experimento NEXT (@NEXT100Exp).

En las charlas a las que me refería Juan José hablaba de neutrinos, del experimento y dejaba en el aire un comentario – No sabemos si hay otros seres en la galaxia, pero tal vez, de haberlos, se estén comunicando por una wifi de neutrinos.  Lo malo es que nosotros aún no hemos conectado con la red -, (interpretación libre de este que escribe).  Pero lo mejor es escuchar a Juanjo, así que aquí tenéis la charla que dio en el evento ciencia de Jot Down en Sevilla el pasado mes de junio:

En esta entrada vamos a intentar entender cómo es eso de que podemos comunicarnos a través de las “indetectables” partículas neutrínicas y qué tan lejos estamos de conseguirlo.  Lo de relacionarnos con otros seres de la galaxia lo dejaremos para un futuro.

Votar en los Premios Bitacoras.com

Sigue leyendo

El universo es un agujero negro o tal vez no

imagesHay que reconocer que el universo tiene un finísimo sentido del humor, vamos que se ríe de nosotros cada vez que quiere.  Una de esas ocasiones es en la que parece decirnos que está dentro de un agujero negro y nosotros vamos y no lo creemos.

Esta entrada está dedicada a discutir sobre si realmente el universo puede estar en un agujero negro o no.  Quiero advertir que solo voy a tratar el tema respecto a los argumentos de la hora del café que abundan por ahí.  Hay otros mucho más elaborados que serán tratados en otra entrada.  Pero primero es conveniente fijar las ideas para no volvernos locos.

Votar en los Premios Bitacoras.com

Sigue leyendo