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.
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.
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):
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.
Un problema de optimización
Intentemos ir paso a paso. Nuestro sistema está compuesto por los siguientes elementos:
Tenemos un robot con dos brazos y un detector de luz.
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.
Tenemos una función objetivo del robot, que es la de maximizar el refuerzo que recibe.
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):
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í:
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:
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:
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.
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.
¿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.
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!
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.
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 . La salida de la neurona es típicamente un número real. Para obtener dicha salida se aplican dos funciones sobre las entradas:
Función de transferencia: no es más que la combinación lineal de las entradas con unos pesos dados, es decir, . Para nuestro caso anterior, . Las son los pesos de la neurona y ya volveremos a ellas pronto. representa el parámetro libre, y también veremos su significado en breve.
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 . 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 si es una cara o no. ¿Cómo?
Miremos la gráfica a continuación.
Hemos puesto en un eje y 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í:
Curiosamente, la función de transferencia que hemos definido antes, no es más que una línea en el espacio de las entradas . Para caracterizar la línea que hemos dibujado, solo hace falta elegir los valores adecuados de y . 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 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:
Esta función tiene este aspecto si lo ponemos en un gráfico:
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:
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 😉 –
El otro día tuve la suerte de acudir a la fantástica charla de Helena Matute (@HelenaMatute) sobre los aspectos psicológicos de la interacción entre humanos y robots. Si no pudiste verla, aquí puedes encontrar un extracto de la misma (se espera que se publique la charla completa en breve). Después de la charla, tuvimos una interesante discusión en Twitter sobre varios de los temas que aparecieron en la charla: cognición, inteligencia, aprendizaje…
Con esta entrada pretendo superar la frustración de los 140 caracteres y ofrecer algunas claves desde el punto de vista de la Inteligencia Artificial para que estas discusiones, lejos de terminar, puedan seguir estando muy vivas. Vamos allá.
El primer gran problema que suelo encontrar en estas discusiones es el uso de palabras y conceptos abstractos como cognición, inteligencia, aprendizaje, emociones y etc. Es muy díficil poder definirlos con exactitud, por lo que suele costar mucho ponerse de acuerdo sobre lo que se le exige a alguien o algo inteligente. Es por ello que he acudido a la Wikipedia a mirar cómo definen cognición.
En esta definición ya hay varias claves interesantes. Se habla de procesar información a partir de la percepción, la experiencia y características subjetivas. También se establece que la cognición engloba temas tales como el aprendizaje, razonamiento, atención, memoria etc. Cabe preguntarse si esas capacidades ya están en manos de las máquinas. Y la respuesta es que sí.
Cognición artificial
No voy a empezar a argumentar que cada uno de los aspectos que se mencionan en la definción de la cognición ya tienen su análogo artificial. Se necesitarían muchas entradas para hacerlo. De todas formas, sí quisiera comentar algunas, más que nada para intentar eliminar esa aureola de magia y misterio que siempre rodea al tema de la cognición, el pensamiento y la inteligencia.
Empecemos por el razonamiento. Hay varias formas de razonamiento, tales como razonamiento inductivo, deductivo o abductivo. Sin meternos en cada una de ellas, nosotros sabemos que las personas se mueren. Si alguien nos dice que Fulano es una persona, razonamos inmediatamente que Fulano es mortal. Este tipo de razonamientos han sido muy estudiados desde la antigua Grecia y fueron el primer caballo de batalla de la Inteligencia Artificial. Ni que decir que hoy en día, hay miles de formas de implementar sistemas artificiales de razonamiento.
Se habla también de resolución de problemas. El ejemplo que me suele gustar dar es el de jugar al ajedrez. Al jugar al ajedrez, en cada movimiento estamos resolviendo un problema, buscando la mejor solución a la situación en la que nos encontramos. Lo que estamos haciendo, al fin y al cabo, es buscar en un espacio de soluciones. Cada movimiento de cada pieza, es una solución, y todas ellas conforman el espacio de las soluciones. Tenemos que ser capaces de evaluar cada una de esas soluciones y tomar la mejor decisión. Obviamente, si lo hacemos uno a uno, tardaríamos infinito tiempo, ya que cada movimiento puede desencadenar millones de posibilidades, y eso crece de manera exponencial. Por eso, aplicamos heurísticos, que no son más que funciones que nos permiten acotar el espacio de búsqueda. Pues bien, esos algoritmos de búsqueda con heurísticos han sido implementados en muchas máquinas para muchos própositos diferentes. Como ejemplo, el algoritmo de búsqueda de caminos del coche de Google, que ya explicamos aquí.
Finalmente, un tema que me apasiona: el aprendizaje. Una vez más, un concepto abstracto con el que es difícil lidiar. Una de las cosas buenas de la ciencia respecto al lenguaje natural, es que intenta definir los conceptos de forma inequívoca. Cuando se habla de aprendizaje artificial o aprendizaje automático, normalmente se acude a la definición dada por Tom Mitchell. Viene a decir que un programa P aprende de la experiencia E respecto a una tarea T y una métrica de rendimiento R, si su rendimiento a la hora de ejecutar la tarea T, medido por R, mejora con la experiencia E. Claro y conciso, ¿verdad?
El aprendizaje automático hoy en día está ya muy extendido entre nosotros. Nuestro correo eléctronico hace uso de aprendizaje supervisado para distinguir entre correo spam y correo bueno. Facebook, etiqueta a personas detectando sus caras, usando de nuevo técnicas de aprendizaje supervisado. Los astrónomos recurren a técnicas de aprendizaje no-supervisado para analizar los millones y millones de imágenes que sacan sus telescopios y buscar galaxias, clusters, nebulosas y otras estructuras en esas imágenes. Vamos, que no hay nada mágico en el aprendizaje.
Bueno, me equivoco, detrás de todo esto está la magia de las matemáticas. El aprendizaje supervisado no es más que encontrar el (hiper-)plano que divide en un espacio multi-dimensional de características calculadas sobre imágenes u otras entradas, entre aquellos puntos que pertenecen a una clase (por ejemplo, cara) y los demás. El aprendizaje no-supervisado trata de agrupar puntos en un espacio de similitud, formando grupos de puntos que se parecen mucho.
Turing y el cambio de paradigma
Para enfocar mejor la discusión, que ya existía desde mediados del siglo pasado, fue Alan Turing el que planteó un cambio de paradigma. La gente no dejaba de preguntarse si las máquinas podrían llegar a pensar. Turing se dio cuenta de lo difícil que resultaba medir la capacidad de pensar, por lo que cambió la pregunta que debíamos hacernos: ¿pueden las máquinas hacer lo que hacemos nosotros?
Esto no es un truco semántico. La pregunta de Turing nos permite medir y comparar máquinas con seres vivos. Tomemos alguna tarea que un ser que consideramos inteligente pueda realizar. Elijamos la tarea que nosotros creamos que no sería capaz de realizar si no fuera inteligente. Bien, si alguna máquina es capaz de realizar esa misma tarea, debemos concluir que el proceso que le ha llevado a realizarla, contiene algun rasgo de inteligencia.
Cuando hablamos de tareas, nos referimos tanto a las físicas como navegar de un punto a otro o preparar la mesa para comer, como a las más mentales como reconocer caras, probar teoremas etc.
En esa línea va el famoso test de Turing. Seguramente la conoceréis como el test que propone a una persona mantener una convesación con alguien desconocido. La persona en cuestión no sabe si el que está hablando con él es otra persona o una máquina. En el caso de que sea una máquina, si al final de la conversación la persona no es capaz de adivinarlo, tenemos que concluir que la máquina es inteligente.
Natural VS artificial
Esta batalla entre lo natural y lo artificial es muy conocida en muchos campos. Como en esos muchos campos a los que me refiero, seguramente llegará el día en el que en el campo de la inteligencia también carecerá de sentido hablar de lo natural y lo artificial (es solo mi opinión).
De todas formas, hay corrientes que creen que la inteligencia artificial debe imitar la inteligencia natural. Esto, por si solo, no conlleva ningun problema. La cuestión es que mucha gente llega a la conclusión de que la inteligencia artificial solo podrá ser considerada inteligencia en tanto en cuanto copie nuestros procesos naturales. Esto contraviene el paradigma de Turing.
La inteligencia artificial ha demostrado poder realizar tareas inteligentes siguiendo caminos diferentes al nuestro. Esto no implica que no se deba intentar replicar nuestros procesos cognitivos, por dos grandes razones:
Ello nos permitiría entender mucho mejor nuestros procesos cognitivos.
Seríamos capaces de crear máquinas inteligentes, ya que nosotros, lo somos.
En este sentido, os recomiendo la lectura de esta entrada de Helena Matute sobre aprendizaje natural y artificial, la forma en la que se entrelazan y sacan provecho el uno del otro. En esa entrada se da con una de las claves de nuestra inteligencia: la rapidez de adaptarnos a nuevos contextos, con la capacidad de aprender con gran flexibilidad.
Ya en la charla Helena comentó que nuestros sesgos cognitivos son el precio a pagar por esa flexibilidad, que es clave a la hora de sobrevivir en un entorno como el nuestro. De allí, se concluía que si las máquinas implementaran esa flexibilidad, estarían abocadas a tener esos mismos sesgos cognitivos. Yo matizaría esta afirmación: si las máquinas implementan nuestros mismos procesos cognitivos para alcanzar esa flexibilidad, entonces tendrán nuestros mismos sesgos cognitivos. Pero, ¿no se puede alcanzar la misma flexibilidad con procesos diferentes?
más allá de la inteligencia humana
Por mucho que la tradición sitúa la inteligencia en nuestro encéfalo, aspectos como la percepción y la capacidad de acción moldean la inteligencia de forma definitiva. Es decir, nuestra inteligencia no sería la misma si en vez de ojos y visión, solo tuviéramos oídos. Todas estas herramientas han sido moldeadas por la evolución, a través de eones. El resultado es maravilloso.
Pero no nos engañemos: la evolución no es un buen ingeniero. Por mucho que nos maravillemos, nuestros ojos son soluciones parcheadas de ojos que se desarrollaron para entornos acuosos. Nuestra columna vertebral es otro parche para una solución bípeda que parte de una solución para animales de cuatro patas. La evolución no genera soluciones óptimas, solo soluciones aceptables. ¡Y no es poco!
Nosotros, en cambio, somos muy buenos ingenieros. Es verdad que los robots aun parecen torpes, limitados en sus tareas y en su flexibilidad y les cuesta realizar tareas que nosotros ya realizamos con 3 años. Pero nosotros somos fruto de millones y millones de años de evolución. La robótica y la inteligencia artificial nacieron ayer.
Sin embargo, con todos los avances que hemos realizado, ya se puede vislumbrar que las máquinas del futuro no solo nos van a igualar, sino que nos van a superar. En vez de ver solo la luz visible, podrán ver en infrarrojos o en cualquier otro lado del espectro. Podrán usar sensores activos como láseres y ultrasonidos, sacar provecho de toda la infraestructura TIC que hemos desarrollado con satélites, Internet, computación en la nube, grandes repositorios de datos etc. Podrán comunicarse entre ellos a una velocidad que nosotros no podemos.
Para muestra un botón: el proyecto RoboEarth. En él, varios grupos de investigación de Europa (entre ellos la Universidad de Zaragoza), han desarrollado el Internet de los robots. Cuando un robot aprende a realizar una tarea, lo sube a un repositorio común, donde se especifican los modelos para reconocer objetos, los pasos a dar para completar esa tarea, las capacidades que se necesitan, aspectos importantes del entorno etc. Otro robot, en otra parte del mundo, con un cuerpo y capacidades diferentes, es capaz de bajarse toda esa información cuando se encuentre ante la necesidad de realizar esa misma tarea. Si durante la realización de esa tarea aprende y descubre algo nuevo, lo comparte, mejorando/completando el conocimiento del repositorio común. Es algo parecido a lo que hacían en Matrix para aprender a conducir un helicóptero, ¿verdad? Pero con robots.
Otro ejemplo: Watson de IBM. Capaz de entender el lenaguaje natural y aprender de la interacción con los humanos. Ya está aprendiendo aspectos relativos a la medicina y la fisiología humana. Propone diagnósticos y tratamientos basándose en su conocimiento enciclopédico, al que un humano no puede aspirar. Pero también está aprendiendo de finanzas. ¡Ojocuidao!
Todos estos ejemplos son todavía prototipos. Puede que en aspectos generales no estén a nuestra altura: no son tan inteligentes como nosotros. Pero es cuestión de tiempo. Como bien dijo Helena al final de su charla, estos robots, estas máquinas inteligentes, van a llegar. No se sabe cuando, pero van a llegar. Nos corresponde a nosotros decidir cómo queremos que sean. Y no deberíamos esperar mucho tiempo para empezar a decidirlo.
Es obvio que hay grandes diferencias entre la forma de impulsar la investigación científica en Estados Unidos y en Europa. El sistema de ayudas públicas a la I+D en ambos sitios tienen muy poco que ver. Aunque este tema sea muy interesante por sí mismo y bien merecería una discusión en profundidad, en esta entrada sólo pretendemos ver uno de los actores principales en el escenario científico estadounidense: DARPA, la agencia de defensa para proyectos de investigación avanzada.
DARPA subvenciona y promueve programas de investigación con fines militares, nos guste o no nos guste. Está detrás de miles de proyectos, poniendo sobre la mesa millones de dólares todos los años. Estos proyectos abarcan todas las ramas de la ciencia y el conocimiento humano. Aun con esos fines militares, está claro que DARPA es un motor importante para la ciencia tanto en Estados Unidos como en el mundo entero.
Un gran ejemplo de cómo funciona esta singular agencia gubernamental es el DARPA Challenge, concurso organizado por DARPA en el que pueden participar laboratorios de todo el mundo para hacerse con un suculento premio final. Casualidades de la vida, el próximo Challenge se anunció a finales del 2012, y tendrá que ver con robots de rescate en escenarios catastróficos.
Antecedentes históricos
Durante la primera década del presente siglo, DARPA hizo un gran esfuerzo para impulsar la investigación en coches autónomos. Organizó tres concursos para empujar el desarrollo de unas tecnologías que ellos consideraron claves. Concretamente, se organizaron concursos los años 2004, 2005 y 2007. Los dos primeros fueron en entornos desérticos, sin ningún otro tipo de tráfico. El último, bautizado como DARPA Urban Challenge obligó a los coches sin conductor humano completar unos recorridos en entornos urbanos, con tráfico y respetando las normas de tráfico.
El reto de 2004 fue tal vez demasiado ambicioso para aquellos tiempos. Se pretendía que los coches, sin ninguna ayuda humana, recorrieran 240 km por la Interestatal 15, entre California y Nevada. Ninguno de los participantes logró completar el reto. El equipo que llegó más lejos fue la Universidad de Carnegie Mellon, con una marca de 11,78 km. Muy lejos del objetivo.
En el año 2005, volvieron a la acción. Aquella vez cinco equipos fueron capaces de completar el recorrido previsto por DARPA. Los ganadores fueron los integrantes de la Universidad de Stanford, bajo el mando del alemán Sebastian Thrun. Aquí tenéis el momento de la llegada a meta del coche llamado Stanley.
En una más que honrosa segunda posición quedaron los integrantes de la Universidad de Carnegie Mellon, después de pasarse 7 horas y 5 minutos para llegar a meta. Los ganadores necesitaron 11 minutos menos.
Por último, en el año 2007 se celebró el apasionante Urban Challenge. El reto era recorrer 96 km en entornos urbanos, con tráfico y respetando las leyes de tráfico, tal y como hemos dicho anteriormente. Además, para completar el recorrido había un tiempo límite: 6 horas.
Ese año, tomándose la revancha, los ganadores fueron los de la Universidad de Carnegie Mellon, relegando a Stanford a la segunda posición. También participaron laboratorios tan prestigiosos como el MIT o Virginia Tech, ¡casi nada! Los ganadores necesitaron 4 horas y 10 minutos para completar el recorrido, marcando una media de velocidad de 22,53 km/h. Os dejamos con el video que resume los mejores momentos de la competición. La puesta en escena, como veréis, muy a su gusto 😉
Estos concursos fueron un tremendo empujón para el desarrollo de las tecnologías de coches autónomos. La mejor demostración es el ya muy conocido Google Car, desarrollado por la Universidad de Stanford bajo el mando de Sebastian Thrun, quien aprovechó todo el trabajo hecho para los retos de DARPA. El Google Car ha sido pionero, pero ya tiene seguidores. Hace poco, Lexus ya enseñó su proyecto de coche autónomo, Honda está también investigando en ello y Bosch colabora con BMW. El siguiente video nos muestra cómo benefician estas tecnologías a la sociedad, mostrando a un señor con problemas de visión usar el coche de Google:
Sería muy interesante analizar el proceso que ha llevado a los coches autónomos a la situación actual. Analizar cómo en su momento se apostó por financiar proyectos muy caros con dinero público, cuya aplicación comercial aunque clara, se veía muy lejana. Hoy en día, los coches autónomos empiezan a demostrar que pueden ser un gran mercado en el futuro y los fabricantes ya se están posicionando. Sin embargo, llama la anteción que casi todos ellos están recurriendo a universidades estadounidenses para desarrollar sus propias tecnologías. Tal es el ejemplo de Google, Honda (Japón) y Bosch (Alemania). Es decir, Estados Unidos ha conseguido posicionar a sus universidades en la primera línea de fuego de un mercado del que seguro que obtendrán grandes cantidades de dinero.
DARPA ROBOTICS CHALLENGE
Desde el 2007 DARPA no ha vuelto a organizar otro concurso de esas dimensiones. Pero a finales del año 2012, e impulsados por desastres naturales como el Katrina y sobre todo el de Fukushima, decidieron lanzar un nuevo reto: el DARPA Robotics Challenge.
Este nuevo concurso nada tiene que ver con coches autónomos. El objetivo es desarrollar robots que puedan actuar de inmediato en entornos humanos que han sufrido catástrofes naturales. Los robots concursantes han de ser capaces de conducir un coche para llegar al sitio donde se ha producido la catástrofe, subir escaleras para acceder a los sitios más problemáticos, abrir o derribar puertas, cerrar válvulas de seguridad en caso de escapes y otras tareas propias de humanos. Y todo ello de forma autónoma. Vamos, que de eso a un Terminator ¡ya no queda nada!
La competición se organiza básicamente en dos áreas: en la primera, llamada Track A, los competidores tienen que desarrollar su propio robot y todo el software para locomoción, percepción y manipulación. En la segunda área, llamada Track B, los competidores «sólo» deben preocuparse de desarrollar el software, ya que el mismo DARPA les va a dar un robot humanoide de última generación llamado Atlas. Este robot ha sido desarrollado por la empresa Boston Dynamics, conocidos por otro robot llamado Big Dog (ese robot cuadrúpedo que se hizo famoso en Youtube). En el siguiente video veréis de lo que es capaz el amigo Atlas:
¡Qué no os extrañe que alguna noche de estas os despertéis sudorosos soñando que este robot os está persiguiendo por la calle! En el video hemos visto un prototipo que todavía está en desarrollo. Seguramente ahora se parece mucho más a los diseños que ha colgado DARPA en la red. Hablamos de un robot humanoide, con 150 kg de masa, dos brazos con 7 grados de libertad, dos manos, dos piernas con 6 grados de libertad y una cabeza con sensores de visión estereoscópica y láser 3D. Algo así:
Pero los de DARPA no invierten el dinero a lo tonto. Por ello, han organizado la competición en distintas fases. En cada fase, someterán a los competidores a ciertas pruebas que servirán de criba. Aquellos que se consideren mejores, seguirán adelante con financiación y recursos de DARPA. Los demás, se tendrán que retirar a sus laboratorios a buscarse otros proyectos. Es una apuesta por la excelencia en toda regla.
Virtual Robotics Challenge
La primera fase ha sido bautizada como la competición de robots virtuales. DARPA ha encargado a Open Source Robotics Foundation (Fundación para la robótica de código abierto) que le dé un empujón a su simulador de robótica llamado Gazebo, para ofrecer a todos los participantes un entorno virtual dónde puedan demostrar sus desarrollos.
El uso de simuladores en robótica es muy común, dado que no todo el mundo se puede permitir comprar un equipamiento tan caro. Gazebo es un simulador de código abierto con un motor físico que simula las interacciones entre objetos. En un simulador, un desarrollador puede modelar distintos robots, sensores y entornos. Se puede jugar con los parámetros físicos como la masa de los objetos, la aceleración de la gravedad (para simular otros planetas o satélites), el rozamiento entre objetos, la penetrabilidad de los objetos, la naturaleza de los choques entre objetos y un largo etc. Los simuladores permiten acelerar el desarrollo del software para robótica, permitiendo realizar los primeros tests para validar los desarrollos. Además, los simuladores se diseñan de tal forma que te permiten ejecutar el mismo software en tu robot simulado que en tu robot real. Resumiendo, hoy por hoy son herramientas indispensables para cualquier investigador en robótica.
Volviendo al hilo de esta sección, DARPA creará un entorno simulado para Junio del 2013, sin dar pistas a los contendientes. Aquellos que participen en el Track A, tendrán que modelar sus propios robots en el simulador para competir. Los demás, usarán el modelo simulado de Atlas. Todos ellos tendrán que competir en el simulador, realizando tareas que DARPA definirá. Por ahora, aquí tenéis uno de los videos del simulador que se han dejado ver:
Por cierto, si queréis aprovechar las bondades del código abierto, podéis instalar en vuestros PCs el simulador con todos los modelos para el DARPA Robotics Challenge. Solo tenéis que seguir las instrucciones aquí.
DRC Trials
Aquellos supervivientes de la primera fase, tendrán que seguir trabajando muy duro para las pruebas a las que les someterán en Diciembre del 2013. A los competidores del Track B que sigan adelante, DARPA no sólo les dará financiación, sino que también un robot Atlas para que puedan trabajar por fin con el robot real. Todo ello por que las pruebas de Diciembre del 2013 se realizarán ya con robots reales en entornos reales preparados por DARPA. El espectáculo promete.
Las tareas a realizar en estas pruebas ya están definidas, aunque de forma un tanto genérica. Sirven de guía para el desarrollo de habilidades, pero omiten muchos detalles con el ánimo de impulsar la investigación más básica. DARPA ha hecho públicas las siguientes tareas:
Conducir un vehículo utilitario hasta la zona de catástrofe
Desmontarse del vehículo y desplazarse entre los escombros
Retirar los escombros que bloquean la puerta de entrada del edificio donde se ha dado la catástrofe
Abrir la puerta y entrar en el edificio
Escalar una escalera industrial y atravesar una pasarela industrial
Utilizar una herramienta eléctrica para atravesar una barrera
Localizar y cerrar una válvula cerca de una tubería con escapes
Ser capaz de conectar una herramienta tipo manguera
Los equipos que mejor lo hagan, pasarán a la fase final de la competición.
DRC Finals
Las finales del DARPA Robotics Challenge, donde los equipos competirán por el gran premio final: ¡2 millones de dólares! En principio se disputarán en Diciembre del 2014, pero DARPA se reserva el derecho a cambiar las fechas. Además, todavía no ha anunciado las tareas que tendrán que realizar los robots. Lo único que se sabe es que el premio final será realmente grandioso. Lo más seguro es que DARPA espere a que pasen las pruebas de Diciembre del 2013 para definir mejor lo que exigirá en las finales. Habrá que seguir con atención las noticias que vayan llegando.
Diseños de robots presentados en el Track A
Los participantes del Track A y B ya han sido seleccionados. Para ello, los contendientes del Track A tuvieron que enseñar los diseños de los robots que pretenden construir para la competición. A continuación, os dejamos con los diseños propuestos:
Robosimian, diseño de NASA-JPL (Jet Propulsion Laboratory), el mismo laboratorio que ha desarrolado las misiones de los robots marcianos, entre ellos el Curiosity
El robot HUBO de la Universidad de Drexel, Filadelfia, Estados Unidos
CHIMP, diseñado en la Universidad Carnegie Mellon, inspirado en la movilidad de los simios
El atractivo R2, diseñado por el NASA Johnson Space Center, responsable del conocido Robonaut que ya se está probando en la Estación Espacial Internacional
El robot Guardian, propuesto por Raytheon, empresa de defensa aeroespacial situada en Massachusetts
SCHAFT, diseño propuesto por Schaft Inc
El robot THOR, de Virginia Tech, que destaca por su ligereza
Conclusiones
Así se las gasta DARPA. A lo grande. Identifica tecnologías básicas que deberían desarrollarse, idea las pruebas y escenarios para testearlos y organiza grandes competiciones que subvenciona con dinero público. Entre otras cosas.
Nadie niega los fines militares que mueve a esta agencia, que utilizará todo el conocimiento generado para beneficio de su ejército y horror de algunos pueblos que han de sufrirlo. No quisiera que estas líneas sirivieran para justificar nada de eso. Sin embargo, sí creo que tenemos mucho que aprender de la metodología que utilizan para impulsar y acelerar la investigación en diversos campos.
El conocimiento por sí mismo es un tesoro. Pero además, el conocimiento genera aplicaciones de las cuales podemos beneficiarnos todos. Adelantos para la humanidad. Es el ejemplo de los coches autónomos que tarde o temprano llegarán a nuestras calles. Minimizarán los accidentes, nos permitirán aprovechar mejor nuestro tiempo de viajes, les dará independencia y movilidad a personas con discapacidades y abrirá todo un mercado de trabajo en torno a ellos. Esos coches verán la luz por la gran inversión económica realizada por DARPA.
Lo que surja del último Robotics Challenge también generará avanzadas tecnologías, cuyo uso depende exclusivamente de nosotros. Los podremos utilizar para actuar en situaciones catastróficas, salvar vidas y minimizar desastres, para construir robots de compañía para gente necesitada, para construir robots trabajadores que libren a muchas personas de trabajos físicamente nocivos y un largo etcétera. Pero eso depende de nosotros. Lo que esta entrada pretendía era mostrar formas exitosas de impulsar la I+D. El debate sobre sus fines lo dejaremos para otro lugar y momento.
Premiado en el IV Concurso de Divulgación Científica del Centro Nacional de Física de Partículas, Astropartículas y Nuclear (CPAN) Proyecto Consolider-Ingenio 2010
La entrada sobre femtoquímica ha sido reconocida con el Premio ED a la excelencia en la divulgación científica.