Archivo de la categoría: ingeniería

Historias de Transistores, Silicios y Nanotubos

De las válvulas al Silicio

La electrónica está cambiando el mundo. El transistor es uno de los grandes inventos de la humanidad…y no me refiero a las arradios payo ;). Me refiero a esa pequeña pastilla de semiconductor que mató a la estrella de la válvula. Que sí, que la válvula mola, pero en los amplis de instrumentos.

Historias de válvulas. Válvula electrónica, termoiónica o de vacío. Se trata de un componente electrónico que amplifica, conmuta o modifica una señal eléctrica mediante el control del movimiento de los electrones en un espacio “vacío” a muy baja presión, o en presencia de gases especialmente seleccionados.

La electrónica de mediados del siglo XX se desarrolló gracias a las válvulas. Teléfono, radio, televisión, computadores….La revolución tecnológica fue explosiva. Pero nada comparable a la revolución de los transistores. Gracias a ellos y a la miniaturización que permiten, tenemos en nuestro smartphone una capacidad de procesado increíblemente superior a la de aquellas viejas computadoras antevintage que ocupaban metros y metros cuadrados. Con unos pocos Hz de velocidad de procesador llegamos a la Luna y ahora tenemos poder de GHz en nuestras manos. No te despeines.

Historias de semiconductores. Para conducir la corriente, en las válvulas se utiliza el vacío, en los transistores se utilizan semiconductores. Un semiconductor es un elemento que se comporta como un conductor o como aislante dependiendo de diversos factores, como por ejemplo el campo eléctrico o magnético, la presión, la radiación que le incide, o la temperatura del ambiente en el que se encuentre.

gapLa banda de valencia es el mayor intervalo (bandas) de energía electrónica que alcanzan los electrones en el cero absoluto. La banda de conducción es la que permite las corrientes eléctricas, y se encuentran por encima de las bandas de valencia, tienen mayor nivel energético. En los metales no hay ningún intervalo de energías prohibidas entre las bandas de valencia y de conducción. En los semiconductores y en los aislantes, en cambio, aparece una banda prohibida –gap- por encima de la banda de valencia, seguida de una banda de conducción a energías aún mayores.

La mayoría de los transistores utilizan como semiconductor el Silicio, que tiene un sistema de cristalización tetraédrico similar al del Carbono, mediante enlaces covalentes entre sus átomos. Aunque pueden existir otros materiales semiconductores, generalizaremos con el Silicio por mayoría aplastante de tecnologías. Con las moléculas cristalizadas del Silicio se obtienen unas  nanoestructuras, nanocables. Cuando el cristal se encuentra a temperatura ambiente algunos electrones pueden absorber la energía necesaria para saltar a la banda de conducción dejando el correspondiente hueco en la banda de valencia. El Silicio requiere una energía  de 1,12 eV  a temperatura ambiente. Obviamente el proceso inverso también se produce, de modo que los electrones pueden caer, desde el estado energético correspondiente a la banda de conducción, a un hueco en la banda de valencia liberando energía. Este proceso se llama recombinación. A una determinada temperatura, las velocidades de creación de pares electrón-hueco, y de recombinación se igualan, de modo que la concentración global de electrones y huecos permanece constante.

Historias de corrientes. Los electrones y los huecos son los portadores, y ambos contribuyen al paso de la corriente eléctrica. Si se somete el cristal a una diferencia de potencial se producen dos corrientes eléctricas.

Por un lado la debidesquema energeticoa al movimiento de los electrones libres de la banda de conducción,

Por el otro la debida al movimiento de los huecos; los electrones al desplazarse en la banda de valencia tenderán a saltar a los huecos próximos, originando una corriente de huecos en la dirección contraria al campo eléctrico de velocidad y magnitud muy inferior a la de la banda de conducción.

FET, MOSFET, CMOS..Historias de Transistores.

transistor MOSFET

Los transistores son dispositivos de estado sólido en los que un campo eléctrico controla el flujo de portadores en un canal de conducción. Pueden funcionar como fuentes dependientes de corriente (amplificadores, electrónica analógica) o como interruptores controlados (electrónica digital). Un transistor, por tanto, es una puerta que une dos nanocables.

Los primeros transistores fueron los de efecto de campo, FET. Son unos dispositivos electrónicos con una resistencia de entrada infinita. Los FETs son unipolares debido a que utilizan un solo tipo de carga para transportar la corriente y son controlados por voltaje. En los transistores FET la puerta es una capa de óxido (SiO2), en ambos lados: fuente y sumidero.

La patente  del principio básico de los FET la inscribió  Julius Edgar Lilienfeld en 1925. Famoso no se hizo el muchacho, porque estos transistores de efecto de campo no tuvieron demasiada relevancia. Los laboratorios Bell desarrollaron los MOSFET, y llegaron a un acuerdo con Julius, del que no se saben los términos.

