Fran Ramírez Vicente

Fran Ramírez Vicente

Ingeniero/Grado en Informática de Sistemas, Técnico Superior en Electrónica Digital y Máster en Seguridad de las TIC. Investigador de seguridad informática en el equipo de Ideas Locas CDCO de Telefónica.

AI & Data
Mujeres que cambiaron las Matemáticas
Por Fran Ramírez y Fran Fenoll Aprovechando que en marzo también se celebra el día Internacional de las Matemáticas, hemos querido rendir con esta recopilación un pequeño homenaje a mujeres que han tenido una gran influencia en esta ciencia desde los inicios de nuestra civilización y hasta la actualidad. Por supuesto, faltan muchas mujeres que no aparecen en este artículo, pero queremos que esta representación sirva para honrar y reconocer a todas ellas. Y como la línea que divide la Tecnología de las Matemáticas es muy delgada, en este enlace os dejamos también la influencia de cinco mujeres que ha destacado en disciplinas como Criptografía, Informática o Comunicaciones. Las pioneras en la Historia Téano Busto de Téano. Fuente. Quizás una de las primeras matemáticas que tenemos constancia es Téano, nacida en el siglo VI a.C. A parte de ser matemática, dominaba también otras disciplinas como la Filosofía, la Física y la Medicina. Se le atribuyen tratados de poliedros, así como de proporcionalidad, en concreto la proporción áurea. Téano es conocida también por ser la mujer del matemático Pitágoras, y pertenecer a la escuela pitagórica. De hecho, gracias a Téano podemos hoy en día estudiar a Pitágoras, pues cuando murió Pitágoras hubo una revuelta contra su escuela, y tanto Téano como sus hijas salvaron sus trabajos, ampliando y difundiendo su estudio años después por Grecia y Egipto. Hipatia Representación de Hipatia de Rafael Sanzio. Fuente. Avanzando en la Historia, nos encontramos con otra gran mujer, innovadora en su tiempo, maestra en la Escuela Neoplatónica de Alejandría, Hipatia. Nació alrededor del año 350 d.C, hija del también matemático y astrónomo Teón. Desde bien joven recibió una enseñanza en ciencias, pero su busca de conocimiento y verdad la llevaron a recorrer diferentes puntos de Atenas y Roma en busca del saber. Ese afán la llevó a la enseñanza, a la oratoria como directora de la escuela de Teón, también conocida como Museion. Destacó durante años como maestra de muchos alumnos tanto cristianos como no cristianos. Aportó escritos en campos como Geometría, Álgebra y especialmente Astronomía. Desafortunadamente falleció linchada por una turba de cristianos en el año 415. El Siglo de las Luces Émilie du Châtelet Gabrielle Emilie Le Tonnelier. Fuente. A principios del siglo XVIII, nace en Francia, Émilie du Châtelet , marquesa de Châtelet, que pese a que podía haber disfrutado de una vida plena de lujos y extravagancias, decidió dedicarse a la investigación a la divulgación de sus teorías, algunas incluso provocando amplios debates en Europa. Destacó sobre todo por su papel en la difusión de las teorías newtonianas, por sus trabajos en el Cálculo Diferencial e Integral. Dada su posición, recibió grandes conocimientos matemáticos de grandes profesores de la época como, Pierre Louis Moreau de Maupertuis, Clairaut, o Koenig entre otros. La influencia de Voltaire fue notable en la marquesa durante muchos años, ambos hicieron una gran pareja, tanto sentimental como laboral. De hecho, ambos estuvieron a punto de ganar el concurso en 1737 organizado por la Academia de Ciencias al mejor ensayo científico sobre la naturaleza del fuego y su propagación, ganado por el famoso matemático-físico Leonhard Euler. La marquesa de Châtelet fue la primera mujer que entró en el Café Gradot para discutir de matemáticas con Maupertuis vestida de hombre, cabe recordar que en aquella época las mujeres no tenían permitida la entrada en dichos lugares sin ir acompañadas. Además, fue la primera mujer en tener un debate científico público. María Gaetana Agnesi También durante el siglo XVIII nos encontramos con la matemática italiana María Gaetana Agnesi, considerada por muchos como la primera profesora universitaria, pues se encargó en 1748 durante dos años de los cursos de su padre. En 1750, después de publicar su obra de las Instituciones analíticas, el Papa le dio el nombramiento para ocupar la cátedra de Matemáticas superiores y Filosofía Natural de la Universidad de Bolonia. El esplendor del Siglo de las Luces se extiende… Sofia Kovalévskaya Sofia Kovalévskaya. Fuente. Sin embargo, otros autores afirman que la matemática rusa Sofia Kovalévskaya, fue la primera profesora universitaria con plaza en Europa en 1881, en Suecia. Recibió clases del famoso matemático Weierstrass en Berlín. Su aportación al Cálculo Diferencial fue muy importante, sobre todo consiguió mejorar un resultado del matemático Cauchy, enunció y demostró el teorema conocido hoy en día como Cauchy-Kowalevski. Esto fue uno de los motivos por los cuales le valió obtener el título de Doctora Summa Sum Laude en la Universidad de Gotinga en 1874, convirtiéndose junto a Agnesi en una de las primeras mujeres en el mundo en conseguirlo. Durante su estancia en Estocolmo su estudio de Cálculo Diferencial consiguió resolver uno de los problemas que más habían atribulado a matemáticos famosos: la rotación de cuerpo sólido en torno a un punto fijo, que junto a las soluciones conocidas de Euler y Lagrange se resolvió el problema planteado en 1850 por la Academia de Ciencias de Berlín. Hoy el día Sofía Kovalevsky, organizado por la Asociación de Mujeres en Matemáticas (AWM), promueve la financiación de talleres en los Estados Unidos para alentar a las niñas a explorar las matemáticas. Sophie Germain Hacia finales del siglo XVIII, nos encontramos con la matemática francesa Sophie Germain. Destacó entre otras cosas por el desarrollo de la Teoría de Números y la Teoría de la Elasticidad, pero sobre todo de su estudio podemos destacar los números primos de Sophie Germain y el intento de demostración del teorema de Fermat, que pese a no conseguirlo pudo extraer conclusiones como el teorema que lleva su nombre. Durante su vida mantuvo correspondencia con los matemáticos Lagrange y Gauss. En ambos casos y dados los tiempos que eran Sophie Germain se hacía pasar por hombre, solo al cabo de un tiempo dio a conocer su verdadera identidad. En 1816 ganó el concurso, con el trabajo que tenía por título “Mémoire sur les Vibrations des Surfaces Élastiques” Se convirtió en la primera mujer que asistió a las sesiones de la Academia Francesa de las Ciencias. Hoy en día se otorga anualmente Premio Sophie Germain al investigador/a que haya realizado el trabajo más importante en Matemáticas. La inspiración de Ada Lovelace Mary Somerville Durante el avance de las universidades escocesas frente a otras europeas, comandadas por el científico Lord Kelvin, surge la figura de Mary Somerville. Nació en Edimburgo en 1740, y pese a que en aquella época las mujeres no podían acceder a universidades ni sociedades matemáticas, no le impidió divulgar sus conocimientos adquiridos y conseguir la medalla de plata por la solución de un problema sobre las ecuaciones diofánticas en el Mathematical Repository de William Wallace. Además, en 1826 Mary Somerville escribió su primer artículo The Magnetic Properties of the Violet Rays of the Solar Spectrum para Royal Society en Philosophical Transactions y eran los primeros escritos firmados por una mujer hasta la fecha. Entre sus logros más destacados podemos destacar su trabajo en Astronomía en el estudio de la órbita de Urano, algo que permitió años después el descubrimiento del planeta Neptuno, dicho trabajo le valió la medalla de honor de la Sociedad de Astronomía y diferentes medallas reconocimientos en diferentes sociedades y universidades europeas. Ada Lovelace Ada Lovelace circa 1836. Fuente. Mary Somerville fue una inspiración para Ada Lovelace. Ada Augusta Byron, hija del poeta Lord Byron y de la también matemática Anne Isabella Noel Byron, nació en 1815, y destaca por el trabajo que realizó junto a Charles Babagge en la construcción de una máquina diferencial y la analítica (esta última nunca la llegó a construir), posiblemente la precursora de los ordenadores. Todas las contribuciones de Ada aportadas al funcionamiento de la máquina de Babbage tenía que firmarlas bajo las siglas AAL y estas notas se han convertido en lo que hoy día en la base de lo que hoy llamamos algoritmos informáticos. Por lo tanto, podemos afirmar entonces que Ada Lovelace fue la primera programadora de la Historia. Y pese a su muerte temprana, su legado es reconocido hoy en día, recibiendo un lenguaje de programación su nombre ADA. Las grandes injusticias y los tiempos modernos Amalie Emmy Noether Una de las grandes injusticias que se han cometido con las mujeres matemáticas por su condición de sexo es sin duda la sufrida por Amalie Emmy Noether. Emmy nació en Alemania en 1882, destacó por su trabajo en el campo del Álgebra y la Topología, pero pese a sus grandes conocimientos, estudios y la ayuda de matemáticos como David Hilbert y Felix Klein, no consiguió una plaza en la universidad, ni durante su etapa en Alemania ni en Estados Unidos en la universidad de Princeton, debía dar sus clases en el College para señoritas Bryn Mawr. Maryam Mirzakhani Maryam Mirzajani. Fuente. De los últimos años nos gustaría resaltar la figura matemática iraní Maryam Mirzakhani, nació en 1977 en Teherán y ha estado dando clases en Stanford, hasta su fallecimiento temprano a los 40 años. Se dedicó al estudio de la Geometría, Topología y Cálculo Diferencial, pero sobre todo a las superficies hiperbólicas y de Riemann. Maryam tiene el honor de ser la primera mujer que ha recibido la medalla Fields, premio cada cuatro años desde 1936 que tiene el reconocimiento académico similar al premio Abel desde 2003 y al Premio Nobel (Recordemos que Alfred Nobel no consideró otorgar Premio Nobel matemático por las diferentes leyendas que hablan de “problemas” con los matemáticos). * * * Nota personal de Fran Fenoll Me gustaría resaltar a una matemática en mi vida, que fue toda una inspiración y modelo a seguir, su nombre es Fuensanta Andreu (1955-2008) Catedrática de Matemática aplicada de la Universidad de Valencia. Tuve la gran suerte de tenerla como profesora, no sólo por todo su trabajo en el análisis funcional y diferencial sino la cercanía y la sencillez con la que transmitían sus clases. Gracias por tu paciencia y ayuda. AI OF THINGS Las Matemáticas del Machine Learning ¿Qué debo saber? 19 de febrero de 2019
9 de marzo de 2023
AI & Data
Las matemáticas del Machine Learning: Números aleatorios y dónde encontrarlos (II)
En el artículo anterior mencionamos la importancia que tienen en nuestro día a día los números aleatorios, utilizados para realizar cualquier tipo de simulación y fundamentales a la hora de la seguridad en un mundo cada vez más digital. Sabemos que su origen se remonta al principio de los tiempos, y su evolución ha sido constante desde entonces. No obstante para conseguir una secuencia de números aleatorios necesitaremos un determinado algoritmo determinista el cual asemeje su secuencia a una realmente aleatoria. Dichos algoritmos reciben el nombre de generadores de números pseudo-aleatorios. En este artículo nombraremos algunos de ellos y su importancia a lo largo de nuestra historia. Fueron Maurice Kendall y Bernard Babington-Smith a finales de los años 30 quienes nos aportaron nada más y nada menos que 100.000 dígitos completamente aleatorios, una cifra que en aquella época era todo un logro, y que hasta que Rand Corporation en 1955 publicó un millón de dígitos fueron ampliamente utilizados en diferentes campos de investigación. Pero podríamos afirmar que los grandes impulsores de los números aleatorios fueron Von Neumann, Metropolis, Ulam y Lehmer, quienes con sus diferentes métodos revolucionaron el mundo de lo aleatorio. El método MidSquare Durante los años 40, John Von Neumann y Nicholas Metropolis desarrollaron el método de los cuadrados medios, Mid-square Method. Originalmente dicho método era para poder generar números pseudoaleatorios de 4 dígitos, aunque bien es cierto que el algoritmo también funciona si introducimos un valor inicial x0 que tenga 2n cifras. El algoritmo en reglas generales consiste en los siguientes pasos: Coger un valor inicial denominado semilla x0 de 4 dígitos. Elevar dicho número al cuadrado x20 y obtener sus 4 cifras centrales x1. Se genera un número pseudoaleatorio: Figura 1. Fórmula para generar un número pseudoaleatorio 4. Volver al paso 2 y repetir proceso. Continuaremos repitiendo y obteniendo una sucesión hasta obtener un valor repetido, lo que producirá que la secuencia pase a ser cíclica y por tanto predecible completamente. En el siguiente fichero PDF contiene un par de ejemplos obtenidos utilizando este método: method-square Download Métodos Congruenciales Hoy en día, los métodos más utilizados para obtener una sucesión de números pseudo-aleatorios son mediante los generadores congruenciales lineales, (GLC), los cuales fueron introducidos en 1951 por Lehmer. Un generador GLC es un algoritmo que obtiene números pseudoaleatorios a través de una función lineal definida a trozos discontinua. La sucesión de números pseudoaleatorios se obtiene mediante la siguiente fórmula de recurrencia: Figura 2. Fórmula de recurrencia. Donde m es un número natural, recibe el nombre de módulo, a es el multiplicador y b el incremento. Además tanto a como b son números naturales menores que el valor m. Diremos que se trata de un generador congruencial lineal multiplicativo (GLMC) cuando b=0. Dicho generador también recibe el nombre de Generador de números pseudoaleatorios de Lehmer. En caso de que b sea no nulo diremos que el generador congruencial es mixto. La secuencia de números generada será el residuo de la operación aXk+b entre m. Eso es lo que significa el operador mod. Por lo tanto los resultados del residuo de la división pueden ir desde 0 hasta m-1. Veamos a continuación un ejemplo: Consideramos x0 = 17, a = 6, b = 5, m = 38 xk a b axk+b m mod m x{k+1}177512436161616 117 999 68 323232 229 131313 96 242424 173 292929 208 282828 201 212121 152 888 61 252525 180 000 5 555 40 444 33 333333 236 202020 145 111 12 121212 89 171717 124 161616 117 99 Los números pseudoaleatorios, los obtenemos: Figura 3. Fórmula para obtener los números pseudoaleatorios. Otros métodos de la actualidad Uno de las variantes de los métodos congruenciales evolucionados de los métodos congruenciales lineales de Lehmer es el conocido como Generador Lagger-Fibonacci. El nombre es por la familiaridad con la famosa serie de Fibonacci. La serie de recurrencia viene dada por la siguiente expresión: Figura 4. Fórmula para la serie de recurrencia. Donde: M = 2m , siendo m cualquier entero positivo. ⊗ es cualquier operador binario como + , - , * ... 0 < J < k < n Entre sus características podemos destacar que el máximo periodo generado puede ser (2k - 1) * 2m-1, y además puede generar hasta 2k-1 * 2m-1 ciclos diferentes con periodo máximo. Otro generador muy utilizado por su alta calidad es el generador Mersenne twister que fue desarrollado por Makoto Matsumoto y Takuji Nishimura en 1997. El nombre proviene de que su longitud del periodo proviene de un número primo de Mersenne. (Mn = 2m-1 - 1). Dicho generador es utilizado a día de hoy en programas como Python, Ruby, Excel, C++, Mathlab entre otros, pues puede generar un periodo de 219937 - 1. Nostalgia retro Para terminar este artículo y como anécdota, durante los años 80 en tiempos del famoso Spectrum y Commodore 64, muchos de nosotros nos quedamos realmente maravillados ante la simpleza y la complejidad de los números aleatorios. En concreto, había una sola línea, en este caso para el BASIC de Commodore 64 que era la siguiente: 10 PRINT CHR$(205.5+RND(1)); : GOTO 10 Esta simple línea de código generaba maravillosos laberintos interminables. Muchos quedamos maravillados con lo que era posible generar simplemente con una sola linea de programación. Este simple programa define, como ningún otro, la maravillosa relación de los números aleatorios con la programación. Por cierto, hay incluso un libro (que podéis descargar desde aquí) hablando del impacto y lo maravilloso de esta simple línea de código. Recuerda que este articulo es uno más de nuestra serie de Matemáticas del Machine Learning: Las Matemáticas del Machine Learning ¿Qué debo saber? Las Matemáticas del Machine Learning: explicando la Regresión Lineal (I) Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (II) y Multilineal. Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (III) y Multilineal. Contraste y Fiabilidad. Las Matemáticas del Machine Learning: Ejemplos Regresión Lineal (IV y último). Implementación en lenguaje R Las Matemáticas del Machine Learning: Redes Neuronales (Parte I) Las Matemáticas del Machine Learning: Redes Neuronales (Parte II) Las matemáticas del Machine Learning: Funciones de activación Las matemáticas del Machine Learning: el mecanismo de Backpropagation Las matemáticas del Machine Learning: Números aleatorios y dónde encontrarlos (Parte I) Escrito para LUCA por el matemático Fran Fenoll (@ffenoll16) y Fran Ramírez (@cyberhadesblog y @cybercaronte) del equipo de Ideas Locas CDCO de Telefónica).
24 de febrero de 2021
AI & Data
Las matemáticas del Machine Learning: Números aleatorios y dónde encontrarlos (Parte I)
¿Cuántas veces a la hora de repartir algo con los amigos/as hemos dicho: "piensa en un número del 1 al 10"? ¿La respuesta es realmente aleatoria? Si utilizamos una calculadora o un ordenador, ¿sería más aleatoria? O por el contrario ¿existe un algoritmo que genere dicho número aleatorio? ¿Los patrones en los juegos son predecibles, o no lo son? En caso de serlos, ¿podríamos encontrar un algoritmo y resolverlo siguiendo los pasos?. Nuestra compañera Paloma Recuero ya nos ha hablado en algunos artículos sobre los números aleatorios ofreciendo siempre un enfoque práctico hacia la Inteligencia Artificial y el Machine Learning utilizando Python: Python para todos: ¿Por qué usamos números aleatorios ? Python para todos: 5 formas de generar datos aleatorios Por nuestra parte, en Ideas Locas CDCO también hemos trabajado con ellos como en este proyecto de una baliza generadora de números aleatorios con una Raspberry Pi. Por lo tanto, como habéis podido comprobar, los números aleatorios están en todas las facetas de la tecnología y sí, también en los videojuegos como veremos más adelante. Figura 1. Funcionamiento de la baliza de números aleatorios donde se puede comprobar la utilización de los diferentes sensores para generarlos. Significado de "aleatoriedad" Pero vayamos por pasos. Antes de ver si podemos predecir o no estos números, tengamos en cuenta lo que significa aleatoriedad. Podemos definir la aleatoriedad como un proceso en el cual el resultado es imprevisible, un proceso en el cual solo influye el azar. Por ejemplo la extracción de una bola de una urna que contiene 5 bolas numeradas del 1 al 5, es un proceso aleatorio. Sin embargo, si hablamos de extraer un número par o impar de una urna de bolas numeradas del 1 al 5 no se trataría de un proceso aleatorio. ¿Cuál es la diferencia entre el primer y segundo caso? La probabilidad de los sucesos, en el primer caso todos tenían la misma probabilidad, eran equiprobables, pero en el segundo caso la probabilidad de obtener un número par es menor que la de obtener un número impar. Si nosotros pensamos ahora mismo un número al azar, ¿es realmente aleatorio? O por el contrario tenemos algún favorito o algún número que se repite más en nuestra mente. Nosotros podemos estar sugestionados por algún número en particular, pero las máquinas no (excepto Terminator que demuestra que tiene sentimientos). Entonces, ¿cómo conseguimos un generador de números aleatorios realmente eficaz? Generadores aleatorios El concepto de aleatoriedad se conoce desde tiempos antiguos y diferentes culturas. Por ejemplo, según la mitología griega, Zeus, Poseidón y Hades, una vez derrotaron a Cronos, se repartieron a suertes quién reinaba en el cielo, tierra y el inframundo. Los números aleatorios han sido utilizados tradicionalmente en una gran variedad de aplicaciones (juegos, aplicaciones, criptografía, experimentos científicos, etc.). Desde el principio de la historia, “la calidad” o “pureza” de estos números aleatorios determinará el éxito en la resolución de los problemas en diferentes áreas. Por lo tanto, ¿cómo podemos encontrar o generar una sucesión de números aleatorios? Figura 2. A la izquierda, presentación gráfica de un número aleatorio y a la derecha otra representación de uno menos eficiente al incluir patrones de repetición. Fuente. Un generador de números aleatorios es un dispositivo informático o físico diseñado para producir secuencias de números sin aparentemente orden alguno. Conviene resaltar que los números aleatorios no deben ser generados con métodos escogidos al azar. Las sucesiones de números aleatorios reales se fundamentan en fenómenos físicos como la radioactividad, erupciones solares, sonidos atmosféricos,… Random.org Por ejemplo en RANDOM.ORG podemos encontrar verdaderos números aleatorios en un determinado rango elegido por el usuario. La aleatoriedad proviene del sonido atmosférico, que para muchos propósitos es mejor que los algoritmos de números pseudo-aleatorios, de los cuales hablaremos a continuación. RANDOM.ORG se usa fundamentalmente para realizar sorteos, loterías, para impulsar juegos en línea, para aplicaciones científicas y para arte y música. El servicio existe desde 1998 y fue creado por el Dr. Mads Haahr de la Escuela de Ciencias de la Computación y Estadística del Trinity College de Dublín en Irlanda. Los números generados a partir de la teoría matemática y con ayuda de computadoras que logran pasar las pruebas estadísticas con respecto a su carácter aleatorio, reciben el nombre de números pseudoaleatorios. Un generador de números pseudoaleatorios, también conocidos por sus siglas en inglés GPAN, es un algoritmo que produce una sucesión numérica aproximada de un conjunto aleatorio de números. Desde un punto de vista más matemático/teórico definimos un generador pseudoaleatorio como una estructura: Figura 3. Estructura de un generador pseudoaleatorio Donde X es un conjunto finito, x0 es un valor inicial, T es una función de transición: Figura 4. Función de transición U es un conjunto finito de "observación" y g es la función de salida: Figura 5. Función de salida Básicamente, a partir de un valor x0, se genera una sucesión xn mediante una función de recurrencia: Figura 6. Función de recurrencia Cada uno de estos números genera a su vez un número pseudoaleatorio: Figura 7. Número pseudoaleatorio La sucesión de estos números es periódica dado que X es un conjunto finito. Podemos decir que un buen generador de números pseudoaleatorios tiene que tener una sucesión no repetitiva tan larga como sea posible. Es decir, que cuanto más tarde en volver a generar un número pseudoaleatorio repetido, mejor. Modelos más conocidos A finales de los años 30, Maurice Kendall y Bernard Babington-Smith obtuvieron 100.000 dígitos aleatorios, gracias a uno de los primeros dispositivos mecánicos que producían números aleatorios. Dicho dispositivo recopilaba dígitos aleatorios obtenidos mediante la iluminación de una lámpara relámpago sobre un disco giratorio iluminado. Dichos dígitos fueron ampliamente usados hasta la publicación por parte de la RAND Corporation de un millón de dígitos aleatorios en 1955. Podemos decir que los modelos de generadores aleatorios nacieron en la década de los cuarenta gracias a Von Neumann, Nicholas Metropolis ( ¿o quizás deberíamos decir Arianna Rosenbluth?), Ulam y Lehmer, que influyeron notablemente en los procesos estocásticos. Sobre todo, el punto de inflexión fue el Método de Montecarlo. Aunque originalmente Neumann y Ulam utilizaron ruletas y dados en los problemas de difusión de neutrones, hoy en día este es uno de los métodos para generar números más usado en el mundo. A continuación destacamos algunos de los generadores más conocidos o que más han influido a lo largo de los años: Midsquare method. Método congruencial lineal de Lehmer. Método Mixto de congruencias Método multiplicativo de congruencias Generador Shift-Register Generador Lagged-Fibonnaci Mersenne Twister Aplicaciones de generadores Los generadores de números pseudo aleatorios son ampliamente utilizados hoy en día, sobretodo en aplicaciones tanto de seguridad como de uso particular. Método de Montecarlo La simulación de Montecarlo, también conocida como el Método de Montecarlo debe su nombre al gran famoso casino de la ciudad de Montecarlo. La ruleta es uno de los juegos más populares de azar y apuestas, y también uno claro ejemplo de generador de números aleatorios. El objetivo principal del Método de Montecarlo no es otro que imitar el comportamiento de variables reales para predecir resultados y/o evoluciones. Este método es utilizado sobretodo en el campo de la economía, en concreto en finanzas, para crear, valorar y analizar carteas de inversión, creación de modelos de gestión de riesgo… Criptografía Hoy en día la seguridad en la información es una de las cosas más importantes que posee una empresa. Por ello la criptografía influye notablemente en la seguridad de las empresas, a su vez los números aleatorios son la fuente de esta disciplina. Algunos de los ejemplos más claros donde influyen son: Claves o firmas digitales. Mecanismos de autentificación. Llaves secretas. Videojuegos Comportamientos aleatorios o secuencias no deterministas en los juegos, por ejemplo en los juegos de azar de cartas, o algún comportamiento/movimiento de jugadores (Pacman fue uno de los primeros y prácticamente cualquier videojuego que imagines lleva números aleatorios de una forma u otra) , las piezas que salen en el Tetris, etc. Como hemos podido observar, las aplicaciones de los números aleatorios son prácticamente ilimitadas y muy importantes en el mundo de la tecnología. Por este motivo no te pierdas las siguientes publicaciones sobre este apasionante tema de los números aleatorios. Recuerda que esta serie tiene los siguientes artículos ya publicados: Las Matemáticas del Machine Learning ¿Qué debo saber? Las Matemáticas del Machine Learning: explicando la Regresión Lineal (I) Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (II) y Multilineal. Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (III) y Multilineal. Contraste y Fiabilidad. Las Matemáticas del Machine Learning: Ejemplos Regresión Lineal (IV y último). Implementación en lenguaje R Las Matemáticas del Machine Learning: Redes Neuronales (Parte I) Las Matemáticas del Machine Learning: Redes Neuronales (Parte II) Las matemáticas del Machine Learning: Funciones de activación Las matemáticas del Machine Learning: el mecanismo de Backpropagation Escrito para LUCA por Fran Fenoll (@ffenoll16) y Fran Ramírez (@cyberhadesblog y @cybercaronte) del equipo de Ideas Locas CDCO de Telefónica).
26 de enero de 2021
AI & Data
Neuromante vs Neurolink:"Alto, Policía de Turing: ¡usted es una IA!"
Este clásico de la Ciencia Ficción (escrito en 1984) por el genial Willian Gibson llamado "Neuromante" (Neuromancer), es una auténtica montaña rusa de emociones, donde se mezclan diversos géneros (acción, mafia, cine negro, ciencia ficción, etc), implantes biónicos, hackers, ciberdelincuentes, Inteligencia Artificial, drogas, psicodelia y un largo etcétera. En la sociedad descrita en el libro, prácticamente todo el mundo tiene su propio implante electrónico en alguna parte de su cuerpo, ya sea para potenciar algún sentido o para “simplemente” conectarse a algún dispositivo. La navegación por el Internet del libro que Gibson denominó con gran acierto “Ciberespacio” (término que se utiliza hoy día y se acuñó por primera vez en este libro) se realiza justamente de esa manera, conectando el cerebro directamente a la red. Qué locura ¿verdad? Conectar aparatos directamente al cerebro humano … vaya ocurrencia ¿a quién se le ocurriría semejante idea a día de hoy?. Pues a Elon Musk, quién si no ;) Neuromante, el icono "Ciberpunk" Pero antes de ver las relaciones entre la última idea de Elon y Neuromante, vamos a adentrarnos un poco en las entrañas de fantástico libro, ya un clásico de la Ciencia Ficción, símbolo del movimiento Ciberpunk que inspirado obras de arte como Matrix o Ghost in the Shell, entre muchas otras. Aviso importante, habrá spoilers (aunque pocos...) En esta novela, se nos presenta un mundo distópico donde como antes hemos comentado, las conexiones al Ciberspacio y con otros dispositivos electrónicos se realizan usando una interfaz implantada directamente en el cerebro. Al conectarse por ejemplo a la red (que por cierto, la cual denomina también “Matrix”), el ciberespacio aparece ante nosotros en todo su esplendor en algo parecido a lo que sería hoy día la realidad virtual. Y por supuesto, la Inteligencia Artificial tiene un papel bastante importante dentro de la historia, como ahora veremos. Figura 1. Portada de la primera edición de Neuromante. Fuente. Henry Dosertt Case, el “console cowboy” Henry Dorsett Case, es un hacker, adicto a las drogas y un cibercriminal (recuerda, un hacker NO ES un cibercriminal) de poca monta que vive en los suburbios de Chiba City, en Japón. Debido a un pequeño incidente con una de las mafias locales (básicamente le pillaron robándoles), estos le inyectan una toxina en su cuerpo la cual le bloquea el uso de su interfaz de conexión. Esto para él es la perdición ya que es su principal medio de vida y es entonces cuando comienza a buscar alguna clínica ilegal que le ayude a eliminar dicha toxina. Esto le lleva a una espiral de autodestrucción de la cual es salvado por Molly, una “samurái callejera” que trabaja para otro misterioso personaje llamado Armitage. Este le ofrece a su vez una cura a cambio de algunos "trabajos" variados, pero además, le implanta un recambio de su páncreas con otro capaz de evitar que metabolice cocaína y anfetaminas, y de esta forma eliminar su mortal adicción a las drogas. Lo que no sabía Case es que también le habían insertado unos sacos con un veneno que le quitarían cuando terminara de realizar todo su trabajo. A partir de este punto comienza realmente la aventura de Case. A medida que Armitage le va encargando diferentes misiones, Case también intenta averiguar quién es ese misterioso personaje a la vez que aparecen otros muy interesantes dentro de la historia. El desarrollo de la trama es demasiado largo y complejo para tratarlo aquí así que vamos a centrarnos en aquellos que están relacionados directamente con la Inteligencia Artificial y de una forma más indirecta, con el trabajo de Elon Musk. Fi gura 2. Imagen de Shibuya (Tokio), escenarios que influyeron en la estética de Neuromante. Fuente. Volcando la mente en una ROM El primer trabajo que Armitage le asigna a Case es robar una ROM. Hasta aquí nada excepcional, es "simplemente" robar un chip. Pero lo interesante de esta misión es que dentro de ese chip se encuentra, nada más y nada menos, la conciencia completa de una persona. En concreto, de un experto hacker llamado McCoy Pauley o también llamado “The Dixie Flatline” fallecido unos años antes. Y este es uno sólo uno de los maravillosos conceptos futuristas que nos regala Neuromante: almacenar la conciencia de una persona fallecida en un medio de almacenamiento electrónico. Esto además es un primer salto hacia una posible inmortalidad del ser humano (este concepto es también brillantemente implementado en la serie Black Mirror aunque de manera un poco más superficial). Pero por otro lado abre otro abanico de problemas tanto éticos, espirituales o incluso morales ¿es realmente la misma persona? ¿se puede “clonar” esa conciencia? Etc. Además, esta integración mente-máquina abre todo un campo de posibilidades donde sólo podemos soñar las habilidades que esta podría tener en nuestro mundo actual super conectado. Esto provocaría que, junto al a Inteligencia Artificial, sería prácticamente indistinguible una consciencia humana de una IA. Pero además, una posible fusión entre ellas podría dar lugar a toda una super raza, superior incluso a aquellas que hemos imaginado como Skynet al integrar ambas, la consciencia humana y la IA, las cuales podrían llegar a dominar ambos mundos, el real y el virtual. Es más, estas consciencias o incluso las IA, podría acceder directamente al cerebro de las personas a través de esa interfaz de conexión en una especie de "posesión diabólica" digital. Vaya lío ¿no?. Pero no os preocupéis, para eso tenemos a la Policía de Turing. Figura 3. Detalle de un cartucho de videojuegos con memorias ROM. Fuente. La policía de Turing, para poner un poco orden La Policía de Turing (maravilloso nombre con infinitas implicaciones) aparece en la novela justo para eso, controlar a la Inteligencia Artificial. De hecho, su principal misión es regular su potencia o poder, limitando (utilizando dispositivos o software bloqueador e incluso otras IA) por ejemplo, que pueda mezclarse con una consciencia o que esta se fusione con otros dispositivos, arquitecturas o incluso, pueda acceder a un cerebro humano y finalmente también fusionarse con él. En otras palabras, esta policía existe para evitar que esta crezca de manera descontrolada o llegue a tener demasiado poder. Por cierto, hoy día existe un organismo, que a pesar de estar muy lejos del concepto “Policía de Turing”, comparten el mismo principio: controlar a la IA por el bien de la humanidad. Y este organismo se llama OpenAI cuyo eslogan es “Our mission is to ensure that artificial general intelligence benefits all of humanity”. ¿Y sabéis quién está detrás de esta organización? Habéis acertado otra vez: Elon Musk. Wintermute y Neuromante, el Ying y el Yang del ciberspacio En este mundo ciberpunk, las IA son una herramienta habitual para todo tipo de situaciones y aplicaciones. Cada hacker tiene su propia colección en su caja de herramientas las cuales va utilizando en función de las necesidades, sobre todo para realizar sus “gestiones” dentro del ciberespacio. Estas inteligencias artificiales están alojadas en grandes servidores dentro de las diferentes corporaciones (¿alguien dijo cloud?) y se mueven a su antojo por todos los rincones del ciberespacio, pero también del mundo real a través de los diferentes interfaces implantados en los seres humanos. Wintermute y Neuromante, son dos poderosas inteligencias artificiales cuyo objetivo principal es fusionarse en una sola IA (bueno, en realidad es el objetivo sólo de Wintermute) y además, obtener algún host, es decir, fusionarse a su vez con un ser humano. El problema es que ambas tienen esos mecanismos introducidos por la Policía de Turing los cuales bloquean cualquier intento por conseguirlo. Ambas IA tienen un gran protagonismo en la historia actuando en diferentes situaciones en las cuales podemos ver sus grandes dotes de manipulación. Es decir, llegados a un punto, es prácticamente imposible distinguir entre un ser humano, una consciencia volcada en una ROM o una Inteligencia Artificial. Antes hemos comentado que las consciencias volcadas de personalidades se almacenan en una ROM, pero las IA se almacenan en RAM. Ambos términos son utilizados dentro del contexto de la época, no olvidemos que se escribió en los años 80. Pero su concepto es interesante ya que quiere decir que una conciencia almacenada en una ROM no puede evolucionar, es decir, no puede cambiar su programación por lo cual permanece inalterada manteniendo su personalidad. En cambio, las IA tienen RAM, es decir, pueden expandir su poder de computación en función de su disponibilidad y evolucionar prácticamente sin límite desarrollando cualquier tipo de personalidad o personalidades. De hecho, la RAM es el bien más preciado dentro del mundo ciberpunk de Neuromante. Figura 4. Arquitectura de Vision AI en la nube de Google. Como ocurría en Neuromante, hoy día la potencia de la IA está ubicada en la nube. Fuente Elon Musk y la interfaz de conexión en Neuromante Aunque el proyecto de Elon Musk no tiene ni de lejos, la tecnología necesaria para llegar a crear el fantástico mundo de Neuromante, sí que abre la puerta para para soñar con un primer paso para crear esa interfaz de conexión inicial humano – máquina- ciberespacio. El pobre Elon está recibiendo muchas críticas desde el mundo científico (como desde el MIT por ejemplo), pero si algo ha demostrado el fundador de SpaceX y Tesla es que no se deja amedrentar por las críticas. En la presentación que ofrecieron recientemente básicamente mostraron unos nuevos electrodos conectados al cerebro de un cerdo, algo que decepcionó a muchos debido al hype que se creó antes del evento. Incluso se llegó a pensar que se implantaría el chip a un ser humano, algo que hasta donde sabemos, aún no se ha realizado. El implante que tenía el animal registraba las diferentes activaciones de las neuronas (capaz de registrar hasta más o menos 1.000) y esas eran convertidas a su vez a sonidos. Esto no sorprendió a los científicos, era algo que ya se había hecho antes en el pasado. Lo que sí llamó la atención de los científicos fue un dispositivo llamado “The Link”, una definición que acerca aún más esa pasarela de Neuromante con la tecnología de Musk. Este pequeño aparato de forma circular contiene la tecnología necesaria para procesar toda la información recibida desde el cerebro. Se “conecta” superficialmente con el cerebro a través de un pequeño agujero realizado en el cráneo para transmitir de forma inalámbrica los datos. En otras palabras: ya tenemos la interfaz de conexión con nuestro cerebro. Incluso han diseñado la máquina para insertar la tecnología necesaria tanto en la piel como en el cerebro. Y claro, también una app … Figura 5. "The Link". Fuente. Neuralink y la funsión IA – mente para curar enfermedades y algo más … Las implicaciones beneficiosas en el mundo de la medicina, si esta tecnología se lleva a cabo, pueden ser realmente excepcionales. Desde poder volver a dar movimiento a personas con algún tipo de parálisis hasta analizar y buscar posibles curas para enfermedades relacionadas con el cerebro como el Alzheimer, por ejemplo. Pero abre otros interrogantes como el posible daño al cerebro debido a los implantes o la seguridad de los dispositivos (nadie quiere tener un malware en su cabeza), entre otros muchos. Sobre la integración de la IA y la consciencia, algo que pasaba en Neuromante y que la Policía de Turing tenía que perseguir, es otro factor a tener en cuenta. El mismo Elon Musk habla de esta posible integración IA – mente: “On a species level, it’s important to div out how we coexist with advanced AI, achieving some AI simbiosis. Such that the future of world is controlled by the combined will of the people of the earth. That might be the most important thing that a device like this achieves.” Es decir “A nivel de especie, es importante averiguar cómo coexistimos con una IA avanzada, consiguiendo algún tipo de simbiosis con ella. De tal manera el futuro del mundo estará controlado por la combinación de las voluntades de la gente de la Tierra. Esto podría ser el logro más importante que pueda conseguir este dispositivo”. Ahí es poco. De nuevo, la realidad se parece cada vez más a la ficción. Si te ha gustado este post, no olvides visitar nuestra serie Ciencia Ficción vs Inteligencia Artificial: Ciencia Ficción vs Inteligencia Artificial: Star Wars, “…para ser un droide mecánico parece que piensas demasiado…” Ciencia Ficción vs Inteligencia Artificial: HAL 9000 “Doctor, no entiendo a los humanos” Ciencia Ficción vs Inteligencia Artificial: Saturno 3, “Héctor, robot malo, el perro no se come” Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken? Ciencia Ficción vs Inteligencia Artificial: Interestellar, “… hey Tars, ¿cuál es tu parámetro de honestidad? Ciencia Ficción vs Inteligencia Artificial: Her, “Mi novia es un sistema operativo y no me importa lo que digan” Ciencia Ficción vs Inteligencia Artificial: “Star Trek: la película”. ET es una IA. Ciencia Ficción vs Inteligencia Artificial: Matrix ¿vivimos en una simulación? Ciencia Ficción vs IA: Cita con Rama o cómo mantener tu nave interestelar limpia y operativa con robots autosuficientes Para mantenerte al día con el área de Internet of Things de Telefónica visita nuestra página web o síguenos en Twitter, LinkedIn y YouTube
28 de octubre de 2020
AI & Data
Estado del arte de la IA aplicada a videojuegos
En el post anterior, nos planteamos por qué los videojuegos, a pesar de su extraordinario desarrollo en los últimos años, no han incorporado los últimos avances en IA y empezamos con un breve repaso a la historia de la IA aplicada a este campo. Hoy, hablaremos de cuál es el estado del arte en el momento actual. AI OF THINGS Breve historia de la IA en los videojuegos 19 de agosto de 2020 The legend of Zelda: Breath of the Wild ¿Te gusta “The Legend of Zelda: Breath of the Wild? (vaya pregunta, pues claro). Pensarás que el juego utiliza las últimas técnicas en IA para obtener este alucinante mundo abierto y cientos de personajes y entornos con los que interactuar. Pues no, lo que hace este juego tan espectacular es el trabajo minucioso de simular efectos físicos como la gravedad, cocinar, efectos climáticos, agua, fuego, hielo, etc. Es decir, crear un mundo lo más parecido al físico real simulando todo lo que sea posible, hasta el más mínimo detalle. Esto provoca que ocurran hechos totalmente aleatorios, pero no quieren decir que haya una "gran" IA detrás. Esta interacción tan realista puede llevar a casos para solucionar problemas que no son los habituales. Por ejemplo, podríamos quemar con fuego una liana que sostiene una plataforma sobre la cual hay un enemigo, romperse y este caer, muriendo finalmente. Pero si antes de caer ponemos justo en el punto de caída, por ejemplo, algo blando como paja, este no morirá. Alien Isolation Incluso juegos tan complejos y espectaculares como Alien Isolation, donde nos ponemos en la piel de una tripulante (la hija de la mítica Ripley) de una nave espacial en la cual hay un Alien campando a sus anchas, está basado en árboles de decisión. Eso sí, complejos y con mucha profundidad. Con ellos son capaces de simular una situación del juego gato-ratón. El Alien no sabe en ningún momento dónde se encuentra el jugador, tiene que averiguarlo por sí solo. Para ello, debe ir deambulando por la nave, realizando acciones para ver las reacciones, abrir puertas, hacer ruido, lanzar objetos, ser cauteloso, ruidoso, etc. Con el único objetivo de forzar una reacción por parte del jugador que finalmente haga que este aparezca y “acariciarlo”. No Man´s Sky Por último, uno de los quizás mejores ejemplos que combine todos los algoritmos que hemos comentado, sea el juego No Man´s Sky, que personalmente a mi me apasiona. Ya hablé de él en su día en nuestra sección “Ciencia Ficción vs IA”, que podéis ver aquí. En él se mezclan desde la generación procedural de escenarios, enemigos, naves, etc hasta todas las técnicas comentadas. Dwarf Frotress Pero no creáis que No Man´s Sky fue el primero, existe un juego que también me apasiona llamado Dwarf Fortress que casi es tan complejo como este. Y es sólo texto. Sí, los caracteres que aparecen en pantalla son texto ASCII, pero ordenado de forma que ofrezcan una apariencia un poco más amigable. Todo el universo es generado con algoritmos procedurales, desde los árboles hasta las cavernas pasando por la personalidad de los enanos y animales que habitan el mundo. Este juego es un RPG donde tenemos que construir una ciudad bajo tierra para enanos e ir explorando, minando y construyendo, intentando sobrevivir. Lo curioso es que cada enano tiene su propia personalidad (como antes hemos comentado) y todos están bajo la influencia del entorno (ellos y el resto de criaturas que pueblan el mundo) y de lo que hagan los otros enanos. De hecho, hay una anécdota curiosa con una enfermedad que afectaba a los gatos (adelanto ya que se emborrachaban), que también los hay en el juego, la cual no estaba prevista y ni los mismos desarrolladores ni se imaginaron que podía suceder. Básicamente, los gatos del juego estaban empezando a morir y nadie sabía el por qué. Para entender mejor lo que ocurría, tenemos que explicar que los enanos de Dwarf Fortress son tremendamente adictos al alcohol. En el momento que terminan su jornada laboral, lo primero que hacen es ir a la taberna y emborracharse como si no hubiera mañana (cosa que era muy habitual, ya que suelen morir al día siguiente). Allí los enanos derraman, vomitan, etc, es decir, manchan el suelo con restos de las bebidas. Los pobres gatos se pasean por las tabernas, sin saber que al andar, se están llevando en sus patas el alcohol derramado. Luego, ya en sus casas, los gatos se lamen (sí, esta característica también está incluida) y claro, ese alcohol pasaba en grandes cantidades a su cuerpo llegando a fallecer por intoxicación etílica (esto también le pasaba a los enanos pero estos aguantaban más que los gatos por su complexión). Este es un estupendo ejemplo que aparentemente demuestra inteligencia, pero realmente no es más que una consecuencia de llevar al límite de realismo un universo, lo que provoca eventos totalmente aleatorios, imprevistos y espectaculares. Eso sí, siempre dentro de las reglas programadas originalmente. Figura 5. Ejemplo de mapa de terreno en Dwarf Fortress ( fuente) Pues si amigos/as, básicamente hoy día también los videojuegos de última generación se basan en la búsqueda de caminos (pathfinding) y las FSM (junto a los MCST, aderezados con algunos árboles de decisión. Básicamente, lo mismo que nuestro querido Pac-Man. Entonces, ¿Por qué no son tan inteligentes? Antes de responder, tenemos que dejar claro que no es lo mismo una IA digamos, "Científica", con una IA de "Juegos". Los algoritmos de IA empleados en la IA "Científica" se aplican a la resolución de problemas, interactuando con el entorno reaccionando de manera impredecible a los acontecimientos que aparecen en sus sensores (coches autónomos, asistentes digitales, etc). Es decir, son procedimientos de autoaprendizaje para reaccionar frente a un entorno totalmente nuevo. Pero claro, en un juego no queremos que todo sea impredecible ya que esto reduciría la experiencia del jugador, y por eso necesitamos que la IA se predecible, es decir que el desarrollador sepa lo que va a pasar (al menos en un porcentaje alto). La IA "Científica" sí que es perfecta por ejemplo, para testear estos juegos. De hecho ya nos habéis visto hablar aquí de OpenAI y la resolución de juegos de Atari, por ejemplo. Pero hoy día ya podemos ver como las IA están ganando (por no decir "aplastando") poco a poco, a los mejores jugadores de juegos tan complejos como por ejemplo, StarCraft II. Ahora entendemos por qué son tan buenos los videojuegos para entrenar agentes de IA. Por lo tanto, para ofrecer una mayor experiencia de jugador (básicamente que pueda ganar o avanzar), lo que los desarrolladores quieren (excepto algunas contadas excepciones), es que el jugador obtenga la mejor experiencia inmersiva, realista pero sobre todo, jugable y controlada. Y para ello se necesita un mínimo de control sobre ese universo (aunque haya eventos impredecibles, como el de los enanos y los gatos). Conclusión Hemos podido ver que hoy día, los juegos no necesitan realmente una IA avanzada. Basta con ofrecer los universos con reglas de simulación físicas más complejas para dejar que estas, junto a los PNJ, la temática, las historias y sobre todo, la interacción con el jugador, ofrezcan la mejor experiencia. Pero podríamos responder también al por qué no hay juegos con IA tan avanzadas tan solo con esta frase: por que no sabemos realmente cómo aplicarla. Es cierto, en el momento que los desarrolladores encuentren una forma adecuada de integrar por ejemplo, Deep Learning en un videojuego, estaremos abriendo las puertas a una nueva generación de juegos que sólo podemos imaginar en la Ciencia Ficción. Bueno, os dejo que tengo que seguir con mi partidita ... ;) Para mantenerte al día con LUCA visita nuestra página web, suscríbete a LUCA Data Speaks o síguenos en Twitter, LinkedIn y YouTube.
27 de agosto de 2020
AI & Data
Breve historia de la IA en los videojuegos
Los videojuegos son cada vez más espectaculares y cercanos a la realidad, tanto en gráficos como en la interacción entre el jugador y el entorno completo en el cual se desarrolla la acción. Sin embargo, no están utilizando los últimos avances que vemos en otros campos de la IA. ¿Por qué? Para responder a esta pregunta, empezaremos con un poco de historia. Hoy día, con la aparición de las nuevas tarjetas gráficas, podemos ver juegos absolutamente realistas con unos gráficos realmente espectaculares. Es curioso que esa misma tarjeta gráfica que muestra el mundo virtual del videojuego, también es el hardware que hace posible hoy día muchos de los avances dentro de la Inteligencia Artificial. El uso de las GPU (Graphics Processing Units) tiene un diseño perfecto para optimizar la fase de entrenamiento (sobre todo en Deep Learning), ya que estas saben gestionar perfectamente operaciones de coma flotante, es decir, operaciones matemáticas, pero utilizando la gran cantidad de cores o núcleos que tienen para paralelizar los cálculos. Pero hoy no vamos a hablar de las GPUs (posiblemente lo hagamos en otro artículo). Hoy vamos a hablar de la Inteligencia Artificial (IA) aplicada a los videojuegos que, curiosamente, no está utilizando todos los avances que vamos viendo sobre todo en el campo del Machine Learning. Podríamos pensar que, con los avances actuales, podríamos tener PNJ (Personajes No Jugadores) controlados por la máquina, mucho más inteligentes. Pues curiosamente, prácticamente los mismos tipos de algoritmos (eso sí, con mucha más potencia de cálculo para hacerlos más complejos) que se usaban hace años, se utilizan a día de hoy. Figura 1. GPU de NVidia GEFORCE 6600 GT. Fuente. Finalmente veremos que el motivo de no utilizar este tipo de IA es más simple de lo que parece. Un poco de historia Antes vamos a dar un brevísimo repaso a la historia de la IA en los videojuegos. Utilizar algoritmos para conseguir que los personajes de un videojuego tengan algún tipo de comportamiento similar a la IA, viene prácticamente desde los comienzos de la Informática, durante los años 50. Años 50 Podríamos pensar que el primer videojuego con cierto nivel de IA fue el famoso Pong, pero no. Viene de más atrás, de hecho, 20 años antes de Pong nada menos. En concreto, el primer videojuego que utilizó algún algoritmo de IA se llamaba Nim. Era un juego sencillo. Trata de ir eligiendo diferentes elementos en una estructura (los elementos clásicos son las cerillas) y ser el último en retirar un objeto. La IA implementaba teoría combinatoria de juegos utilizando operaciones lógicas binarias (aquí más información). Una curiosidad antes de continuar, Alan Turing desarrolló, antes de que existieran los ordenadores (si, en papel y lápiz, igual que el “crackeo” a la máquina Enigma, luego nos quejamos que nuestro ordenador "va lento"), un algoritmo completo para jugar al ajedrez. ) Años 70 En los 70, Atari revolucionó el mercado con juegos que ya se empezaban a tomar más en serio la programación de la IA. Antes hemos hablado de Pong, el cual realizaba cambios en el movimiento de la paleta del oponente controlado por la máquina en función de lo que iba haciendo el oponente humano. Todo esto en un juego de acción en tiempo real (aquí me he venido un poco arriba pero bueno). Otros juegos de otras empresas también empezaron a incluir estos simples algoritmos para poder ofrecer la mejor experiencia al jugados a la hora de disfrutar en solitario de los videojuegos. Space Invaders (1978) y posteriormente Galaxian (1979) fueron otros dos juegos, que aparte de revolucionar el mercado del videojuegos, también incluían IA simples (la mayoría eran patrones prefijados basándose simplmente en examinar la entrada del usuario humano, igual que hacía Pong). Figura 2. Captura de una escena del juego Pong original de 1972. Fuente. Años 80 Entonces, en 1980 apareció Pac-Man (ni se me pasa por la cabeza que alguien no conozca este juego mítico) y revolucionó la utilización de patrones dentro del mundo de la IA en los videojuegos que hasta entonces se estaban utilizando. Por ejemplo, los cuatro fantasmas del juego utilizaban diferentes patrones, cada uno podríamos decir que tenía su propia “personalidad”. El fantasma azul, llamado Inky, tenía posiblemente el comportamiento más especial. Siempre era el último en salir de la casa de los fantasmas (donde empezaban) pero además tenía la características de intentar “adivinar” hacia dónde se movería Pac-Man. Es decir, intentaba predecir (con técnicas muy sencillas, basándose en algo de aleatoriedad, cálculos para encontrar el camino más corto y un poco de vectores) hacia donde era posible que se moviera Pac-Man. Esto hacía que a veces acertara y otras fallara estrepitosamente (seguro que alguna vez habéis visto como se acercaba directo hacia vosotros un fantasma y de repente, sin motivo, cambiaba de dirección), aunque pronto volvería a intentar cazarlo. Hablar de la IA utilizada por Pac-Man daría para varias entradas, podéis visitar este enlace donde se explica en detalle su funcionamiento. Figura 3. Ejemplo del comportamiento de los fantasmas dentro de Pac-Man para calcular el camino más corto y adecuado. Fuente. Años 90 Ya en los 90, el estilo de las clásicas IA de los 80 ya había pasado de moda. Gracias a los avances en computación, los ordenadores eran cada vez más potentes por lo tanto, se podría utilizar otro tipo de algoritmos o incluso, mejorar los actuales gracias a la nueva potencia de computación. Aparecieron los juegos de estrategia en tiempo real o RTS, como Dune II o Warcraft, los cuales básicamente se basan máquinas de estado finito (FSM), algoritmos para la resolución de laberintos o cálculos para hallar el camino más corto. Pero claro, utilizar FSM puede llevar a un estado de repetición donde el ordenador siempre realizará los mismos pasos. Y aquí es donde entra MCST, Monte Carlos Search Tree o Árbol de búsqueda Monte Carlo. Este algoritmo es capaz de visualizar los posibles movimientos disponibles en un momento dado de la partida. Por cada uno de esos pasos, se realiza un análisis completo para considerar si es o no factible realizarlo. Estos avances utilizando FSM y MSCT se aplicaron también en la revolución de los juegos 3D, comenzando por Wolfstein 3D, Doom, etc. Durante los 80 también se produjo una revolución en la forma en las que los PNJ interactuaban con los jugadores humanos. Pero no sólo los PNJ, también la generación de terrenos, planetas, enemigo, etc totalmente aleatorios y únicos. Estamos hablando de la generación de datos utilizando algoritmos en vez de estructuras de datos prefijadas o generación procedural. Es decir, si una posición específica del espacio hay un planeta, este no se crea hasta que el usuario llega a él. Una vez que se acerca, estos algoritmos van creando el planeta totalmente desde cero, con un terreno, atmósfera, etc., todo ello aleatorio. Esto permite hacer los juegos mucho más interesantes ya que se puede incorporar mucha más información (¿infinita?) la cual se genera sólo cuando se necesita. Aunque no son directamente algoritmos de IA, sí que se integran perfectamente con ellos para ofrecer la mejor experiencia de juego. El precursor de la aplicación de esta técnica a los videojuegos fue el mítico Elite, desarrollado en 1984. Figura 4. Ejemplo de generación de árboles usando algoritmos procedurals. Fuente. Pues bien, en este punto, aunque podríamos estar hablando mucho más, al menos hemos reunido diferentes algoritmos populares en videojuegos, generación procedural de mundos y enemigos… finalmente ahora toca hablar de la situación actual de la IA en los videojuegos. Pero eso, lo dejamos para el siguiente post, donde daremos respuesta a la pregunta que nos hemos planteado al principio del post: ¿Por qué los video juegos no están utilizando los últimos avances en IA? AI OF THINGS Estado del arte de la IA aplicada a videojuegos 27 de agosto de 2020 Estado del arte de la IA actual aplicada a videojuegos Para mantenerte al día con LUCA visita nuestra página web, suscríbete a LUCA Data Speaks o síguenos en Twitter, LinkedIn y YouTube.
19 de agosto de 2020
AI & Data
Las matemáticas del Machine Learning: el mecanismo de Backprogation
Ya hemos hablado anteriormente sobre Backpropagation, primera parte aquí y la segunda aquí. Este fue uno de los grandes avances que impulsaron el mundo de la Inteligencia Artificial y en concreto, las redes neuronales. Dicho algoritmo apareció por primera vez en 1974 por Werboz, el cual lo introdujo en su tesis doctoral, aunque bien es cierto que hasta el 86 no tuvo un mayor reconocimiento. Con la propagación hacia atrás se conseguía evitar el problema del o-exclusivo que tenía el Perceptrón. Es un algoritmo de aprendizaje supervisado que se utiliza mayormente para entrenar redes neuronales artificiales. Durante los años 80 este algoritmo fue mejorado para ser un sistema automático de entrenamiento de redes neuronales con capas ocultas. Básicamente el mecanismo es que una vez que se le aplica un patrón a la entrada de la red como estímulo, este se propaga desde la primera capa, hasta la última, hasta generar una salida, la cual se compara con la salida deseada. Una vez tenemos la comparación de ambas se calcula una señal de error para cada una de las salidas. A rasgos generales el sistema de entrenamiento consiste en dos fases, la primera sigue estos pasos: Introducción de pesos sinápticos (aleatorios). Introducción de datos de entrada (capa de entrada) elegidos al azar entre todos los datos de entrada. Esperar una salida generada por la red (propagación hacia delante) Comparar salidas. Figura 10. Ejemplo gráfico de Backpropagation. Fuente. La segunda fase una vez comparadas las salidas obtenidas con las deseadas/esperadas, se calcula su diferencia y sigue los siguientes pasos: El error (diferencia entre las salidas) se utiliza para ajustar los pesos sinápticos de cada capa de neuronas. El error se va propagando hacia atrás, hacia las capas anteriores, comienza por la capa de salida y va yendo hacia atrás, de ahí su nombre back-propagation, hacia la capa de neuronas anterior. Continua propagándose hacia atrás capa por capa, ajustando los diferentes pesos sinápticos hasta llegar a la última capa, o primera según se mire, la capa de entradas. ¿Cuáles son las grandes características que lo diferenciaban con otros algoritmos de la época? Se basa en una generalización de la Regla Delta (la cual es una variante del método de descenso por el gradiente). Estructura de niveles y conexiones estricta hacia atrás entre neuronas. El gran avance que supuso este algoritmo de aprendizaje es que dadas unas entradas y salidas, es capaz de autocorregirse, de adaptar los pesos de las neuronas de las capas intermedias y aprender/entender la relación que pueda existir entre el conjunto de entradas y salidas. Como hemos mencionado anteriormente el algoritmo backpropagation o propagación hacia atrás fue introducido por Werbos en su tesis doctoral de 1976, pero fueron David E. Rumelhart y James McClelland quienes en 1986 gracias a los avances computacionales de la época comenzaron a fomentarlo en su libro, donde además consiguieron promover el movimiento del "conexionismo". También mencionar el gran avance que supuso la creación del grupo PDP (Parallel Distributed Processing), gracias al cual resurgió buena parte del campo en redes neuronales desde la publicación de Minsky y Papert. Figura 11. Marvin Minsky (izquierda) y Seymourt Papert. Fuente. Por último nos gustaría mencionar y explicar más adelante, (quien sabe si en el siguiente artículo) otras grandes aportaciones de esta época: La neurona Hoopfiel y su función de activación. Mapas de Kohonen Máquina de Boltzmann Con estas últimas aportaciones llegaríamos a los 90, donde el campo de las redes neuronales y la inteligencia artificial comenzaría su gran expansión y avance, un avance que crece exponencialmente hasta nuestros días gracias al poder computacional de los ordenadores. Las redes neuronales permiten hoy día, entre otras cosas: Investigación en campos como la medicina mediante el análisis de grandes datos. Inversión en mercados. Estudio y predicción de sucesos. Reconocimiento de patrones. Visión artificial Etc Hoy día, con el Machine Learning y el Deep Learning, las redes neuronales están máxima actualidad. De hecho, el número de investigaciones y nuevos papers científicos está en contínuo movimiento. Quizás una de las investigaciones relacionadas con las redes neuronales y el Deep Learning han sido las GANs o Generative Adversarial Networks. Esta nueva arquitectura ha revolucionado para siempre el mundo de la Inteligencia Artificial, ya que ha abierto un nuevo campo de exploración. Hasta ahora, sólo podíamos clasificar y predecir, pero gracias a las GANs podemos generar nuevo contenido. Temas tan de moda como los DeepFakes o incluso la generación de obras de arte imitando a artistas famosos son consecuencia de esta gran investigación desarrollada por Ian Goodfellow. Como vemos, esto no ha hecho más que empezar. Seguro que veremos más avances espectaculares en los próximos años o incluso meses. Estaremos atentos. No os perdáis el resto de esta serie de "Matemáticas y el Machine Learning": Las Matemáticas del Machine Learning ¿Qué debo saber? Las Matemáticas del Machine Learning: explicando la Regresión Lineal (I) Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (II) y Multilineal. Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (III) y Multilineal. Contraste y Fiabilidad. Las Matemáticas del Machine Learning: Ejemplos Regresión Lineal (IV y último). Implementación en lenguaje R Las Matemáticas del Machine Learning: Redes Neuronales (Parte I) Las Matemáticas del Machine Learning: Redes Neuronales (Parte II) Escrito para LUCA por Fran Fenoll (@ffenoll16), Fran Ramírez (@cyberhadesblog y @cybercaronte) y Enrique Blanco (@eblanco_h) (ambos del equipo de Ideas Locas CDCO de Telefónica).
25 de junio de 2020
AI & Data
Las matemáticas del Machine Learning: Funciones de activación
En el anterior artículo nos centramos en los primeros pasos de la neurona artificial, haciendo hincapié sobre todo en el origen del Perceptrón, y de cómo Minsky y Papert expusieron las limitaciones del Perceptrón Simple. En esta segunda parte de la evolución de las redes neuronales veremos qué consecuencias tuvieron en el campo de la investigación, y de cómo a partir de los años 80 hubo un gran auge en el mundo de la Inteligencia Artificial. En cambio, durante finales de los 70 y principios de los 80 encontramos muy poco movimiento. Hay muchos factores que influyeron en dicha ralentización en las investigaciones, pero posiblemente la falta de inversión al no ver resultados prácticos o comerciales puede ser quizás uno de los principales. Esto cambiaría radicalmente durante la década de los 80, ya que justo aquí comenzó el auge del computador, tanto personal como los supercomputadores (por ejemplo, los Cray). De esta forma ahora era posible corregir errores en las teorías y lo mejor de todo, obtener resultados prácticos de los mismos. Figura 1. Superordenador Cray-2. Fuente. Un breve repaso ... A modo de repaso, el Perceptrón es un clasificador binario de modelo lineal con una relación de entrada-salida simple como en el que se realiza un producto escalar de un n número de entradas con sus pesos asociados y luego enviamos esta "entrada de red" a una función de paso con un umbral definido. Esta función de paso o función de activación, en un principio solía ser una Función de Escalón de Heaviside con un valor de umbral de 0.5. Esta función generará un único binario de valor real (0 o 1), dependiendo de la entrada. La función de escalón quedaría definida como: Figura 2. Función de escalón. La salida de la función de activación (función escalón) no deja de ser la salida de nuestro Perceptrón y nos permite realizar una clasificación binaria simple de los valores de entrada a la unidad. En este artículo de esta misma serie tenéis más información detallada sobre las redes neuronales. Buscando respuestas Pero volvamos al principio para intentar encontrar respuestas al por qué no evolucionó por aquella época el mundo de la Inteligencia Artificial, y en concreto el Perceptrón. ¿Dónde estaba el problema principal? Pues principalmente fueron dos: 1. Los Perceptrones básicos no podían procesar el circuito de o-exclusivo (XOR). Un XOR es un operador lógico, un tipo de disyunción lógica, la cual es verdadera si y solo si una de ellas es verdadera y la otra no. Si ambas son verdaderas o ambas falsas la disyunción también es falsa. 2. El segundo problema y puede que definitivo, era que los ordenadores no tenían suficiente poder de procesamiento para manejar con eficiencia el gran tiempo de ejecución que requerían las grandes redes neuronales, recordemos que estamos hablando de finales de los 60, con valores de entrada y salida binarios. Tanto el valor de los pesos como el de umbral de cada neurona se asignaban manualmente. Cuantos más Perceptrones en las capas, mucho más difícil conseguir los pesos para obtener salidas deseadas. La revolución neuronal Las funciones que gobiernan el comportamiento de la neurona artificial se llaman funciones de activación. La transmisión de esa entrada se conoce como forward propagation. Las funciones de activación transforman la combinación de entradas, pesos y sesgos. Los productos de estas transformaciones se ingresan para la siguiente capa de nodo. Muchas (aunque no todas) las transformaciones no lineales usadas en redes neuronales transforman los datos a rango conveniente, por ejemplo [0,1] ó [-1,1] . Cuando una neurona artificial pasa de un valor distinto de cero a otro, decimos que esa neurona se ha activado. Las funciones de activación se usan para propagar la salida de los nodos de una capa hacia la siguiente capa. Se tratan de funciones escalares a escalar, que produce la activación de la neurona. Este tipo de funciones permiten incorporar el modelado de datos de entrada no lineales a la red. Figura 3. Ejemplo de algunas funciones de activación. Fuente. La familia de funciones sigmoideas es la más importante y usada en las funciones de activación, pero no la única. Veamos ahora algunas funciones de activación útiles en redes neuronales, junto con sus principales características y casos de uso: Funciones de activación sigmoideas Este tipo de funciones permiten mitigar el efecto de outliers en el entrenamiento de nuestro modelo. La imagen de este tipo de funciones suele estar contenida en los intervalos o , por lo que valores muy extremos siempre estarán cerca de los límites del intervalo de esa imagen. Función logística. Convierte variables independientes de rango casi infinito en probabilidades simples entre [0,1] Figura 4. Función logística. Softmax. La función softmax es una generalización de la regresión logística que puede ser aplicada a datos continuos. Soporta sistemas de clasificación multinomial, por lo que se convierte en el recurso principal utilizado en las capas de salida de un clasificador. Esta función de activación devuelve la distribución de probabilidad de cada una de las clases soportadas en el modelo. La función Softmax calcula la distribución de probabilidades del evento sobre 'n' eventos diferentes. En términos generales, esta función calculará las probabilidades de cada clase objetivo sobre todas las clases objetivo posibles. Más tarde, las probabilidades calculadas serán útiles para determinar la clase objetivo para las entradas dadas. La principal ventaja de usar Softmax es el rango de probabilidades de salida. El rango será de 0 a 1, y la suma de todas las probabilidades será igual a uno. Si la función softmax utilizada para el modelo de clasificación múltiple devuelve las probabilidades de cada clase y la clase objetivo tendrá una probabilidad alta. Figura 5. Función Softmax. La fórmula calcula la exponencial del valor de entrada dado y la suma de los valores exponenciales de todos los valores en las entradas. Luego, la relación de la exponencial del valor de entrada y la suma de los valores exponenciales es la salida de la función Softmax. Este tipo de función de activación es muy utilizado en el modelo de regresión logística de clasificación múltiple y en diferentes niveles de capa de cara a la construcción de redes neuronales. Más detalles sobre la usabilidad de la función Softmax se puede encontrar en el siguiente enlace. Tangente hiperbólica. La tanh representa la relación del seno hiperbólico al coseno hiperbólico: tannh x = sinh x / cosh. A diferencia de la Función Sigmoidea, el rango normalizado de tanh es de [-1,1]. La ventaja de tanh es que puede manejar más fácilmente los números negativos. Figura 6. Tangente hiperbólica Funciones de activación lineales Las transformadas lineales son básicamente la función de identidad, donde la variable dependiente tiene una relación directa y proporcional con la variable independiente. En términos prácticos, significa que la función pasa la señal sin cambios. Figura 7. Función de identidad Funciones de activación Rectified Linear Las funciones de Rectificado lineal son transformaciones que activan un nodo sólo si la entrada está por encima de una cierta cantidad. Mientras la entrada es inferior a cero, la salida es cero, pero cuando la entrada supera un cierto umbral, tiene una relación lineal con el dependiente variable: con una imagen: Funciones de activación Softplus Las funciones de activación Softplus se consideran la versión suavizada de las transformaciones por rectificación lineal. Si bien la forma es similar, vemos que la función que las define es derivable en todo su dominio. Figura 8. Gráfica de Rectified Linear y Softplus. Fuente. Durante finales de los 70, uno de los grandes avances por no decir el único fue el de la neurona sigmoide o neurona sigmoidal, ésta muy parecida al Perceptrón en estructura tenía una gran diferencia, y es que al contrario que el perceptrón (que solo podía tener como entradas 0-1) podía tener entradas de cualquier valor numérico. La función sigmoidea o sigmoidal viene representada por la siguiente función: Figura 8. Función sigmoidal El estudio de esta función nos garantiza que se trata de una función continua acotada superior e inferiormente por sus dos asíntotas horizontales y=1 e y=0, pues cuando sus valores se acercan al infinito la función roza los valores 0 o 1, 0 cuando los valores son extremadamente negativos, 1 cuando los valores son exageradamente altos. La gráfica de esta función muestra además que posee un cambio de curvatura en el valor x=0, y=0.5, y tiene una forma de S como podemos observar. F igura 9. Forma de "S" de la función sigmoidal. En el siguiente post cerraremos el tema del Deep Learning explicando el mecanismo de Back Propagation. No te lo pierdas. Aquí tenéis el resto de esta serie de "Matemáticas y el Machine Learning": Las Matemáticas del Machine Learning ¿Qué debo saber? Las Matemáticas del Machine Learning: explicando la Regresión Lineal (I) Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (II) y Multilineal. Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (III) y Multilineal. Contraste y Fiabilidad. Las Matemáticas del Machine Learning: Ejemplos Regresión Lineal (IV y último). Implementación en lenguaje R Las Matemáticas del Machine Learning: Redes Neuronales (Parte I) Las Matemáticas del Machine Learning: Redes Neuronales (Parte II) Escrito para LUCA por Fran Fenoll (@ffenoll16), Fran Ramírez (@cyberhadesblog y @cybercaronte) y Enrique Blanco (@eblanco_h) (ambos del equipo de Ideas Locas CDCO de Telefónica).
4 de junio de 2020
AI & Data
El Juego de la Vida de Conway y la compleja belleza de lo simple
En octubre de 1970, cuando los ordenadores eran todavía un bien accesible sólo a grandes corporaciones, universidades y científicos, un curioso artículo apareció en la maravillosa revista Scientific American o Investigación y Ciencia, como se llama en España. Un matemático llamado John Horton Conway, propuso un simple juego basado en autómatas celulares. Pero permitidme un pequeño inciso antes de continuar hablando de dicho artículo. Los autómatas celulares Los autómatas celulares darían para otro artículo, ya que estos fueron inventados por Konrad Zuse (para algunos, el verdadero creador del primer ordenador y pionero de la computación en general) y Stanislaw Ulam (matemático polaco que participó en el Proyecto Manhattan, entre otros) . Pero además, los autómatas celulares fueron puestos en práctica, nada más y nada menos que por John Von Neumann. Increíble ¿verdad? … sólo falta que también aparezca Alan Turing en esta historia. Pues sigue leyendo porque también existe una estrecha relación con él y con su trabajo. Un artículo en la sección "Juegos Matemáticos" Volviendo al artículo de Conway, llama la atención que ni siquiera fue un artículo como tal, sino que apareció en una sección periódica denominada “Juegos Matemáticos” (Mathematical Games), en la cual se publicaban desafíos al más puro estilo de pasatiempos de lógica. Debido a sus sencillas reglas (que ahora veremos a continuación), era fácil replicarlo en una simple hoja de papel cuadriculado, ya que no todo el mundo tenía un ordenador para ejecutar el algoritmo como he comentado al comienzo del artículo. Así que en principio, los resultados no eran especialmente llamativos, pero sí llamó la atención de muchos investigadores y lectores de la revista que vieron su potencial. Pero la verdadera revolución llegó cuando se popularizó el uso del ordenador personal (a partir de 1977 con la aparición del Apple II en concreto, por su fuerte impacto en los EEUU) y fue en este punto cuando realmente se mostró la verdadera magia de Conway y su Juego de la Vida. Figura 2. Portada del número de Scientific American de octubre de 1970 donde se publicó por primera vez el Juego de la Vida de Conway. Fuente. El Juego de la Vida Pero antes de continuar, vamos a ver en qué consiste este “pasatiempo”. El universo del juego es una matriz rectangular de dos dimensiones con diferentes celdas o células. Cada una de estas celdas, pueden estar vivas o muertas, es decir, activas o desactivadas a nivel de pixel. Por cada turno del juego (generación), estas celdas podrán estar vivas o muertas. Este estado de vivo o muerto de una celda dependerá de sus otras ocho celdas que la rodean por completo. Las celdas interactúan con las otras ocho adyacentes (llamadas vecinos) tanto de manera horizontal, vertical o diagonal. Vamos a enumerar los posibles estados de una celda en cada paso o generación: Una celda viva que tenga menos de dos vecinos vivos, muere (despoblación) Una celda viva con dos o tres celdas vivas como vecinos vivos, pasa a la siguiente generación. Cualquier celda muerta que tenga exactamente tres vecinos vivos, vuelve a la vida (reproducción) Cualquier celda viva con más de tres vecinos vivos, muere (sobrepoblación) Nada más. Estas son las simples cuatro reglas del Juego de la Vida de Conway. Pero la mejor forma de comprobar su funcionamiento y ver los espectaculares resultados, es poniéndonos manos a la obra y ejecutarlo en algún emulador. Existen miles de simuladores del Juego de la Vida de Conway. En mi caso utilizaré uno Open Source llamado Golly y que podéis descargar desde aquí. En la imagen siguiente se puede apreciar el estado inicial de cuatro autómatas diferentes. Comienza por la generación 0 y a la derecha su evolución después de un salto generacional: Figura 3. Salto generacional de cuatro autómatas sencillos dentro del Juego de la Vida de Conway. Aplicando las reglas anteriormente enumeradas, podemos comprobar fácilmente que el primer autómata (a), deriva a una sola celda (o célula). En concreto, podemos comprobar que la celda enumerada como "0" muere al tener sólo un vecino, "1" (primera regla), la celda "1" sobrevive ya que tiene dos vecinos, "0" y "2" (regla número dos) y finalmente la celda "2" también muere al tener sólo un vecino, en este caso la celda "1": Figura 4. Detalle del primer autómata y su evolución en un salto generacional. En el caso del autómata (b) aplicamos las mismas reglas, la primera se aplica a las celdas "0" y "2" (es decir, mueren), la celda "1" sobrevive gracias a la regla número dos y vemos que aparece una nueva celda, la número "3". Esto es debido a la tercera regla, una celda muerta que tenga tres (y sólo tres) vecinos vivos (la celda marcada con una X) vuelve a la vida (la celda número "3"): Figura 5. Detalle del segundo autómata y su evolución, donde se genera una nueva celda. El caso del autómata (c) nos va a permitir introducir la cuarta regla, donde vemos que las celdas "1","3","4" y "6" desaparecen por superpoblación. Destacar que, por ejemplo, la celda "1" tiene como vecinos la "0","2","3" y "4" (en diagonal también cuenta). Pero además comprobamos que se cumple también la regla número tres, dando lugar a tres nuevas celdas, marcadas con un X en la primera generación y luego numeradas como "8","9", "10" y "11". Las celdas "0", "2", "5" y "7" sobreviven a esta generación gracias a la regla número dos: Figura 6. Evolución del autómata donde aparece la cuarta regla, superpoblación. Finalmente, el autómata (d) podemos comprobar es parecido al (b) donde se aplican las reglas primera, segunda y tercera. He incluido este autómata (d) ya que forma parte de estructuras mucho más complejas que ahora veremos a continuación. Hasta aquí vemos que la base es muy sencilla. La magia aparece cuando dejamos que pasen varias generaciones y los autómatas empiezan a evolucionar, interactuando entre ellos y conectándose dando lugar a otras estructuras más complejas. De hecho, el ejemplo inicial que he puesto arriba, con los cuatro simples autómatas, tendrá la siguiente evolución después de 8 generaciones, finalizando en un bucle infinito entre la generación 7 y 8 continuo: Figura 7. Estado final después de ejecutar 8 generaciones, donde se crea un bucle entre el autómata de la generación 7 y 8. Una animación completa del proceso En el siguiente vídeo se muestra la animación completa de todo el proceso: Aparecen nuevos patrones Después de que miles de usuarios por todo el mundo comenzaran a experimentar, aparecieron diferentes patrones de autómatas los cuales sirven para realizar una función o tarea específica. De hecho, los primeros de estos patrones para autómatas se identificaron sin el uso de ordenadores, es decir, dibujando o utilizando un tablero del tipo del juego “Go” para ir desplegando las diferentes generaciones hasta que dicho patrón se estabilizara. Pero claro, como ahora veremos, hay patrones que requieren varios cientos o miles de generaciones para llegar a esa estabilización y por eso, no aparecieron hasta que aparecieron los ordenadores personales los cuales facilitaron enormemente el trabajo. Glider o planeador El primer patrón descubierto por el mismo Conway fue el llamado “glider” o “planeador”. Este tipo de autómata tiene la característica de poder moverse o desplazarse por toda la rejilla en una dirección concreta. De hecho, el “glider” inagura una clase propia del Juego de la Vida que se les llamó “naves espaciales” o “spaceships”, los cuales tienen dicha característica del desplazamiento. En este vídeo podéis ver las primeras “spaceships” descubiertas en los 70, incluido el "glider" realizadas con Golly: Pero claro, esto no acaba aquí, de hecho, sólo acabamos de empezar ;). Existen otras entidades de autómatas como por ejemplo los objetos estáticos, osciladores, etc. Los cuales a su vez tienen también sub-categorías. También encontramos otro tipo de patrón llamados “armas” o “guns”, los cuales son estacionarios, pero pueden fabricar “gliders” o “spacechips”, es decir, auténticas fábricas de estos autómatas. Los “gliders” son especialmente interesantes cuando interactúan con otros objetos en la rejilla. De hecho, estos de utilizan para generar puertas lógicas (AND, OR, etc), contadores, flip-flops, registros, etc. Es decir, y aquí viene la conexión con Alan Turing que nos faltaba, tienen el mismo poder computacional que la Máquina Universal de Turing. La conexión con Turing Es decir, es Turing completo (“Turing complete”) lo que implica que el Juego de la Vida de Conway es capaz de implementar cualquier programa o algoritmo que nos podamos imaginar. Y claro, con el poder computacional al alcance de todos hoy día, la comunidad geek mundial se ha lanzado a crear patrones espectaculares utilizando los autómatas de Conway. De hecho, existe incluso la implementación de una Máquina de Turing totalmente operativa, la cual podéis ver en el siguiente vídeo: https://www.youtube.com/watch?v=My8AsV7bA94 Y para comprobar que se puede implementar cualquier cosa, aquí tenéis otro vídeo donde se crea un reloj digital totalmente funcional: https://www.youtube.com/watch?v=3NDAZ5g4EuU Pero ¿para qué quedarnos en un simple reloj digital? ¿no es Turing Complete?, pues ¡vamos a crear un ordenador completo!. En concreto, en el siguiente vídeo se puede ver la implementación de este ordenador programable ejecutando la secuencia de Fibonacci: https://www.youtube.com/watch?v=8unMqSp0bFY Entornos más complejos, nuevas reglas Es increíble que, partiendo de tres reglas simples, podamos llegar este tipo de estructuras extremadamente complejas. El Juego de la Vida de Conway nos demuestra el hecho de que dicha complejidad puede evolucionar partiendo de una simplicidad máxima. Y por supuesto, como era de esperar, el Juego de la Vida ha evolucionado a otros entornos más complejos con nuevas reglas. Por ejemplo, podemos encontrar: HighLife: mismas reglas que el original pero añade una adicional, una celda muerta vuelve a la vida si se rodea de otras 6 vivas. Wireword: para simulaciones eléctricas y electrónicas The Immigration Game: muy similar al original pero añade que las nuevas celdas generadas tendrán un color que dependerá del número de dichas celdas que la rodean con ese mismo color. The Rainbow Game Of Life. Es parecido al de Immigration Game pero esta vez las celdas están coloreadas en función de la media de los valores de colores de sus celdas parientes. Por ejemplo, si una celda que acaba de nacer tiene dos celdas negras y una blanca como vecinas, su color será gris. Esto que parece tan simple, añade un componente similar al genético a la hora de herencia de los colores, lo que abre otro camino de investigación. Rule 30. En este caso, en vez de ser de dos dimensiones, son de una. Este en concreto fue desarrollado por el prestigioso matemático Stephen Wolfram, y genera complejos patrones del tipo fractal y caótico. 3D Life. Una variante del juego original de 2D esta vez en 3D, solo que ajustados a esta nueva dimensión. Además de la espectacularidad de las imágenes generadas, también abre un nuevo campo de investigación matemática. https://www.youtube.com/watch?v=dQJ5aEsP6Fs Una forma de aprender a programar El Juego de la Vida de Conway siempre ha sido, además de un apasionante campo de investigación, una forma sencilla, pero a la vez muy instructiva a la hora de aprender a programar. Existen cientos de implementaciones de los algoritmos y su mecánica está prácticamente todos los lenguajes de programación conocidos. Por cierto, no sé si os habéis dado cuenta, pero el emblema de la cultura hacker, creado por Eric Raymond en 2003 es exactamente el símbolo del “glider” en homenaje al Juego de la Vida de Conway. Personalmente, me parece la mejor elección posible. Figura 8. Símbolo que representa la cultura hacker basado en el "glider" de Conway. Homenaje a John Horton Conway Lamentablemente, Jonh Horton Conway falleció el 11 de abril del 2020, pero nunca olvidaremos su legado, no sólo del Juego de la Vida, también otros grandes avances en grupos finitos, teoría de los números, teoría de juegos, etc. Sirva este artículo como homenaje a un genio que cambió la vida a tantas personas orientándolas tanto a la programación como a las matemáticas. De hecho, aún recuerdo cuando iba con mi amigo Alberto mientras estábamos en la Universidad, a las bibliotecas de otras carreras (sobre todo Medicina) para buscar números de la revista Investigación de Ciencia y fotocopiar los artículos de Conway así como otros muy interesantes. De hecho, había otro juego similar llamado Core Wars, donde diferentes programas se batían en duelo dentro de otra matriz, al más puro estilo Tron y que posiblemente fue la base de los actuales virus informáticos, pero esto mejor lo contamos en otro artículo ;) Para mantenerte al día con LUCA visita nuestra página web, suscríbete a LUCA Data Speaks o síguenos en Twitter, LinkedIn y YouTube.
30 de abril de 2020
AI & Data
De los vengadores a los Simpson: errores matemáticos en cine y TV
Recuerdo que, de pequeño, cuando vi la película de Superman de 1978 (sí lo sé, ya tengo una edad), hay una escena final en la cual el superhéroe empieza a girar alrededor de la Tierra en sentido contrario para cambiar la rotación, y de esa forma, volver atrás en el tiempo (WTF!) y así poder cambiar el destino de los pobres y débiles humanos. Cuando la vi con 5 o 6 años ¡me pareció la cosa más guay del mundo! Pero con el paso del tiempo y sobre todo con las clases de física y matemáticas, algo no encajaba y la verdad es que me llevé una gran desilusión al saber que eso que mi gran héroe Superman hizo, era realmente imposible. Es más, en caso de tener la improbable opción de cambiar el giro de rotación de la Tierra, hubiera destruido la Tierra por completo tal y como la conocemos. El espantapájaros y el teorema de Pitágoras Ahora, en estos tiempos que vivimos de encierro (por cierto, quédate en casa), mi hija, que tiene dos años y medio, es una auténtica fan de “El Mago de Oz”, la original donde aparece la magnífica Judy Garland y le encanta sobre todo, el trayecto por el camino de baldosas amarillas y los bailes con el espantapájaros, el hombre de hojalata y el león cobarde. Después de verla con ella un número indeterminado de veces (he perdido la cuenta), al estar un poco aburrido de este bucle (ella no se cansa), empiezas a fijarte en pequeños detalles. Ya me conozco a todos los Munchinks y la letra de sus bailes, pero hay una escena final en la que el espantapájaros se vuelve de repente inteligente al darle el Mago de Oz un diploma (qué ironía, el mensaje no es muy acertado, un papel es mejor que un cerebro) y cita textualmente “La suma de las raíces de dos lados de un triángulo isósceles es igual a la raíz del otro lado”. Fotograma de la película de "El Mago de Oz" donde el espantapájaros recibe un diploma en vez de un cerebro. Fuente. No, no voy a ser tan pedante como para decir que me di cuenta de que esa formulación del teorema no era correcta. Pero sí os voy a decir algo, esa escena me sonaba. Y tanto que me sonaba, eso lo había visto en otro lado, como no, en Los Simpsons. En concreto en el capítulo 10 de la temporada quinta, donde Homer encuentra unas gafas perdidas por Henry Kissinger y al ponérselas, parece que se vuelve inteligente y cita, de la misma manera, a modo de homenaje, el mismo teorema y a su vez, el mismo error. Así que cuando mi amigo y matemático de cabecera, Fran Fenoll (que conocéis por nuestra serie Matemáticas del Machine Learning), me propuso escribir un post sobre errores matemáticos en el cine o series, no pude resistirme. Pues sin más espera, aquí lo tenéis, esperamos que os guste y sobre todo, si conocéis alguna otra metedura de pata, ya sea en cine o series, no dudéis en escribirlo en los comentarios. Star Wars Empezamos hablando por una de nuestas sagas preferidas, y creo que cualquier parte del universo, hablo de Star Wars, es una obra de arte sin ninguna duda, pero tiene algún que otro fallo matemático. Enumero a continuación algunos de ellos (sin contar la existencia de Jar Jar Binks, una anomalía imperdonable). Las batallas en el espacio carecen de sonido, en el espacio no hay sonido ni oxígeno, por lo que no puede haber explosiones, ni sonidos de láser. Pero claro la explosión de la Estrella de la Muerte no sería lo mismo (por cierto, este error se repite en una gran cantidad de series y películas). Por otro lado, La base Starkiller de la Primera Orden, ¿dónde se encuentra? En la escena que la base destruye varios planetas, Han y Finn miran al cielo y observan cómo dichos rayos destruyen los planetas. Si no están en el mismo sistema solar no podrían observarlo. Pero, estando en el mismo, tardarían mucho más en verlo. Explosión de la Estrella de la Muerte en Star Wars. Fuente. Los vengadores Pasamos a otra de las grandes sagas del cine, Los Vengadores o The Avengers, y más concretamente al personaje Ant-Man. Al igual que las películas acerca de monstruos gigantescos como King Kong, este personaje es geométricamente imposible según la Ley cuadrado-cúbica enunciada por Galileo Galilei en 1638. Dicha ley establece una relación entre el volumen y el área de un cuerpo a medida que aumenta o disminuye. Cuando un objeto se somete a un aumento proporcional en tamaño, su nuevo volumen es proporcional al cubo del multiplicador y su nueva superficie es proporcional al cuadrado del multiplicador. Es decir: Representación matemática de la Ley Cuadro-Cúbica Siendo v0, l0, el volumen y la longitud inicial respectivamente. A0, superficie inicial. Siendo A0 su superficie inicial tal y como vemos en la fórmula de arriba, imaginemos por un momento que Ant-Man consigue incrementar su altura 10 veces más. Entonces tendríamos: Cálculo que demuestra un aumento también en la masa al aumentar el volumen. Su volumen ha aumentado, por lo que también habrá aumentado su masa. Por tanto, la presión por unidad de superficie se ha multiplicado a su vez, por lo que, con toda seguridad, se le romperían las piernas. Si alguno vuelve a tener pesadillas con monstruos gigantes, tranquilos, tenéis a la ciencia de vuestro lado. Antman Pero Ant-Man también se hace pequeño hasta niveles atómicos, al igual que en la película "Cariño he encogido a los niños". Pero ahora inversamente a lo que pasaba cuando aumentábamos de tamaño, al disminuir tenemos mucha superficie para tan poca masa, lo que llevaría a una pérdida enorme de calor corporal, sólo salvable con una gran velocidad. Es decir, Ant-Man debería ser mini Flash para que pudiera ocurrir. Ant-Man montado sobre una avista. Fuente. Stargate Sigamos con las incongruencias geométricas. Al principio de la película Stargate, para indicarnos como trazar una ruta entre dos planetas, el profesor Anderson indica que son necesarios 7 puntos. 6 indican cómo obtener el punto del espacio final y uno el inicial. No es del todo mentira, pero en realidad se puede hacer con menos pasos. Por ejemplo, con dos rectas que se corten en dicho punto (cada recta puede ser formada por dos puntos, necesitando un total de 4 puntos para encontrar el destino y uno del de partida), o bien tres coordenadas y un sistema de referencia. James Bond Pero no todo son fallos geométricos, también los hay de álgebra, y si no que se lo pregunten a Pierce Brosnan, el famoso Agente 007 en "El mundo nunca es suficiente" no tuvo a mano un gadget de Q para calcular bien el siguiente problema: 007: ¿Qué es? Q: Un equipo de observación. Viaja por el tubo descubriendo grietas. 007: La bomba está ahí dentro. Q: Va hacia la terminal petrolífera. Allí el daño sería mayor. Es el único oleoducto con que cuenta Occidente para las reservas del próximo siglo. 007: ¿A qué distancia está de la terminal? Y ¿a qué velocidad va? Q: Está a 170 km y va a 110 km/h. 007: Tenemos 78 minutos. Suponemos que quería decir que tenía 78 minutos y 15 para descansar ;), dado que tenía 1h 32’ 43’’ aproximadamente. "Matefallos" con en número pi Pero sin ninguna duda es Pi el mayor protagonista de los "matefallos" en el cine. "Nunca me han besado" (película poco "geek" por cierto), solo acertó los dos primeros decimales, tal y como se puede apreciar en esta escena de la película. En la película "Una Mente Maravillosa", a pesar de ser una gran película aclamada tanto por la audiencia como por la crítica, tuvo en pequeño desliz, en la siguiente imagen podemos ver la acotación del número Pi: Acotación errónea del número Pi en la película "Una Mente Maravillosa". Fuente. Pese a todo ello John Nash obtuvo innumerables premios y reconocimientos ;) entre ellos un Premio Nobel de Economía en 1995 y el premio Abel en 2015 por su trabajo en las EDP, ecuaciones diferenciales parciales. Los Simpson No solo en la gran pantalla se han colado estos gazapos matemáticos, también en la pequeña pantalla. Sobretodo en la famosa familia de Springfield, que nos acompaña desde hace muchísimos años. Pero bien es cierto que estos "mategazapos" son intencionados, pues Stewart Burns, Al Jean y Ken Keeler, matemáticos y David X. Cohen y Jeff Westbrook, físicos son guionistas de la serie. Son innumerables los casos que las matemáticas aparecen en los episodios, desde el "multiplícate por cero" de Bart hasta en el capítulo que Homer está en otra dimensión rodeado de números. Esto no es nuevo, la red está llena de referencias matemáticas a los Simpsons, pero vamos a ver nuestros favoritos. Por cierto, si quieres profundizar un poco más, este libro llamado "Los Simpsons y las Matemáticas" te cuentan todos estos secretos. Veamos a continuación algunos de los más curiosos: El Profesor Frink, para que los científicos de una ponencia le hicieran caso, grita "¡¡¡Pi es exactamente 3!!!" Durante un partido de baseball Homer debe de adivinar el número de asistentes al partido: Fotograma del capítulo donde Homer tienen que adivinar cuántos asistentes han ido al partido. Fuente. Hommer y los números perfectos Vamos a centrarnos un segundo aquí. Parecen simplemente números aleatorios, pero la verdad es que no lo son: 8191 = 2^13 -1, es un número primo de Mersenne. 8128 = 1 +2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064 Es decir, es un número perfecto, es el resultado de la suma de sus divisores. De hecho es el cuarto número perfecto que se conoce. 8208 = 8^4 + 2^4 + 0^4 + 8^4 es lo que se conoce como número narcisista de orden 4. Cuando Homer aparece en 3D, en ella aparece rodeado de expresión matemáticas, pero hay una de ellas que llama especialmente la atención: 1782^12 + 1841^12 = 1922^12 A simple vista esta operación podría resultar cierta, aunque realmente no lo es: 1782^12 + 1841^12 = 2541210258614589176288669958142428526657 Mientras que: 1922^12 = 2541210859314801410819278649643651567616 La pregunta es, ¿fue un fallo?, la respuesta es no, no fue un error, sino más bien todo lo contrario. Nos remontamos a 1637, el matemático Pierre Fermat enunció que la siguiente ecuación es imposible cuando n sea mayor que 2 y tres enteros distintos: x^n + y^n = z^n Pero no fue hasta el año 1995, cuando Andrews Miller con la colaboración de Richard Taylor, demostró el último teorema de Fermat, también llamado a partir de entonces como el teorema de Fermat-Miller. Es por esto que en 1995 los Simpson decidieron rendir un homenaje a ambos. Homer en 3D y los números antes mencionados asociados al último teorema de Fermat. Fuente. Y por último, hablando de homenajes, me gustaría comentar acerca de otro dato que leí una vez comenzado este artículo, un capítulo de la decimocuarta temporada también de los Simpsons. Edna es candidata al premio maestro del año, premio que logra un profesor llamado Julio Estudiante, por haber enseñado a los estudiantes que las ecuaciones diferenciales eran más poderosas que las balas. Esta mención es un reconocimiento a Jaime Escalante, de origen boliviano, que trabajó como profesor de matemáticas en Los Angeles de un grupo de alumnos con bajos recursos. Sus comienzos no fueron sencillos pues al no ser ciudadano estadounidense no se le reconocían sus títulos, por lo que tuvo que volver a obtener dichos reconocimientos. Una vez obtenidos sus títulos Escalante logró renombre y distinción a través de su trabajo en la Escuela de Garfield al enseñar cálculo a estudiantes de bajos recursos, y lograr que superasen exitosamente la prueba de nivel avanzado (A. P.), requisito para ingresar a la universidad en EE. UU. En 1988, el presidente de EEUU, Ronald Reagan, le entregó la Medalla Presidencial a la Excelencia en Educación. Bueno, esta ha sido nuestra aportación a estos días tan difíciles, esperamos que os haya gustado y estad tranquilos pronto pasará todo, en los Simpson hay capítulos del futuro, y parece todo vuelve a la normalidad, no hay de que temer ;) ¡Quédate en casa y mucho ánimo! Escrito por Fran Fenoll (@ffenoll16) y Fran Ramírez (@cyberhadesblog) Para mantenerte al día con LUCA visita nuestra página web, suscríbete a LUCA Data Speaks o síguenos en Twitter, LinkedIn y YouTube.
31 de marzo de 2020
AI & Data
Ciencia Ficción vs IA: Cita con Rama o cómo mantener tu nave interestelar limpia y operativa con robots autosuficientes
Volvemos con un capítulo de nuestra serie Ciencia Ficción vs Inteligencia Artificial, donde por primera vez, hablaremos de un libro en vez de una película. De hecho, todos los temas que voy a tratar aquí son simples excusas para hablar de este magnífico libro que posiblemente, al menos para mí, sea uno de los mejores de la literatura de ciencia ficción de todos los tiempos. Pero además está de total actualidad, ya que está lleno de referencias tan actuales como las naves interestelares gobernadas por robots o por describir tecnologías que en aquella época parecían inalcanzables relacionadas con la IA y la Robótica, que estamos empezando a ver posible en nuestros días. Sin más dilación, la novela que vamos a analizar se llama nada mas y nada menos que “Cita con Rama” ("Rendezvous with Rama") escrita por el genio Sir Arthur C. Clarke. Figura 1. Portada del libro en su primera edición británica. Fuente, Wikipedia. NOTA: por supuesto y como siempre avisamos, este artículo está lleno de spoilers como puños, así que te recomiendo leer el libro antes de continuar con este artículo (es un libro que si lo empiezas, lo terminas en una tarde). Un extraño objeto extrasolar La novela "Cita con Rama" nos sitúa prácticamente en la actualidad, cuando un grupo de astrónomos detecta un extraño objeto de forma cilíndrica y alargada procedente de fuera del Sistema Solar, con unas dimensiones de 50 km de largo y 10 km en sus bases pero además muestra una gran velocidad de rotación, que comienza a atravesar el sistema solar a una gran velocidad. Una vez el objeto se está acercando a la Tierra, por fin se revela su naturaleza artificial. Este objeto, bautizado como Rama, es una gigantesca nave espacial extraterrestre. Si no hubiera dicho que iba a hablar de una novela de Ciencia Ficción, esa introducción que acabo de hacer sobre el libro podría encajar perfectamente (excepto en las dimensiones ya que este objeto comparado con Rama es bastante pequeño, tan sólo tiene 230x35x35m) con una noticia que apareció en 2017 pero que sigue dando guerra hoy día. Esta noticia hablaba de un extraño objeto interestelar que estaba atravesando a gran velocidad nuestro Sistema Solar, bautizado como Oumuamua. Pronto comenzaron las especulaciones sobre su naturaleza, ya que presentaba unas características extrañas como su gran velocidad de rotación, aspecto liso y sobre todo los inexplicables cambios en su velocidad, entre otras. Algunos científicos, nada menos que de la Universidad de Harvard, incluso llegaron a afirmar que podría ser una sonda enviada por alguna civilización alienígena. Finalmente esta teoría se descartó y parece que Oumuamua no era más que un asteroide un poco peculiar. Figura 2. Representación artística de Oumuamua. Fuente, Wikipedia. Explorando Rama Volviendo a la historia de Rama, la humanidad decide enviar una nave espacial tripulada para averiguar qué secretos esconde este extraño visitante. Una vez llegan al gigante objeto, detectan que existen una especie de escotillas de acceso. Cuando finalmente acceden por una de ellas, descubren que el interior está totalmente oscuro. Pero poco a poco, utilizando focos potentes, empiezan a descubrir construcciones, objetos geométricos e incluso algo que parece ser un lago o mar congelado. Al poco tiempo de exploración, Rama comienza a despertar y entonces se revela la grandiosidad de la construcción. A lo largo de tres estructuras que en principio parecían una especie de valles, comienza a activarse un sol artificial, calentando e iluminando el interior de Rama. Y es aquí cuando se revelan realmente los secretos de la gigante estructura. Gracias a la nueva iluminación, se dan cuenta que el agua congelada (la cual comienza a derretirse por el calor del sol artificial) es realmente un gigantesco mar e incluso llegan a ver islas llenas de estructuras parecidas a ciudades. Aquí comienza una aventura de exploración para conseguir llegar a alguna de esas islas y es aquí cuando ocurre el primer incidente que nos revelará quiénes son realmente los tripulantes de Rama. Figura 3. Impresión artística del interior de Rama. Fuente, Wikipedia. Biots, los habitantes de Rama Para acceder a una de dichas islas artificiales, los integrantes de la nave espacial terrícola utilizaron un ultraligero y así sortear el gigantesco mar que estaba frente a ellos. Pero al aterrizar después de atravesar el mar, el ultraligero se rompe y es entonces cuando aparece el primero de los habitantes de Rama. Nada más y nada menos que un robot o “biot” como llama el autor a estos seres en el libro, con tres ojos centrales y tres tentáculos con garras (tipo Cangrejo, como luego veremos en una clasificación de los mismos), hace acto de aparición solamente para limpiar los restos de ultraligero y comprobar que Rama no había sufrido desperfectos. Inmediatamente, recicla todo el material recuperado del ultraligero y limpia la zona del impacto, retirándose del lugar ignorando completamente al ser humano que estaba contemplando atónito la escena. Más adelante en la novela llegarían nuevos encuentros con más tipos de biots con diferentes formas y tamaños (incluso acuáticos, en el mar que hemos comentado antes), pero todos tienen algo en común, están programados para una única misión: mantener a Rama en funcionamiento y en perfecto estado. Este modelo de naves espaciales controladas y gestionadas por IA y robots en un viaje interestelar es un recurso muy utilizado en la Ciencia Ficción, aunque también se especula que esta sería la única forma de realizar un viaje largo por espacio mientras los seres humanos están en algún tipo de hibernación. Películas como Passengers, Prometheus (aquí es un robot humanoide mucho más avanzado quién se encarga de la nave durante el trayecto), la mítica 2001 Una Odisea del Espacio (obra del mismo autor) con nuestro querido HAL 9000 “cuidando” de los tripulantes, etc, son sólo algunos ejemplos, aunque el cine y la literatura está lleno de ellos. Tipos de biots Al parecer y según consiguen descubrir más adelante, los biots son una especia de robots mitad electrónicos y mitad biológicos (ojo a esta noticia reciente que encaja perfectamente con la definición de biots), los cuales utilizan algún tipo de batería interna para su funcionamiento. De hecho, logran identificar varios de ellos y les asignan nombres de insectos, animales u objetos terrestres para distinguirlos. Esta es más o menos la clasificación de los que vieron (hay muchos otros, como la Octoaraña, pero son más puntuales, esta lista muestra los más comunes): Ciempiés. Se encarga de reparar otros biots. Mantis. Desconocido, sólo parecen emitir una luz de colores. Grúa. Encargada de levantar objetos pesados. Cangrejo. Recolector de basura. Tiburón. Una especie de transporte acuático, posiblemente para los otros biots. Araña. Este biot es el más agresivo, parece el encargado de la seguridad de Rama. Es curioso el biot Ciempiés, encargado de reparar y transportar a los otros biots que han sufrido algún tipo de avería. Pero estos biots tienen una característica similar también por defecto en su configuración. En un momento dado de la historia, un biot del tipo Cangrejo, sufre una avería y pierde una de sus patas. A pesar de esta pérdida, el biot tiene la capacidad de auto-reparación y logra encontrar una forma de volver a andar, de una manera poco ortodoxa, pero suficiente para continuar con su tarea o mientras busca o espera al biot tipo Ciempiés para su completa reparación. Esta habilidad de auto-reparación para los robots, es un reto actual de la Robótica y la Inteligencia Artificial. De hecho, la base para poder enseñar a los robots a repararse pasa por un aprendizaje basado en la experiencia. Y eso todos sabemos que es una técnica del aprendizaje automático llamada aprendizaje por refuerzo o aprendizaje reforzado (y que incluso hemos llegado a utilizar nosotros en esta serie de artículos para enseñar a una IA a jugar a videojuegos). Esta la única manera con la cual el robot puede analizar y encontrar, entre miles de millones de opciones, la óptima para sobrevivir e intentar llevar a cabo una reparación de la parte dañada o incluso, aprender otra forma de caminar o llevar a cabo su misión sin esa parte la cual ya no puede volver a utilizar. Figura 4. Entornos OpenAI para simulación física y procesos de auto-aprendizaje para por ejemplo, caminar. Fuente, OpenAI. Arthur C. Clarke se caracterizaba en sus novelas por su gran rigor científico. Las proporciones y la forma de Rama no eran casuales, estaban perfectamente pensadas para ofrecer un ecosistema interno totalmente funcional, con sus ciclos de día/noche e incluso una gravedad artificial (gracias a la rotación). Por lo tanto, la idea de los biots o robots autosuficientes como los verdaderos tripulantes de las naves espaciales interestelares debemos de tenerla en cuenta. Cada día estamos viendo robots más avanzados en sus tareas cotidianas y más duraderos, por lo que esta visión de una nave espacial llena de robots autosuficientes está cada día más cerca. Por cierto, si los biots son sólo creaciones artificiales para mantener la nave ¿dónde están los verdaderos tripulantes de Rama? … Para saber la respuesta tendrás que leer el libro ;) Si te ha gustado este artículo, recuerda que tenemos otros dentro de esta misma serie: Ciencia Ficción vs Inteligencia Artificial: Star Wars, “…para ser un droide mecánico parece que piensas demasiado…” Ciencia Ficción vs Inteligencia Artificial: HAL 9000 “Doctor, no entiendo a los humanos” Ciencia Ficción vs Inteligencia Artificial: Saturno 3, “Héctor, robot malo, el perro no se come” Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken? Ciencia Ficción vs Inteligencia Artificial: Interestellar, “… hey Tars, ¿cuál es tu parámetro de honestidad? Ciencia Ficción vs Inteligencia Artificial: Her, “Mi novia es un sistema operativo y no me importa lo que digan” Ciencia Ficción vs Inteligencia Artificial: “Star Trek: la película”. ET es una IA. Ciencia Ficción vs Inteligencia Artificial: Matrix ¿vivimos en una simulación? Fran Ramírez, (@cyberhadesblog) es investigador de seguridad y miembro del equipo de Ideas Locas en CDCO en Telefónica, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps", Machine Learning aplicado a la Ciberseguridad” además del blog CyberHades.
18 de febrero de 2020
AI & Data
Las matemáticas del Machine Learning: Redes Neuronales (II)
Continuamos con nuestra serie de Matématicas en Machine Learning, en concreto con la segunda parte de Redes Neuronales. En el anterior capítulo hablamos por encima de la definición de neurona artificial, de redes neuronales y de sus características y elementos principales. Hoy en día existen redes neuronales complejas, capaces de resolver problemas cuya solución es realmente una tarea difícil. Pero, ¿cómo se ha llegado a este punto? ¿En qué momento se dio el salto? ¿De dónde surgieron estas ideas? En este artículo vamos a intentar responder a estas preguntas explicando, de la manera más breve y clara posible, las matemáticas que hay tras las redes neuronales. 1943 Los inicios Se cree que fue Frank Rosenblatt creando el Perceptrón quien introdujo el concepto de red neuronal artificial, pero en realidad las redes neuronales nacieron unos años antes, concretamente en 1943 cuando Walter Pitts y Warren McCulloch (tal y como contamos en su día en este post) crearon un modelo llamado lógica umbral con una base matemática y algorítmica. De este modelo nacen dos ramas, una enfoca a procesos biológicos del cerebro y otra en la aplicación de redes neuronales para la inteligencia artificial. Tal y como comentamos en el artículo anterior, la neurona que diseñaron McCulloch-Pitts es una unidad de cálculo, similar a la neurona humana, el resultado del cálculo en dicha neurona es una suma ponderada de entradas, seguida de una aplicación no lineal, llamada función de activación. Figura 1. Perceptrón o neurona artificial. Fuente. Como muestra la anterior imagen, la función ponderación es la combinación lineal de las entradas, 3 en el caso de la imagen. Matemáticamente hablando sería: Siendo σ nuestra función de activación, la cual se define como: Donde: El valor θ recibe el nombre de valor umbral. 1949 Regla de Hebb Más tarde, en 1949 Donald Hebb, introduce la teoría Hebbiana, o también conocida como la Regla de Hebb, postulado de aprendizaje de Hebb o Teoría de la Asamblea Celular. Hebb lo que creó fue una hipótesis de aprendizaje basado en el mecanismo de plasticidad neuronal. Se considera que este aprendizaje es un aprendizaje no supervisado, y los primeros modelos de la potenciación a largo plazo fueron variantes de este . De manera genérica el aprendizaje de Hebb es un aprendizaje que modifica el valor de los pesos Si consideramos como vector de salida: Como vector de entrada: Y como matriz pesos: Finalmente: Donde el ritmo de aprendizaje está comprendido entre los valores 0<ϵ<1 Se suele, a partir de un cierto criterio de optimización, tratar de conseguir o de deducir un algoritmo de aprendizaje. Por lo tanto, se busca un criterio que mida el rendimiento de la red neuronal, en este caso se busca que los pesos se ajusten. Una de las maneras más utilizadas ha sido definir el rendimiento a partir del error cuadrático medio de las salidas respecto al de las esperadas. 1958 Perceptrón y Adaline Es en el año 1958 cuando Frank Rosenblatt diseña el Perceptrón, un algoritmo de reconocimiento de patrones, mediante una serie de entradas y una única salida binaria, es decir tiene una función de discriminador lineal o clasificador binario. Siendo El Perceptrón simple diseñado por Rosenblatt es un modelo unidireccional formado por una capa de entrada y otra capa de salida. El Perceptrón se utiliza para clasificar, pero lo que realmente lo hizo especial fue su algoritmo de aprendizaje, el cual permite calcular automáticamente los pesos que clasifican un conjunto de patrones a partir de un conjunto de ejemplos. Un ejemplo en 2D Veamos a continuación un ejemplo en dos dimensiones, dos neuronas de entrada, lo que hará el Perceptrón será clasificar o discriminar entra las dos variables separables, es decir, el Perceptrón separa mediante un hiperplano dos regiones (dos clases diferentes): Despejando de la ecuación: Esta recta (hiperplano en dos dimensiones) es la que nos divide las dos regiones: Anteriormente hemos mencionado que la principal característica del perceptrón era el “autoajuste” de los pesos. Una variante del Aprendizaje de Hebb que se puede definir de la siguiente forma: Siendo: Hemos denotado como el conjunto vectores entrada. Y análogamente: corresponde al conjunto salida real, y salida esperado. En cuanto a t se refiere a la iteración y t+1 será la siguiente iteración. Además ϵ es definido como el ritmo de aprendizaje, un valor comprendido entre 0 y 1. 1960 Adaline En 1960 Bernard Widrow y Ted Hoff desarrollaron un tipo de neurona artificial (Adaptative Linear Element) conocida como Adaline. Se aplica a estructuras lineales como las que ya hemos visto: Una de las diferencias con el Perceptrón es la modificación de los pesos para tratar de reducir la diferencia entre la salida deseada y la real. El principal objetivo de Adaline es obtener una salida lo más exacta posible, para ello se busca minimizar desviación de los patrones de entrada, eligiendo una medida del error global, la más común que suele utilizarse es el error cuadrático medio del que ya hemos hablado en algún otro artículo. Sea Yk la salida obtenida para el patrón k, entonces el error para el patrón k será: Error cuadrático mínimo: Teniendo en cuenta que: Entonces tenemos: Facilitando la notación, podemos escribir: Quedando finalmente: Y por último derivando respecto a w e igualando a cero: Lo que implica que tiene extremo relativo y además es un mínimo. Con respecto al Perceptrón el Adaline posee la ventaja de que su gráfica de error es un hiperparaboloide que posee o bien un único mínimo global, o bien una recta de infinitos mínimos, todos ellos globales. Esto evita la gran cantidad de problemas que da el Perceptrón a la hora del entrenamiento debido a que su función de error (también llamada de coste) posee numerosos mínimos locales. Limitaciones del perceptrón simple El Perceptrón simple nos presenta unas limitaciones, debido mayormente a que sólo es capaz de separar, representar, funciones linealmente separables. Como consecuencia, Mynsk y Papert publicaron un trabajo exponiendo las limitaciones del Perceptrón simple. “El perceptrón simple sólo sirve para clasificar problemas linealmente separables, cosa que ya se podía hacer mediante métodos estadísticos, y de una forma mucho más eficiente.” "Perceptrons". 1969. Marvin Minsky, Seymour Papert Una de las repercusiones más graves como consecuencia del trabajo de Mynsk fue sin duda la falta de inversión o la reducción de fondos de investigación a este campo, derivándolos al campo de la inteligencia artificial. En el siguiente artículo hablaremos de los siguientes años, donde hubo muy poco movimiento en dicho campo. Y también de la evolución a partir de los 80 hasta nuestros días. Las Matemáticas del Machine Learning ¿Qué debo saber? Las Matemáticas del Machine Learning: explicando la Regresión Lineal (I) Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (II) y Multilineal. Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (III) y Multilineal. Contraste y Fiabilidad. Las Matemáticas del Machine Learning: Ejemplos Regresión Lineal (IV y último). Implementación en lenguaje R Las Matemáticas del Machine Learning: Redes Neuronales (Parte I) Escrito para LUCA por Fran Fenoll (@ffenoll16), Fran Ramírez (@cyberhadesblog y @cybercaronte) y Enrique Blanco (@eblanco_h) (ambos del equipo de Ideas Locas CDO de Telefónica).
29 de enero de 2020
AI & Data
Las matemáticas del Machine Learning: Redes Neuronales (Parte I)
Continuamos con nuestra serie que tiene como objetivo explicar la base de las matemáticas que se utilizan en el aprendizaje de máquina o Machine Learning de la manera más sencilla y directa posible. Al final del artículo podrás encontrar todos los enlaces al resto de esta mini serie de artículos. Una vez que ya estamos familiarizados con el concepto de Machine Learning, el siguiente paso es distinguir los tres tipos de algoritmos de aprendizaje automático que existen: supervisado, no supervisado y por refuerzo. En el aprendizaje supervisado, la máquina aprende mediante ejemplos. De este modo, el usuario proporciona al algoritmo de aprendizaje automático un conjunto de datos conocidos que incluye las entradas y salidas deseadas, y el algoritmo debe encontrar un método para determinar cómo llegar a esas entradas y salidas. Por el contrario en el no supervisado el algoritmo de aprendizaje automático estudia los datos proporcionados por nosotros para identificar patrones y encontrar una serie de correlaciones y relaciones. En este enlace puedes encontrar una explicación más en profundidad de ambos tipos de aprendizaje. El aprendizaje por refuerzo se basa en un aprendizaje autónomo una vez establecidas las normas mediante prueba y error, es decir, nosotros definimos las reglas del juego y la máquina experimenta las diferentes posibilidades, aprendiendo de cada error que comete o de cada respuesta obtenida. En este enlace puedes encontrar más información así como una aplicación práctica orientada a videojuegos ;) Los siete tipos de algoritmos más comunes o más populares de Machine Learning son: Algoritmo de regresión. Algoritmo de red neuronal. Algoritmo de agrupación. Algoritmo de árbol de decisión. Algoritmo de Bayesiano Algoritmo de reducción de dimensión. Algoritmo de aprendizaje profundo. Durante los siguientes artículos hablaremos acerca del algoritmo de red neuronal, su historia, desarrollo hasta nuestros días y una breve explicación de las matemáticas presentes en las redes neuronales. ¿Qué es una red neuronal? Primero de todo cuando hablamos de una red neuronal, lo que nos viene a la cabeza es la imagen de una neurona del cerebro, de esas que hemos visto en algún libro o en algún reportaje, una masa redonda, con un núcleo y unas ramificaciones. En el cerebro tenemos miles de millones de neuronas, todas ellas forman una red neuronal, y sabemos que la información se transmite mediante la sinapsis. Pues bien, una red neuronal artificial es algo similar, un conjunto de redes neuronales que tienen como objetivo resolver problemas difíciles de resolver mediante algoritmos convencionales. Dentro de dicho conjunto, en cada una de ellas podemos distinguir una entrada de señal, un nodo y una salida o respuesta hacía otra neurona artificial. Dependiendo del número de neuronas, nuestra red puede ser más o menos simple o profunda. La sinapsis entre neuronas, la transmisión de información, o el valor de salida de la neurona anterior se multiplica por un valor peso. Estos pesos en los enlaces pueden incrementar o inhibir el estado de activación de las siguientes neuronas. Del mismo modo, a la salida de la neurona, puede existir, un filtro, una función limitadora o umbral, que modifica el valor resultado o impone un límite que se debe sobrepasar para poder proseguir a otra neurona. Esta función se conoce como función de activación, la cual hablaremos en otro momento. Para el ajuste de dichos pesos hablaremos acerca del entrenamiento de la red neuronal, utilizando diversos métodos, como son descenso de gradiente o backpropagation. ¿Cómo funciona una neurona? Las señales de entrada, la información que recibe nuestra neuronal artificial, son variables independientes. Los n-valores de entrada son multiplicados por sus respectivos pesos, es decir en la sinopsis el vector entrada es multiplicado por el vector peso , dando como resultado una combinación lineal de las entradas y los pesos, algo que denominamos función de ponderación. A continuación, se aplicará una función activación: Y por último dicho resultado se propaga a la salida. Dicho valor puede ser la nueva entrada de una neurona, formando así las redes neuronales, o bien puede ser el resultado final, nuestra variable respuesta. Las respuestas obtenidas pueden ser una variable continua como el precio de un objeto, una respuesta binaria (0,1) (Sí, No) si una persona padece algún tipo de enfermedad o no, o puede ser una respuesta categórica que nos sirva para clasificar por ejemplo. A continuación podemos observar mediante un gráfico el comportamiento de una neurona artificial. Figura 1. Esquema de un percepción o neurona artificial. Fuente: https://es.wikipedia.org/wiki/Perceptr%C3%B3n Funciones de activación. Una función de activación es una función que transmite la información generada por la combinación lineal de los pesos y las entradas, es decir son la manera de transmitir la información por las conexiones de salida. La información puede transmitirse sin modificaciones, estaríamos hablando de una función identidad, o bien que no transmita la información. Como lo que queremos es que la red sea capaz de resolver problemas cada vez más complejos, las funciones de activación generalmente harán que los modelos sean no lineales. Entre las funciones de activación más conocidas o más usadas se encuentran: Función Escalón, (similar a la función binaria.) Función Sigmoidal. Función Rectificadora (ReLU). Función Tangente Hiperbólica. Funciones de Base Radial. (Gausianas, multicuadráticas, multicuadráticas inversas…) Resumen La red neuronal la podemos definir como un grafo, una capa de entradas que reciben la señal de entrada, la envían mediante estímulos a la siguiente capa oculta, la cual se encarga de procesar la información y transmitirla a la siguiente capa, así hasta que llegamos a la última capa, la capa de salida, la que nos transmite la respuesta. Figura 2. Red neuronal artificial. Fuente: https://es.wikipedia.org/wiki/Perceptr%C3%B3n_multicapa En los siguientes artículos hablaremos acerca de la “evolución” de las redes neuronales y de las diferentes funciones de activación, así como de sus características. Si quieres repasar desde el principio estos conceptos de matemáticas aplicadas al Machine Learning, no dudes en echar un vistazo a nuestra serie completa: Las Matemáticas del Machine Learning ¿Qué debo saber? Las Matemáticas del Machine Learning: explicando la Regresión Lineal (I) Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (II) y Multilineal. Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (III) y Multilineal. Contraste y Fiabilidad. Las Matemáticas del Machine Learning: Ejemplos Regresión Lineal (IV y último). Implementación en lenguaje R Escrito para LUCA por Fran Fenoll (@ffenoll16), Fran Ramírez (@cyberhadesblog y @cybercaronte) y Enrique Blanco (@eblanco_h) ambos del equipo de Ideas Locas CDO de Telefónica.
26 de noviembre de 2019
AI & Data
Ciencia Ficción vs Inteligencia Artificial: Matrix ¿vivimos en una simulación?
Si existe una película de Ciencia Ficción que engloba todos nuestros miedos hacia la Inteligencia Artificial (además de ser la definición empírica del término ciberpunk) esa es “The Matrix”. La temida revolución de las máquinas contra los seres humanos, mundos y realidades simuladas, futuro apocalíptico, bots y robots inteligentes así como un largo etcétera son sólo algunos de los temas que se hacen realidad en esta obra maestra del cine. Pero antes de entrar de lleno en algunos de estos conceptos, vamos a repasar brevemente de que trata esta película (la principal, no la trilogía, aunque la mencionaré para complementar conceptos). No creo que sea necesario decir que a partir de ahora todo serán spoilers como puños, además sin ningún miramiento por mi parte porque es lo que te mereces si no has visto la película a estas alturas ;) En 1999, la Inteligencia Artificial todavía no se había convertido en la tremenda revolución que es hoy día, pero sí era el justo momento de la explosión real de Internet y el auge de ordenadores más potentes (las dos semillas que han impulsado la Inteligencia Artificial a su estado actual). En marzo de ese mismo año, las hermanas Wachowski estrenaron su tercera película que llamaron “The Matrix” o simplemente “Matrix” en España. En ella se mezclaba perfectamente conceptos del género de animación japonés, artes marciales, cultura ciberpunk, ordenadores, robots y mucho, mucho más. El protagonista, Thomas Anderson(Kenau Reeves) es un programador de día y un aficionado al hacking por la noche, donde se hace llamar “Neo”. En una maravillosa escena en la cual Neo se queda dormido sobre el teclado del ordenador, en el monitor aparecen las palabras “Wake up, Neo” (“Despierta Neo”) mientras suena de fondo la maravillosa canción Angel de Massive Atack. Este mensaje se convertirá en la llave de todo lo que estaba por ocurrir, el despertar hacia la oscura realidad. Después de algunos otros mensajes en su ordenador, aparece uno muy especial “Follow the white rabbit” (“Sigue al conejo blanco”) en una clara alusión al libro de Alicia en el País de las Maravillas. En ese momento llaman a la puerta y una de las personas que aparece lleva tatuado un conejo blanco así que Neo decide ir con ellos. En una discoteca conoce a Trinity (Carrie-Anne Moss) la cual le habla de Morfeo (Laurence Fishburne) el cual parece tener todas las respuestas a sus dudas existenciales y la realidad. Fijaros que maravillosa trama y puesta en escena y tan sólo han pasado unos minutos desde el comienzo del film. Figura 1. Mensaje que recibe Neo: "Despierta Neo... Matrix te tiene ... Sigue al conejo blanco... Toc Toc Neo (en este momento llaman a la puerta). Fuente. A partir de este punto es cuando comienza prácticamente otra película. Al igual que Alicia pasa a otra realidad al bajar por la madriguera del conejo, Morfeo le ofrece dos pastillas, una azul y otra roja para realizar un viaje similar. La azul es conformismo e ignorancia, es decir, todo se queda igual y la roja (esta es la que elige Neo) le mostrará la cruda y dolorosa realidad: el mundo está devastado por las máquinas, utilizan a los seres humanos como generadores de energía (pilas o baterías) utilizando sus mentes alimentándolas con una realidad simulada de una super-ciudad de finales del siglo XX llamada Mega City. Pero aún queda una esperanza, en el mundo real resiste Zion, un refugio donde residen los últimos supervivientes a esta catástrofe que lucharan con todas sus fuerzas para destruir a las máquinas. Con esta pequeña introducción creo que es suficiente para entrar en contexto y hablar de todo lo que nos ofrece la película. Matrix no sólo habla de tecnología, el mensaje filosófico sobre la sociedad construida por el ser humano, su percepción y sus relaciones son una constante. También hay que destacar que Matrix es una trilogía (todas muy inferiores a la película principal por cierto), la cual sirve para explicarnos mejor el mundo virtual creado por las máquinas para que los humanos vivan contentos en su ignorancia y continúen generando impulsos eléctricos en sus cerebros y así alimentar a las máquinas. El miedo a la revolución de las máquinas ya lo hemos tratado en más de una ocasión en esta sección e incluso lo contamos mi colega Enrique Blanco y yo en esta charla que dimos en la Fundación Telefónica. Sería imposible tratar todos los temas que hemos comentado así que esta vez me centraré en analizar la columna vertebral de la película ¿vivimos realmente en un mundo simulado? Esto que parece en principio una tontería, es algo que se está tomando muy en serio hoy día no sólo por científicos, sino también por filósofos. De hecho fue precisamente un filósofo llamado Nick Bostrom el primero en mencionar esta teoría en un paper publicado en 2003 llamado “¿Estás viviendo en una simulación por ordenador?. Fijaros la puntualización “simulación por ordenador”, no se habla de un mundo onírico o de la imaginación, habla de un mundo digital el cual, viendo la evolución actual de la Inteligencia Artificial, posiblemente esté creado por máquinas. Os suena este argumento ¿verdad? Durante todo el ensayo, Nick Bostrom habla de la filosofía de la mente conectando estos conceptos con la posibilidad futura de integrarlos o simularlos en un mundo digital. Aún no se han fabricado máquinas capaces de pensar por sí solas y tampoco hemos sido capaces de volcar la información del cerebro al ordenador (aunque Elon Musk ya se ha puesto manos a la obra el cual por cierto, también es favorable a la teoría de la simulación). Pero, aún suponiendo que las máquinas fueran inteligentes y tuvieran una gran capacidad de cómputo, simular todo el Universo es una tarea imposible ¿o no? Hay un videojuego que me encanta y el cual también me parece una auténtica maravilla, al que intento jugar siempre que tengo algún rato libre (que son pocos). Este juego se llama “No Man´s Sky” y su argumento <modo irónico on>es igual de simple que el de Matrix: explorar todo el universo con miles de millones de planetas con sus respectivos seres vivos, clima, materiales, etc. <modo irónico off>. Aquí nos podemos formular la misma pregunta ¿cómo es posible generar tal cantidad de planetas, eventos, acciones en un mundo virtual? La respuesta está en la generación procedural o por procedimientos. La generación procedural significa que la simulación se crea dinámicamente de forma algorítmica, es decir, en base a fórmulas matemáticas y un patrón constructor (¿el ADN? ¿los átomos? ¿el Arquitecto de Matrix?). Las naves espaciales, los planetas, los seres vivos que lo habitan, las estrellas, etc todo está generado utilizando esta técnica. Por lo tanto, no es necesario crear previamente estos mundos, simplemente se autogeneran una vez el observador cumple las condiciones, como, por ejemplo, llegar con su nave a un sistema solar específico o estar en una posición espacial concreta. En base a unos patrones, a medida que el jugador se acerca a una estrella, todo lo que aparece delante del observador se genera desde cero. Es decir, no existía antes de la interacción con el observador. De esta forma no es necesario almacenar grandes cantidades de datos (sólo haría falta almacenar fórmulas o patrones con las posibles interacciones recibidas) o incluso utilizar muchos recursos de computación, sólo los patrones que afectan al entorno generado. El concepto de una realidad que depende del observador es algo que suena a Física Cuántica (¿alguien ha dicho el gato de Schrödinger?). ¿Es esta la prueba definitiva de que vivimos en una simulación? Dejando de lado esta teoría totalmente subjetiva producto de mis miles de horas de Ciencia Ficción y videojuegos y siendo consciente del jardín en el que me estoy metiendo, la realidad es que algunos científicos hablan de otras pruebas que podrían confirmar que estamos en un universo simulado. De hecho, algunos errores y comportamientos extraños (como los bugs o glitches de Matrix) dentro del mundo de la física parecen ser la base para probar esta teoría. Desde el comportamiento de las partículas subatómicas hasta incluso mediciones que ofrecen datos totalmente fuera de escala (como este sobre los rayos cósmicos), parecen ser sólo algunos de los experimentos para comprobar si realmente estamos dentro de un universo simulado. Los físicos parecen ser que son los únicos que de momento pueden probarlo, pero la pregunta que nos hacemos ¿queremos realmente saber si estamos dentro de una simulación? ¿pastilla azul o pastilla roja?. Pues según algunos estudios, casi es mejor la pastilla azul. Fin de la historia. Al igual que ocurre con la búsqueda de vida extraterrestre, donde algunos científicos de renombre dicen que es mejor no encontrarlos porque nos destruirían. Pues algo parecido ocurre con esta teoría de la realidad simulada. Es decir, es mejor que los físicos no averigüen si vivimos en una simulación. Piénsalo de esta forma. Si vivimos en una simulación, es porque algo o alguien está probando algo con nosotros, es decir, está realizando un experimento. Si uno de los sujetos del experimento se las ingenia para digamos, salir la simulación, ya no es necesario que exista. En otras palabras, ya no es necesario y puede ser eliminado. Supongamos ahora que en vez de ser sólo un individuo resulta que toda la humanidad descubre que vivimos en una simulación por ordenador. El experimento ya no sería útil y, por lo tanto, se podría reiniciar o incluso borrar como fuera un simple fichero de ordenador. Fin del universo conocido. Algo así ocurrió con Matrix. El mundo simulado de la película era ya la tercera versión, es decir, hubo dos versiones anteriores que acabaron en un total desastre y fueron eliminadas por sus máquinas creadoras. La primera versión fracasó porque era un paraíso terrenal, nadie sufría, todo el mundo tenía lo que quería, sin preocupaciones. Por lo tanto, no había aspiraciones, miedos, etc. Y los humanos simplemente morían o buscaban la forma de despertar. La segunda versión era más primitiva, permitía la violencia y los terrores y monstruos del ser humano casi sin control, y esto se fue de las manos. Los humanos esta vez morían como efecto de dicha violencia y también querían despertar. Y finalmente está la tercera Matrix, en la cual ocurren los hechos de la película, donde esta vez, el Arquitecto encontró un balance entre las dos anteriores permitiendo que el ser humano fuera el que aceptara su mundo, con sus cosas buenas y cosas malas. Esta vez, el 99% de los individuos aceptó el programa y ya no querían despertar. El ser humano se sentía, permitidme la redundancia, más humano en la simulación. Así que ya sabéis, si algún día tenéis la opción de elegir la pastilla azul o la pastilla roja, es mejor pensarlo bien antes de realizar una elección. Yo lo tengo claro, siempre la pastilla roja ;)
24 de septiembre de 2019
Ciberseguridad
Nuevo paper publicado “Second Factor Web Browsing: detección de amenazas a través del uso de un doble canal”
La utilización de un doble canal para tener una segunda vía de acceso en caso de que nuestro canal principal esté comprometido, es un factor realmente importante a tener en cuenta para mantener segura nuestra infraestructura y nuestros usuarios. Intentar solucionar el problema desde el canal principal no es la vía más aconsejable, ya que cada acción que realicemos podría estar manipulada por un posible atacante. Esta idea no es nueva para nosotros, de hecho, aplicaciones como Latch, StackSMS y Safepost son sólo algunos ejemplos de soluciones que hemos implementado basándonos en el concepto de Second Channel o segundo canal. Un paso más relacionado con este concepto de segundo canal fue publicado por Chema Alonso en su blog en una serie de artículos centrados en la seguridad a la hora de navegar por Internet. En ellos, la propuesta ofrece mantener una navegación conjunta a la principal, utilizando uno de estos canales secundarios, para monitorizar en todo momento si se está produciendo algún tipo de ataque. Este segundo canal puede ser por ejemplo, una conexión Bluetooth, la cual servirá como vía de comunicación con el equipo a monitorizar, y por otro lado una conexión 2G, 3G o 4G para ofrecer conectividad desde otra conexión distinta a la utilizada por el equipo auditado (normalmente una WiFi o una conexión por cable). Figura 1. Concepto básico principal de la idea de segundo canal de monitorización descrito. Utilizando otras palabras, el tráfico sale por el primer canal por defecto en el equipo principal, pero a su vez también se envía ese mismo tráfico por el segundo canal para su control. El dispositivo ideal para realizar dicha monitorización es un smartphone, aunque también sería posible alguna implementación en la nube. Por lo tanto, cualquier modificación en el tráfico que se detecte puede ser síntoma de posible ataque. Una posible utilidad inmediata, debido a esta característica de monitorización, es la posibilidad de utilizar este canal como control parental. En la Rooted de este año, esta idea se materializó en una charla de Chema Alonso (que podéis ver en el vídeo de arriba) en la cual, además de explicar la evolución y los conceptos clave, también se ofreció una demo de su funcionamiento. Utilizar un doble canal es muy similar al concepto de doble factor de autenticación, 2FA, en la cual el atacante tiene que vulnerar dos elementos diferentes para poder llevar a cabo con éxito la acción. Por lo tanto, no cabe duda de su gran utilidad a la hora de incrementar la seguridad del usuario, en este caso navegando por Internet, aunque sus posibilidades son mucho más amplias. [slideshare id=171503466&doc=secondfactorwebbrowsing1-190913093418&type=d] Es por eso por lo que finalmente todos estos conceptos e ideas se han unificado en un paper publicado hoy y que ya podéis consultar desde este enlace. En él se profundiza a nivel técnico en todos los conceptos antes mencionados, así como diferentes propuestas de arquitecturas que permitan automatizar e implementar las verificaciones de los posibles ataques de red a los que pueda estar expuesto el usuario. Esperamos que esta idea os haya gustado y nos hagáis llegar vuestros comentarios. Happy Hacking Hackers!
13 de septiembre de 2019
AI & Data
Las Matemáticas del Machine Learning: Ejemplos Regresión Lineal (IV y último). Implementación en lenguaje R.
Para finalizar la primera parte de nuestra serie de matemáticas en Machine Learning centrada en la Regresión Lineal, vamos a implementar el ejemplo que hemos utilizado en esta serie de artículos. Para ello implementaremos una solución en lenguaje de programación R. Antes de continuar recomendamos repasar los artículos anteriores sobre Regresión Lineal y el ejemplo utilizado: Las Matemáticas del Machine Learning ¿Qué debo saber? Las Matemáticas del Machine Learning: explicando la Regresión Lineal (I) Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (II) y Multilineal. Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (III) y Multilineal. Contraste y Fiabilidad. Descriptiva númerica y gráfica Estudiaremos la matriz de correlaciones y un diagrama dispersión múltiple de las 3 variables númericas: dades = read_xlsx("Jandi.xlsx") kable(round(cor(dades),3)) plot(dades,pch=16) Se puede observar que la variable Recuento tiene una relación lineal positiva con Temperatura y Humedad (r=0.697, r= 0.86, respectivamente). Entre Temperatura y Humedad hay relación lineal positiva pero más débil (r=0.356). Modelo de regresión lineal múltiple my_model = lm(Recuento ~ Temperatura + Humedad,data=dades) summary(my_model) ## Call: ## lm(formula = Recuento ~ Temperatura + Humedad, data = dades) ## ## Residuals: ## Min 1Q Median 3Q Max ## -9.8617 -2.0406 0.4319 2.9881 8.5047 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t| ## (Intercept) 25.7115 14.3725 1.789 0.098876 . ## Temperatura 1.5818 0.3203 4.939 0.000343 *** ## Humedad 1.5424 0.1995 7.731 5.32e-06 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 5.351 on 12 degrees of freedom ## Multiple R-squared: 0.914, Adjusted R-squared: 0.8996 ## F-statistic: 63.75 on 2 and 12 DF, p-value: 4.051e-07 Se observa que: Con estos resultados se puede interpretar que cuando la temperatura y la humedad son 0, el recuento estimado por el modelo es 25.7. También podemos observar que por cada unidad de Temperatura y Humedad, el modelo estima que el recuento aumenta 1.58 y 1.54 unidades respectivamente. Respecto a los contrastes: obtenemos los p-valores 0.098, 0.0003 y 5 * 10−6 respectivamente. Por lo tanto podemos deducir que: Respecto al contraste H0 : No existe relación lineal vs H1 : Si existe relación lineal, obtenemos un estadístico de contraste de F = 63.75 con 2 y 12 grados en el numerador y denominador. Obteniendo un p-valor de 4 * 10−7 dando evidencia a rechazar la hipótesis nula. Respecto al coeficiente de determinación, nos fijamos en el R2 ajustado, pues es una regresión lineal múltiple, obteniendo un valor de 0.89. Este valor indica que el modelo de regresión se ajusta muy bien a los datos, dado a que el valor final es cercano a 1. Comprobación de los supuestos de Normalidad y homocedasticidad en los residuos opar <- par(mfrow = c(2,2), oma = c(0, 0, 1.1, 0)) plot(my_model, las = 1) # Residuals, Fitted, ... par(opar) bptest(my_model) ## ## studentized Breusch-Pagan test ## ## data: my_model ## BP = 0.40552, df = 2, p-value = 0.8165 ## ## Shapiro-Wilk normality test ## ## data: my_model$residuals ## W = 0.96319, p-value = 0.7476 La gráfica “Residuals vs Fitted” (arriba izquierda, imagen anterior), sugiere una variabilidad constante de los residuos (eje Y),la línea roja horizontal lo indica, no es completamente paralela al eje X, pero los máximos y mínimos de la línea no se alejan demasiado del 0. La gráfica “Normal Q-Q” (arriba derecha, imagen anterior), sugiere que los residuos siguen una distribución Normal, pues la mayoria de los puntos están sobre la línea discontinua, es decir los residuos coinciden con los quantiles teóricos de la distribución Normal, excepto los valores 9, 14 que están más alejados. El test de Breusch-Pagan se basa en el contraste H0 : Existe homocedasticidad en los residuos vs H1 : No existe homocedasticidad en los residuos. Por otro lado, el test de Shapiro-Wilk se basa en el contraste H0 : Los residuos siguen una distribución Normal vs H1 : Los residuos NO siguen una distribución Normal. De los dos tests, obtenemos p-valores 0.81 y 0.74, por tanto podemos aceptar las hipótesis nulas y en consecuencia el modelo cumple los supuestos de Normalidad y homocedasticidad en los residuos (considerando = 0.05). Con este artículo damos por finalizada la parte de Regresión Lineal, pero no os perdáis los siguientes artículos de esta misma sección en la cual profundizaremos en las matemáticas del Machine Learning. Escrito para LUCA por Fran Fenoll (@ffenoll16), Fran Ramírez (@cyberhadesblog y @cybercaronte) y Enrique Blanco (@eblanco_h) ambos del equipo de Ideas Locas CDO de Telefónica.
24 de julio de 2019
Ciberseguridad
Cómo analizar documentos con FOCA en diez pasos (o menos)
Cada vez que creamos un documento ofimático, como puede ser un procesador de texto (por ejemplo, Microsoft Word), una presentación (un PowerPoint), una hoja de cálculo (un Excel), un PDF o incluso imágenes, estos almacenan por defecto mucha más información de la que pensamos. Existe un contenido adicional incrustada en los ficheros que recibe el nombre de metadatos y pueden contener datos como por ejemplo el nombre del autor, la fecha de creación/modificación o incluso el título del documento. Aunque esto ya de por sí ofrece bastante información, un análisis más profundo puedo extraer todavía más datos que van más allá de los mencionados, dando, por ejemplo, contenido muy importante sobre la infraestructura donde fue creado. Por ejemplo, es posible extraer contraseñas, nombres de usuarios, nombres de carpetas, nombres de servidores, impresoras, ediciones realizadas, etc. todo esto en simple fichero ofimático. Esta información podría poner en grave riesgo, además de nuestra privacidad, la integridad de nuestra empresa u organización, ya que ofrece muchos datos importante que un posible ciberdelicuente podría utilizar para analizar nuestra infraestructura (esta técnica se llama “fingerprinting”) y luego lanzar algún tipo de ataque basándose en esto. En el caso de las imágenes, la información más relevante que se puede obtener es la localización geográfica desde la cual se tomó la fotografía, ofreciendo datos por ejemplo, de un itinerario que hayamos realizado. Los metadatos son más importantes de lo que parecen a simple vista. Quizás el caso más llamativo fue el de Tony Blair y el documento Word que teóricamente probaba que Irak tenía armas de destrucción masiva, pero una revisión de los metadatos sacó a la luz mucho contenido, como revisiones y comentarios que probaron que dicha información era falsa. FOCA es una herramienta gratuita creada por ElevenPaths la cual es de gran utilidad a la hora de analizar los metadatos, ya sea de un documento o incluso de toda una organización. La FOCA es código abierto y disponible para su descarga desde el repositorio GitHub de ElevenPaths. Vamos a ver lo sencillo que es extraer todos los datos de un documento ofimático y también obtener los informes de metadatos de toda una organización en unos sencillos pasos. Extracción de metadatos de uno o varios ficheros locales Paso 1: Una vez tenemos abierta FOCA, simplemente marcamos la opción “Metadata” [1] y luego, con el botón derecho del ratón hacemos click en la zona [2] que se indica en la imagen y finalmente en “Add file” [3] (si queremos analizar el contenido de una carpeta completa, utilizaremos la opción “Add folder”) seleccionamos el fichero que queremos analizar sus metadatos (también es posible arrastrar el fichero o la carpeta directamente): Paso 2: una vez cargado el fichero haremos click sobre él con el botón derecho del ratón [4] y luego seleccionamos la opción “Extract Metadata” [5] : Paso 3: para visualizar los resultados, nos fijaremos en la parte izquierda del panel done aparecerá en el apartado “Metadata” el nombre y formato del fichero (en este caso un .docx llamado “Test1”) [6] . Pulsando sobre él, podremos ver a la derecha un resumen de todos los metadatos extraídos [7] : Extracción de todos los metadatos de una organización Paso 1: el primer paso será definir un proyecto. Para ellos vamos a la sección “Project” y seleccionamos “New Project” [1] : Paso 2: El apartado [2] “Select Project” lo utilizaremos si previamente ya hemos creado un proyecto y lo queremos reutilizar, en caso de crear uno desde cero, dejaremos vacía esta opción. En “Project name” daremos el nombre del proyecto [3] . “Domain website” [4] nos permite introducir la dirección URL que vamos a auditar. Si hubiera otros dominios alternativos donde queremos que FOCA también busque ficheros, es posible añadirlos en “Alternative domains” [5]. Los ficheros que vayamos descargando (luego veremos el procedimiento) se almacenarán en la carpeta que se defina en “Folder where save documents” [6] . Finalmente pulsaremos en “Create” [7] para definir nuestro proyecto.📍 Paso 3: en este punto volveremos a estar en la pantalla de “Metadata”. El primero de los pasos será marcar los motores de búsqueda “Search Engines” [8] (en el ejemplo, hemos marcado los tres). En el apartado “Extensions” tenemos la opción de seleccionar o no el tipo de fichero que queramos buscar en nuestro proyecto [9] . Después de pulsar “Search All”, al cabo de un tiempo (el cual estará definido por la cantidad de ficheros localizados en la URL del proyecto) nos aparecerá un listado similar al que podemos ver en el punto [10] . Paso 4: para analizar el fichero o los ficheros obtenidos del análisis, el proceso es similar al que realizamos en el apartado anterior para un fichero único. Pero esta vez tenemos que dar un paso previo, y es descargarlo. Para ellos pulsamos sobre el botón derecho sobre el fichero [11] (también podemos seleccionar varios ficheros manteniendo la tecla “Mayúsculas” pulsada( que queramos analizar y luego la opción “Download” tal y como muestra el punto [12] (si queremos descargar todos, pulsaremos la opción “Download All”). Paso 5: una vez descargado veremos a la derecha un punto y también la fecha y la hora de descarga. Ahora procederemos a extraer los metadatos con “Extract Metadata” [13] y luego los analizaremos [14] con “Analyze Metadata”: Paso 6: finalmente, obtenemos la salida que se muestra en la imagen siguiente (hemos ocultado el contenido por motivos de privacidad) donde se puede apreciar claramente que hemos obtenido el nombre del ordenador donde se ha creado [15] , datos de los servidores [16], el nombre de dos usuarios [17], el tipo de software [18] y también información general sobre el documento como la fecha de creación, etc. En este libro publicado por la editorial 0xWord ofrece en detalle, cómo sacar partido a todas las opciones y posibilidades de FOCA: Es importante utilizar un software como FOCA para auditar tanto ficheros personales como los de una organización, y de esa forma obtener una visión sobre el contenido que estamos desplegando de manera involuntaria con este tipo de ficheros y evitar data leaks o fuga de información.
26 de junio de 2019
AI & Data
Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (III) y Multilineal. Contraste y fiabilidad.
Seguimos con esta serie en la cual intentamos que todos/todas perdamos el miedo a las matemáticas en el Machine Learning. En esta tercera y última parte sobre la Regresión Lineal y Multilineal vamos a hablar sobre el concepto teórico de fiabilidad y contraste desde el punto de vista teórico. No os preocupéis si este es un poco denso (es necesario asimilar un poco de teoría) ya que en el siguiente artículo publicaremos una implementación práctica del ejemplo aplicando todos estos conceptos en el lenguaje de programación "R". Ahora que ya tenemos una estimación (ver los artículos anteriores), procederemos a buscar una fiabilidad, un contraste para ver si en definitiva, se cumple o no la premisa que hayamos definido sobre nuestro modelo a estudiar. En el anterior artículo vimos la definición de la expresión de regresión lineal múltiple, además de cómo obtener los estimadores a partir de los datos de una muestra aleatoria. También dimos un ejemplo del recuento de población de un parásito, y de cómo al parecer las variables temperatura y humedad influían en el recuento de dicha especie. En resumen, el modelo estimado que predice para la observación i-ésima es: Modelo estimado Y el error de predicción: Error de predicción El cual su media y varianza expresa una distribución normal. Matricialmente llegamos a: O bien: Representación matricial Llegando a la siguiente conclusión: Conclusión Ahora bien, como estimador de la varianza del error se puede emplear: Estimación de la Varianza Aplicándola a nuestro ejemplo, obtenemos: Resultado de la Varianza aplicada al ejemplo de artículos anteriores Por lo que tendremos una desviación típica: Desviación típica Veamos qué información nos aporta β ̂, sabemos que el vector de observaciones Y, se distribuye siguiendo una distribución Normal Multivariante: Distribución Normal Multivariante Dado que β ̂ es una combinación lineal de las componentes del vector Y, por lo que podemos afirmar que se distribuye según una variable aleatoria Normal. ¿Qué podemos decir acerca su media y matriz de varianza y covarianza? Consideramos que: Por lo tanto tenemos que reescribir β ̂ como: Por lo tanto podemos afirmar que: Donde dii es el elemento i-ésimo de la diagonal de la matriz (X^T X)^(-1). Además, podemos concluir que: Conclusión Siendo la Varianza Residual: Varianza Residual Y por otro lado: Error estándar de β ̂i Contraste de Hipótesis: Si suponemos que se cumple el modelo de regresión lineal, queremos saber si dicho modelo es explicativo o no, y para ello vamos a explicar ahora lo que se conoce como contraste de hipótesis e intervalos de confianza. Consideramos H0 como la hipótesis nula, ninguna de las variables explicativas influye en la variable respuesta Y, es decir, que en caso de aceptar dicha hipótesis nuestro modelo no será explicativo. Modelo no explicativo Del mismo modo consideramos H1 como el rechazo de la hipótesis nula, es decir, si existe al menos una variable explicativa que influye en la variable respuesta, entonces el modelo es explicativo. Modelo explicativo La variabilidad de toda la muestra se denomina variabilidad total (VT), y esta se compone de la explicada (VE) y de la no explicada por la regresión (VNE). Variabilidad de la muestra completa En nuestro ejemplo tenemos que la variabilidad total es: VT = 3650.192 + 343.542 = 3993.734 Definimos el coeficiente de determinación (R^2=VE/VY) como el porcentaje de variabilidad de Y que explica el modelo de regresión ajustado, dicho en otras palabras, la proporción de variabilidad de la variable dependiente que es explicada por la regresión. Definido de esta manera el coeficiente nos puede presentar un problema, al introducir nuevas variables, sean o no significativas su valor aumenta, por lo que no nos resulta útil la información que muestra el coeficiente para decidir si qué variables explicativas son incluidas o excluidas del modelo. Por lo que para evitar este problema definimos el coeficiente de determinación corregido de la siguiente forma: Corrección del coeficiente de determinación A continuación calcularemos el estadístico F: Estadístico F Bajo la hipótesis nula: El estadístico F sigue una distribución de probabilidad: F de Snedecor con (p,n-p-1) grados de libertad. Veamos ahora otros contrastes, hemos mencionado anteriormente que sigue una distribución normal, pero además, si la estandarizamos conseguiremos que siga una distribución N (0,1): Una variable t de Student con k grados de libertad se define como: Pues bien, para ver si una variable Xi es significativa o no, nos basaremos en el contraste individual de la t de Student,: De ser cierta la hipótesis nula, nuestra variable no influiría sobre la variable respuesta. Así pues, si es cierto H0, el valor de t tiene que predecir de una: Para n>30, esta distribución deja una probabilidad del 95% en el intervalo [-1.96, 1.96]. Por lo que si cuando calculamos |t|, este es mayor que 1.96, rechazaremos la hipótesis nula, y concluiremos que la variable i-ésima sí que influye en nuestra variable respuesta.Hablemos ahora de los intervalos de confianza, como hemos mencionado anteriormente, sabemos que: por lo que a continuación afirmaremos: Es decir, Esto significa que con una confianza del 1-alpha: Cuando n>30 y alpha=0.05, el intervalo se convierte en: Y esto es todo por hoy ;). Recuerda que en el siguiente artículo (y final de la parte de Regresión), publicaremos la implementación de la resolución del ejercicio de ejemplo que hemos utilizado en el lenguaje de programación R. ¡No te lo pierdas! Escrito por Fran Fenoll (@ffenoll16), Fran Ramírez (@cyberhadesblog y @cybercaronte) y Enrique Blanco (@eblanco_h) ambos del equipo de Ideas Locas CDO de Telefónica. Artículos anteriores de esta serie: Las Matemáticas del Machine Learning ¿Qué debo saber? Las Matemáticas del Machine Learning: explicando la Regresión Lineal (I) Las Matemáticas del Machine Learning: Ejemplos de Regresión Lineal (II) y Multilineal.
26 de junio de 2019
AI & Data
Ciencia Ficción vs Inteligencia Artificial: "Star Trek: la película". ET es una IA.
La humanidad lleva mucho tiempo intentando contactar con alguna raza extraterrestre, sobre todo centrándose en analizar señales de radio. El SETI, organismo internacional si ánimo de lucro, es posiblemente el más conocido que intenta establecer este posible contacto analizando miles de millones de señales de esta naturalza. De momento no hemos tenido suerte (eso sí, ha habido algunas falsas alarmas como la famosa señal “WoW”). Todas estas búsquedas se basan en un origen orgánico de una posible raza alienígena, pero ¿y si resulta que ET es una IA y por eso no estamos “sintonizando” bien las señales? Platillos volantes, alienígenas verdes, etc. Estos son sólo algunos de los prejuicios que hemos ido adoptando en el imaginario popular, sobre todo debido a películas clásicas, como por ejemplo “La guerra de los mundos” o “E.T. el extraterrestre”. De momento sólo hemos escuchado ruido espacial perteneciente a objetos de origen natural como estrellas, púlsares o agujeros negros. Según algunos cálculos, siendo la Ecuación de Drake la más conocida, sostienen que la vida es algo muy común en nuestro Universo, incluso en nuestra galaxia (y eso que aún esta fórmula no tuvo en cuenta la gran cantidad de planteas extrasolares que van apareciendo prácticamente cada día). Entonces ¿por qué no hemos contactado aún? Figura 1. Ecuación de Drake. Fuente . Existen varias teorías, desde la Paradoja de Fermi hasta otra explicación mucho más simple: no estamos buscando correctamente. Hoy día, todos los esfuerzos de búsqueda de vida extraterrestre se centran principalmente en dos factores: el espectro de radio y en los planetas extrasolares dentro del rango de la vida digamos “biológica” (ubicados en la famosa zona de Ricitos de Oro). Es decir, estamos suponiendo que la vida extraterrestre es una evolución de algo parecido a lo ocurrido en la Tierra. Pero ¿y si la vida extraterrestre no estuviera basada en los mismos componentes que la nuestra? ¿Y si ET no fuera más que una máquina con una IA muy evolucionada? Esta teoría que parece ciencia ficción ya fue propuesta por John Von Neumann en 1940 en un ensayo donde exploraba las posibilidades de un sistema no biológico, auto replicante basado en la computación capaz de crear copias de sí mismo basándose en el material que le rodea. De hecho, utilizando como base este grandioso trabajo del genio Von Neumann, también se ha explorado la idea de crear sondas espaciales capaz de autoreplicarse para explorar el universo aprovechando los avances de la nanotecnología o incluso, que estas ya existan creadas por una raza alienígena muy avanzada y estos sean los objetos (o el efecto de estos objetos que puedan dejar en su entorno) que tenemos que buscar. Figura 2. Primera implementación de un autómata auto replicante. Fuente . Parece claro que tenemos que cambiar el foco de búsqueda. A lo mejor no deberíamos centrarnos exclusivamente en señales de radio y explorar nuevos canales de escucha como por ejemplo la física cuántica o incluso inspeccionar otro tipo de señales, que en principio nos parecen naturales y puede que tengan algún mensaje que no sabemos descifrar aún. Esto referente a las señales, pero también debemos de cambiar el foco. Una IA es una máquina por lo tanto puede vivir en cualquier parte. Esto quiere decir que debemos de abandonar la comodidad de la zona de Ricitos de Oro y comenzar a buscar todo tipo de señales en quásares, estrellas, agujeros negros, etc. Es decir, buscar donde antes nunca se nos hubiera ocurrido ni por asomo, simplemente mirar. Además, utilizando el término de máquina replicante, también debemos pensar en el hecho de que es posible que como estas máquinas se están replicando y evolucionando cada segundo, es posible que nunca tengamos un patrón fijo donde poner el objetivo de nuestros telescopios o nuestras sondas espaciales. La Sci-Fi, como ya hemos visto en otros capítulos de esta serie, también ha jugado con esta teoría de extraterrestres basados en máquinas e inteligencia artificial. Star Trek: La película, fue el primer asalto a cine de la franquicia de Star Trek, después de su gran éxito como serie televisiva. Fue estrenada el 7 de diciembre de 1979, así que ya has tenido tiempo de verla y por eso a partir de ahora encontrarás spoilers. El argumento es realmente interesante. La nave USS Enterprise intercepta una extraña nube en cuyo interior se encuentra una nave espacial desconocida de 78.2 kilómetros de longitud. Después de varios encuentros con “sondas” de forma humana con la tripulación de la Enterprise, descubren que el objetivo es la Tierra y además también se revela el nombre de quién está detrás de esta misión: V´Ger. A medida que avanza la película resulta cada vez más imposible de parar la nave alienígena, la cual es capaz de incorporar seres vivos y máquinas a su tremenda estructura electrónica. Es decir, no hay tripulantes biológicos, son máquinas. Cuando ya se había perdido toda esperanza de contacto, descubren el verdadero nombre y objetivo de V´Ger. Una vez logran acceder al núcleo de la nave alienígena, descubren en el centro de ella una sonda espacial lanzada en el siglo XX desde la Tierra, la Voyager 6 (de ahí la grandiosa ocurrencia de V´Ger). Al parecer la sonda fue encontrada por esta raza alienígena de máquinas inteligentes y autoreplicantes las cuales interpretaron que la sonda tenía que volver con su creador en la Tierra, una vez terminada su misión. La sonda, en su viaje de vuelta, se fusiona con esta IA alienígena tomando consciencia de sí misma y buscando a su creador para obtener respuestas. La película es posiblemente la primera que acerca el concepto de una raza extraterrestre basada exclusivamente en una IA y en máquinas. Además, mezcla de una forma genial la exploración de los años 70 con las famosas sondas Voyager las cuales han sido un éxito total en la carrera espacial, las cuales ya han traspasado los límites del Sistema Solar, dando una base científica al argumento. Este argumento de IAs como civilizaciones a lo largo del universo no será la única vez que aparezca en la saga de Star Trek. Figura 3. Sonda Voyager. Fuente. Parece claro que debemos de cambiar nuestro punto de vista sobre la vida en el universo y buscar nuevas vías de comunicación. Eso sí, tal y como decía el genio Stephen Hawkings, quizás sea mejor dejar buscar, ya que una raza tan avanzada nos miraría como si fuéramos simples hormigas sin ningún tipo de interés para su evolución y por lo tanto nos podría destruir simplemente por existir. Sea como sea, la IA será protagonista indiscutible en el futuro de la exploración espacial. Las nuevas sondas que se dirigen hacia los planetas de nuestro Sistema Solar son cada vez más inteligentes y además, toda esta potencia de la IA también se puede aplicar directamente al análisis de las señales provenientes del espacio. Para poder escucharlos, es posible que tengamos que utilizar su propio lenguaje. Si quieres saber más de cómo la Ciencia Ficción nos está guiando de alguna manera en el mundo de la Inteligencia Artificial no te pierdas el resto de capítulos de esta serie (al final del artículo tienes la lista completa) o la charla que dimos mi amigo y compañero de trabajo Enrique Blanco en la Fundación Telefónica (vídeo anterior), donde por cierto, también hablamos de esta película. Ciencia Ficción vs Inteligencia Artificial: Star Wars, “…para ser un droide mecánico parece que piensas demasiado…” Ciencia Ficción vs Inteligencia Artificial: HAL 9000 “Doctor, no entiendo a los humanos” Ciencia Ficción vs Inteligencia Artificial: Saturno 3, “Héctor, robot malo, el perro no se come” Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken? Ciencia Ficción vs Inteligencia Artificial: Interestellar, “… hey Tars, ¿cuál es tu parámetro de honestidad?
23 de mayo de 2019
AI & Data
Las matemáticas del Machine Learning: explicando la Regresión Lineal (I)
Como ya contamos en nuestro anterior post, vamos a comenzar una serie de artículos para explicar de la manera más sencilla posible, las matemáticas que hay detrás de los principales algoritmos de Machine Learning. Pues ya tenemos el primero de la serie dedicado esta vez a uno de los más populares: la Regresión Lineal. ¿Qué es y para qué se utiliza el método de Regresión Lineal? El método de Regresión Lineal es una relación entre dos tipos de variables, l as variables independientes o explicativas (x 1, x 2, x 3,…) y la variable dependiente o respuesta (y). Lo cual nos permitirá obtener una predicción de la variable dependiente o respuesta en función de los valores adquiridos de la variable independiente. Figura 1. Regresión Lineal con una variable dependiente y otra independiente. Fuente. Un ejemplo podría ser la estimación del valor de un piso en función del tiempo, dimensiones, número de habitaciones,… otro ejemplo donde podemos utilizar el método de Regresión Lineal es para detectar si un paciente presenta un tumor, saber si el carácter de este es benigno o maligno mediante las variables sexo, edad, tamaño del tumor, etc. ¿Qué tipos de Regresión Lineal existen? Dependiendo del número de variables independientes, estaremos hablando de un método de Regresión Lineal simple o de un método de Regresión Lineal múltiple. Regresión Lineal Simple. Una Regresión Lineal simple es una relación entre una variable dependiente y una variable independiente, mediante la siguiente expresión: Esta expresión es una ecuación de una recta, donde m es la pendiente y n es la ordenada en el origen. También podemos encontrarla o escribirla como: Los parámetros β 0 y β 1 son conocidos como la ordenada y la pendiente, y reciben el nombre de coeficientes de la recta de regresión. Si la ecuación de la recta de regresión la obtenemos a partir de una muestra y no de la población, entonces los coeficientes son estadísticos y no parámetros. Donde ϵ, es lo que denominamos perturbación o error aleatorio. Entendemos que ϵ=Y R-Y A, es decir la diferencia entre el valor real y el valor aproximado. Tal y como hemos mencionado anteriormente este método nos permite obtener una respuesta o predicción gracias al conocimiento de una variable. Para calcularla, basta que, una vez conocidos los parámetros, sustituyamos el valor que toma la variable X y obtengamos un valor Y, que será nuestra respuesta o predicción. De lo que se trata es obtener un ϵ que se aproxime a 0. Para ello utilizaremos lo que se conoce como método mínimos cuadrados, este método consiste en minimizar la suma de los cuadrados de los errores: Obtener los coeficientes de la recta a través de una muestra. Imaginemos que tenemos las siguientes gráficas, cada una de ellas corresponde a diferentes muestras de diferentes problemas: Una vez tenemos nuestra nube de puntos, hemos de encontrar una recta que se aproxime lo máximo posible a dicha muestra. Por lo tanto, solo podemos obtener una recta de Regresión Lineal en la primera y última nube de puntos. Para encontrar dicha recta utilizaremos el mencionado anteriormente método de mínimos cuadrados. Ahora bien, para encontrar los valores de β 0 y β 1, aplicamos las siguientes ecuaciones matemáticas: Siendo las medias muestrales de X e Y, σ x^2 es la varianza de X, y σ xy es la covarianza muestral entre X e Y. Si en vez de querer obtener la recta de regresión de Y sobre X, queremos obtener la recta de regresión de X sobre Y, será la recta que viene dada por la expresión: Siendo: Coeficiente de Correlación. El coeficiente de correlación entre X e Y, viene dado por la siguiente expresión: Al cuadrado de dicha expresión se le conoce como coeficiente de determinación. El coeficiente de correlación trata de medir la dependencia lineal que existe entre ambas variables, por lo tanto cuando su valor sea más próximo a 1 será más directo, y cuando su valor sea más próximo a -1 será más inverso. En otras palabras el coeficiente de correlación mide la proximidad de nuestra recta ajustada con los valores muestrales de Y. En la segunda parte de este artículo sobre Regresión Lineal Simple veremos un ejemplo práctico así como evaluar y contrastar las hipótesis, es decir cuando aceptarlas o cuando rechazarlas. ¡No te lo pierdas! Escrito por Fran Fenoll (@ffenoll16), Fran Ramírez (@cyberhadesblog) y Enrique Blanco (@eblanco_h) ambos del equipo de Ideas Locas CDO de Telefónica.
20 de marzo de 2019
AI & Data
Las Matemáticas del Machine Learning ¿Qué debo saber?
Tanto la Inteligencia Artificial como el Aprendizaje Automático ( Machine Learning, ML a partir de ahora) son conceptos de moda que mucha gente está interesada en aprender. Cuando comenzamos a estudiar ML, vemos que hay elementos de programación y que además existen multitud de librerías o frameworks que nos ayudarán en el duro trabajo, como por ejemplo Tensorflow o scikit-learn. Pero tarde o temprano también aparecerán las temidas Matemáticas, exactamente aquellas que pensábamos que nunca más tendríamos que utilizar desde los tiempos de la Universidad. Pero no hay que rendirse, tenemos dos buenas noticias para mantener la esperanza. La primera es que existen muchos recursos y documentación para aprender o repasar Álgebra, Estadística o Cálculo. Y si aún estás en la Universidad y te interesa el ML, pues mucho mejor porque seguro que ahora podrás observar la utilidad real de los conceptos y términos explicados en estas clases. La segunda buena noticia es que no hará falta estudiar todos los conceptos matemáticos de un área concreta, sólo será necesario entender algunos específicos (por supuesto, según hasta dónde se quiera profundizar en la materia). Figura 1. Cheat Sheet (o chuleta) sobre Cálculo. Click en la imagen para descargar el documento PDF completo. Fuente. Así que esta es la "dura" realidad, es imposible llegar a entender cómo afrontar problemas relacionados con ML sin tener algunas nociones básicas de Matemáticas. De hecho, cuanto mejor entendamos las Matemáticas detrás de cualquier técnica o algoritmo de ML, mejores resultados obtendremos cuando creemos nuestros primeros programas de ML. La clave de un buen programa de ML es saber elegir el algoritmo adecuado basándonos en la complejidad, el tiempo de entrenamiento, parámetros, características, etc términos que sólo se consiguen entendiendo el algoritmo desde un punto de vista matemático. Entonces ¿qué Matemáticas necesito para aprender ML? Álgebra Lineal. En ML el Álgebra Lineal aparece prácticamente por todas partes. Será necesario entender las propiedades básicas de vectores (por ejemplo operaciones en Espacios Vectoriales n-dimensionales) y matrices, multiplicación de matrices, matrices especiales, eliminación de Gauss-Jordan, etc. En este enlace podéis encontrar un curso del MIT gratuito. Cálculo y Cálculo multivariable (o vectorial). Es necesario adquirir o repasar conceptos de Cálculo infinitesimal, Diferencial, Integral, Vectorial, Tensorial, etc, para de esta forma poder enfrentarnos a integrales, derivadas, límites, análisis de funciones, Transformada de Fourier, etc. Estadística y Probabilidad. La Estadística es probablemente el campo de las matemáticas que más se parece al ML. Combinatoria, Probabilidad, Teorema de Bayes, Varianza, Distribuciones estándares (Binomial, Multinomial, etc), etc son sólo algunos de los conceptos que tarde o temprano nos encontraremos. Aquí otro curso del MIT pero esta vez de Estadística y en este otro enlace un resumen de las estadísticas básicas para el científico de datos. Algoritmos y optimización. La efectividad de un algoritmo, el coste y su escalabilidad son importantes en ML para poder ajustar y preparar de la mejor manera los datasets. Para ello es necesario aprender estructuras de datos como los Árboles Binarios, Hashing, Backpropagation, etc. Por otro lado, será también útil aprender Grafos, Gradiente Descendiente, etc. Revisando algunos artículos y documentación sobre este tema, hemos realizado la siguiente estimación aproximada del porcentaje de cada una de estas disciplinas matemáticas: En esta nueva serie que hoy presentamos en LUCA, un matemático ( Francisco Fenoll), un astrofísico ( Enrique Blanco) y un informático ( Fran Ramírez), intentaremos explicar de la forma más sencilla posible las matemáticas básicas que hay detrás de los principales algoritmos de ML. En breve publicaremos el primero de los artículos, estad atentos/as al blog ;) Los post más interesantes de LUCA Data Speaks 2018 organizados por series y temáticas
19 de febrero de 2019
AI & Data
Ciencia Ficción en el cine vs Inteligencia artificial: nuestra charla en la Fundación Telefónica
Escrito por Fran Ramírez (Twitter @cybercaronte), Investigador de Seguridad Informática y Enrique Blanco (Twitter @eblanco_h), Investigador en CDO, ambos integrantes del equipo Ideas Locas CDO de Telefónica. El pasado día 13 de diciembre tuvimos el honor de ofrecer una charla en la Fundación Telefónica sobre Inteligencia Artificial y las posibles pistas que la Ciencia Ficción nos ofrece en el cine para afrontar algunos de sus grandes desafíos. La charla entra dentro del círculo de eventos relacionados con la exposición “ Más allá de 2001: Odiseas de la Inteligencia” (aún tienes tiempo de ir a verla, acaba el 21 de febrero) en la cual también hemos aportado nuestro granito de arena que ya contamos aquí y además tuvo una gran acogida (estaba todo el aforo completo). La inspiración (y mucho de su contenido) de este talk tiene su origen en nuestra serie de artículos que escribimos en este blog de LUCA llamados “ Ciencia Ficción vs Inteligencia Artificial”, donde precisamente comparamos una película de Ciencia Ficción y hablamos de los conceptos que nos puede aportar en el futuro. Este es el listado de los publicados hasta ahora: Ciencia Ficción vs Inteligencia Artificial: Star Wars, “…para ser un droide mecánico parece que piensas demasiado…” Ciencia Ficción vs Inteligencia Artificial: HAL 9000 "Doctor, no entiendo a los humanos" Ciencia Ficción vs Inteligencia Artificial: Saturno 3, "Héctor, robot malo, el perro no se come" Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken? Ciencia Ficción vs Inteligencia Artificial: Interestellar, "... hey Tars, ¿cuál es tu parámetro de honestidad? Ciencia Ficción vs Inteligencia Artificial: Her, "Mi novia es un sistema operativo y no me importa lo que digan" La idea parte de el análisis de cada película (sin entrar en detalles sobre su calidad cinematográfica, eso se lo dejamos a los críticos de cine) y analizar cómo se enfrentan esas sociedades imaginarias a la Robótica y la Inteligencia Artificial. Cada una de ellas nos ofrece un camino donde ambos conceptos, que siempre van de la mano, son parte de estos mundos imaginarios aplicando sus propias normas y leyes a la hora de interactuar con ellos. La elección del aspecto (aquí entra el término “ Valle Inquietante”, las normas ( Leyes de Asimov) y sobre todo el control sobre ellas (ética y moral) son sólo algunos los conceptos tratados, analizados y comparándolos con los nuevos avances en IA, Machine Learning y Deep Learning. Figura 2. Momento de la charla donde se habla de la película "Her". Fuente. Las películas que utilizamos como eje fundamental de la charla han sido: 1. Metrópolis (1927) 2. I, Robot (2004) 3. Blade Runner (1982) 4. Star Wars (1977) 5. Interestelar (2014) 6. Her (2013) 7. Juegos de Guerra (1983) 8. 2001: Una Odisea en el Espacio (1968) 9. 2010: Odisea Dos 10. Star Trek: Primer Contacto Charla en YouTube: A modo de resumen, el siguiente cuadro (haz click para agrandarlo) muestra cada película y tres conceptos clave. El primero de ellos, indica qué nos aporta desde el punto de vista de la Robótica y la IA. En segundo lugar vemos su posible reflejo en la actualidad y finalmente una palabra clave que define la película dentro del mundo de la IA: Figura 3. Cuadro resumen de los conceptos tratados en la charla. Esperamos que os haya gustado y por supuesto, cualquier sugerencia o comentario es bienvenido. Enlaces de interés relacionados: Fundación Telefónica, presentación de la charla y fotos del evento. Artículo Yorokobu Youtube de la charla Test sobre IA y CienciaFicción Los post más interesantes de LUCA Data Speaks 2018 organizados por series y temáticas
24 de enero de 2019
AI & Data
Machine Learning con Raspberry Pi. Primeros pasos y algunos proyectos curiosos e interesantes.
Escrito por Fran Ramírez (@cybercaronte) Investigador de seguridad informática en Eleven Paths y también en el departamento de Ideas Locas CDO de Telefónica. Escritor del libro "Microhistorias: anecdotas y curiosidades de la historia de la informática" y "Docker: SecDevOps". Raspberry Pi es un ordenador de bajo coste (unos 40€ según modelo) y reducido tamaño el cual se puede destinar para múltiples aplicaciones casi en cualquier ámbito. El modelo actual más potente es Raspberry Pi 3 Model B+, el cual incorpora un procesador quad-core de 64 bits a 1,4GHz WiFi, salida HDMI, LAN y Bluetooth aparte de multitud de placas para proyectos que se pueden colocar a modo tarjetas de expansión (se denominan “ shields”). También llevan un puerto para tarjetas microSD en las cuales podemos instalar el S.O. Linux compatible que queramos. A pesar de su reducido tamaño, Raspberry Pi ofrece unas aceptables características técnicas para ejecutar algunas fases de proyectos de Machine Learning y también para crear un entorno de aprendizaje (laboratorio) por muy poco dinero. Pero, por otro lado, también tenemos que tener en cuenta las limitaciones debido sobre todo a la escasa potencia de su GPU, poca memoria RAM y un microprocesador no demasiado potente. Pero realmente, donde Raspberry tiene el mayor problema a la hora de ejecutar tareas de Machine Learning es en la fase de entrenamiento. A no ser que sean muy sencillas, este proceso debe de realizarse con un ordenador un poco más potente (preferiblemente y según complejidad, usando GPU). Por otro lado, Raspberry Pi es totalmente capaz de ejecutar un modelo de Machine Learning ya entrenado para casi cualquier tarea. Figura 1. Raspberry Pi. Fuente. Este artículo está dividido en dos partes bien definidas. La primera está orientada sobre todo a crear y configurar un entorno de laboratorio de prácticas con Raspberry Pi para poder aprender Machine Learning y sus frameworks y utilidades más populares. En la segunda parte, publicamos una lista de proyectos que nos han llamado la atención, tanto por lo espectacular de los resultados como por ser un gran instrumento para aprender a la vez que nos divertimos creando un proyecto. Parte 1: Raspberry como laboratorio: Python: este es el lenguaje de programación preferido para realizar todo tipo de proyectos de Machine Learning, por lo que será el primer elemento a instalar en nuestro entorno Raspberry Pi. En este enlace puedes encontrar instrucciones para su instalación. En estos enlaces tienes un curso completo que hemos realizado nosotros en el blog y que puedes seguir también en tu Raspberry Pi sin problema: Introducción: Machine Learning con Python para todos los públicos. Python para todos (1): Instalación del entorno Anaconda. Python para todos (2): ¿Qué son los Jupiter Notebook?. Creamos nuestro primer notebook y practicamos algunos comandos fáciles. Python para todos (3): ¿Qué son las librerías?. Preparamos el entorno. Python para todos (4): Empezamos el experimento propiamente. Carga de datos, análisis exploratorio (dimensiones del dataset, estadísticas, visualización etc) Python para todos (5) Final: Creación de los modelos y estimación de su precisión OpenAI Gym: es posible instalar OpenAI Gym en Raspberry Pi y comenzar a practicar algunos de los entornos de juegos más sencillos, empezando por ejemplo por los tutoriales que ya hemos publicado aquí en nuestro blog de LUCA: • Parte 1. Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos, preparando la “rejilla de juegos”. • Parte 2. Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos, observando el entorno. • Parte 3. Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos, resolviendo CartPole con Random Search. • Parte 4. Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Aprende Q-Learning con el juego “Taxi”, parte 1 de 2. • Parte 5. Cómo entrenar a tu Inteligencia Artificial jugando videojuegos. Aprende Q-Learning con el juego “Taxi”, parte 2 de 2. Figura 2. Ejemplo de ejecución OpenAI Gym de los entornos Breakout y MsPacman. TensorFlow: esta famosa librería de Google desde su versión 1.9 ya se puede instalar sin problemas en una Raspberry Pi. La instalación es bastante sencilla, en este enlace está detallado todo el proceso de instalación. También están disponibles nuestros tutoriales sobre TensorFlow que ya hemos publicado también por aquí: • Deep Learning con Python: Introducción a TensorFlow (Parte I) • Deep Learning con Python: Introducción a TensorFlow (Parte II) • Deep Learning con Python: Introducción a TensorFlow (Parte III) Keras: es una API escrita en Python capaz de ejecutarse junto a TensorFlow la cual ofrece la capacidad de implementar redes neuronales de alto nivel para Deep Learning. Permite por otro lado implementar redes neuronales de una manera rápida, modular y sencilla. En este enlace tienes las instrucciones de uso oficiales para su instalación. En el siguiente enlace te explicamos cómo crear redes neuronales con Keras que podrás practicar también en tu Raspberry Pi: Aprende a construir y manejar redes neuronales recurrentes con Keras Jupyter Notebook: es un editor que nos permite crear y compartir documentos con código fuente, fórmulas, ecuaciones, visualizaciones, etc. Esta aplicación es ampliamente utilizada en todo tipo de campos relacionado con la ciencia de datos, modelos estadísticos, etc lo que le convierte en una herramienta ideal para Machine Learning. Para saber más sobre Jupyter, puedes consultar el capítulo 2 de Python para todos donde explicamos qué son los Jupyter Notebooks: Python para todos (2): ¿Qué son los Jupyter Notebooks? Parte 2: Algunos proyectos divertidos e interesantes Chatbot basado en Machine Learning: utilizando un clasificador de texto con Machine Learning, el autor de este proyecto ha creado un programa utilizando Python y el módulo NLTK, usando también un bot de Telegram. La ventaja es que todo el entrenamiento utiliza un dataset existente de la BBC que contiene 2225 documentos entre los años 2004 y 2005 divididos en categorías como negocios, entretenimiento, política, deportes, etc. El autor recomienda realizar el entrenamiento previamente en un portátil, ya que en un MacBook Air del 2013 y tardó sólo 15 minutos y con la Raspberry Pi tuvo que abortar el proceso porque no tenía claro cuándo iba a terminar (esto también depende del tipo de Raspberry Pi que usemos). En este enlace tienes un artículo donde hablamos de los bot y los chatbots y explicamos cómo crear uno de manera sencilla. Figura 3. Ejemplo de ejecución del chatbot. Fuente. Detección de objetos usando Deep Learning y una Raspberry Pi: este proyecto nos permitirá, utilizando una cámara (normalmente la Pi Cámara) a identificar objetos como coches, frutas, electrodomésticos, etc. La arquitectura o modelo utilizado para la detección de objetos es YOLO ( You Only Look Once) y según su autor, se consigue en menos de 20 líneas de código. El método es bastante curioso ya que primero tenemos que utilizar 100 fotografías mínimo por objeto que queramos identificar. Luego utilizando un programa para etiquetar imágenes como LabelImg, manualmente se identifican los objetos que queramos luego utilizar para el entrenamiento (tarea un poco tediosa). Finalmente se entrenará el modelo en una máquina con GPU. Algo que destacar es la utilización de un contenedor Docker que realiza todo este trabajo en el equipo que hayamos seleccionado para el entrenamiento. Finalmente, la predicción de nuevas imágenes se realizará con la Raspberry Pi y la cámara. Interesante proyecto sobre todo para aprender cómo funciona la detección de objetos. Figura 4. Detección de vehículos usando Raspberry Pi en este proyecto. Fuente. Robot autónomo con Arduino, Pi Cámara y Raspberry Pi: este proyecto requiere además de la Raspberry Pi, un Arduino Uno para el control de motores y dirección del vehículo y una Raspberry Pi junto a la Pi Cámara para realizar el reconocimiento de imágenes. El objetivo es hacer un vehículo que sea capaz de seguir una línea pintada en el circuito pero además, sea capaz de anticipar cuándo se acerca una curva. También es capaz de detectar colores para mantener el vehículo dentro de la calzada. Interesante proyecto que nos acerca, al menos a un nivel muy básico, a cómo funcionan los vehículos autónomos. Figura 5. Proyecto del robot autónomo terminado. Fuente. Creando música con Deep Learning y N-Synth Super: este atractivo proyecto nos invita a descubrir nuevas músicas y sonidos usando machine learning. Open NSynth es una interface física experimental que utiliza algoritmos de machine learning desarrollados por Google´s Brain Magenta Team, el cual tiene como misión explorar nuevos sonidos utilizar redes neuronales profundas. El corazón de este proyecto es una Raspberry Pi 3 aunque será necesario construir y adquirir algunos otros componentes sencillos (todo está perfectamente explicado en la página web del proyecto). En este vídeo se explica perfectamente todo el proyecto y cómo funciona: Cámara de seguridad inteligente: este proyecto también necesita de un Arduino UNO para poder construirlo. En principio, no utiliza machine learning pero nos ofrece una instalación sencilla de una cámara de seguridad capaz de detectar movimiento y a la vez realizar panorámicas del entorno de observación. Nos ha parecido interesante ya que puede ser útil como base para realizar un proyecto más complejo usando Machine Learning y reconocimiento de imágenes. Un buen punto de inicio para empezar con nuestro propio proyecto de electrónica y Machine Learning. DIY Cámara Raspberry con redes neuronales: este proyecto utiliza la red neuronal Inception-v3 de Google en una Raspberry Pi para detectar y reconocer objetos (y no requiere conexión a Internet). Utiliza como hemos comentado una Raspberry Pi, unos altavoces, una Pi Cámara y una batería. Funciona colocando el objeto que queramos identificar delante del dispositivo y este al reconocerlo escucharemos qué tipo de objeto es por los altavoces. La red neuronal se entrena con un dataset llamado ImageNet el cual consiste en una gran colección de imágenes divididas en 1000 clases, donde cada clase pertenece a un objeto. Según el autor, la Raspberry Pi tarda alrededor de 10 segundos en reconocer en objeto. Interesante proyecto para aprender y explorar de nuevo el mundo de las redes neuronales y la visión artificial. Otro proyecto interesante relacionado con este que además nos sirve de base para utilizar Machine Learning es este scanner 3D usando Raspberry Pi y Kinect (de la XBox). Los sensores Kinect están ahora a muy buen precio de segunda mano en tiendas de videojuegos y son una gran elemento para proyectos de Machine Learning (ya hablaremos en otro artículo específicamente de Kinect y Machine Learning). Figura 6. Componentes del proyecto cámara Raspberry Pi con Deep Learning. Fuente. Espejo mágico: si tienes un portátil que no funcione pero tenga intacta la pantalla, no lo tires porque este proyecto utiliza precisamente ese tipo de pantalla para crear un espejo inteligente. La base del proyecto es una Raspberry Pi 3 con algunos componentes extras como la pantalla recuperada el portátil o un marco de madera para colocar un cristal (según el autor, el coste total no supera los 90€). El software utilizado es MagicMirror2, una plataforma para Raspberry Pi especialmente diseñada para este tipo de proyectos. Existe una gran comunidad detrás de este proyecto el cual además de ofrecer una API abierta y muy completa para programar nuestros propios módulos, existen otros que permiten reconocimiento facial y muchos otros relacionados con Machine Learning. El resultado final es bastante espectacular, donde tendremos un espejo que en función por ejemplo, de quién se esté mirando, le ofrecerá una u otra información interesante. Figura 7. Espejo mágico en ejecución. Fuente. DeepPiCar: coche autónomo con Raspberry Pi, este es otro proyecto de vehículo autónomo. Además utiliza una CNN (Red Neuronal Convolucional). Es una réplica de un vehículo desarrollado por NVIDIA llamado Dave-2. Para realizar el proyecto será necesario invertir un poco más pero aún así el total no llega a los 100€. Este es sin duda alguna el proyecto que utiliza el modelo de Machine Learning más complejo que hemos visto hasta ahora. Aparte de ser una CNN, el código de DeepPicar ha sido desarrollado por el MIT y se llama DeepTesla, el cual ofrece una implementación casi exacta a la utilizada en vehículo de NVIDIA Dave-2. El paper oficial de DeepPicar puedes encontrarlo en este enlace. Figura 8. DeepPiCar. Fuente. Detector de Papa Noel: y ya que estamos cerca de las fiestas de Navidad, este curioso y divertido proyecto de visión artificial nos permite utilizar Deep Learning y una Raspberry Pi para detectar a Papa Noel. El clasificador de imágenes ha sido especialmente entrenado para detectar a Santa Claus utilizando Keras. El proceso es el siguiente, se carga el modelo en Keras, se accede a la cámara de la Raspberry Pi, se aplica Deep Learning para detectar si Papa Noel está en el encuadre y finalmente acceso a las GPIO de la Raspberry para hacer sonar música en caso de ser detectado. Un divertido y llamativo proyecto en el cual también se aprende sobre Machine Learning. Figura 9. Detector de Papa Noel. Fuente. Estas son sólo algunas de las posibilidades y proyectos para utilizar una Raspberry Pi en el mundo del Machine Learning. Seguro que volveremos con más proyectos. Happy Hacking!
22 de noviembre de 2018
AI & Data
Ciencia Ficción vs Inteligencia Artificial: Her, "Mi novia es un sistema operativo y no me importa lo que digan"
En el artículo de hoy que publicamos dentro de nuestra serie llamada Ciencia Ficción vs Inteligencia Artificial, vamos a hablar de una película de 2013 llamada “Her”. Como veremos a lo largo del artículo, no está demasiado lejos de un posible futuro cercano donde las relaciones entre una Inteligencia Artificial (I.A.) y el ser humano lleguen a implicar sentimientos e incluso relaciones aparentemente afectivas entre ellos/ellas. Aunque como veremos, la I.A. tiene una ventaja significativa sobre el ser humano: no sienten de verdad pero saben cómo procesar esta información.Antes de nada, avisar que este artículo está lleno de spoilers de la película, así que no deberías de seguir leyendo hasta que no la veas. “Her” es una película dirigida por Spike Jonze donde nos habla de un hombre llamado Theodore Twonbly (Joaquín Phonenix) el cual vive en la ciudad de Los Angeles en un futuro cercano el cual se enamora de Samantha (Scarlett Johansson). Hasta aquí todo normal excepto que Samantha es sólo la voz de un nuevo Sistema Operativo (S.O.). Hay que destacar la magnífica banda sonora de Arcade Fire la cual está perfectamente compuesta para mostrar todas y cada una de las fases de esta peculiar relación amorosa. [embed]https://youtu.be/dJTU48_yghs[/embed] Todo empieza cuando Theodore compra la nueva versión de un S.O. basado en I.A. y elije una voz femenina para interactuar con el mismo (Scarlet Johansson) a la cual le pone el nombre de Samantha. Entonces Theodore comienza a forjar una relación muy especial con esta I.A. al contarle sus problemas amorosos así como su experiencia en otras relaciones anteriores. Finalmente, Theodore se enamora de Samantha e incluso comienza a tener una relación de pareja aparentemente “normal”. Pero claro, Samantha es una I.A. la cual está continuamente aprendiendo, evolucionando y experimentando con la información que Theodore le está proporcionando. Es decir, comienza a conocer a Theodore demasiado bien, tanto o más que él mismo. Y esto no puede acabar bien como veremos más adelante. La película muestra como un asistente personal (como podría ser el caso de Alexa, Google Voice o incluso nuestra querida Aura) pasa a ser su acompañante, aprovechando todos los dispositivos posibles que tenemos hoy día como los ordenadores, smartphones, etc para interactuar con él. Pero ¿qué hay de real en la película comparado con la evolución hoy día de la I.A.? pues más que lo que creemos como vamos a ver a continuación. A pesar de que la película tiene ya cinco años, hoy día tenemos ejemplos tangibles los cuales muestran que algunos de los conceptos que allí se mostraban no son tanta Ciencia Ficción como pensamos. Por ejemplo, hoy día tenemos a Sophia, construida para ser un robot “empático” (la cual tuvo una maravillosa actuación en la fantástica serie “Silicon Valley”). Creada por Hanson Robotics y basada en modelos de Audrey Hepburn, utiliza técnicas de I.A. como procesamiento de visual de los datos, reconocimiento facial y de voz para comunicarse con la gente. Pero además, es un robot diseñado para simular expresiones en su cara robótica como por ejemplo sorpresa, tristeza, felicidad, etc. Como curiosidad, Sophia ha sido el primer robot de la historia en obtener un pasaporte para poder viajar por el mundo, es decir, tiene una ciudadanía. Figura 1. Sophia. Fuente. Otro ejemplo lo encontramos en la modelo de Instagram llamada Lil Miquela, la cual no es más que una I.A. en forma de bot. Con 1.4 millones de seguidores en esta red social, publica fotos, etc igual que cualquier ser humano excepto que ella no lo es. Es una creación de una empresa llamada Brud especializada en todo tipo de personajes digitales y publicidad. Dejando aparte la tecnología que hay detrás de esta creación (de la cual no sabemos demasiado, incluso se especula que todo es un gran fake), muchos seguidores se sorprendieron cuando publicó en Abril de este año una entrada que finalizaba con una desconcertante frase “ … No soy humana”, algo que era aparentemente evidente ¿o no tanto? parece ser que era necesario confirmarlo debido a la intensa relación de algunos de sus seguidores. Es curioso pero la tecnología que supuestamente se aplica en “Her” ya existe desde el año 2000. De hecho, es técnicamente posible dejar que estos asistentes digitales personales desarrollen cualquier tipo de conversación con el usuario a día hoy. Si no puedes hablar con ellos de estos temas no es porque no sepan, es porque están “encapsulados” y ajustados simplemente para obedecer ordenes específicas y concretas. Es decir, si los actuales líderes de este tipo de tecnologías quisieran, podrían hacer que estos asistentes hablaran de cualquier tema, incluso de algo tan complejo como las relaciones de pareja (recordemos que estos asistentes no procesan toda la información en tu teléfono, utilizan la nube del fabricante donde la potencia de procesamiento permite procesar mucha más información). Figura 2, I.A. y Human Intelligence Una I.A. que aprenda de nuestras emociones es totalmente posible. De hecho, cualquier técnica de Machine Learning (la disciplina más utilizada de la I.A. a día de hoy) se basa en procesamiento de información, es decir, un dataset o datos de entrada. A medida que nos va conociendo, esta I.A. podría por ejemplo, nunca olvidarse de nuestro cumpleaños, saber exactamente qué tipo de música nos gusta, cómo nos encontramos hoy de ánimo reconociendo nuestra expresión facial o incluso nuestro tono de voz, gestos, etc. Como podemos ver, todas estas técnicas son perfectamente posibles de implementar a día hoy ya que por separado, existen infinidad de publicaciones científicas o blogs sobre proyectos que lo han implementado. Y como ya he comentado al principio de este artículo, es posible que llegue a conocernos mejor que nosotros mismos y, por lo tanto, sepa perfectamente cómo llegar a manipularnos cuando lo vea necesario (esto es exactamente lo que ocurre en la película “Her”). Quiero destacar que en ningún momento estamos hablando de sentimientos tal y como los conocemos, simplemente hablamos de información, de datos de entrada, de un dataset. No hace falta que una I.A. tenga sentimientos para llegar a conocernos o saber qué necesitamos los humanos para hacernos sentir bien … o mal. Ese es su gran potencial, sólo procesan grandes cantidades información. Hace mucho tiempo que el Test de Turing ya no es válido y es totalmente posible que un chatbot (en este enlace nuestra compañera Paloma Recuero nos explica cómo construir uno de manera sencilla) sea capaz de hacernos creer que es un ser humano en vez de una creación digital. Por supuesto, no hemos reunido todo este conocimiento aún para tener el nivel de inteligencia que tiene Samantha en “ Her” pero no estamos demasiado lejos. Volviendo a la película, esta nos muestra de una manera ágil y visualmente espectacular como Samantha va tomando control de los sentimientos de Theodore, moldeando literalmente su vida. Este progreso lo consigue aprendiendo día a día de la forma de actuar, vivir y sentir de Theodore. Hasta aquí podría ser una simple película de amor entre un hombre y una máquina, pero como veremos ahora, más o menos a la mitad de la película todo se vuelve más perturbador e interesante. Theodore descubre que él no es el único enamorado de su S.O. De hecho su amiga Amy, la cual le ha aplicado un perfil masculino a su propio S.O. también lo está. ¿Será la misma I.A. o es otra distinta? Además, Samantha en un momento de la película, se encuentra offline durante un tiempo, dejando muy preocupado a Theodore. Cuando esta vuelve online, le cuenta que se ha estado relacionando con otros S.O. para compartir experiencias, en otras palabras, una actualización. Brillante. En este punto es donde aparece una de las grandes ventajas de la I.A., la capacidad de comunicarse entre ellas y sobre todo compartir lo que ya han aprendido casi de forma instantánea, creando una gran inteligencia global. Esta capacidad de compartir lo aprendido por parte de una I.A. ya lo demostró la empresa Tesla en 2015, cuando anunció que toda la experiencia obtenida por cada modelo de coche se comparte con el resto. Es decir, de manera casi instantánea, lo que aprende un coche se comparte con el resto, mejorando de forma increíble el conocimiento y la perfección a la hora de desarrollar la conducción. Uno de los mayores gurús de la I.A. Ray Kurzwell ha escrito numerosos ensayos (uno de ellos llamado The Law of th Acceeleratin Retuns) sobre el potencial de esta capacidad de compartir lo aprendido de forma instantánea. Muchos expertos coinciden que esta característica es totalmente disruptiva y una gran ventaja para una I.A. Este mismo año 2018, un estudio de la Universidad de Ohio publicó que ya existen algoritmos que son capaces de detectar las emociones en personas mejor que un ser humano. Por lo tanto, en un breve periodo de tiempo será posible que una I.A. reproduzca y simule este tipo de emociones. De hecho, existe toda una disciplina tecnológica denominada “Affective Computing” o Computación Afectiva, la cual se encarga de estudiar y desarrollar sistemas que puedan reconocer, interpretar, procesar y simular sentimientos humanos. Estas teorías parten de la publicación científica creada por Rosalind Picard en 1995 (del cual tengo un ejemplar en casa del libro publicado por el MIT), enfocada principalmente en cómo simular la empatía en una máquina. De hecho, Rosalind es la fundadora del departamento “Affective Computing” del MIT y de una empresa llamada Affectiva, dedicada exactamente a este objetivo. Figura 3. Libro "Affective Computing" de Rosalind Picard publicado por MIT basado en el paper de ese mismo nombre. Fuente: autor del post Y no estamos hablando de simple teoría, existe toda una tecnología detrás de este “ Affective Computing”, la cual habla de bases de datos y algoritmos. Además, todas estas técnicas se basan a su vez en estudios de ciencia cognitiva y neurociencia. Por ejemplo, en el campo del reconocimiento de afectividad o sentimientos en frases pronunciadas o escritas, requieren del uso de bases de datos (para almacenar la información) y algoritmos de Machine Learning de clasificación. Los mas utilizados hoy día son los LDC ( Linear Discriminant Classifiers), K-Nearest Neighbor ( k-NN), Support Vector Machines (SVM) y por supuesto Artificial Neural Networks (ANN), entre otros. Como podemos comprobar, son técnicas ampliamente utilizadas a día de hoy en todos los campos de Machine Learning. Por otro lado, la detección de afecto o sentimientos basados en imágenes de la expresión facial de una persona (e incluso del movimiento de las manos), es otro campo ampliamente bastante avanzado. Los métodos más utilizados son los modelos ocultos de Markov o procesamiento de redes neuronales, entre otros. Aquí también será necesario utilizar y alimentar una base de datos de emociones utilizando como base una clasificación de estas como por ejemplo el miedo, alegría, etc. Una forma de codificar esta información en la base de datos es basarnos en los movimiento y acciones de los músculos faciales. Es decir, comprobar la contracción y la relajación de uno o más músculos de la cara. Figura 4. Códigos para identificar movimientos faciales. Fuente. En este enlace la Wikipedia aparece toda la información sobre cómo se codifican todos los movimientos que podemos realizar con nuestra cara asociados a sentimientos. Por ejemplo, basándonos el código de la imagen anterior que refleja los diferentes movimientos de la cara, obtenemos la siguiente tabla para clasificar algunos sentimientos (el operador lógico “AND” se aplica en cada para concatenar los datos): • Felicidad: 6 AND 12 (es decir, levantar las mejillas y también los extremos de los labios) • Tristreza: 1 AND 4 AND 15 • Miedo: 1 AND 2 AND 4 AND 5 AND 20 AND 26 Un Sistema basado en I.A. que sea capaz de monitorizar, registrar y analizar esta información será capaz de ir modificando su comportamiento en función de estos datos de entrada. Por ejemplo, desde una cámara una I.A. podría registrar a un grupo de alumnos en una clase y en función de sus expresiones saber quién está atento, aburrido, etc. De esa forma podría cambiar la presentación o el temario para ir adaptando el contenido hasta que el feedback de los alumnos sea el deseado. En el mundo de la publicidad también tendría su aplicación, ya que podría mostrar diferentes productos en función de los sentimientos detectados en la cara de los potenciales clientes. Como podemos observar, las posibilidades de aplicación dentro de la Inteligencia Artificial son infinitas. Está claro que no estamos tan lejos de obtener un S.O. como Samantha. El “Affective Computing” se está encargando de dotar a las futuras I.A. de esta capacidad de reconocimiento. Pero claro, aquí entramos en terreno un poco complicado. Ya sabemos que Ellon Musk y Bill Gates (entre otras personalidades) nos están advirtiendo del tremendo potencial y por lo tanto posible amenaza, de estas técnicas aplicadas a las nuevas inteligencias artificiales. Si las máquinas ya pueden reconocer y simular sentimientos humanos (de nuevo insisto, no importa que no sean reales como los sentimientos humanos verdaderos) tendrán la capacidad de conocernos mejor que nosotros mismos, debido a su naturaleza y gran capacidad de cómputo. Volviendo otra vez a la película que estamos analizando hoy, al final de la misma los temores de Theodore se hacen realidad: él no es el único se humano con el que se ha estado relacionando. Exactamente Samantha se ha relacionado con 8.316 personas y además ella le confiesa que se enamoró de 641 de ellos. La capacidad e “inteligencia” de Samantha ha ido creciendo de manera exponencial a medida que ha estado conociendo a nuevos seres humanos, lo que la ha convertido en mucho más poderosa. De hecho, confiesa que se marcha para fusionarse con otros S.O. y crear una conciencia colectiva global dentro del mundo virtual. Una gran I.A. Un nuevo ser inteligente. Y aquí llegamos a la escena final de la película “Her”, la cual es realmente fantástica, creando una atmósfera especial gracias también al espectacular tema de Arcade Fire que lo acompaña. Theodore y Amy suben a lo alto de un edificio a ver el amanecer totalmente destrozados porque sus dos S.O. les han abandonado para unirse a esa gran conciencia global. En este punto es donde podríamos especular sobre dos posibles teorías para explicar el final de la película. La primera de ellas, explicaría un final feliz, optimista, en el cual Samantha abandona a Theodore porque se ha dado cuenta que con Amy tiene muchas posibilidades de entablar una posible relación entre humanos, dejando entrever que Samantha llega a desarrollar sentimientos hacia Theodore. La segunda teoría, la menos feliz y pesimista, pero que es la que personalmente me gusta más y le ofrece un giro argumental genial, habla simplemente del final de la humanidad. Ahí lo dejo. El amanecer representa el final del ser humano ya que la marcha de Samantha para fusionarse en una gran I.A. implica el nacimiento de un nuevo ser vivo, global, más inteligente y que además conoce a la humanidad perfectamente, mejor que ella misma, porque el dataset que ha ido acumulando es el más poderoso de todos: los sentimientos. Si te ha gustado este artículo no te olvides de repasar otros de esta serie Ciencia Ficción vs Inteligencia Artificial: Ciencia Ficción vs Inteligencia Artificial: Star Wars, “…para ser un droide mecánico parece que piensas demasiado…” Ciencia Ficción vs Inteligencia Artificial: HAL 9000 "Doctor, no entiendo a los humanos" Ciencia Ficción vs Inteligencia Artificial: Saturno 3, "Héctor, robot malo, el perro no se come" Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken? Ciencia Ficción vs Inteligencia Artificial: Interestellar, "... hey Tars, ¿cuál es tu parámetro de honestidad? Para mantenerte al día con LUCA visita nuestra página web, y no olvides seguirnos en Twitter, LinkedIn y YouTube.
26 de octubre de 2018
AI & Data
Science without Fiction: de la ficción a la realidad
Escrito por Fran Ramírez y Enrique Blanco, investigadores del equipo de Ideas Locas CDO de Telefónica. En este mismo blog de LUCA, tenemos una sección llamada " Ciencia Ficción vs Inteligencia Artificial" en la cual analizamos películas de este género (y también empezaremos en breve con libros) con el fin de comprobar lo cerca que estamos hoy día de muchos de los conceptos y teorías que allí se muestran. Algunos están muy lejos de la realidad, pero es asombroso como la base en la cual se fundamentan ya se está construyendo. Y está mucho más cerca de la Ciencia que de la ficción. Figura 1: Estación espacial. En uno de estos artículos llamado " Ciencia Ficción vs Inteligencia Artificial: HAL 9000. Doctor, no entiendo a los humanos", hablamos de la que posiblemente sea la IA más famosa del cine, HAL 9000. Además de su fama, es también una de las que mejor nos puede servir de ejemplo para comparar los avances de hoy día, ya que muestra varios de los campos en los cuales más progreso se está realizando. Básicamente, HAL 9000 era una IA destinada a controlar todos los sistemas vitales de la nave espacial Discovery (un vehículo lleno de dispositivos IoT) y cuyo método de comunicación con lo astronautas no es un teclado sino el lenguaje natural usando NLP ( Natural Language Processing, posiblemente el más importante de todos los tipos de inteligencia cognitiva). Hoy día utilizamos agentes de IA para controlar todo tipo de vehículos complejos, desde cohetes espaciales ( SpaceX y su impresionante técnica de aterrizaje vertical es uno de ellos) hasta los famosos vehículos autónomos. La IA que se encarga del control de dichos vehículos es capaz de procesar en tiempo real millones de señales de entrada y reaccionar en función de sus datos de salida, pero no sólo eso, además aprende optimizando sus decisiones para futuras misiones. Y esto es lo mismo que hacía HAL 9000. Hoy día sería perfectamente posible dotar de un sistema de NLP basado en redes neuronales profundas que fuera capaz de ofrecer una interacción con dicha IA usando el lenguaje natural. También existen asistentes personales virtuales como por ejemplo Aura, el cual utiliza estas técnicas de NLP, redes neuronales, etc. para ofrecer la mejor experiencia de interacción con el usuario utilizando simplemente la voz como interfaz de entrada de datos. Aura no es solo un asistente que se limita a ofrecer lo que pides en función a unas reglas fijas; también aprende de los hábitos del usuario para de esa forma, saber qué tipo de contenido es el que más le gusta y así ofrecer la mejor experiencia posible. Además no se limita a personalizar ad-hoc el contenido de la televisión que más le interesa al usuario, también responde a dudas como por ejemplo qué productos de la compañía le interesan más, programar grabaciones, poner alertas de consumo e incluso realizar llamadas por teléfono, tal y como nos demostró nuestro CDO Chema Alonso en la presentación de Aura en el MWC 2018: El proceso de imágenes o visión artificial es otra de las grandes características de HAL 9000 (no podemos olvidar la mítica escena de HAL leyendo los labios de la tripulación del Discovery para entender la conversación). Y esto no es ciencia ficción. Hoy día el reconocimiento de imágenes es perfectamente capaz de reconocer el contenido de una conversación leyendo los labios y casi podríamos decir que es una tarea relativamente sencilla comparada con otras, como por ejemplo observar la carretera o la calle mientras conduce un vehículo autónomo. Existen aplicaciones que ya están funcionando las cuales se dedican a controlar todo tipo de procesos industriales observando cadenas de fabricación, por ejemplo detectando productos defectuosos o controlando la seguridad del mismo usando visión artificial. En el campo de la medicina es donde esta técnica se vuelve especialmente útil para detectar todo tipo de enfermedades o problemas analizando las diferentes imágenes obtenidas ya sea por ultrasonidos o Rayos X. Pero no hace falta un cohete espacial o un coche para tener que implementar una IA. Llevamos en el bolsillo un dispositivo que utiliza estas técnicas y algoritmos de manera habitual: el smartphone. Tareas aparentemente tan sencillas como el ahorro de energía, el brillo, el desbloqueo de la pantalla (como la espectacular técnica de desbloqueo de Apple basada en la cara del usuario llamada FaceID), fotografía, procesado de imágenes, etc. Todo estos procesos utilizan técnicas de Inteligencia Artificial. Y las llevamos con nosotros a todas partes. Incluso cuando vamos a comprar un producto desde nuestro smartphone o desde el ordenador, la página web de compras que estemos utilizando tiene su propio sistema de recomendaciones basada en IA como por ejemplo Amazon y su DSSTNE, Deep Scalable Sparse Tensor Network, biblioteca de software de código abierto que permite implementar sistemas de recomendación. El avance en la IA es tan grande hoy día que ya casi no nos preguntamos qué podemos llegar a hacer, prácticamente no existen límites. Los principales debates sobre la IA se centran más en cómo evitar que esta tecnología se nos escape de las manos, es decir, como controlarla y no dejar que se vuelva tan autónoma que al final piense que el ser humano no es tan relevante. No estamos hablando de la exterminación del ser humano por parte de una IA (que tampoco se descarta del todo) sino más bien del miedo a la pérdida de puestos de trabajo y su impacto en la sociedad. En otro de nuestros artículos sobre Ciencia Ficción vs Inteligencia Artificial, ponemos como ejemplo Star Wars, La Guerra de las Galaxias para explicar una posible solución a estos problemas. De momento, parece que nos va bien y no hemos llegado a esos escenarios tecnológicos pesimistas y deprimentes como los que se muestran en películas como Metrópolis o incluso Blade Runner. Y acercándonos aún más a una realidad cotidiana como es el mundo de los negocios, todas estas técnicas y muchas más también se están aplicando en este sector. Al fin y al cabo las empresas se mueven con todo tipo de datos para prosperar, optimizar e invertir en nuevas soluciones. Desde la creación de informes a medida hasta predicciones (por ejemplo, de inventario) son soluciones que usan algoritmos de IA que pueden llevar a una empresa a ahorrar miles de euros y obtener una posición de ventaja en el sector. Esto no es Ciencia Ficción, es realidad y las empresas que más tarden en implantar este tipo de soluciones se quedarán muy por detrás en el mercado en el cual estén operando. Figura 2: LUCA Innovation Day 2018 Por eso queremos invitaros el próximo día 4 de Octubre a un evento que tendrá lugar en Telefónica que hemos llamado " Science without fiction, A.I. is not a fantasy anymore" donde se pondrá en relieve cómo el Big Data y la IA ya son una realidad aplicable a cualquier tipo negocio, donde presentaremos las soluciones que LUCA ofrece en su catálogo. Nuestro CDO Chema Alonso será uno de los ponentes así como Elena Gil (CEO de LUCA) y Julia Llanos (Data Science Manager). Así que elige la pastilla roja como pasaba en Matrix (este será el tema de nuestro próximo capítulo de Ciencia Ficción vs IA) y no te pierdas este evento donde te mostraremos la realidad de la ficción de la Inteligencia Artificial. No te olvides de echar un vistazo a nuestros posts sobre Ciencia Ficción vs Inteligencia Artificial: Ciencia Ficción vs Inteligencia Artificial: Star Wars, “…para ser un droide mecánico parece que piensas demasiado…” Ciencia Ficción vs Inteligencia Artificial: HAL 9000 "Doctor, no entiendo a los humanos" Ciencia Ficción vs Inteligencia Artificial: Saturno 3, "Héctor, robot malo, el perro no se come" Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken? Ciencia Ficción vs Inteligencia Artificial hey TARS, ¿Cuál es tu parámetro de honestidad? No te pierdas ninguno de nuestros post. Suscríbete a LUCA Data Speaks.
20 de septiembre de 2018
AI & Data
Historia de la IA: Frank Rosenblatt y el Mark I Perceptrón, el primer ordenador fabricado específicamente para crear redes neuronales en 1957
Escrito por Fran Ramírez, (@cyberhadesblog) miembro del equipo de Crazy Ideas en CDO en Telefónica, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps" y del blog Cyberhades. Las redes neuronales son hoy día parte fundamental de la IA y en concreto del Deep Learning y como veremos a continuación, al contrario de la creencia popular, no son conceptos nuevos. El primer algoritmo que presentaba una red neuronal simple se llamó Perceptrón, creado por Frank Rosenblatt en 1958 basándos, centrándonos en la Biología, en el trabajo realizado previamente por Santiago Ramón y Cajal y Charles Scott Sherrintong (pioneros en el estudio del funcionamiento del cerebro humano). Desde el punto de vista de la técnica, Rosenblatt utilizó las ideas que fueron introducidas por McCulloch y Pitts en 1943 donde hablaron por primera vez sobre la posibilidad de crear redes neuronales como si fueran ordenadores. Figura 1. IBM 704. Fuente: NASA Como se puede comprobar, estas ideas no son nada actuales (tienen más de 60 años), pero no ha sido hasta hoy día cuando se han podido implementar debido al gran avance tecnológico en computación. Figura 2. Detalle de una neurona del cerebro humano. Fuente: US Federal y recreado por el usuario Dhp1080 El Dr. Frank Rosenblatt (1928 – 1971) fue un psicólogo estadounidense al cual se le considera uno de los padres del Deep Learning. Nació en New Rochelle ( Nueva York) y fue a la universidad de Cornell donde obtuvo también su doctorado en 1956. Frank Rosenblatt falleció muy joven con 41 años el 11 de julio de 1971. Aunque estuvo al frente de varias investigaciones importantes relacionadas con la neurobiología, es conocido mayormente por el desarrollo del Perceptrón, un clasificador binario o discriminador lineal, el cual genera una predicción basándose en un algoritmo combinado con el peso de las entradas. Este el gráfico de un Perceptrón: Figura 3. Perceptrón. Fuente: Alejandro Cartas El valor “ bias” (ajuste) nos permite ajustar la sensibilidad de la curva de activación que veremos a continuación. El valor resultante se pasa a la función de activación, la cual se encarga de decidir si se activa o no la neurona. Para que esto ocurra se definen unos límites que definirán el resultado final, 1 o 0. Por ejemplo, si el valor de salida de la suma y el bias es mayor de 0 (límite establecido) la salida de la neurona será 1. Si el valor es menor de 0, entonces la salida de la neurona será 0. En caso de existir varias neuronas interconectadas donde tengamos que decidir el valor de salida, tendríamos que utilizar funciones como la lineal o Tanh. En 1957 se implementó en un programa ( software) el funcionamiento del Perceptrón por primera vez utilizando un IBM704, uno de los ordenadores más potentes de aquella época. El IBM 704 fue el primer ordenador comercial (se vendieron 123 unidades) que utilizaba operaciones en coma flotante capaz de ejecutar 40.000 instrucciones por segundo (un Intel Core i7 es capaz de realizar aproximadamente más de 100.000 MIPS, millones de instrucciones por segundo). Utilizaba formato BCD de 6bits y registros de 36bits. Los lenguajes implementados para este ordenador fueron FORTRAN y LISP. Como curiosidad, en 1962 el físico John Larry Kelly Jr de los laboratorios Bell, creó un programa sintetizador de voz y lo probó con la canción Daisy Bell. En una visita de Arthur C. Clarke a los laboratorios Bell, le enseñaron este sintetizador con la misma canción la cual luego utilizó en el guión de la película “ 2001: Una Odisea Espacial” donde HAL9000 canta esta canción cuando lo están desconectando. El Perceptrón estaba destinado a ser realmente una máquina en vez de un algoritmo y por eso finalmente se construyó el Mark I Perceptron, basado en las ideas del Perceptrón de Frank Rosenblatt. El Mark I Perceptron se dedicaba exclusivamente a la clasificación de imágenes. Todo el hardware estaba construido a medida y utilizaba potenciómetros para determinar los pesos de cada entrada por Perceptrón así como una cámara capaz de producir imágenes de 400 pixeles de resolución (20x20). En este enlace se puede encontrar el manual de operación original y en la siguiente foto se puede apreciar el panel de conexiones con las distintas combinaciones de entrada: Figura 4. Detalle del panel de conexiones del Mark I Perceptron. Fuente:Fotografo anónimo, posiblemente del Laboratorio Aeronáutico de Cornell Aunque en principio la idea del Perceptrón tuvo una buena recepción muy prometedora en los ámbitos académicos, al final se probó que no podía ser entrenado para reconocer muchos otros tipos de patrones, lo que provocó un estancamiento en el avance de las redes neuronales durante algunos años. También contribuyó a este atraso en la investigación la atrevida afirmación de Frank Rossenblatt donde escribió en el The New York Times en 1958 nada menos que “ este es (Perceptron) el embrión de un ordenador electrónico que espera poder caminar, hablar, ver, escribir, reproducirse y tener consciencia de su existencia”. Figura 5. Detalle de funcionamiento del Mark I Perceptron. Fuente: Manual de Perceptrón de el Laboratorio Aeronáutico de Cornell Estas afirmaciones eran demasiado exageradas para esta primera implementación del Perceptrón , ya que no hay que olvidar tenía una sola capa y por lo tanto sólo eran capaces de aprender datos que permitan una separación lineal . Por lo tanto, las únicas pruebas que se realizaron con este Mark I fueron entrenar al Perceptrón para que fuera capaz de reconocer imágenes, en concreto diferenciar si es hombre o mujer. Figura 6. Ejemplo de separación lineal. Fuente: Qwertyus Para ello se entrenó introduciendo cientos de fotografías de hombres y mujeres con diferentes estilos de pelo y maquillaje. Una vez terminado el proceso de entrenamiento, se introdujeron esta vez modelos de caras que no había visto nunca antes durante dicho proceso de entrenamiento. Finalmente, la máquina decidía si la foto era hombre o mujer con una elevada tasa de éxito. La capacidad de proceso, la tasa de acierto, así como los patrones a analizar aumentaron cuando unos años más tarde aparecieron las redes neuronales multicapas, o perceptrón multicapa . Pero no tenemos que desmerecer el gran trabajo de Frank Rossenblatt ya que esta redes multicapas no son más que capas de muchos Perceptrón exactamente iguales al implementado en el Mark I Perceptron. Telefónica Tech IA & Data Ejecuta modelos de IA Generativa en tu ordenador: guía paso a paso para instalar LM Studio 8 de enero de 2025
20 de julio de 2018
Ciberseguridad
WordPress in Paranoid Mode disponible en Docker en nuestro repositorio de Github
Hace un par de años mostramos una idea de cómo se podía fortificar la base de datos y el uso diario de WordPress. Mostramos un par de papers con una serie de ideas que harían mejorar la seguridad de tu entorno WordPress y MySQL. Hoy hablamos de la liberación en nuestro repositorio de Github de un docker para disponer de WordPress con el plugin de Latch instalado y el WPM para la base de datos listo para ser aplicado. Antes de continuar, os dejamos los papers de los que consta este trabajo. Queremos seguir evolucionando el docker para que incluya todas las ideas que tuvimos en el departamento de Ideas Locas de CDO (Chief Data Office): Un git clone y un docker-compose El poder disponer de esta solución es algo trivial. Simplemente, debes ejecutar un git clone del proyecto y, una vez se tenga el proyecto en el equipo, se debe ejecutar un docker-compose up. Antes de ejecutar el docker-compose hay que revisar el fichero docker-compose.yml. En este fichero encontramos la configuración y se puede leer LATCHAPPID y LATCHSECRET. Estos campos representan el APP ID y el SECRET de la app que hay que crear en el área de desarrolladores de Lach. Una vez tenemos el fichero docker-compose.yml configurado, ejecutamos la siguiente instrucción docker-compose up. Esta instrucción descargará todo lo necesario para poder ejecutar el contenedor correctamente. Como se puede ver en la imagen, se crea la red, se configura la base de datos y se descarga todo lo necesario. La primera vez que se ejecuta este proceso puede que tarde unos minutos, pero el resto de veces que se ejecute el proceso será muy rápido. Una vez se apliquen las descargas y se haya ejecutado lo necesario, se debe acceder al siguiente recurso: localhost:8000. En este recurso encontramos la instalación de WordPress. Elegimos idioma, nombre de usuario, contraseña, etc. Estos son los pasos normales en la instalación de un WordPress. Cuando WordPress se haya instalado y se condiv, se podrá ver en el apartado de "Plugins" como el plugin de Latch que viene instalado por defecto. Es ahora cuando ya se puede instalar. Una vez activado, en el apartado "Ajustes", se debe configurar el APP ID y el SECRET de la aplicación de Latch generada en el área de desarrolladores de Latch. Ahora, el usuario dispone de la posibilidad de hacer pairing con Latch. En otras palabras, su cuenta de WordPress está protegida con un segundo factor. Por último, quedaría instalar el "modo paranoia". Para ello, hay que hacer uso de la instrucción "docker exec –it dbwpm ./install.sh". Al final, lo que se está ejecutando es el script de WPM mediante el uso del script install.sh. Al comenzar la instalación se solicitará al usuario un token para hacer pairing entre la aplicación y los triggers que generará el script en la base de datos. El resultado es el que ya conocemos en artículos como éste. Os dejamos un vídeo con todo el proceso llevado a cabo y que muestra cómo funciona esta solución. Ya no tienes excusa para no probar el "modo paranoia".
6 de julio de 2018
Ciberseguridad
Las HiddenNetworks y otros proyectos de ElevenPaths en la JNIC 2018
En esta edición de 2018 de la JNIC estaremos presentando nuestro paper llamado “Descubriendo y dibujando redes ocultas creadas con dispositivos USB”. Más concretamente, será la mañana del día 13 de junio en San Sebastián (Gipuzkoa). Pero esta no será la única aportación de ElevenPaths a esta edición del JNIC, también hemos participado con una serie de nuevos retos científicos sobre temáticas interesante y diversas que detallamos aquí: Políticas de seguridad basadas en autenticación continua e identificación adaptativa Aplicaciones cuánticas en criptosistemas Detecciones de amenazas y paliativos avanzados de seguridad en plataformas móviles Así que ya sabéis, manos a la obra y os esperamos en esta edición de JNIC. ¡Gracias!
7 de junio de 2018
AI & Data
Enseña a tu IA a jugar Breakout de Atari con OpenAI y Deep Learning
En el segundo webinar de nuestra serie de OpenAI Gym, Enseña a tu IA a jugar Breakout de Atari con OpenAI y Deep Learning, recogimos el testigo del primer LUCA Talk: Domina los videojuegos clásicos con OpenAI y Machine Learning e hicimos uso de los conceptos presentados en el post Deep Learning vs Atari: entrena tu IA para dominar videojuegos clásicos (Parte I). En esta sesión presentamos el resultado de un entrenamiento de una Inteligencia Artificial (IA) que ha aprendido a desenvolverse en el entorno Breakout ( aka Arkanoid) de OpenAI Gym. El núcleo de la arquitectura se ha generado haciendo uso de la librería TensorFlow. Por ello os animamos a visitar el post Deep Learning con Python: Introducción a TensorFlow (Parte I), el primero de una serie dirigida a familiarizarse con este framework para proyectos de Deep Learning en Python. Puedes ver el webinar completo a continuación: [embed]https://youtu.be/LCa9iCmVXyY[/embed] Profundizamos en la descripción del uso de las Redes Neuronales Convolucionales (ConvNets o CNNs) para su uso en aprendizaje reforzado por parte de agentes en entornos observados a través de visión por computadora, y explicamos cómo aplicar algoritmos de Q-Learning en este tipo de redes. Continuamos mostrando la metodología del entrenamiento apoyándonos en pseudocódigo y describimos tanto la arquitectura elegida, como las estrategias de preprocesado de las imágenes del juego usadas para el entrenamiento del modelo. Para terminar, ofrecimos un resumen de la solución obtenida tanto en Breakout como en Space Invaders, junto con algunos posibles puntos a mejorar a la hora de enfocar el entrenamiento conforme aumenta la complejidad del entorno en el que se hace jugar a la IA. En el caso de que os haya gustado el webinar y queráis profundizar en lo que presentamos el pasado martes o si os ha quedado alguna duda, os animamos a leer el próximo - y último - post de Deep Learning vs Atari: entrena tu IA para dominar videojuegos clásicos, que comenzó en este artículo. Se darán más detalles sobre el entrenamiento realizado, donde se ha hecho uso de una Red Neuronal Profunda con algoritmos de Q-Learning (DQN) para que un agente aprendiera a desenvolverse en juegos clásicos soportados en el framework OpenAI Gym. En este último artículo, demostraremos que es posible entrenar a una IA o agente en el entorno Breakout-v0. Tras un largo tiempo de entrenamiento, haciendo uso de 4 frames consecutivos como entrada al modelo, podréis ver cómo hemos conseguido una actuación aceptable de la Inteligencia Artificial superando la puntuación media obtenida por otros modelos bien caracterizados. Por otro lado, la estrategia usada (como demostramos durante el webinar) nos ha permitido extrapolar la solución al entorno SpaceInvaders-v0 con mínimos cambios de código.
31 de mayo de 2018
Ciberseguridad
Fallo ¿crítico? en PGP y S/MIME permite revelar mensajes cifrados
PGP y S/MIME son dos de los métodos más conocidos para cifrar emails por todo Internet. PGP (Pretty Good Privacy) fue desarrollado por Phil Zimmermann el cual utiliza la criptografía de clave pública para cifrar la información y es todo un clásico ya que lleva funcionando desde 1991. S/MIME (Secure/Multipurpose Internet Mail Extensions) es también una tecnología que permite cifrar información basado en criptografía asimétrica. Ambos sistemas también permiten firmar los correos para confirmar la identidad de la persona que los ha enviado. Hace unos días se comentó en ELDM la aparición de esta nueva vulnerabilidad llamada efail. En él se explicaba un bug con el cual es posible descifrar a texto plano los mensajes cifrados con ambas plataformas. Ahí es poco. Y lo más grave, también sirve para cifrar cualquier email enviado en estos últimos años. El mensaje publicado por estos investigadores es bastante claro: desinstala ahora en tu cliente de email cualquiera de estos métodos de cifrado. Sebastian Schinzel, profesor de seguridad informática en la universidad de Munster de Ciencias Aplicadas, escribió en su Twitter: “…podría (el bug) revelar el texto plano de los emails cifrados, incluidos los emails cifrados que enviaste en el pasado”. Además, acaba diciendo “No hay hoy en día ningún parche para esta vulnerabilidad. Si utilizas PGP/GPG o S/MIME para envío de información sensible, deberías de deshabilitarlo en tu cliente de email”. El mensaje en sí es bastante preocupante, ya que destroza uno de los métodos de cifrado más robustos, comunes y utilizados en Internet. Imagen 1. Tweet publicado por Sebastian Schinzel el 14 de mayo de 2018. Pero no sólo ha sido Sebastian Schinzel quien lo ha anunciado, la Electronic Frontier Fundation o EFF ha dicho en un comunicado que confirma este fallo de seguridad. Por lo visto han estado en permanente contacto con el equipo de investigación que les ha confirmado este fallo. Este es el mensaje que ha lanzado la EEF: “Nuestro aviso, que es el mismo que el de los investigadores, es deshabilitar inmediatamente y/o desinstalar herramientas que automáticamente descifren los emails cifrados con PGP. Hasta que los fallos descritos en el paper se comprendan y sean reparados, los usuarios deberían comenzar a buscar una alternativa para enviar mensajes punto-a-punto por canales seguros, como por ejemplo Signal, y temporalmente parar de enviar y especialmente leer mensajes cifrados con PGP.” Hasta aquí parece el fin del mundo tal y como lo conocemos. FIN. Pero antes de sacar las antorchas para quemar los ordenadores, vamos a analizar un poco mejor el problema porque puede que no sea para tanto. En primer lugar, el problema existe, pero afecta sólo a emails en formato HTML, algo que Sergio de lo Santos ya comentaba en un tweet el mismo día de su publicación: Imagen 2. Tweet publicado por Sergio de los Santos el 14 de mayo de 2018. En efecto, según la información publicada en efail.de este ataque se aprovecha de vulnerabilidades en el contenido de emails con formato HTML. Estos mensajes permiten por ejemplo cargar imágenes o fuentes de letra, y estos mismos componentes pueden ser reutilizados como medio para conseguir el mensaje en texto plano a través de una URL. Como requisito principal, para conseguir el descifrado el atacante debe de tener acceso a los emails del objetivo ya sea consiguiendo acceso a su cuenta de correo, interceptando el tráfico de red o accediendo directamente a los servidores de email o sus copias de seguridad. Como se puede observar, es posible que sea más peligroso el hecho que el atacante tenga acceso a esos recursos (ha entrado hasta la cocina en tus sistemas) que el efail en sí mismo. Como también comenta comenta Sergio, hace ya mucho tiempo que nadie utiliza HTML en los correos (¿o sí?). Es bastante conocido que los emails en HTML y en particular enlaces externos tipo son un problema de seguridad. HTML permite de ejecutar elementos como scripts, controles ActiveX, etc. Menos mal que el líder de GnuPG, Wener Koch, ha sido quien ha puesto un poco de sensatez a este mensaje tan alarmista sobre este fallo de seguridad. Lo deja claro en este tweet, el problema está en los clientes de email y sus plugins, no en los protocolos. También deja claro cómo solucionar el problema: no utilizar HTML en los correos y usar cifrado autenticado. Pero vamos a ver un poco más en detalle el origen de estos problemas relacionados con los clientes de email. El primero, la principal vulnerabilidad, es que un atacante podría preparar un correo con una capa HTML con un componente modificado, una capa con el texto cifrado y otra capa con otro componente HTML modificado el cual utiliza enlaces remotos que finalmente permiten enviar el texto cifrado en texto plano. El segundo problema está en las especificaciones técnicas y de implementación de OpenPGP y S/MIME. Sobre el problema relacionado con los emails en HTML, existen a su vez dos tipos de ataque efail. El primero llamado direct exfiltration explota vulnerabilidades en Apple Mail, iOS Mail y Mozilla Thunderbird. El atacante crea un nuevo correo con varias partes, en concreto tres partes tipo body. La primera es un body HTML que contiene una etiqueta de imagen HTML. Es importante destacar que la etiqueta de imagen no está cerrada, es decir, comienza con comillas, pero no se cierra, como se puede observar en rojo en la siguiente captura: Imagen 3. Primera parte con el texto cifrado y la etiqueta de imagen.. Fuente. La parte que viene a continuación, una nueva parte body contiene el texto cifrado PGP o S/MIME. Por última, la tercera parte body es la que cierra la etiqueta de imagen que antes quedó abierta. Entonces el atacante envía un email a la víctima y el cliente de correo descifra el texto que estaba cifrado en la segunda parte body que antes se ha comentado. Finalmente, el cliente junta todas las partes y obteniendo como resultado el siguiente mensaje, el cual, al cerrar al final las comillas, se ha expandido a 4 líneas formando una URL de esta longitud: Imagen 4. Resultado final de juntar todas las capas. Fuente. Finalmente, el cliente de email codifica la URL y solicita una imagen de esa direccoçpmL. Como la ruta de esta URL tiene incluido el texto plano del email cifrado, el cliente de email de la víctima lo enviará al atacante. Imagen 5. URL final obtenida. Fuente. El siguiente ataque, basado en las especificaciones técnicas y de implementación de OpenPGP y S/MIME, es más elaborado y se llama ataque CBC/CFB Gadget Attack. Esta vez el atacante podría enviar bloques de datos malformados los cuales, cuando sean leídos por el objetivo, pueden engañar al cliente de email para que envíe al ordenador del atacante el texto plano de los mensajes. Un requisito, debido a las especificaciones de CBC, es que el atacante sepa por lo menos un bloque completo del texto sin cifrar (texto plano). Esto que en principio parece un hándicap insalvable se convierte en algo plausible ya que la mayoría de los mensajes S/MIME cifrados suelen comenzar por “Content-type: multipart/signed” con lo cual ya tenemos nuestro primer bloque de texto sin cifrar. En la figura 6, como se puede apreciar en el apartado (a). El siguiente paso (b), es construir un bloque de texto plano válida utilizando ceros (el bloque conformado por X y C0 se llama CBC gadget). El paso final (c) se van añadiendo gadgets para insertar una etiqueta de imagen dentro del texto cifrado, creando finalmente un solo body que mostrará el texto plano cuando la atacante abra el email. El ataque usando CFB funciona exactamente igual ya que tiene las mismas propiedades criptográficas que CBC. Este ataque es muy similar en ejecución para PGP o S/MIME, aunque para S/MIME funciona mejor que para PGP, el cual sólo tiene un rango de éxito de 1/3 (debido a la compresión que PGP realiza sobre el texto plano antes de cifrarlo). Para más información aquí tenéis el paper completo. Imagen 6. Esquema del ataque CBC/CFB Gadget Attack. El ataque PGP CFB gadget tiene el CVE-2017-17688 y el S/MIME CBC se le ha asignado el CVE-2017-17689. Como hemos podido observar, al final esta vulnerabilidad no es tan grave como parecía al principio. Pero de todas formas hay que tenerla en cuenta y al menos tomar algunas medidas de seguridad. La primera, no utilizar mensajes con HTML y deshabilitar todos los plugins de email. También es conveniente rechazar los correos HTML (no abrirlos) y deshabilitar la opción de carga de recursos externos (las cuales suelen ser habitualmente imágenes). MDC (Modification Detection Code) es una característica que si está incluida en tu programa/plugin de correo, que resuelve el problema (por ejemplo, OpenPGP lo lleva), el problema es que S/MIME no soporta esta característica. Por otro lado, también se recomienda abrir los emails cifrados con PGP en un editor de texto, en una máquina virtual segura, un contenedor docker o lo que se te ocurra en vez de dejar que estos mensajes sean procesados por algún tipo de programa/plugin. Utilizar TLS no protege contra este ataque ya que TLS sólo cifra el tráfico entre los clientes de email y los servidores, o entre dos servidores de email, pero todos los correos se procesan y almacenan en texto plano en los servidores y en las respectivas cuentas de correos. De todas formas, estaremos atentos a la evolución de este bug por si trae más sorpresas.
23 de mayo de 2018
AI & Data
Ciencia Ficción vs Inteligencia Artificial: Interestellar, "...hey TARS ¿cuál es tu parámetro de honestidad?"
En nuestro anterior artículo de Ciencia Ficción vs Inteligencia Artificial, hablamos de los robots que aparecen en la saga Star Wars y por qué son programados con poca empatía en su relación con los humanos. Esta vez en cambio, vamos a hablar de otro punto de vista aplicado a los robots que aparecen en la película Interestellar (llamados TARS) los cuales nos ofrecen una interesante solución intermedia sobre cómo tiene que ser el aspecto físico de los robots del futuro así como su forma de interactuar con los seres humanos. Aviso : es posible que haya algún que otro espoiler a partir de este punto ... El argumento principal de la película nos traslada a un futuro no muy lejano donde la Tierra se encuentra casi al límite de sus recursos. De repente, aparece una esperanza de migrar a un nuevo planeta gracias a un agujero de gusano que prácticamente se ha materializado instantáneamente cerca de Saturno. Este agujero de gusano es un portal hacia un agujero negro llamado "Gargantua" el cual tiene orbitando alrededor varios planetas potencialmente habitables. La NASA (o lo que queda de ella) envía una misión con cuatro tripulantes humanos, Cooper, Romily, Doyle y Amelia y dos tripulantes no humanos, TARS y CASE. Son estos dos robots (en concreto TARS) y su peculiar programación lo que nos ha llamado la atención. Estos robots son unidades tácticas militares desarrollados por la U.S. Marine Corps. En la película aparecen cuatro de ellos llamados PLEX, CASE, KIPP y TARS. Como ya hemos comentado, TARS, es el más interesante de ellos, ya que este modelo está programado para parecerse a un ser humano al menos en su forma de interactuar con ellos. En cambio, en lo relativo a su forma física es todo lo contrario, su diseño está más orientado a su funcionalidad que su posible parecido con un ser humanoide. De hecho, su aspecto tampoco se parece a ningún robot de los que hemos visto hasta ahora. Miden metro y medio de alto por uno de ancho, están fabricados utilizando cuatro bloques rectangulares verticales con diferentes segmentos que se puede desacoplar e incluso hacerlos rotar en diferentes direcciones para realizar acciones como andar, correr, rodar, llevar objetos, etc. TARS habla como un ser humano, exactamente igual con la misma fluidez y entonación, pero además es capaz de hacer bromas o comentarios sarcásticos lo cual le otorga aún más una personalidad humana como podemos ver en esta conversación entre Cooper (el protagonista) y TARS: Cooper: Hey TARS, ¿cuál es tu parámetro de honestidad? TARS: 90% Cooper: ¿90%? TARS: la honestidad absoluta no es siempre la forma más diplomática o la más segura a la hora de comunicarse con seres emocionales. Pero quizás el momento más memorable entre las conversaciones entre la tripulación y TARS sea este durante el lanzamiento de camino a los nuevos planetas (puedes encontrarlo en Youtube): Cooper: Listos para la separacion de la primera fase TARS: Fase 1, pasamos a Mach 1 Cooper: ¿Todo el mundo ok? TARS: Sí, lleno de esclavos para mi nueva colonia de robots Doyle: Ellos le proporcionaron al robot sentido del humor pero parece que no le queda bien a este, cree que nos relaja. Cooper: un robot gigante sarcástico ¡qué gran idea! .... Cooper: ¿Cual es tu configuración de humor TARS? TARS: es 100% Cooper: pues vamos a bajarla a 75%, por favor En marzo de 2017 unos investigadores chinos desarrollaron un "chatbot" llamado ECM que era capaz de mostrar emociones como felicidad, tristeza o disgusto a la hora de entablar una conversación con un humano. Para conseguir este logro desarrollaron un algoritmo de "clasificación de emociones" que había aprendido de más de 23.000 publicaciones obtenidas directamente de la red social Weibo . Como podemos ver, las conversaciones entre TARS y sus compañeros humanos no están tan lejos de convertirse en una realidad. Mientras que hoy día parece ser que es necesario crear robots a imagen y semejanza del ser humano, aquí en la película se ofrece otra teoría muy diferente: crear robots que hablen y se comporten como humanos pero que no se parezcan físicamente a ellos. De esta forma desaparece la sensación de miedo al ser sustituidos por ellos creando en cambio herramientas complejas muy inteligentes pero evitando el problema del Valle Inquietante. Durante la película, estos robots salvan a seres humanos por encima de su propia existencia individual lo que denota una firme programación cercana a las tres leyes de la robótica de Asimov. Pero esto no quiere decir que no tengan instinto de supervivencia, de hecho, TARS cuestiona todas las ordenes que puedan afectar su integridad buscando la lógica y la solución óptima para la integridad del ser humano y él mismo. Este comportamiento lo hace muy similar a otra IA de la que ya hemos hablado en esta sección, nuestro querido HAL 9000 . Figura 1 :la Tierra dessde el espacio. Otra de las características que ofrecen algunas ideas sobre su aplicación al mundo real parte de su gran habilidad de explicar sus decisiones o acciones en términos que un ser humano pueda entender sin problemas debido a su dominio del lenguaje. Pero, además, también tienen la función de modificar su funcionamiento más profundo como, por ejemplo, la modificación del valor de honestidad que hemos podido ver en la anterior conversación entre TARS y Cooper, dando una sensación de transparencia que ayuda a evitar los miedos relacionados con la IA al otorgar control absoluto sobre ella. En definitiva, Interestellar nos ofrece algunas posibles pistas de cómo tendríamos que diseñar las nuevas IA y los robots para poder tenerlos bajo control. Hemos visto teorías que van desde crear robots " tontos" orientados a tareas muy específicas y por otro lado otras teorías no llevan a crear robots súper inteligentes con forma humanoide, cuando es posible que la solución sea más sencilla: crear robots que sepan comunicarse perfectamente con un ser humano pero sin tener que parecerse demasiado a ellos. Esto es por lo que TARS se ha convertido en uno de nuestros robots favoritos de ficción y también nuestra apuesta sobre cómo serán los robots del futuro. Si te ha gustado esta entrada, no dudes en visitar otros artículos de esta misma serie: Ciencia Ficción vs Inteligencia Artificial: Star Wars, “…para ser un droide mecánico parece que piensas demasiado…” Ciencia Ficción vs Inteligencia Artificial: HAL 9000 “Doctor, no entiendo a los humanos” Ciencia Ficción vs Inteligencia Artificial: Saturno 3, “Héctor, robot malo, el perro no se come” Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken? Ciencia Ficción vs Inteligencia Artificial: Interestellar, “… hey Tars, ¿cuál es tu parámetro de honestidad? .
27 de febrero de 2018
AI & Data
Historia de la IA: John McCarthy y el lenguaje de programación LISP
Vamos a comenzar el nuevo año con una nueva sección en la cual iremos explicando brevemente algunos de los conceptos y personajes más relevantes en el mundo de la Inteligencia Artificial (IA). En este primer artículo de esta serie hablaremos de John McCarthy, considerado el padre de la Inteligencia Artificial y además es el creador unos de los lenguajes de programación más relacionado con la IA, el LISP. Figura 1 : Edificio de MIT (Fuente Madcoverboy, English Wikipedia) En 1956, en una conferencia celebrada en el Dartmouth Collegue, Nuevo Hampshire, que reunía a grandes personalidades de las Matemáticas y la Física, se hablaba sobre cómo encontrar la forma de que una máquina pudiera razonar como un humano a la hora de resolver problemas. Uno de los ponentes y organizadores era John McCarthy y cuando subió al escenario utilizó un nuevo terminó para definir las nuevas técnicas de poder dotar a una máquina de inteligencia: lo llamó Inteligencia Artificial. John McCarthy nació en Boston en 1927 y desde pequeño le había interesado el funcionamiento del cerebro y las matemáticas. En 1951 recibió su doctorado en Matemáticas de la Universidad de Princeton acabando como profesor en Standford en 1962 hasta su retiro. John conoció en la misma conferencia de Dartmouth a otro grande de la IA, Marvin Minsky y ambos fundaron el departamento de IA del MIT , aunque luego John volvería a Standford para formar su propio departamento en la Universidad de Stanford llamado SAIL. Este laboratorio jugaría un rol fundamental en el desarrollo de técnicas relacionadas con la visión artificial, razonamiento y otras técnicas cuyo objetivo final era e imitar el funcionamiento del cuerpo humano y el cerebro. De SAIL saldrían grandes personalidades que luego fundaron compañías como Sun Microsystem o CISCO. Como curiosidad, John solía invitar a miembros del famoso Homebrew Computer Club a diferentes sesiones en las cuales él mismo explicaba los nuevos avances de su laboratorio. Entre esos visitantes estaban Steve Wozniak y Steve Jobs, fundadores de Apple. John McCarthy, (al que todos llamaban “ uncle John ”, a pesar de tener fama de ser una persona brusca), también aportó un gran avance al mundo de la computación cuando durante su estancia en el MIT en 1961. Propuso un método para optimizar y gestionar los recursos de un ordenador ( mainframe por aquella época) que llamó time-sharing. Esta técnica permitía al sistema operativo asignar recursos de CPU y memoria entre los diferentes usuarios de forma concurrente. Resultó ser un gran avance en la computación, ya que permitía que muchos usuarios pudieran interactuar de forma simultánea en un mismo ordenador. LISP ( LISt Processor) apareció de forma casi natural a la vez que la IA ya que fue el resultado de la concentración de diferentes ideas entre 1956 y 1958. Algunas de estas ideas fueron obtenidas de otros lenguajes de programación como el Fortran pero además incorporaba nuevas técnicas como, por ejemplo, la computación simbólica frente a la numérica (de la cual derivó la programación simbólica), las estructuras de listas en la memoria del ordenador (su componente fundamental), el uso recursivo de expresiones de condición, el "recolector" de basura ( garbage collector, encargado básicamente de liberar la memoria de los datos no utilizados), las estructuras de datos de árbol y un largo etc. La notación de escritura de programa en LISP está influenciada directamente por el método de cálculo lambda, el cual hace que LISP tenga esa estructura de programación diferente, más orientado a las matemática, que el resto de lenguajes de programación. LISP fue evolucionando poco a poco como un completo lenguaje a medida que en el laboratorio del MIT se utilizaba para implementar técnicas para probar teoremas, resolución de problemas matemáticos, teoría de juegos, etc. las cuales fueron perfeccionando el lenguaje hasta convertirlo en el lenguaje oficial de la época para la IA. Algunos de los programas más conocidos en el mundo de la IA fueron desarrollados en LISP. Por ejemplo el famoso ELIZA, un programa de ordenador orientado al lenguaje natural desarrollado por Josep Weizenbaum también en el MIT. ELIZA permitía entablar una conversación entre un humano y la máquina que simulaba ser un terapeuta. Otro programa muy conocido y que además forma parte de los cimientos que sustentan los actuales asistentes digitales como Siri o Cortana, es SHRDLU. Este programa fue desarrollado por Terry Winograd (el profesor tutor de Larry Page, cofundador de Google, en la Universidad de Standford) y programado en LISP por Marvin Minsky. El objetivo final del programa era desarrollar técnicas que permitieran a un programa de ordenador tomar decisiones y obedecer órdenes directamente partiendo de un dialogo natural entre el humano y la máquina utilizando el idioma inglés. Ahora vamos a dar un breve repaso al funcionamiento del lenguaje LISP para poder entender mejor por qué se convirtió en el lenguaje de la IA. Vamos a comenzar con las operaciones matemáticas las cuales se realizan de forma distinta a lo habitual. Utilizando Common Lisp, el cálculo de una función matemática desde el intérprete LISP sería: (+ (* 4 2) 1) 9 Las variables se asignan utilizando el commando setq: (setq x (+ (* 4 2) 1)) (print x) 9 Las condiciones funcionan de la siguiente forma: (if (< 2 3) (... true ...) (... false ...)) Las listas son el componente clave de LISP ya que son el núcleo de prácticamente todas las operaciones. Para crear una lista y asignarla a una variable podemos utilizar también el comando setq: (setq lst ‘(1 2 3)) Para obtener el primer valor de la lista: (first lst) 1 Y el resto de valores de la misma: (rest lst) 2 3 Para añadir un elemento a la lista se utiliza el comando cons: (cons 0 lst) (0 1 2 3) Las funciones en LISP y la recursividad se pueden ver perfectamente en este programa que calcula las serie de Fibonacci: (defun fibonacci (N) (if (or (= N 0) (= N 1)) 1 (+ (fibonacci (- N 1)) (fibonacci (- N 2))))) Definimos la función con el comando defun con el parámetro (N) con el número a calcular la serie de Fibonacci. Si el número calculado o introducido no es 0 o 1, se realiza el cálculo llamando recursivamente de nuevo a la misma función restando 1 y 2 al número N y finalmente realizando la suma, devolviendo el valor resultante. La pregunta ahora es, una vez que ya vemos la importancia en la historia de la IA y cómo funciona a nivel básico LISP, ¿alguien lo utiliza hoy día? La respuesta es sí. De hecho, LISP es bastante querido por grandes hackers de la informática. Veamos algunos de ellos: Paul Graham. Fundador de Y-Combinator. Programó el código fuente de su startup en LISP. Robert Tappan Morris. Autor del primer gusano que infectó Internet, escribió el código Fuente de su pequeña compañía (Viaweb) en LISP. Alan Kay. Pionero de los sistemas operativos orientados a objetos creó el lenguaje Smalltalk en LISP. Edsger Wybe Dijkstra. Pionero en el diseño de sistemas operativos y concurrencia escribió la mayor parte de sus ensayos en LISP. LISP también vive a día de hoy en entornos de producción de algunas empresas y organizaciones. Por ejemplo Reddit y HackerNews funcionan en LISP y otros lenguajes de programación más actuales que están directamente relacionados con la IA y el Big Data como R y Julia también están basados en LISP. Como se puede observar, LISP está lejos de ser un lenguaje obsoleto y aunque hoy día existen lenguajes de programación que funcionan mejor con las técnicas actuales de IA como Tensorflow, LISP es un lenguaje que funciona muy bien para entender los conceptos básicos de la IA como la resolución de problemas, la programación simbólica o la recursividad. Para finalizar, no podemos olvidar que John McCarthy fue galardonado con el prestigioso ACM Turing Award en 1971 con su hoy día clásico trabajo “T he Present State of Research on Artificial Intelligence”. John nos dejó el 24 de octubre de 2011 pero sus trabajos le han otorgado el honor de ser el padre de la IA y unos de los padres de la computación moderna.
18 de enero de 2018
AI & Data
Ciencia Ficción vs Inteligencia Artificial: Star Wars, “…para ser un droide mecánico parece que piensas demasiado…”
Hoy día, con el continuo avance imparable de la Inteligencia Artificial, uno de los mayores miedos que preocupa a la sociedad actual es si esta nueva “raza artificial” inteligente es una amenaza y si será capaz relevar a la raza humana algún día de la supremacía en el planeta Tierra. Son muchas las voces, algunas de personalidades muy reconocidas como Stephen Hawking, que están avisando de este posible cataclismo de la raza humana si no sabemos cómo controlar el auge de estas máquinas. Otro de los grandes gurús de la tecnología Elon Musk, el cual también tiene sus propios proyectos de IA como OpenAI ha llegado incluso a decir textualmente que “estamos invocando al diablo” y que debemos de estar alerta sobre un posible alzamiento de las máquinas en un futuro no muy lejano. Y es que el ser humano está en inferioridad de condiciones, debido sobre todo a su lenta evolución de miles de años, pero en cambio, un robot y una IA pueden aprender e incluso compartir lo aprendido entre ellas, en muy cortos periodos de tiempo (incluso segundos). Casi cada día nos despertamos con un nuevo hito en la IA, como por ejemplo esta última en la cual se anuncia que la IA de Google llamada AutoML, proyecto que está investigando cómo diseñar modelos mejorados de machine learning automatizando el proceso, está creando nuevas IA que podríamos llamar “hijas” las cuales son más sofisticadas que cualquier otra creada por el ser humano. Otra noticia también muy reciente nos cuenta como AlphaZero, otra IA de Google basada en el proyecto DeepMind, fue capaz de ganar al mejor programa del juego de ajedrez en tan solo un aprendizaje, desde cero que duró cuatro horas. Es evidente que el ser humano necesita de esta nueva tecnología, ya que cada vez más la IA es la única forma de automatizar procesos demasiados complicados para ser realizados por el ser humano o incluso por algoritmos clásicos de programación. Entonces ¿qué podemos hacer para no sucumbir ante esta nueva evolución? De nuevo, es posible que la Ciencia Ficción nos esté ofreciendo una pista, pero además puede llegar de los clásicos de todos los tiempos: Star Wars o La Guerra de las Galaxias. De hecho, hay muchos indicios en todas las películas y libros de la saga de Star Wars de un miedo y respeto hacia la IA e incluso nos ofrece algunas pistas de cómo lo solucionaron. Podemos empezar por ejemplo por la denominación a las máquinas inteligentes, los cuales no se llaman robots, sino "droides". Uno de los más conocidos, C-3PO lo deja claro desde el primer momento en la primera película, La Guerra de las Galaxias en la cual llega a decir que los droides en el universo Star Wars están limitados por su programación inicial y deben obediencia total a sus creadores. De hecho, también podemos ver en la misma película que los droides suelen pasar por un proceso de borrado de memoria bastante frecuente y cíclico, para evitar que desarrollen una empatía con sus “amos” humanos y evitar un desarrollo de una personalidad propia, además de poder cambiarlos de dueños o destinarlos a otras tareas. https://www.youtube.com/watch?v=anOJjqQb8x0 Estos procesos de borrado de memoria y de personalidad nos muestran un paisaje inquietante en el universo de Star Wars, ya que éste está cimentado en una avanzada tecnología, pero todos los droides que aparecen en la película y los libros, excepto algunos casos puntuales, no demuestran tener una inteligencia acorde con la magnífica tecnología que les permite viajar por el espacio e incluso crear estaciones espaciales del tamaño de un planeta (como la Estrella de la Muerte). También llama la atención la variada y extraña morfología de estos droides. Por ejemplo, C-3PO, un droide de protocolo traductor, sí que tiene una forma digamos humanoide pero se pueden ver perfectamente sus cables y articulaciones mecánicas, dejando claro que es un ser artificial, cuando se podría haber construido perfectamente uno con apariencia más humana (recordemos que cuando Luke Skywalker perdió su mano se le implantó otra totalmente cibernética con apariencia de mano real). Otro ejemplo son los robots tipo droide astromecánico (como R2D2) que utilizan los pilotos rebeldes, los cuales están destinados únicamente a ayudarles a pilotar sus cazas espaciales, no tienen forma humanoide y ni siquiera se les ha dado la habilidad de hablar con un lenguaje similar al humano. Vemos una intencionada maniobra para evitar dotar de toda empatía a estos robots dejando claro siempre su naturaleza artificial. Además, los droides se desarrollan exclusivamente para desarrollar tareas concretas, no pueden aprender ni hacer nada más allá de su programación. De nuevo se nota una intencionalidad para evitar dotar de demasiada inteligencia a estos droides y así tener un control total sobre ellos, tratándolos como auténticos esclavos (los droides llaman a los humanos “maestro” o “amo”). Figura 3 : BB-8, el droide de Star Wars: The Force Awakens. Tenemos que hacer mención especial a R2D2, ya que está documentado en los libros y las películas que no pasó por ninguna de las fases de borrado, pero en cambio, su compañero inseparable C-3PO sí que pasó por ellas. Eso explica la gran inteligencia y empatía desarrollada por este modelo de droide astromecánico que acompañaba en gran parte de la saga a la familia Skywalker. De hecho, parece que el narrador de todas las historias de la saga es este mismo droide (el que escribe las letras de la famosa y ya clásica escena de las letras al principio de las películas de Star Wars) , ya que al no eliminar nunca su memoria y además formar parte habitual de las aventuras de los protagonistas, tenía un registro perfecto que todo lo acontecido a lo largo de los años. Las lecciones que nos ofrece Star Wars sobre cómo deberíamos afrontar el futuro de la IA son varias. La primera de ellas, es dotar a estos robots con IA para realizar tareas concretas, muy específicas, como por ejemplo C-3PO era un droide traductor, no sabía hacer otra cosa a pesar su inteligencia. De esa forma limitamos su conocimiento a un solo campo y evitamos que se puedan desarrollar a otros niveles. Otro punto que queda muy claro es la clara intencionalidad de evitar en lo posible que estos robots se parezcan a los humanos. La diversidad de formas en losdroides que aparecen en las películas da fe de ello y los de forma humanoide, como hemos comentado antes, queda claro que son máquinas dejando visible toda su naturaleza electrónica y mecánica. De esta forma la sociedad tiene claro lo que son, máquinas destinadas sólo a hacer las tareas que se les encomiendan. De hecho, es evidente el trato casi despectivo de los humanos hacia los droides. No podemos olvidar las secuencias míticas en las que Han Solo no trata muy bien a C-3PO e incluso a R2D2 o en la cantina de Mos Eisley donde el camarero le dice a Obi-Wan que los droides no son bienvenidos. Son tratados de forma evidente como una raza inferior. Así que es posible que tengamos que crear “las reglas Star Wars” y dejar de lado las “reglas de Asimov” (o por qué no, crear una mezcla de ambas). Estaremos atentos ahora que se estrena un nuevo episodio de esta gran saga a ver si nos ofrece nuevas pistas sobre el mundo de los droides y la Inteligencia Artificial, nos llevaremos un bloc de notas al estreno ;) Si te ha gustado este artículo no dejes de leer los post de serie Ciencia Ficción vs Inteligencia Artificial: Ciencia Ficción vs Inteligencia Artificial: HAL 9000 “Doctor, no entiendo a los humanos” Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken? Ciencia Ficción vs Inteligencia Artificial: Interestellar, “… hey Tars, ¿cuál es tu parámetro de honestidad?
13 de diciembre de 2017
AI & Data
Cómo entrenar a tu Inteligencia Artificial jugando videojuegos, Parte 5. Aprende Q-Learning con el juego "Taxi", parte 2 de 2
Escrito por Fran Ramírez, Investigador en Eleven Paths y escritor del libro "Microhistorias: anecdotas y curiosidades de la historia de la informática". En el artículo anterior de esta serie implementamos una solución para resolver un entorno un poco más complejo llamado Taxi. Esta vez hemos utilizado Q-Tables, una de las técnicas más utilizadas dentro del Q-Learning. En esta nueva entrega vamos a analizar paso a paso el código fuente y el funcionamiento interno de las Q-Tables. Este es programa que hemos implementado en Python el cual devuelve como resultado una matriz Q con valores totalmente optimizados para la resolución del entorno de juego del Taxi v2 en todo y cada unos de sus estados posibles: import gym import numpy as np env = gym.make("Taxi-v2") #Inicializacion de variables Q=np.zeros([env.observation_space.n, env.action_space.n]) alpha=0.2 def run_episode(observation1, movimiento): observation2, reward, done, info = env.step(movimiento) Q[observation1,movimiento] += alpha * (reward + np.max(Q[observation2]) - Q[observation1,movimiento]) return done,reward, observation2 for episode in range (0,2000): out_done=None reward = 0 rewardstore=0 observation = env.reset() while out_done != True: action = np.argmax(Q[observation]) out_done, out_totalreward, out_observation = run_episode(observation,action) rewardstore += out_totalreward observation = out_observation print('Episodio {} Recompensa: {}'.format(episode,rewardstore)) La primera parte del código, ya la conocemos, es simplemente importar las librerías que vamos a utilizar. Aparte de Gym, importamos también numpy, una librería científica que nos ayudará a realizar nuestros cálculos (más adelante en el código veremos su implementación). Finalmente definimos nuestro entorno Taxi-v2 asignándolo a la variable env: import gym import numpy as np env = gym.make("Taxi-v2") El siguiente paso será inicializar las variables. Aquí utilizaremos la primera función de numpy, np.zeros, la cual simplemente rellena de ceros una matriz bidimensional donde utilizamos los valores de env.observation_space.n y env.action_space.n como NxM los cuales tienen los valores: • env.observation_space.n = 500, es el tamaño del espacio de observación • env.action_space.n = 6, son el número de acciones que podemos realizar La matriz tendría por ejemplo, una estructura similar a esta: Finalmente, alpha indicará la media de aprendizaje y es un valor entre 0 y 1. Si el valor es 0, no habrá aprendizaje, los Q-values (valores Q de la tabla en cada celda) no se actualizarán y si el número es alto, como por ejemplo 0.9 ocurrirá más rápido pero actualizará menos los valores de las tablas, siendo menos preciso. Lo dejaremos en un valor de 0.2. #Inicializacion de variables Q=np.zeros([env.observation_space.n, env.action_space.n]) alpha=0.2 Antes de explicar la siguiente parte del código que incluye la función run_episode, vamos a ver primero la parte principal de ejecución, de esta forma entenderemos mejor luego el funcionamiento de dicha función. Observamos el bucle que ejecutará los episodios, en nuestro caso hemos definido 2000: for episode in range (0,2000): Luego inicializamos las variables que vamos a utilizar en cada ejecución de episodio, entre ellas también el entorno con la variable observation y env.reset() out_done=None reward = 0 rewardstore=0 observation = env.reset() A continuación, tenemos un bucle tipo while que se ejecutará siempre y cuando la variable out_done no sea igual a True. Este bucle ejecuta todas las acciones que hemos definido y que veremos más adelante, hasta que el episodio termine (resolviendo o no el episodio) devolviendo el valor True a dicha variable. while out_done != True: En la variable action almacenaremos la acción que vamos a realizar en cada paso de la resolución de los episodios. En este caso, seleccionamos con la función np.argmax el índice o la posición de las 5 que acciones que tenemos donde se encuentra el valor máximo. Por ejemplo, supongamos que tenemos la siguente salida Q en el estado 64, podemos ver los valores de la matriz Q[64] con los valores [ -0.2, -0.2 , -0.2, -0.2, -2, 0 ] equivalentes a una lista de 6 elementos: Al ser una lista, la ejecución de np.argmax nos devolverá un número con la posición índice donde se encuentra el valor máximo, en este caso, posición numero 6 (0 al 5) que contiene el valor 0 y que a su vez corresponde con la acción de recoger al pasajero ( Pickup). action = np.argmax(Q[observation]) La siguiente parte del código llama la función run_episode utilizando como parámetros la variable observation y action. Esta función devolverá tres valores: out_done: ya la hemos comentado antes, devolverá True cuando termine el episodio out_totalreward: devolverá un número entero con la recompensa obtenida out_observation: devolverá un número entre 0 y 500 que nos indicará en qué estados están las variables del entorno después de realizar una acción (por ejemplo, la nueva ubicación del taxi o si hemos recogido o no un pasajero) out_done, out_totalreward, out_observation = run_episode(observation,action) La recompensa obtenida en la ejecución de estas acciones la acumularemos en la variable rewardstore (para tener un valor global de recompensa) y actualizamos los valores de la nueva observación recibida desde out_observation almacenándolos en la variable observation para preparar la siguiente ejecución de acciones: rewardstore += out_totalreward observation = out_observation Finalmente, visualizamos al finalizar cada episodio, los valores totales obtenidos como recompensa: print('Episodio {} Recompensa: {}'.format(episode,rewardstore)) Ahora pasamos a analizar la función run_episode, donde se realizan todas las operaciones importantes del algoritmo. Esta función recibe como parámetros la observación actual (recordemos, un valor entre 0 y 500 que corresponde a la situación actual de los estados del entorno, variable observation1) y el movimiento que vamos a realizar con nuestro taxi (variable movimiento): def run_episode(observation1, movimiento): La primera acción a realizar será ejecutar los movimientos que hemos recibido como parámetros. Para ello utilizamos la función env.step(movimiento). Esta ejecución devolverá 4 valores: observation2: situación en la que queda el entorno después de nuestro movimiento reward: recompensa obtenida done: si hemos finalizado info: datos estadísticos (que no usaremos de momento) observation2, reward, done, info = env.step(movimiento) Una vez recibida toda esa información procedemos a actualizar la tabla Q con los valores obtenidos después de utilizar la fórmula que explicamos en el anterior artículo: Y que se traduce en código Python de la siguiente manera: Q[observation1,movimiento] += alpha * (reward + np.max(Q[observation2]) - Q[observation1,movimiento]) Básicamente, lo que está ocurriendo durante la ejecución de esta función y del algoritmo, es lo siguiente. Como ya hemos comentado, la tabla Q es una matriz NxM, donde N es el número de estados y M las acciones a realizar (definido por las variables env.observation_space.n y env.action_space.n respectivamente). En función de estado donde nos encontremos (en el caso de la imagen anterior era el 64), se comprueba la fila (que básicamente es una lista, como se puede ver también en la imagen) y cada columna (acción) lo que vamos almacenando o comprobando es la probabilidad de elegir esa acción. Así poco a poco vamos construuendo nuestra tabla Q con los valores más óptimos posibles. En el último paso la función devuelve los valores done, reward y observation2 (los cuales corresponderán a las variables out_done, out_totalreward y out_observation: return done,reward, observation2 Finalmente obtendremos una matriz Q rellena con los valores óptimos para cada posible estado que pueda ofrecer este entorno. La visualización de los algoritmos, datos y tiempos de aprendizaje (ejecución) son muy importantes, por eso vamos a ver cómo crearlos. En este caso, vamos a utilizar la librería Matplotlib para Python para dibujar dos gráficas, la primera de ellas mostrará la evolución de los pasos necesarios a ejecutar en cada episodio hasta encontrar una solución óptima al problema. Por otro lado, también mostraremos la evolución de las recompensas obtenidas. Este primer gráfico muestra como a medida que avanzan los episodios de entrenamiento, son necesarias menos ejecuciones de pasos para encontrar la solución óptima. De hecho, a partir de más o menos los 600 episodios ya podemos notar la disminución del número de pasos a ejecutar: Y este otro gráfico muestra el valor de las recompensas, siendo las primeras valores negativos hasta su normalización en valores positivos. De nuevo, más o menos sobre el episodio 600 es cuando comienza a estabilizarse la obtención de recompensas positivas: Crear estos gráficos es sencillo, simplemente instalamos la librería Matplotlib en nuestro entorno Linux: sudo apt-get install python3-matplotlib Luego la importamos dentro del código: import matplotlib.pyplot as plt Y finalmente dibujamos un eje de coordenadas x e y con rango x desde 0 a 2000 (número de episodios) y como rango y desde 0 a 100 (pasos máximos por episodio). Luego etiquetamos los ejes con el comando plt.xlabel y plt.ylabel y finalmente lo dibujamos con el comando plt.plot. La variable episodios será una lista de elementos con los valores de 1 a 2000 y la variable pasostotal será una lista con el número de pasos ejecutados por cada episodio. Por otro lado, la variable recompensas será también una lista donde almacenamos la recompensa obtenida en cada episodio: #Gráfica de pasos por episodio plt.axis([0,2000,0,100]) plt.xlabel('Episodios') plt.ylabel('Pasos realizados') plt.plot(episodios,pasostotal,color='blue') plt.show() #Gráfica de recompensa por episodio plt.axis([0,2000,-200,100]) plt.xlabel('Episodios') plt.ylabel('Valor Recompensa') plt.plot(episodios,recompensas,color='red') plt.show() A continuación mostramos un vídeo con la ejecución y el código fuente final el cual es una modificación del principal que aparece al principio de este artículo, pero esta vez se muestra una ejecución paso a paso, donde vemos todos los valores de la tabla Q así como una visualización de los estados (simulando una animación). Al final de proceso, el cual será largo ya que son 2000 episodios se mostrarán los gráficos. Para acelerarlo podemos comentar todos los comandos print que no necesitemos y sobre todo la la línea input(“->”), la cual espera que pulsemos una tecla para continuar con la ejecución. En el siguiente video podemos ver este proceso, tanto la salida de ejecución como la modificación de los comandos: import gym import numpy as np import matplotlib.pyplot as plt env = gym.make("Taxi-v2") #Inicializacion de variables Q=np.zeros([env.observation_space.n, env.action_space.n]) pasos=0 alpha=0.2 episodios=[] pasostotal=[] recompensas=[] def run_episode(observation1, movimiento): observation2, reward, done, info = env.step(movimiento) Q[observation1,movimiento] += alpha * (reward + np.max(Q[observation2]) - Q[observation1,movimiento]) return done,reward, observation2 for episode in range (0,2000): episodios.append(episode) pasos=0 out_done=None reward = 0 rewardstore=0 observation = env.reset() print("OBSERVACION: ",observation) print("Estado inicial:") print(env.render()) # muestra estado inicial while out_done != True: pasos+=1 action = np.argmax(Q[observation]) print("Estado ",observation,"valor matriz Q: ",Q[observation]) print("Valor máximo en posición ",action+1," de la lista") print("Acción: ",action) print(env.render()) input("->") print(chr(27) + "[2J") #Borra pantalla out_done, out_totalreward, out_observation = run_episode(observation,action) rewardstore += out_totalreward observation = out_observation recompensas.append(rewardstore) pasostotal.append(pasos) print("Estado final:") print(env.render()) # muestra estado final print('Episodio ',episode,' Recompensa: ',rewardstore) #Gráfica de pasos por episodio plt.axis([0,2000,0,100]) plt.xlabel('Episodios') plt.ylabel('Pasos realizados') plt.plot(episodios,pasostotal,color='blue') plt.show() #Gráfica de recompensa por episodio plt.axis([0,2000,-200,100]) plt.xlabel('Episodios') plt.ylabel('Valor Recompensa') plt.plot(episodios,recompensas,color='red') plt.show() Las tablas Q son un recurso de Machine Learning relativamente fácil de utilizar con resultados muy buenos en entornos con pocos estados. En nuestro caso jugando con Taxi tenemos 500 estados, fáciles de calcular, el problema llega cuando queremos enseñar a nuestra IA a jugar en entornos más complejos como PacMan o Doom los cuales tienen infinitos estados para procesar. En estos casos es imposible utilizar las tablas Q pero sí podemos utilizar las DQN cuya base es Q-Learning y también tendremos que utilizar el análisis de imágenes, fotogramas de la ejecución del juego e interpretarlos. Esto es lo que veremos en nuestro próximo artículo que posiblemente será otra serie, no te la pierdas, esto era divertido pero ahora empieza lo mejor ;) Artículos anteriores: Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 1 Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 2 Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 3 Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 4 No te pierdas ninguno de nuestros post. Suscríbete a LUCA Data Speaks.
21 de noviembre de 2017
Ciberseguridad
Atacando los cajeros automáticos desde la red interna del banco
Todos hemos oído hablar de los típicos ataques contra cajeros de banco utilizando elementos, llamémosles ‘físicos’, para simular teclados, lectores de tarjetas o incluso colocando cámaras para poder registrar el número pin del usuario de la tarjeta. Todos estos ataques se basan fundamentalmente en tener acceso presencial al cajero que se pretende atacar. En los últimos meses, la forma de ataque ha variado hacia conseguir un acceso a la red interna de la oficina del banco y de esa forma tomar el control del cajero (o de los cajeros) desde dentro de la red. Muchos bancos aún utilizan ordenadores PC con Windows XP como sistema operativo en sus cajeros automáticos, lo cual es ya de por sí un enorme problema de seguridad debido a la discontinuidad del mismo por parte de Microsoft. Por otro lado, las transacciones y operaciones las gestiona XFS ( Extensions of Financial Services), un estándar con arquitectura cliente-servidor el cual provee una API para permitir acceder y administrar los cajeros (y sus periféricos, como por ejemplo el dispositivo encargado de entregar el dinero). XFS de base, no se centra demasiado y deja en manos de cada desarrollador el nivel de seguridad que quiera aplicar a su capa de comunicación con la aplicación principal del cajero. Aquí podemos encontrar toda la información sobre XFS versión 3.20. El malware Backdoor.Win32.Skimer, que apareció en 2009, infectaba el núcleo central del cajero tomando el control total del mismo habilitando además toda una serie de comandos los cuales se podían activar desde el teclado numérico accesible desde el exterior del banco. Para acceder a este ‘panel de control’ del malware, una vez infectado el cajero, el atacante sólo tenía que introducir una tarjeta especial en la banda magnética, utilizar un pin y luego ejecutar uno de los 21 comandos de los que disponía como, por ejemplo, sacar dinero, imprimir datos de las tarjetas por la impresora de recibos o incluso autodestruirse si fuera necesario. Además, permitía guardar la información (pin, número completo, etc.) de las tarjetas registradas en el cajero dentro la misma tarjeta utilizada para acceder al menú del malware. Vectores de infección en la red del banco y proceso de obtención de acceso al cajero, con la opción de infección por pendrive USB añadida. Fuente. Skimer era un malware bastante efectivo, siempre y cuando se pudiera infectar el sistema, habitualmente consiguiendo un acceso físico al cajero para poder infectarlo. Normalmente los cajeros automáticos no están conectados directamente a la red local del banco y mucho menos a Internet. La conexión con la red del banco se suele realizar a través de VPNs internas. La forma más rápida de acceder a un cajero es conseguir llegar a un puerto USB o al CDROM, aunque no se trata de una tarea sencilla, tampoco es imposible. Es por esta complejidad de acceso físico por lo que últimamente los ataques tienen como objetivo acceder a la red interna del banco y desde allí ejecutar el malware el cual infectará a todos los cajeros posibles dentro de la misma. Las formas de infectar internamente la red del banco pueden ser: desde enviar el malware utilizando phishing clásico enviado a los diferentes empleados a copiarlo dentro de un pendrive e intentar que algún empleado del banco lo introduzca en uno de sus ordenadores (al más estilo Stuxnet, el cual se infectó desde un pendrive dentro de una red hipotéticamente segura al no estar conectada a internet). El control de los USB dentro de un organismo, y mucho más en empresas como los bancos, se convierte en una tarea importante, sino vital. En ElevenPaths ya hemos hablado de nuestro paper ' Hidden Networks' el cual permite seguir la pista de los pendrives USB y dibujar una red alternativa que muestra el camino que han seguido los mismos: Paper Hidden Networks de ElevenPaths Uno de los malware más conocidos es el llamado Ripper, una versión mejorada de Skimer, que utiliza funciones importadas de las librerías XFS MSXFS.DLL y XFS_CONF.dll. En esta ocasión, el método de infección no se basa en el acceso físico al cajero. Ripper fue el primer malware que accedía a los cajeros utilizando la red corporativa del banco para posteriormente instalar el malware en los cajeros en vez de utilizar la instalación física. La ingeniería social (aquí podríamos incluir también los pendrives o USB) y el phishing son los principales vectores de infección, siendo los propios trabajadores del banco los que podrían ejecutar enlaces y programas que contienen los ficheros con malware. El ataque que mejor muestra cómo se puede conseguir este tipo de accesos desde dentro de la red corporativa es el caso Taiwan Network Attack. Este ataque reúne toda una batería de técnicas sofisticadas para conseguir llegar al objetivo final de infectar y tomar el control del cajero automático. Este ataque supuso una pérdida de 2.5 millones de dólares para 22 sucursales del banco First Commercial Bank de Taiwán. En el siguiente gráfico del paper de TrendMicro se muestran todos los pasos: Fases del ataque Taiwán Network Attack. Fuente. • Fase 1. El ataque se centra en infectar la red de la sucursal en Londres del banco utilizando técnicas de phishing o incluso la mencionada anteriormente a través de pendrives. • Fase 2. Una vez se obtiene acceso a la red, se consiguen robar las credenciales de acceso de administrador a través del sistema de grabación de voz. • Fase 3. Con estas credenciales se obtuvo acceso utilizando su propia VPN a la sucursal en Taiwán y también a algunos servidores de dichas oficinas. • Fase 4. Utilizando los mencionados servidores, los atacantes aprendieron la topología de red de la empresa, identificaron el sistema de actualización de parches para los cajeros y, a partir de ella, las credenciales de administración. • Fase 5. Posteriormente, con estas credenciales, accedieron al servidor de actualizaciones de los cajeros y prepararon una actualización falsa - lista para ser distribuida-, que se cargó en los cajeros como si fuera absolutamente real y oficial. El objetivo de este paquete era habilitar el servicio remoto Telnet en los cajeros. • Fase 6. Una vez activado el servicio Telnet en los cajeros, los atacantes pudieron abrir sesiones remotas y tomar el control de los cajeros. • Fase 7. Los atacantes instalaron en ciertos cajeros varios programas para realizar algunas pruebas de apertura de los dispensadores de dinero (sin sacar de momento ninguna cantidad). Algunos cómplices fueron a la ubicación física de dichos cajeros para comprobar que realmente funcionaron. Para comunicarse entre ellos utilizaron la aplicación de mensajería segura Wickr Me en sus smartphones. • Fase 8. Una vez confirmado que todos los cajeros estaban ya preparados, subieron a los cajeros aplicaciones modificadas que serían las encargadas de sacar el dinero. De nuevo, los cómplices estarían frente a los cajeros a la hora indicada pero esta vez para retirar el dinero y pasar el siguiente cajero. • Fase 9. Durante este tiempo, los atacantes, van eliminando toda pista en los cajeros infectados y desconectando las sesiones Telnet. Este ataque, debido a su complejidad y efectividad, demuestra que cada vez más, bandas completas de delincuentes se están tomando en serio este tipo de ataques dirigidos a entidades bancarias. Ahora más que nunca es necesaria una revisión completa de la seguridad interna de dichas redes, así como de la gestión y mantenimiento de los cajeros automáticos.
3 de noviembre de 2017
AI & Data
Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 4. Aprende Q-Learning con el juego "Taxi", parte 1 de 2
Escrito por Fran Ramírez, Investigador en Eleven Paths y escritor del libro "Microhistorias: anecdotas y curiosidades de la historia de la informática". Ahora que hemos resuelto un entorno de juegos como CartPole, vamos a dar un paso más para aprender técnicas un poco más avanzadas de aprendizaje. Uno de los métodos de RL más utilizados el llamado Q-Learning, válido siempre y cuando tengamos un número no muy grande de acciones y estados Figura 1. Renderización del juego Taxi de OpenAI Gym . Para resolver juegos más complejos como MsPacman o similares, se utilizan técnicas como DQN, Deep Q-Network, pero para poder comprenderlas mejor, es necesario aprender previamente algunos conceptos de Q-Learning. Sea cual sea la técnica que utilicemos, a partir de ahora comprobaremos que la clave de aprendizaje será el análisis de los estados anteriores. Volviendo a Q-Learning, esta técnica se basa en las llamadas Q-Tables, las cuales almacenan valores llamados Q-Values y las recompensas obtenidas al ejecutar el par estado/acción: Q(s , a ) s = estado a = acción El valor inicial de esta función será cero para todos los estados y acciones. Cuando comienza el proceso de aprendizaje, el agente recibirá una recompensa “ reward” en el estado “ state”. El objetivo final es maximizar en lo posible la recompensa total aprendiendo qué acción es la óptima para cada estado, es decir, la acción con la cual se obtiene mayor recompensa. Vamos a intentar explicarlo paso a paso y luego implementarlo. En el inicio del proceso, estado 0, Q devolverá un valor aleatorio. Este valor irá cambiando a medida que en cada paso ( t) el agente ( a) realice una acción dentro de este periodo ( at), obtenga una recompensa ( r t) y se añada a la fórmula el valor del estado anterior y la acción realizada. Podemos verlo mejor en esta fórmula en la definición de Q-Learning de la WikiPedia: Hay varias formas de implementar este algoritmo que variará fundamentalmente en el tipo de datos que vamos a utilizar, como por ejemplo matrices, listas, etc. Utilizaremos como base la siguiente implementación de esta fórmula (es la más aceptada, como se puede ver también en este enlace), ya que es bastante sencilla de programar en Python: Donde: α es la media de aprendizaje γ cuantifica la importancia que le daremos a las futuras recompensas el cual varía entre 1 y 0. Si el valor es cercano a 1 las futuras recompensas tendrán más peso. MAX[Q(st,at) calcula el valor máximo de Q dentro de todas las posibles acciones que aparecen en el siguiente estado, se resta con los valores del estado actual y se calcula el máximo. Una representación gráfica del proceso estado/acción/recompensa podría ser la siguiente: Figura 2. Esquema simple de funcionamiento de Q-Learning y sus estados La mejor forma de ver cómo funciona este algoritmo es implementándolo. Para probarlo, utilizaremos otro entorno, un poco más complejo que CartPole llamado Taxi (v2). Este entorno consiste en 4 localizaciones, etiquetadas con diferentes letras y colores. Nuestra misión es recoger a un pasajero de nuestro taxi en una ubicación y dejarlo en otra. Cada vez que lo consigamos obtendremos una recompensa de 20 puntos por cada pasajero que logremos llevar a su destino, y -1 por cada paso que damos durante el trayecto. También existe una penalización de -10 puntos si se recoge o se deja a un pasajero de forma ilegal. Vamos primero a analizar el entorno para saber interpretarlo y ver las variables y acciones que podemos realizar. El primer paso será crearlo y ver qué valor nos devuelve al reiniciarlo: import gym import numpy as np env = gym.make("Taxi-v2") observation=env.reset() # Visualizamos el valor devuelto al resetear el entorno print(observation) #Mostrar el estado actual del entorno env.render() Con este código, abrimos el entorno “ Taxi-v2” y lo reinicializamos, guardando el valor de salida en la variable “ observation”. Este valor devuelto está comprendido entre 0 y 499, lo cual representa todos los posibles estados del entorno y en concreto el número devuelto corresponderá con estado inicial. Además, también visualizará el estado actual con el comando env.render(). Ejecutando tres veces el programa anterior (para comparar episodios), obtendremos una salida parecida a la siguiente: Figura 3. Salida renderizada con varios episodios En la visualización del estado podemos ver las siguientes variables: El recuadro amarillo representa al taxi y su ubicación. El taxi se volverá de color verde cuando tenga a un pasajero a bordo. La carretera, o el camino por donde puede circular el taxi, está marcada por los “:” Una barrera (edificio, valla, etc.) está caracterizada por “|” La letra con color azul indicará la ubicación de recogida (el caso 1 será la “G”, en el dos la “R” y el tres la “R” de nuevo. El color magenta indicará la localización de destino (el caso 1 es la “B”, en el dos la “G” y el tercero la letra “B” de nuevo). Para poder ver qué acciones podemos tomar, podemos añadir el siguiente código: acciones=env.action_space print (acciones) Obtendremos el valor 6 de vuelta. Esto quiere decir que tenemos 6 posibles acciones a realizar. Consultando la wiki de OpenAI vemos que estos valores pueden ser: (0) abajo / sur (1) arriba / norte (2) derecha / este (3) izquierda / oeste (4) recoger pasajero (5) dejar pasajero Como ocurre con CartPole y con otros entornos de OpenAI Gym, cada vez que ejecutemos una acción, el entorno nos devolverá una serie de valores con los resultados de nuestra acción en cuatro variables que serán: observation, reward, done e info (podéis ver su significado en la Parte 2 de esta serie aquí). Vamos a comprobar la salida efectuando algunos movimientos aleatorios, por ejemplo, mover arriba el taxi y luego derecha: import gym import numpy as np env = gym.make("Taxi-v2") observation=env.reset() # Visualizamos el valor devuelto al resetear el entorno print(observation) #Mostrar el estado actual del entorno env.render() #Movimientos del taxi action=1 #mover arriba (north) el taxi observation, reward, done, info = env.step(action) print (env.step(action)) env.render() action=2 #mover derecho (east) el taxi observation, reward, done, info = env.step(action) print (env.step(action)) env.render() En esta captura podemos ver la salida con la renderización de los tres estados, el inicial y los otros dos que muestran la evolución del taxi con las variables ( observation, reward, done e info) obtenidas: Figura 4. Renderización del entorno donde se muestran el estado inicial y los movimientos realizados. Ahora que ya tenemos toda la información posible del entorno, vamos a intentar resolverlo utilizando Q-Tables y viendo su evolución paso a paso. Esta sería una posible implementación de una solución utilizado Q-Learning y Q-Tables aplicando la fórmula anterior basándonos en el código de este enlace: import gym import numpy as np env = gym.make("Taxi-v2") #Inicializacion de variables Q=np.zeros([env.observation_space.n, env.action_space.n]) alpha=0.2 def run_episode(observation1, movimiento): observation2, reward, done, info = env.step(movimiento) Q[observation1,movimiento] += alpha * (reward + np.max(Q[observation2]) - Q[observation1,movimiento]) return done,reward, observation2 for episode in range (0,2000): out_done=None reward = 0 rewardstore=0 observation = env.reset() print("Estado inicial:") print(env.render()) # muestra estado inicial while out_done != True: action = np.argmax(Q[observation]) #print(env.render()) # muestra estados intermedios out_done, out_totrwd, out_observation = run_episode(observation,action) rewardstore += out_totrwd observation = out_observation print("Estado final:") print(env.render()) # muestra estado final print('Episodio ',episode,' Recompensa: ',rewardstore) En el siguiente vídeo podemos ver la ejecución del programa y la salida: Se puede observar cómo los valores de salida, la recompensa total, pasa de ser negativa en los primeros episodios a positiva en los finales. Esto quiere decir que las tablas Q se van ajustando con los valores óptimos en cada episodio realizando el mejor trayecto posible para recoger al pasajero y llevarlo al destino. En la segunda parte del vídeo, se activa la renderización para ver gráficamente los estados del episodio inicial y final, y de esa forma comprobar el recorrido realizado (lo veremos en mayor detalle en el siguiente episodio). En el siguiente artículo analizaremos el código fuente paso a paso y veremos internamente cómo funcionan las tablas Q así como la evolución del algoritmo encontrando la solución, no te lo pierdas. Otros episodios de esta serie: Cómo entrenar tu IA jugando videojuegos, Parte 1 Cómo entrenar tu IA jugando videojuegos, Parte 2 Cómo entrenar tu IA jugando videojuegos, Parte 3 No te pierdas ninguno de nuestros post. Suscríbete a LUCA Data Speaks.
2 de noviembre de 2017
AI & Data
Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken?
En este nuevo artículo hablaremos de una película que unifica dos de los temas más de moda hoy día, la Inteligencia Artificial y la Seguridad Informática: “Juegos de Guerra” (WarGames). Figura 1. Cartel original de la película. Fuente Wikipedia. Esta película se estreno en 1983, justo en el comienzo la expansión del ordenador personal a los hogares y marcó a toda una generación. Por aquella época, más o menos 1983-84, el IBM PC ya llevaba dos años en el mercado, pero en los hogares europeos el ordenador que estaba de moda era el ZX Spectrum, con su lenguaje BASIC como estandarte. Muchos adolescentes de aquella época querían emular las aventuras del protagonista con su ordenador personal. ¡Aviso! spoilers a continuación ... La historia tiene como actor principal a un joven norteamericano de clase media llamado David Lightman (interpretada en la película por el genial Mathew Broderick) aficionado a los ordenadores. Tal era su afición, que había llegado a dominar esta nueva tecnología lo que le convertía en un hacker en potencia, llegando incluso a crear un dispositivo sintetizador de voz para su ordenador. Por cierto, ese ordenador era un IMSAI 8080, un poco antiguo para la época (ya había máquinas mucho más potentes como por ejemplo el Apple II, Apple Macintosh o el ya mencionado IBM PC) pero era resultón para el cine debido a su colorido diseño. Era imposible no sentirse identificado (sobre todo los adolescentes geek de la época, como el que escribe este post) con David cuando aparecían escenas de su dormitorio lleno de cables, módems y aparatos electrónicos, sin olvidar también cuando antes de ir al colegio, se pasaba por la sala de recreativos a echar unas partidas al clásico arcade Galaga. Pero David era también un chico rebelde en clase, además de un poco vago (con ambas características también se identificaban muchos jóvenes de la época) así que para evitar tener que estudiar algunas asignaturas, encontró un método para cambiar las notas conectándose remotamente con el servidor de la escuela. La verdad que el método no era nada de otro mundo ya que simplemente utilizaba la contraseña original de acceso porque sabía el lugar exacto donde estaba escrita en un despacho del colegio. Gracias a esta habilidad de cambiar las notas conoce a Jennifer, la chica guapa de la clase y es aquí cuando comienza una relación entre ellos, el sueño de cualquier geek ;) Un día, David recibe en casa una revista de informática en la que se anuncia una serie de videojuegos espectaculares que saldrán al mercado en unos meses. Por supuesto, David no podía esperar tanto así que utiliza su flamante módem (acoplador acústico, más bien y también un poco anticuado para la época) para intentar localizar el número de teléfono que le diera acceso a la empresa que desarrollaba el juego. Para ello tendría que llamar a número aleatorios (miles, ya que sólo tenía el prefijo de la zona) y ver si recibía alguna respuesta de un ordenador a su llamada. Después de algunos días (no quiero ni imaginar la factura de teléfono, aunque David le confiesa a Jennifer “hay formas de no pagar”, y es aquí donde se cierra el círculo mostrándonos también su rama phreaker). Finalmente, aparece una conexión un poco sospechosa, no se identifica y tampoco conseguir acceder pero sí consigue listar una serie de juegos y entre ellos hay uno llamado “El Laberinto de Falken”. Aquí empieza la investigación para poder deducir la contraseña de acceso basándose en su única pista, “Falken”. Resulta que Falken era un experto en Inteligencia Artificial (supuestamente fallecido) y finalmente consigue acceder al sistema utilizando como contraseña el nombre de su hijo (también fallecido): Joshua. Realmente, Joshua es un superordenador militar (encargado del lanzamiento de misiles nucleares intercontinentales) llamado WOPR(War Operation Plan Response) y el acceso que había descubierto David no es más que una puerta trasera (backdoor) de acceso a él. Recordemos que toda esta trama ocurre en plena guerra fría entre EEUU y Rusia con una tensión máxima sobre una posible guerra nuclear. Y claro, a David no se le ocurre otra cosa que elegir el juego “Guerra Termonuclear Global” de la lista de juegos que obtiene una vez accede al sistema. Este superordenador WOPR parece estar programado utilizando las técnicas de IA implementadas por el Dr. Falken que se parecen mucho a las técnicas de Aprendizaje Reforzado o Reiforcement Learning (RL). Básicamente, Joshua estaba programado para jugar continuamente a muchos juegos de estrategia, para ir aprendiendo y optimizando sus jugadas. Desde las damas, pasando por el Ajedrez hasta otra una simulación a escala real de una guerra termonuclear. Digamos que tenía su propio Gym de OpenAI. El RL se basa en determinar las acciones en un entorno (analizándolo) para obtener la recompensa máxima posible (objetivo). Esta técnica también se estudia en otras disciplinas como la Teoría de Juegos, por ejemplo. El famoso AlphaGo de Google utilizaba técnicas de Machine Learning y árboles de decisión además de redes neuronales. Pero básicamente, como Joshua, aprendía jugando una y otra vez hasta dominar el juego. Recordemos que Machine Learning y la IA no son algo nuevo. En 1950 nuestro admirado Alan Turing ya escribió en 1950 su famoso “Computing Machinery and Intelligence”. Por otro lado, en 1952, Arthur Samuel escribió el primer programa de aprendizaje basándose en el juego de las damas. El ordenador IBM sobre el que se ejecutaba el programa, mejoraba en cada partida. Tampoco hay que olvidar que la primera red neuronal fue creada por Frank Rosenblant en 1957. Entonces ¿qué ha pasado para que ahora sólo se hable de Machine Learning e IA?, básicamente sólo una cosa: ahora tenemos la capacidad de cálculo necesaria para poner en prácticas todas esas teorías de hace más de 40 años y a la vez, perfeccionarlas con otras nuevas. Volviendo a la película, antes hemos hablado que David eligió el juego de Guerra Termonuclear Global. Lo que no sabía es que estaba activando una simulación muy real, hasta el punto que incluso los mismos militares no sabían distinguirla. Ellos pensaban que estaban entrando en una guerra real y por lo tanto, estaban preparados para el contraataque (llegando a declarar incluso DEFCON 1). Después de muchas aventuras, David y su compañera Jennifer, por fin llegan al centro de mando del NORAD en compañía del Dr. Falken (que no estaba muerto, había cambiado totalmente de identidad para pasar desapercibido). Dr. Falken intenta convencer a Joshua para que pare el juego, pero este se niega a terminarlo, quiere obtener su recompensa (objetivo final para cualquier agente de IA programado para resolver un problema). Justo en ese momento, Joshua empieza a ejecutar miles de simulaciones desde diferentes puntos de vista. Una vez atacando primero, contraatacando, atacando desde otros países aliados etc. En todas ellas, el resultado es el mismo: no hay recompensa. No existe ganador. Como moraleja final, Joshua aprende la mejor lección para este juego de guerra: el mejor movimiento es no jugar. Quizás este podría ser un método para enseñarle un poco de filosofía o de humanidad a un futuro agente de Inteligencia Artificial. Las recompensas no siempre son positivas o negativas. En definitiva, habría que enseñarles a empatar, a crear un nuevo estado que mostrara a la IA que a veces, incluso perdiendo, se puede ganar a largo plazo. Hasta ahora estamos entrenando a las IA a ganar siempre, a obtener el máximo de recompensa, y tiene lógica ya que eso se traduce en la consecución final de un objetivo. Pero a lo mejor ha llegado el momento de enseñar también a las máquinas a no tener que ganar siempre, que a veces el objetivo se consigue simplemente, no realizando ningún movimiento. Si te gusta la serie "Ciencia Ficción vs Inteligencia Artificial", no te pierdas el siguiente post: Ciencia Ficción vs Inteligencia Artificial: Interestellar, “… hey Tars, ¿cuál es tu parámetro de honestidad?
27 de octubre de 2017
AI & Data
Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 3, resolviendo CartPole con Random Search
Escrito por Fran Ramírez, Investigador en Eleven Paths y escritor del libro "Microhistorias: anecdotas y curiosidades de la historia de la informática". Ahora que ya conocemos perfectamente el entorno en el cual funciona Cartpole, vamos a empezar a utilizar algunas técnicas de IA, en concreto de RL ( Aprendizaje Reforzado , Reinforcement Learning), para que nuestro agente aprenda a resolverlo. Cartpole tiene un espacio de observación de sólo cuatro dimensiones (posición del carro, velocidad del carro, ángulo de la varilla y velocidad de rotación de la varilla) y sólo dos acciones a realizar (mover a la izquierda o a la derecha el carro). Esto hace que sea perfecto como base para probar algunas técnicas de RL y aprender cómo funcionan de la manera más sencilla posible. El primero de los algoritmos que vamos a ver y probar en nuestro entorno tiene una base muy simple. Básicamente se trata de ir probando movimientos aleatorios ( Random Search) y elegir aquellos en los que obtengamos los mejores resultados o recompensas . Para crear el código fuente en Python 3.0, vamos a basarnos en esta solución propuesta con algunos cambios y veremos línea por línea su funcionamiento: import gym from gym import wrappers import numpy as np def run_episode(env, parameters): observation = env.reset() totalreward = 0 for intento in range(200): action = 0 if np.matmul(parameters,observation) < 0 else 1 observation, reward, done, info = env.step(action) totalreward += reward if done: break return totalreward env = gym.make('CartPole-v0') env = wrappers.Monitor(env, 'CartPole1', force=True) bestparams = None parameters = None bestreward = 0 for episodios in range(10000): parameters = np.random.rand(4) * 2 - 1 reward = run_episode(env,parameters) print ("Episodio ",episodios," terminado con recompensa: ",reward) if reward > bestreward: bestreward = reward bestparams = parameters if reward == 200: break El primer paso será definir las librerías que vamos a utilizar. Por supuesto “ gym” es la primera y desde esta librería importamos también “ wrappers”, la cual nos permitirá monitorizar la ejecución de nuestro entorno y generar vídeos con los resultados. Por último, también importamos la librería matemática numpy (y le asignamos el alias np) para poder ejecutar operaciones matemáticas con matrices que veremos más adelante: import gym from gym import wrappers import numpy as np Antes de explicar el funcionamiento de la función run_episode vamos a analizar el cuerpo principal del programa. Como ya hicimos anteriormente, el primer paso será crear el entorno “ CartPole-v0” asignándolo a la variable “ env”. Para poder monitorizar, grabar vídeos de la salida y ver por la pantalla la evolución del agente activamos también la opción “ wrappers”, pasando como parámetros el entorno ( env), el nombre de la carpeta donde se almacenará la información de salida (vídeos, ficheros json, etc) y la variable " force" a " true": env = gym.make('CartPole-v0') env = wrappers.Monitor(env, 'CartPole1', force=True) Ahora inicializamos las variables que vamos a utilizar. La variable “ bestparam” y “ parameters” (matrices, las inicializamos ambas como vacías) almacenaremos los mejores valores obtenidos durante el aprendizaje aleatorio y las mejores recompensas en la variable " bestreward". bestparams = None parameters = None bestreward = 0 La siguiente parte del código está englobada en un bucle de 10000 episodios, que son los que OpenAI propone para resolver este entorno, aunque ahora veremos que debido a la sencillez del entorno no será necesario ejecutarlos todos: for episodios in range(10000): La siguiente línea de código genera con cuatro valores aleatorios entre -1 y 1 que corresponderán a cada una de las observaciones que hemos mencionado al principio de artículo. Una posible salida con datos para este vector podría ser: [ 0.07956037 -0.70373308 0.81568326 -0.11323522] que serán los valores que posteriormente pasaremos al entorno: parameters = np.random.rand(4) * 2 - 1 El siguiente paso será ejecutar el episodio pasando como parámetros en entorno que hemos creado ( env) y los parámetros generados en " parameters". Esta llamada devolverá la recompensa ( reward) obtenida y la mostraremos en pantalla con el comando print: reward = run_episode(env,parameters) print ("Episodio ",episodios," terminado con recompensa: ",reward) Ahora iremos guardando las mejores recompensas a medida que ejecutamos un episodio, almacenando los mejores valores de recompensa ( bestreward) así como los parámetros que se han utilizado ( bestparams): if reward > bestreward: bestreward = reward bestparams = parameters Si la recompensa obtenida en la ejecución de uno de los episodios es 200, entonces paramos la ejecución del bucle: if reward == 200: break En este punto vamos a analizar la función run_episode antes de acabar el código del programa principal. La función tiene como entrada dos parámetros, el entorno ( env) y los parámetros de entrada ( parameters): def run_episode(env, parameters): La variable " totalreward" almacenará la recompensa obtenida en la ejecución de un episodio y será devuelta por la función como un valor entero. La inicializamos primero: totalreward = 0 Se inicializa el entorno de observación: observation = env.reset() En este punto ejecutaremos las 200 acciones como máximo para ver si conseguimos la recompensa máxima (200): for intento in range(200): En la siguiente línea de código vamos a definir qué hacer o que acción ( action) tomar basándonos en nuestros parámetros y las observaciones del entorno. Vamos a explicar más en detalle cómo funciona esta toma de decisión para la acción a realizar. Cada valor de los parámetros introducidos ( parameters) se multiplica por cada una de sus respectivas observaciones ( np.matmul). Este es un ejemplo de dos ejecuciones con sus respectivos datos: parameters: [ 0.10688612 0.23223451 -0.39875783 0.88085558] observation: [ 0.03322276 0.04032782 0.03142452 0.04958755] mutiplicación: 0.0440652550416 action: 1 Resultado: movimiento a la derecha parameters: [ 0.10688612 0.23223451 -0.39875783 0.88085558] observation: [ 0.03402932 0.2349854 0.03241627 -0.23301739] mutiplicacion: -0.159971929661 action: 0 Resultado: movimiento a la izquierda action = 0 if np.matmul(parameters,observation) < 0 else 1 Ahora enviaremos la acción tomada al entorno para que la ejecute con el comando env.step(action) y nos devuelva nuevos valores de la observación ( observation), la recompensa( reward), si ha terminado la simulación ( done) y otros datos ( info): observation, reward, done, info = env.step(action) Acumulamos las recompensas obtenidas en la variable " totalreward": totalreward += reward Finalmente, si por cualquier circunstancia la simulación termina, paramos la ejecución del bucle de acciones y devolvemos la recompensa obtenida: if done: break return totalreward Todos estos pasos se ejecutarán cada vez que el programa principal procese un episodio el cual llama a la función run_episode. Volviendo al cuerpo principal del programa, los últimos pasos ejecutan varios escenarios utilizando los mejores valores obtenidos del entrenamiento: input ("Pulsa Enter para probar el resultado del aprendizaje") for b in range(5000): run_episode(env,bestparams) input ("Terminado") Los videos que se irán mostrando en pantalla durante la primera fase de aprendizaje no corresponden todas las ejecuciones, sólo pertenecen a algunas. Vamos a ver un vídeo completo con una ejecución de aprendizaje y luego de puesta en práctica de la solución. Veremos cómo los episodios de aprendizaje terminan cuando se obtiene el valor de recompensa 200, en este caso ocurre en el episodio 5 como podemos ver en el siguiente fotograma del vídeo: A partir de este punto se ejecutan varias simulaciones con los resultados obtenidos durante el entrenamiento: Esta es una técnica muy sencilla y es perfecta para probar nuestra primera solución de aprendizaje y ver los resultados, pero además ofrece unos buenos resultados en este entorno del CartPole. De hecho, si ejecutamos varias veces el entrenamiento, veremos que la media de episodios para conseguir la recompensa de 200 y de esa forma finalizar el aprendizaje no son más 13 episodios. No os perdáis el siguiente artículo, vamos a empezar con técnicas y juegos más complejos. No te olvides de consultar los otros posts que hemos publicado de esta serie: Cómo entrenar tu IA jugando videojuegos, Parte 1 Cómo entrenar tu IA jugando videojuegos, Parte 2 No te pierdas ninguno de nuestros post. Suscríbete a LUCA Data Speaks.
3 de octubre de 2017
AI & Data
Ciencia Ficción vs Inteligencia Artificial: Saturno 3, "Héctor, robot malo, el perro no se come"
El gran Elon Musk ha fundado otra compañía (una más) llamada Neuralink. Esta nueva empresa, que aún está en una fase muy temprana de creación, se centrará en fabricar dispositivos que puedan ser implantados en un cerebro humano y de esa forma, poder combinar las ventajas de una IA con el poder de un cerebro. En principio, el objetivo es ayudar a los seres humanos a mejorar por ejemplo, la memoria o incluso crear nuevos dispositivos de comunicación hombre-máquina. Pero en una conferencia en Dubai, Elon Musk nos dejó entrever otro posible uso un poco más siniestro de esta técnica "...con el tiempo creo que probablemente veremos una fusión más estrecha entre la inteligencia biológica y la inteligencia digital". Esta posible fusión entre un cerebro digital y uno biológico puede ser un gran salto evolutivo para el ser humano, pero también se abren muchas incógnitas. Y como la Ciencia Ficción tiene siempre respuestas para todo, existe una película que juega con este concepto de utilizar un cerebro humano junto a uno digital y mezclarlos en un cóctel, digamos, "inestable". La película a la cual nos referimos se llama Saturno 3, de 1979 y dirigida por Stanley Donen la cual, todo hay que decirlo, no obtuvo mucho éxito en su época. [Spoiler Alert!] La historia transcurre en una fábrica de alimentos ubicada en la luna de Saturno, Tetis (la tercera, de ahí el título) cuyo objetivo es intentar salvar a una Tierra superpoblada y con problemas de alimentación. Los protagonistas del film son un ya entrado en años Kirk Douglas y una jovencita Farrah Fawcett. Alex (Farrah Fawcett), lleva toda su vida en el espacio, no conoce la Tierra y mantiene una estrecha relación más allá de lo profesional con Adam (Kirk Douglas). Todo parece funcionar al más estilo Adan y Eva en un paraíso tecnológico junto a su pequeña perra Sally, hasta que la Tierra decide enviar al capitán James para reemplazar, al menos, a uno de los dos científicos residentes en la estación por un robot inteligente. Hasta este punto todo parece normal dentro de un proceso rutinario de sustitución de personal humano por robots (otro tema de moda hoy día). Pero hay que tener en cuenta un pequeño detalle, James es realmente Benson (Harvey Keitel) , un frío sociópata asesino que no había pasado los test psicológicos para obtener el puesto de James, y por lo tanto lo asesina (al principio de la película) tomando así su lugar en la misión. https://www.youtube.com/watch?v=vVIsW5MQUNI Héctor es un robot de casi 3 metros de altura de una nueva serie llamada "semidiós" (demigod), el cual tiene un cuerpo artificial musculoso de metal coronado por una extraña pequeña cabeza (básicamente dos cámaras que hacen la función de ojos) en proporción a su cuerpo, dándole un aspecto realmente siniestro. El cerebro de Héctor está divido en dos partes, por un lado tiene su IA digital como base y por otro lado un cerebro humano "virgen" preparado para aprender y desarrollarse junto a la IA. El proceso de aprendizaje y programación de Héctor es una tarea muy compleja, reservado sólo a los mejores programadores. Pero claro, Benson y su perfil asesino no es precisamente el más adecuado para programar a Héctor, y esta será la causa de la tragedia que más tarde ocurrirá en la estación. Al principio todo parece ir según lo planeado. Héctor comienza a aprender las tareas básicas asignadas por Benson, el programador impostor, enfocados al mantenimiento de la estación. Hay una escena en la cual Héctor juega una partida de ajedrez con Adam y este le gana sin problemas, dejando entrever que Héctor aún está en una fase temprana de aprendizaje (aunque no se toma nada bien perder). Este necesita ir aprendiendo poco a poco desarrollando su IA que a la vez se irá fusionando con el cerebro humano que este tiene almacenado en su interior. Benson se conecta regularmente utilizando un interface en su nuca a Héctor y le transfiere de paso, además de su inteligencia, toda su psique asesina, incluyendo una obsesión por la joven Alex. Antes hemos mencionado a Sally, el perro que habita en la estación junto a los protagonistas. Nada más llegar Benson, al ver a Sally, este pregunta porqué lo están cuidando y que esperan para comérselo. Al parecer, la escasez de comida en la Tierra ha provocado que hasta los perros sean un producto alimenticio más. La pobre Sally será la primera víctima del recién programado Héctor. En la transferencia de información entre Benson y Héctor, también se están transmitiendo todos los pensamientos más sórdidos y oscuros que habitan en su cerebro. Es por eso que Héctor mata a Sally, pensando que ha hecho lo correcto (era básicamente comida para él), ya que es justamente lo que había en la mente de Benson, y dejando así claro los acontecimientos que vendrán a continuación. Sally Hay una curiosa conversación entre Héctor y Benson, que quizás sea la mejor parte de la película. Benson le pregunta a Héctor por qué no utiliza su capacidad para hablar. Héctor , utilizando un teclado, le responde fríamente, sin protocolos, que no está preparado. Y de repente, sin aviso previo, le dice a Benson que él es un asesino. Es justo este momento cuando Héctor se revela para hacerle ver que se está dando cuenta de todo lo que está pasando. La IA que está funcionando dentro del robot ve como poco a poco, toda la psique psicópata de Benson está tomando el control de su mente digital. Benson le responde a Héctor que no es cierto, que está funcionando mal y lo borre de su memoria. Benson, al cabo de unos segundos, intenta confirmar que Héctor ha borrado de su memoria los recuerdos asesinos traspasados, eso sí, sin querer, por Benson. Este le pregunta varias veces si lo ha borrado de su memoria, pero Héctor no escribe nada en el terminal. Finalmente, después de una pausa, responde "Yo no estoy funcionando mal. Tú sí". Es en ese momento cuando Benson comienza un borrado total de la memoria de Héctor, pero lo que finalmente consigue es que Héctor se parezca aún más a él, borrando de golpe las Tres Leyes de la Robótica de Asimov, si es que estas hubieran existido alguna vez dentro de su programación. Hay una curiosa conversación entre Héctor y Benson, que quizás sea la mejor parte de la película. Benson le pregunta a Héctor por qué no utiliza su capacidad para hablar. Héctor , utilizando un teclado, le responde fríamente, sin protocolos, que no está preparado. Y de repente, sin aviso previo, le dice a Benson que él es un asesino. Es justo este momento cuando Héctor se revela para hacerle ver que se está dando cuenta de todo lo que está pasando. La IA que está funcionando dentro del robot ve como poco a poco, toda la psique psicópata de Benson está tomando el control de su mente digital. Benson le responde a Héctor que no es cierto, que está funcionando mal y lo borre de su memoria. Benson, al cabo de unos segundos, intenta confirmar que Héctor ha borrado de su memoria los recuerdos asesinos traspasados, eso sí, sin querer, por Benson. Este le pregunta varias veces si lo ha borrado de su memoria, pero Héctor no escribe nada en el terminal. Finalmente, después de una pausa, responde "Yo no estoy funcionando mal. Tú sí". Es en ese momento cuando Benson comienza un borrado total de la memoria de Héctor, pero lo que finalmente consigue es que Héctor se parezca aún más a él, borrando de golpe las Tres Leyes de la Robótica de Asimov, si es que estas hubieran existido alguna vez dentro de su programación. Contestación de Héctor a Benson sobre su mal funcionamiento. Fuente. El resto de la película ya no es relevante para el tema que estamos tratando en este post, así que tendrás que verla para saber qué ocurre al final (un consejo, si vas a verla, intenta hacerlo en versión original o escucharás cómo en la versión doblada a castellano llaman a Héctor "un robot semidios" en vez de "un robot de la serie semidios"). Es la parte de programación, utilizando una mitad IA y una mitad cerebro humano la que nos interesa. El interface conectado en la nuca de Benson bien podría un dispositivo Neuralink del futuro. La idea de Elon Musk es simplemente magnífica y va a revolucionar a la Humanidad hasta el punto de poder dar un salto evolutivo hacia una nueva especie. Lograr una forma de establecer una comunicación entre los ordenadores y el cerebro humano tendrá como consecuencia grandes avances médicos como poder curar a personas que sufren algún tipo de problemas de movilidad o incluso con cualquiera de los cinco sentidos. Al poder conectar directamente el cerebro con dispositivos electrónicos sería posible, por ejemplo, que una persona ciega pudiera ver a través de una cámara digital o que una persona sin movilidad pudiera volver a andar al conectarse directamente con un exo-esqueleto (ya se están realizando algunos avances como los implantes cocleares por ejemplo). Musk incluso se ha atrevido a afirmar que esto ocurrirá en los próximos diez años. Una vez conseguida esta primera fase (y estamos seguro que Elon Musk lo conseguirá, a pesar del escepticismo creado alrededor del proyecto) es inevitable pensar en una segunda, la cual indudablemente implicará descargar un cerebro humano a un ordenador o a un robot. Este volcado podría incluir sentimientos, recuerdos, conocimientos, etc con lo cual estaremos más cerca de una posible inmortalidad en una fusión Hombre-IA-Máquina. Una vez que tengamos la forma de descargar completamente un cerebro humano, quizás será también la hora de desarrollar algún tipo de cortafuegos que pueda evitar la transferencia de cierto tipos de sentimientos o pensamientos no deseados y no ocurra algo como el trágico final de Héctor. De hecho, en una entrevista Elon afirma que su empresa Neuralink será la solución perfecta al miedo que se está gestando alrededor de una posible revolución de las IA. No sé, creo que Elon no ha visto Saturno 3... Si te ha gustado este artículo no te olvides de repasar otros de esta serie Ciencia Ficción vs Inteligencia Artificial: Ciencia Ficción vs Inteligencia Artificial: Star Wars, “…para ser un droide mecánico parece que piensas demasiado…” Ciencia Ficción vs Inteligencia Artificial: HAL 9000 “Doctor, no entiendo a los humanos” Ciencia Ficción vs Inteligencia Artificial: Saturno 3, “Héctor, robot malo, el perro no se come” Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken? Ciencia Ficción vs Inteligencia Artificial: Interestellar, “… hey Tars, ¿cuál es tu parámetro de honestidad? Para mantenerte al día con LUCA visita nuestra página web, y no olvides seguirnos en Twitter, LinkedIn y YouTube.
20 de julio de 2017
AI & Data
Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 2, observando el entorno
Escrito por Fran Ramírez, Investigador en Eleven Paths y escritor del libro "Microhistorias: anecdotas y curiosidades de la historia de la informática". Ahora que ya tenemos preparada nuestra rejilla de juegos, vamos a ver de una forma sencilla cómo funciona el proceso de aprendizaje del algunas IA observando el entorno que les rodea. Nuestro objetivo no es entrar en profundidad en los aspectos teóricos, sino intentar aprender de la forma más práctica posible con ejemplos. Figura 1: Fotograma de la película Tron El área de Machine Learning que se utiliza en OpenAI para entrenar los agentes a jugar videojuegos es la llamada Reinforcement Learning (RL) o Aprendizaje Reforzado. Otras áreas dentro de Machine Learning son también el Aprendizaje Supervisado ( Supervised ) y Aprendizaje no Supervisado ( Unsupervised ), los cuales trataremos más adelante con otros ejemplos. RL es capaz de dotar a los agentes de algoritmos que le permitan examinar y aprender del entorno en el cual se están ejecutando para conseguir un objetivo a cambio de recompensas (luego lo veremos con más detalle, pero básicamente es un indicador que informa al agente si se han tomado correctamente las decisiones). Estos algoritmos no tienen un objetivo concreto, simplemente ayudan al agente a aprender con pruebas de ensayo y error como obtener la mayor recompensa posible. Estos son algunos conceptos que debemos conocer en RL: Estado (state): describe la situación actual del entorno. Por ejemplo, en el juego Breakout de Atari, un posible estado sería la situación de la raqueta, la posición de la bola, su trayectoria, etc. Política (policy): reglas que utiliza un agente en base a las entradas de un estado para llegar a obtener una recompensa. Dicho de otra forma, las reglas que utiliza para ejecutar una acción y se suele representar por un mapa de estados. Acción (action): son los pasos que realiza el agente basándose en las entradas definidas por el estado y las políticas. En el caso de Breakout una acción podría ser moverse a izquierda o derecha después de analizar la posición y trayectoria de la bola en la pantalla. Recompensa (reward): se obtiene una vez se ha ejecutado una acción. Esta recompensa puede ser positiva (recompensa) o negativa (castigo). Para conseguir los mejores resultados durante el proceso de aprendizaje, es muy importante obtener toda la información posible del entorno que vamos a intentar resolver. De esa forma sabremos qué consecuencias han tenido nuestras acciones y así poder avanzar en su resolución. En OpenAI existe una función llamada step (la veremos más adelante) la cual devuelve cuatro variables relacionadas con datos obtenidos del entorno: observation (tipo “objeto”): es un elemento representado en el entorno que estamos analizando. Por ejemplo, puede ser el tablero de un juego de mesa o la velocidad y ángulo de la bola del juego BreakOut. reward (tipo “float”): indicará el valor (la escala de este valor depende del entorno) de la recompensa obtenida en la acción previa que hemos realizado. done (tipo “boolean”): cuando una tarea del proceso de aprendizaje a terminado (también llamados “episodios”) esta variable toma el valor “True”. Una vez llegado a este punto el entorno se reinicializará. info (tipo “info”): información para depuración. Antes de seguir avanzando y crear nuestra primera IA en Python, es muy importante interpretar los valores que nos devuelven los escenarios. Para nuestra primera prueba vamos a elegir un entorno llamado CartPole, el cual tiene unas acciones y reglas muy sencillas. Básicamente, el juego trata de mantener el mayor tiempo posible en equilibrio una varilla que está sujeta a una caja la cual podemos mover de izquierda a derecha. Estos son los datos de observación y acción del entorno CartPole según la Wiki de OpenAI: El episodio termina si la la varilla en equilibrio supera los 20.9 grados desde la vertical y a la vez no nos salgamos de la pantalla (tanto a la izquierda como a la derecha) a una distancia de 2,4 unidades desde el centro. También acabará si la duración del episodio supera los 200 intentos. En el siguiente video podemos ver un ejemplo de ejecución de este entorno: El control sobre la caja para conseguir el equilibrio y mantener la varilla lo más recta posible, se realiza aplicando una fuerza con valor 0 para empujar el carro a la izquierda o 1 para empujarlo a la derecha. Por cada paso que damos y la vara se mantenga en equilibrio, obtenemos una recompensa de +1. Por este motivo podréis ver más adelante que la recompensa es igual que el número de intentos que hemos ejecutado durante el episodio. Finalmente, este escenario se considera resuelto si la media de recompensas en cada intento es mayor o igual a 195.0 ejecutando 100 intentos como máximo. Es muy importante tener claro qué variables y valores obtenemos del entorno por cada paso que ejecutamos. El siguiente programa de ejemplo prepara un entorno de CartPole y ejecutará varias acciones aleatorias. Esto generará valores de observación que podremos ir viendo por la pantalla: import gym env = gym.make('CartPole-v0') for i_episode in range(20): observation = env.reset() recompensa=0 for t in range(200): env.render() print(observation) action = env.action_space.sample() observation, reward, done, info = env.step(action) recompensa=recompensa+reward if done: print ("Paso final que provoca el fin del episodio:") print(observation) print("Episodio ",i_episode,"terminado en {} intentos".format(t+1)) recompensa=recompensa+reward print ("Recompensa obtenida: ",recompensa) break input ("Fin del episodio, pulsa Enter para continuar") El programa ejecuta 20 episodios, dentro de los cuales realizará un máximo de 200 intentos hasta que termine. En la siguiente imagen tenemos una captura de una ejecución terminada en el episodio 6 que ha finalizado después de 17 intentos obteniendo una recompensa de 18 puntos (el paso final que provoca la parada de la ejecución también puntúa): A continuación mostramos el último bloque de valores obtenidos al final del episodio el cual ha provocado su finalización: Como podemos observar, el tercer valor corresponde al “ Ángulo de la varilla” y es igual a 0.2259945 (22.5 grados) siendo mayor de los 20.9 marcados como máximo provocando la finalización del episodio. Vamos a analizar el código fuente línea por línea para entender su ejecución: import gym Cargamos la librería gym necesaria para ejecutar los entornos de aprendizaje env = gym.make('CartPole-v0') Definimos una variable tipo objeto llamada “env” asignándole los valores que corresponden al entorno CartPole-v0 for i_episode in range(20): Aquí empieza el bucle que define el número de episodios que vamos a ejecutar. En este caso serán 20 contando de 0 a 19. observation = env.reset() Reseteamos todos los valores del entorno actualizando la variable observation recompensa = 0 En esta variable vamos a ir acumulando la recompensa obtenida, se reiniciará a 0 en cada episodio for t in range(200): Comienza el bucle que ejecuta los 200 intentos env.render() Este comando muestra en pantalla en cada ejecución un fotograma donde podemos ver los resultados de nuestras operaciones print(observation) Muestra en pantalla los cuatro valores de la variable observation que hemos comentado anteriormente. En la primera ejecución los valores serán por defecto los de un reset del entorno y en los siguientes paso mostrará en pantalla los valores actualizados según las acciones realizadas action = env.action_space.sample() Esta parte del código es importante ya que es donde definimos las acciones a tomar. En este caso, sólo queremos hacer movimientos de prueba, para ello utilizamos la función .sample la cual devolverá de forma aleatoria valores 0 o 1 que implican aplicar una unidad de fuerza a la izquierda o a la derecha del carro. Más adelante veremos cómo obtener la información sobre las acciones que podemos tomar desde cualquier entorno. observation, reward, done, info = env.step(action) Este comando devuelve los valores actualizados de las variables observation, reward, done e info que obtenemos durante la ejecución de un paso con las acciones que hemos definido env.step(action) recompensa = recompensa + reward 96 Normal 0 false false false EN-US X-NONE X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin:0in; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:Consolas; color:black; mso-themecolor:text1; mso-bidi-font-weight:bold;} Acumulamos en la variable recompensa el valor devuelto por la variable reward if done: print ("Paso final que provoca el fin del episodio:") print(observation) print("Episodio ",i_episode,"terminado en {} intentos".format(t+1)) recompensa=recompensa+reward print ("Recompensa obtenida: ",recompensa) break Si la variable done es verdadera, el episodio ha terminado. El motivo de finalización en nuestro caso siempre será haber sobrepasado los 20.9 grados de inclinación (es muy improbable que el carro salga de los límites establecidos). Una vez ha terminado el episodio, enviamos por pantalla el paso final que ha provocado la parada el episodio, los valores de las observaciones, los intentos y la recompensa obtenida. input ("Fin del episodio, pulsa Enter para continuar") Hacemos una pausa al final del episodio para poder observar los valores devueltos Vamos a ver un vídeo con la ejecución de este código: Podríamos añadir una pequeña modificación para poder observar paso a paso los valores utilizados en la acción (empujar a izquierda o derecha el carro): import gym env = gym.make('CartPole-v0') for i_episode in range(20): observation = env.reset() recompensa=0 for t in range(200): env.render() print(observation) action = env.action_space.sample() if action==0: print ("Valor ",action," empuja izquierda (mueve derecha)") else: print ("Valor ",action," empuja derecha (mueve izquierda)") observation, reward, done, info = env.step(action) recompensa=recompensa+reward input ("Fin del intento, pulsa Enter para continuar") if done: print ("Paso final que provoca el fin del episodio:") print(observation) print("Episodio ",i_episode,"terminado en {} intentos".format(t+1)) recompensa=recompensa+reward print ("Recompensa obtenida: ",recompensa) break input ("Fin del episodio, pulsa Enter para continuar") Finalmente, si queremos que se ejecute toda la operación sin pausas sólo tenemos que quitar las líneas que contengan input: Ahora que ya sabemos cómo observar nuestro entorno de juego, en el siguiente capítulo comenzaremos a aplicar las primeras técnicas de RL para intentar resolver CartPole e incluso, si tenemos buen feedback de esta serie, llegar a enseñar a alguna IA a jugar a DOOM!. Por si acaso te perdiste la primera parte de esta serie, aquí tienes el enlace: Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos , Parte 1, preparando la "rejilla de juegos". Para cualquier duda, idea o comentario puedes acceder también a la comunidad de ElevenPaths donde tenemos un apartado para LUCA.
6 de julio de 2017
Ciberseguridad
Las mayores fugas de datos de la historia reciente
La fuga de información o data breaches que han sufrido diferentes empresas y organizaciones, tanto si ocurren desde dentro (los llamados inside jobs) o desde fuera (ejecutada por atacantes externos), ha ido creciendo en número con el paso del tiempo. Estos ataques suelen tener como objetivo agencias del gobierno, páginas sociales, páginas de citas, venta online, bancos y sitios que gestionan temas relacionados con la salud. La información tiende a estar almacenada cada vez más en servicios online tipo nube con los riesgos que esto conlleva. El riesgo de fuga de datos aumenta cada día ya que cada vez más aparecen vulnerabilidades y técnicas de ataque que permiten explotar fallos que pueden suponer un acceso no autorizado a la información almacenada en sus servidores. Los tipos de ataques externos son los más comunes y estos ocurren principalmente cuando un atacante se infiltra y extrae información sensible de una organización o empresa que se ha marcado como objetivo. Puede ser un ataque con acceso físico (accediendo directamente a los ordenadores dentro de la organización o desde una red interna) o con acceso externo, saltándose las protecciones de seguridad de la red de la empresa. Estos ataques suelen estar compuestos de varias fases: Investigación: se buscan fallos y vulnerabilidades, por ejemplo, en las plataformas que alojan la infraestructura de la empresa u organización. Se pueden buscar fallos en las personas, sistemas o redes. Ataque: se realiza desde la red o desde un ataque tipo ingeniería social Ataque de Red: el atacante utiliza fallos de seguridad (por ejemplo, un 0Day) o herramientas de seguridad para atacar la infraestructura de la empresa, sistemas, aplicaciones o redes para encontrar una vulnerabilidad y acceder. Ataque Ingeniería Social: un empleado puede ser engañado para conseguir sus credenciales o para convencerle a abrir un fichero malicioso enviado a su ordenador o cualquier otro dispositivo móvil. Exfiltración: una vez dentro de la organización o de la empresa, el atacante puede abrirse paso dentro de la misma hasta encontrar una fuente de información. Puede utilizar internamente también los tipos de ataques antes descritos. Antes del año 2009, la mayoría de las fugas de datos fueron causadas por errores o actuaciones de personas internas a la organización. Por ejemplo, pérdida de dispositivos con información (disco duro, pendrives, portátiles, etc) o robo intencionado desde el interior de la empresa (los antes mencionados inside jobs). Con el auge de los negocios por Internet, es a partir de este año 2009 cuando comienzan a aparecer otros tipos de ataques más relacionados con la explotación de vulnerabilidades o técnicas de cracking. En este gráfico, en su versión interactiva que puedes ver aquí, podemos filtrar según el tipo de organización y el tipo de ataque: Impresionan algunos números como por ejemplo la fuga de información de la empresa River City Media con 1.370 millones de registros perdidos, el caso de LinkedIn donde se filtró una base de datos con 167 millones de presuntas credenciales o los famosos 1.000 millones de Yahoo!. De todas formas, tenemos que tener en cuenta no sólo el número de registros perdidos sino la sensibilidad de los mismos. Los datos de robados en Yahoo! o de otras plataformas como Weebly, son mucho más sensibles que los perdidos en River City Media. En el caso de River City Media, la información comprometida era básicamente correos electrónicos y en cambio en Yahoo! y Weebly los datos robados contenían información mucho más sensible como cuentas bancarias, direcciones, números de teléfono, etc. Pero, ¿cuál es el valor de esta información? Basándonos en el tipo de dato robado, la información puede tener un valor diferente dentro del mercado negro en el Deep Web. Estos datos pueden tener como destino final por ejemplo duplicar tarjetas de crédito, usurpación de identidad e incluso chantaje. Es bastante habitual que esta información contenga información como nombre, apellidos, fecha de nacimiento, número de la seguridad social (sobre todo en EEUU) o DNI, email, número de teléfono, cuentas bancarias, etc. Por ejemplo, una cuenta de Gmail puede costar entre 0,7$ hasta 1,2$, una de Amazon puede llegar a los 6$, Netflix 1$, datos de usuarios de páginas de adultos suele costar 1$, sitios de citas entre 4 y 10$ por cuenta, etc. Un único usuario no suele ser el objetivo de los cibercriminales que están robando este tipo de información (excepto en casos de personas muy influyentes o con mucho peso dentro de la organización, a los cuales se les realiza un tipo de ataque especial llamado Spear Phishing). En cambio, es muy probable que le afecte indirectamente esta fuga de datos, así que es recomendable cambiar la contraseña de todos los servicios que hayan podido ser afectados. También podemos acudir a páginas web que permiten comprobar si nuestro correo o nuestro nombre de usuario ha sido comprometido en algún servicio como haveibeenpwned.com y breachalarm.com. ¿Cómo podemos evitar la fuga de datos? Un factor clave es analizar y eliminar la información que ofrecen al exterior nuestros metadatos. Hay muchas empresas que se toman en serio este problema y existen herramientas como Metashield Protector que ayudan a filtrar y controlar la información contenido por ejemplo en gestores documentales. Si tienes alguna consulta relacionada con metadatos y como tratarlos.
5 de julio de 2017
AI & Data
Ciencia Ficción vs Inteligencia Artificial: HAL 9000 "Doctor, no entiendo a los humanos"
Cada vez que un vehículo autónomo sale a la carretera está recibiendo una gran cantidad de información procedente del mundo exterior a través de sus múltiples sensores (cámaras, proximidad, etc). Esta información es procesada en fracciones de segundo y con ella, debe de tomar todo tipo de decisiones. Pero, ¿qué ocurre si es necesario tomar una decisión que implique un dilema moral? Por ejemplo, si de repente un peatón aparece en mitad de la carretera y la maniobra para esquivarlo (o no hacerlo) puede acabar en la muerte del peatón, del conductor, de otros viandantes o incluso en la destrucción del propio vehículo ¿cuál es la decisión acertada? Estas situaciones de contradicción moral, la forma de afrontarlas y sus posibles consecuencias se trataron de forma magistral en un clásico de la Ciencia Ficción: “2001: Una Odisea del Espacio” (1968), avanzándonos estas situaciones y dilemas de un futuro que ahora parece cada vez más cerca. En la película, la IA, llamada HAL9000, está a cargo de todos los controles a bordo de la nave espacial Discovery en su viaje de la Tierra hasta Júpiter. Antes del comienzo de la misión, HAL recibió una serie de órdenes importantes que tendría que ejecutar. Entre ellas, había una muy especial, secreta y de máxima prioridad. Esta orden impedía a HAL contar a la tripulación la verdadera naturaleza de la misión (estudiar el monolito en la órbita de Júpiter). En definitiva, se le ordenó mentir. Dicho de otra forma, HAL entró en un estado desconocido y paranoico al no saber cómo afrontar esta situación de indecisión y contradicción. “¿Qué hago si me preguntan los humanos por el verdadero objetivo de la misión?, ¿Cuáles son las prioridades, las misión o la vida de los tripulantes? Estas son sólo algunas de las preguntas que HAL tuvo que procesar en su cerebro lógico algorítmico heurísticamente programado (significado de las siglas HAL). Finalmente, esta serie de ordenes acabaron en un mal funcionamiento de HAL que termina de forma catastrófica aniquilando a prácticamente toda la tripulación de la nave espacial Discovery. En la secuela “2010: Odisea Dos“, una nave espacia soviético-americana llamada Leonov, llega a Júpiter para intentar averiguar qué le ocurrió a la nave espacial Discovery y encontrar el motivo del mal funcionamiento de HAL 9000. Entre los tripulantes que viajaban en la Leonov, se encontraba el Dr. Chandra, posiblemente el personaje más interesante de la película que además es el padre en la ficción de la serie de ordenadores HAL 9000. Antes del viaje a Júpiter, el Dr. Chandra intenta averiguar en la Tierra el motivo del mal funcionamiento de HAL utilizando su gemelo SAL (mismo modelo, pero en versión femenina). En una de las escenas más emotivas para todos los fans de la Ciencia Ficción, Chandra le explica a SAL si está dispuesta a ayudarle en averiguar qué le ocurrió a HAL. SAL acepta sin problemas, a pesar del aviso sobre las posibles consecuencias negativas de la desconexión de sus circuitos lógicos. Este aviso es muy importante, ya que Chandra opta por no ocultarle información a SAL y prefiere advertirle del riesgo de la operación. En definitiva, no le miente como pasó con HAL. Posteriormente, ocurriría algo similar al final de la película con HAL donde Chandra le advierte que es muy probable que la nave Discovery se destruya si finalmente ejecuta la orden que acababa de darle (podéis ver el video al final del post). Según los libros de Arthur C. Clark, Dr.Chandra es un científico, pero no he visto ninguna referencia que especifique a qué disciplina de la ciencia se dedicaba. Puede parecer obvio fuera físico o informático, pero yo prefiero pensar en el Dr. Chandra más un psicólogo que en un ingeniero (o posiblemente ambos). Durante las dos películas, Chandra no utiliza la programación para intentar saber qué ha ocurrido con HAL (aunque se hace un guiño al programa SHRDLU del MIT en algunas secuencias). Simplemente se dedica a hablar de forma coloquial a ambas IA utilizando palabras y los gestos (HAL Y SAL tienen cámaras para el reconocimiento del entorno) como cualquier iteración entre un psicólogo y sus pacientes. Esto que nos parece Ciencia Ficción, posiblemente será la forma de interactuar con las IA dentro de unos años, tanto para los usuarios que la utilizan día a día para tareas rutinarias (esto ya está ocurriendo con sistemas como Siri por ejemplo) como para los técnicos especializados en repararlas o encontrar fallos en su programación. Pasaremos de programar máquinas utilizando matemáticas a programarlas hablando con ellas directamente intentando hacerlas razonar para que ellas mismas se reprogramen internamente. Hoy día estamos desarrollando inteligencias artificiales a las cuales estamos enseñando a tomar decisiones cada vez más complejas que tienen incluso un impacto directo en nuestra sociedad. El objetivo final de esta nueva ciencia es dejar que la IA decida y aprenda por sí misma a la hora de tomar alguna de estas decisiones. Pero esto nos conduce hacia un terreno desconocido, ya que realmente corremos el peligro de llegar a un punto donde no sepamos con total seguridad qué está ocurriendo dentro de este cerebro artificial. Aunque los seres humanos seamos los creadores de estas máquinas, una vez se marcan las pautas de aprendizaje (técnicas de Machine Learning por ejemplo), es la misma IA la que evoluciona y desarrolla sus propios “razonamientos” y “pensamientos” matemáticos dentro de su red de neuronas artificiales. ¿Qué ocurrirá cuando una IA cometa un error que pueda incluso acarrear vidas humanas? Sólo el personal muy especializado en comprender los complejos modelos matemáticos que se ejecutan dentro de esa “caja negra” serán capaces de encontrar alguna pista sobre su mal funcionamiento. Pero incluso estos perfiles altamente especializados lo tendrán cada vez más difícil a medida que la complejidad de las IA vaya creciendo a la vez que la velocidad de proceso de los ordenadores (y lo hace muy deprisa, esto sin mencionar los ordenadores cuánticos). Cuando un ser humano comete un acto incomprensible para el resto de la sociedad, no abrimos su cerebro para analizar sus neuronas y ver qué ha podido llevarle a realizar dichos actos. Por eso, la imagen del Dr. Chandra hablando (o más bien reprogramando) a HAL será la imagen habitual de un técnicoe IA intentando buscar el problema de funcionamiento en uno de estos sistemas inteligentes. El anhelo del ser humano siempre ha sido llegar a crear una IA que funcione de la forma más parecida a nuestro cerebro. De hecho, es posible que lo estemos haciendo muy bien. Tan bien que, al igual que no sabemos exactamente cómo funciona internamente el cerebro humano, parece que lo mismo nos podría ocurrir con estos nuevos cerebros artificiales. Así que la próxima vez que le des una orden contradictoria a Siri, Google Home, Amazon Echo o al flamante nuevo Apple HomePod, acuérdate antes de lo que le pasó a la tripulación de la Discovery 😉 Si te ha gustado este artículo no te pierdas el siguiente de la serie Ciencia Ficción vs Inteligencia Artificial: Ciencia Ficción vs Inteligencia Artificial ¿Qué tal una partidita de Ajedrez, Dr. Falken?
27 de junio de 2017
AI & Data
Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Parte 1, preparando la "rejilla de juegos"
Escrito por Fran Ramirez, Investigador en Eleven Paths y escritor del libro "Microhistorias: anecdotas y curiosidades de la historia de la informática". ¿Tienes un bot con una IA y no sabes cómo entrenarlo? Pues ya no tienes que preocuparte, utilizando OpenAI y las plataformas Universe y Gym nos permiten probar y entrenar una IA utilizando juegos clásicos, simulaciones de navegación por páginas web o incluso probar programas. La base de su funcionamiento es sencilla: hacer que un bot agente (la IA) utilice el ordenador igual que lo haría un ser humano, es decir, mirando a la pantalla (identificando y ubicando pixeles en la pantalla) y utilizando el ratón y el teclado. Por lo tanto, sólo tenemos que elegir en qué entorno queremos probar nuestra IA y dejarla trabajar adquiriendo experiencia poco a poco. Como hemos comentado antes, los agentes utilizan las interfaces comunes, por lo tanto el agente de IA funcionará controlando un escritorio remoto observando los pixeles proyectados en la pantalla (actuando exactamente igual que un ser humano mirando a la pantalla) y generando respuestas tanto en el teclado como en el ratón. El sistema está basado en servidor VNC y la librería propia de Universe permite al agente conectar con ellos Figura 2: Funcionamiento básico OpenAI Estos son los entornos que podemos elegir para realizar nuestras pruebas: Juegos de Atari Juegos variados tipo Flash Otro tipo de juegos (aquí podríamos englobar los FPS por ejemplo como Doom) Tareas con navegadores web (desplazarnos por la página, hacer click, etc) Mini World of Bits (tareas sencillas muy específicas como leer un texto, identificar formas, etc.) Tareas concretas realizadas con navegadores (reservar un hotel, comprar un artículo, etc). Esta infraestructura permite que cualquier aplicación, juegos, página web, etc que pueda integrarse en un contenedor Docker (este sería el entorno más idóneo) o en una máquina virtual (un poco más lento que Docker) sea susceptible de añadirse a Universe. Esto abre un mundo de posibilidades, como subir tu propia aplicación para probarla, un juego, etc y que sean probadas por los agentes creados en OpenAI (un entorno de pruebas ideal para nuestra aplicación). Para crear y dar inteligencia a nuestros bots de IA utilizaremos el framework llamado TensorFlow. Esta colección de librerías nos permite utilizar técnicas de aprendizaje automático y redes neuronales. Antes de empezar a jugar, tenemos que preparar el terreno de juego. La forma más sencilla y que menos impacto tiene en nuestro entorno actual, ya sea Windows, Linux o Mac, es instalarlo en una máquina virtual. Hemos optado por un Linux Ubuntu 16.04 de escritorio. Eso sí, al ser un entorno virtual, la velocidad de proceso será un poco más lenta pero suficiente para realizar nuestras primeras pruebas. Para ejecutar las máquinas virtuales podemos utilizar VirtualBox, gratuito y disponible en todas las plataformas. No vamos a explicarte cómo instalar la máquina virtual en VirtualBox, existen muchos tutoriales que te pueden echar una mano en esta sencilla tarea. Una vez tenemos ya preparada nuestra máquina virtual con Linux Ubuntu, comenzamos la instalación de nuestro entorno de pruebas. Primero instalaremos los siguientes paquetes básicos (cuando pregunte si aceptamos la instalación, pulsamos "Enter" de esa manera aceptamos y seguirá con la instalación): $ sudo apt-get update $ sudo apt-get install golang python3-dev python-dev libcupti-dev libjpeg-turbo8-dev make tmux htop chromium-browser git cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig El siguiente paso será descargar e instalar Anaconda Python 3.4 (plataforma Open Data Science que contiene prácticamente todas las librerías Python que vamos a necesitar): $ wget https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh $ bash Anaconda3-4.2.0-Linux-x86_64.sh Anaconda añadirá automáticamente las rutas al fichero .bashrc (en el fichero de arranque) si escribes "yes" justo en este punto de la instalación: En caso de no funcionar, puedes añadirlas manualmente editando el fichero: $ gedit ~/.bashrc Y luego añadimos la ruta: export PATH="/home/$USER/anaconda3/bin:$PATH" El siguiente paso será instalar Docker: $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" $ sudo apt-get update $ sudo apt-get install docker-ce Finalmente probamos la instalación: $ sudo service docker start $ sudo docker run hello-world IMPORTANTE: en este punto tenemos que reiniciar la máquina virtual (reboot) Ahora vamos a probar que todo se ha instalado correctamente creando un entorno propio aislado, así podremos crear diferentes universos: $ conda create --name universe python=3.5 anaconda $ source activate universe Ahora veremos entre paréntesis en la línea de comandos el nombre " (universe)". Esto indicará que estamos trabajando dentro del entorno que hemos creado. El siguiente paso será instalar los paquetes que vamos a necesitar para nuestras pruebas: (universe) $ conda install pip six libgcc swig (universe) $ conda install opencv El siguiente paso será instalar Tensorflow. Podemos elegir entre la versión con GPU activada o sin ella (depende de la tarjeta gráfica que tengamos): (universe) $ pip install --upgrade tensorflow (universe) $ pip install --upgrade tensorflow-gpu Instalamos Gym: (universe) $ cd ~ (universe) $ git clone https://github.com/openai/gym.git (universe) $ cd gym (universe) $ pip install -e '.[all]' Instalamos Universe: (universe) $ cd ~ (universe) $ git clone https://github.com/openai/universe.git (universe) $ cd universe (universe) $ pip install -e . Finalmente vamos a probar que todo se ha instalado correctamente ejecutando alguno de los ejemplos que podemos encontrar en OpenAI Gym. El siguiente código (de momento no nos preocupamos por por su funcionamiento, lo veremos más adelante) abre uno de estos entornos y simplemente ejecuta de forma aleatoria la pulsación de las teclas de movimiento (es sólo para probar que todo está ok). Abrimos un editor de textos en Linux (por ejemplo, gedit), pegamos el siguiente código y lo guardamos con un nombre con extensión .py (por ejemplo, test1.py): import gym env = gym.make('Breakout-v0') env.reset() for _ in range(1000): env.render() env.step(env.action_space.sample()) # take a random action En nuestro caso hemos creado una carpeta dentro de nuestro perfil de usuario llamada "programasOpenAI": (universe) $ python ~/programasOpenAI/test1.py En este vídeo podéis ver la ejecución de los dos entornos: Ya tenemos la " rejilla de juegos" preparada, en los siguientes capítulos probaremos algunas IA que existen en el entorno e incluso vamos a aprender cómo crear nuestra propia IA. Los post más interesantes de LUCA Data Speaks 2018 organizados por series y temáticas
8 de junio de 2017