La puerta del FET estaba hecha con un material metálico, Aluminio.  hasta que a alguien se le ocurrió añadir una capa de metal a continuación de la capa de óxido, modificando la puerta. Fue entonces cuando aparecieron los MOSFET, FET de tipo Metal-Óxido-Semiconductor. Si además añadimos, justo antes de llegar a la puerta, una pequeña zona de Si dopado tenemos MOSFET tipo n o tipo p, dependiendo del tipo de impureza que añadamos al Silicio.

La corriente eléctrica que atraviesa la nanoestructura de material semiconductor (Si) se encuentra justo antes de la puerta con una pequeña zona de Silicio con impurezas, que es la que está en contacto con una primera puerta de óxido (SiO2), y a continuación una segunda puerta de metal. Este nuevo diseño resultó extremadamente compacto, condición sine qua non para la integración de circuitos…. Y la integración de circuitos es lo que nos ha permitido tener en una mano más potencia tecnológica que en un centro de cálculo de hace unas décadas.

En un MOSFET por lo tanto la fuente emite portadores (electrones o huecos), el colector hace de sumidero de esos portadores e intercalada entre ambos está la puerta, que modula el paso de los portadores. El sustrato semiconductor tiene tres partes dopadas artificialmente (contaminadas con materiales específicos en cantidades específicas).  Un MOSFET tiene dos uniones bipolares, que son las uniones entre una zona p y una zona n.

En los MOSFET de canal n, la fuente S y el colector D son regiones fuertemente dopadas difundidas en un sustrato de tipo p. Una compuerta conductora G (Gate) se aísla del Silicio mediante una fina capa de SiO2.  Durante el funcionamiento ”normal activo” una tensión positiva es aplicada entre la fuente y el sustrato, lo cual produce una atracción de los conductores de la fuente y el colector creando un canal de conducción entre ellos. Se produce un enriquecimiento de carga negativa.

En los MOSFET de canal p se produce un enriquecimiento de carga positiva. Para ello se intercambian los materiales n y p con respecto a los de canal n. En consecuencia, la dirección de la corriente y las polaridades de las tensiones se ven invertidas. Por ejemplo, para que exista un canal, en un MOSFET de enriquecimiento canal p, la tensión de compuerta debe ser lo suficientemente negativa.

MOSFET P MOSFET N

Hoy la mayoría de los circuitos se construyen con tecnología CMOS (Complementary MOS) . Esta tecnología consiste en unir dos transistores MOSFET de manera complementaria y asimétrica. El diseño consiste en dos MOSFET diferentes, de canal n y de canal p, que se complementan mutuamente y consumen muy poca corriente en funcionamiento sin carga. Los Semiconductores tipo n han sido dopados con elementos que aumentan el número de electrones, en los los semiconductores de tipo p las impurezas hacen aumentar el número de huecos.

Historias de nanómetros y de límites físicos

Las tecnologías CMOS punteras están en torno a los 30nm. Nanómetro son 10 elevado a menos 9 metros…. lo que viene siendo requetepequeño. La evolución tecnológica hace deseable seguir disminuyendo ese límite, pero en el caso de la tecnología CMOS actual, existe una limitación física y es la impuesta por el Silicio, el cual, por debajo de 10nm  comienza a comportarse de manera inestable. Es decir, entran en juego fenómenos cuánticos y por tanto impredecibles. Si no se puede controlar el dispositivo no nos vale.

A medida que los transistores se hacen más pequeños, es más difícil controlar el modo en que los electrones se mueven a través del canal de silicio para encender y apagar el transistor. Al tener que hacer frente a este comportamiento ‘rebelde’ se incrementa el consumo energético. Intel anunció hace unos años que cambiaría a un nuevo diseño de transistor en tres dimensiones para su generación de chips de 22 nanómetros. Otras empresas, sin embargo, están trabajando en los llamados transistores de cuerpo ultrafino. No obstante, al margen de la forma que se le dé, el silicio es silicio, y utilizarlo a tamaños tan pequeños presenta problemas incluso en estos nuevos diseños.

Cuando hablamos de “nanómetros” en el contexto tecnológico estamos hablando por lo tanto del tamaño, precio y rendimiento de los dispositivos electrónicos.

Como hemos dicho, hoy en día las tecnologías punteras son de 30 nm, pero hay prototipos de menor tamaño, rondando el límite físico del Silicio. Si se consiguen tecnologías de menos nm significa que caben más circuitos integrados en el mismo espacio, se consume menos potencia, se aumenta el rendimiento y bajan los costes de fabricación. Cuando se usa una tecnolObleaogía que permite reducir el tamaño de los elementos de un procesador, se reduce también la temperatura de funcionamiento sin necesidad de alterar otros factores como la frecuencia de funcionamiento. Y esto a su vez nos permite hacer procesadores cada vez más potentes incrementando su frecuencia, controlando temperaturas y optimizando tamaños. A su vez, disminuir el tamaño permite fabricar en la misma unidad de superficie (oblea) mayor número de chips,  con lo que se reducen los costes de producción.

Como el Silicio, alma mater de esta tecnología, tiene un límite físico de 10 nm, hay que buscar alternativas, y los nanotubos de carbono se posicionan a la cabeza de la lista. El radio medio del Silicio se mueve entorno a los 110pm, el radio medio del Carbono está entorno a los 70pm. Pero lo realmente diferenciador, es que con el grafeno podemos hacer capas de muy poco átomos.

Del Silicio a los nanotubos de carbono

Los nanotubos podrían ser una alternativa viable al Silicio a medida que la electrónica se haga cada vez más pequeña. Un dispositivo de nueve nanómetros desarrollado por IBM es el botón de muestra.

nanotubo-carbono2Según los investigadores de IBM, el transistor de nanotubos de carbono más pequeño jamás creado, un dispositivo de nueve nanómetros, funciona mejor de lo que lo haya hecho cualquier otro transistor del mismo tamaño.

Llevábamos más de una década escuchando hablar auténticas maravillas sobre la posibilidad de utilizar nanotubos de carbono en lugar del Silicio, pero poco más que humo había hasta que estos investigadores de IBM los fabricaron. Y además aseguran que esta es la primera evidencia experimental de que el material resulta un potencial reemplazo viable del silicio a un tamaño menor de 10 nanómetros.

nanotube_trans_x220

Para comprobar cómo afecta el tamaño de un transistor de nanotubos a su rendimiento, crearon varios transistores de diferentes tamaños a lo largo de un único nanotubo. Esto les permitió controlar las posibles variaciones que puedan producirse de nanotubo a nanotubo.

  • En primer lugar, tuvieron que colocar una capa muy delgada de material aislante sobre la que asentar los nanotubos.
  • Después, desarrollaron un proceso de dos pasos para agregarles puertas eléctricas sin dañarlos.

Estas técnicas no están en absoluto listas para la manufactura, pero permitieron al grupo de IBM crear los primeros dispositivos de nanotubos de menos de 10 nanómetros y ponerlos a prueba en el laboratorio. El trabajo se describe en la revista Nano Letters, si quieres más…léete esto..

El grupo de IBM demostró que su transistor de nanotubos de nueve nanómetros tenía un consumo de energía mucho menor que otros transistores del mismo tamaño. Además, puede llevar más corriente que otros dispositivos de silicio comparables, lo que da como resultado una mejor señal.

Siguen existiendo varios problemas de ingeniería importantes.

  • En primer lugar, los investigadores tienen que encontrar mejores métodos para crear lotes puros de nanotubos semiconductores: añadir tubos metálicos a la mezcla provocaría cortocircuitos en los circuitos integrados.
  • En segundo lugar, deben crear un modo de colocar un gran número de nanotubos en una superficie con una alineación perfecta.

Los retos aún son muchos, pero el futuro parece prometedor. La tecnología cada día nos sorprende más. El ser humano ha encontrado un camino que parece no tener fín.

Votar en los Premios Bitacoras.com

@filotecnologa

Anuncios

Evolución al extremo

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

Votar en los Premios Bitacoras.com

Diseño de robots por evolución

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

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

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

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

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

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

Esto no es solo un juego

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

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

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

Nos seguimos leyendo…

¡Que siga aprendiendo!

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

¡Que aprenda él mismo!

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

Votar en los Premios Bitacoras.com

Un problema de optimización

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

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

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

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

Por fin los algoritmos genéticos

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

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

Algoritmos genéticos by Clara Grima

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

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

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

espacio-soluciones

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

espacio-soluciones-1

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

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

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

espacio-soluciones-2

 

¿Por qué es esto tan chulo?

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

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

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

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

Para terminar

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

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

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

Nos seguimos leyendo…

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

¿Viajamos a las estrellas?

Tal y como está la cosa será mejor que vayamos pensando en ir haciendo las maletas.  Pero, tal y como está la cosa, insisto, es mejor que vayamos pensando en ir hacia sitios un pelín más alejados que Alemania.

¿Sería posible visitar otras estrellas? ¿Qué dice la física al respecto?

Estas son peguntas muy interesantes y lo mejor será que le dediquemos un tiempo a discutirlas. Así que, sí amigos, vamos a hablar de la posibilidad de los viajes interestelares.

Sigue leyendo