Inteligencia simulada
Siempre he tenido una mente inquieta, como buen hacker, científico e investigador, mi cerebro ha estado constantemente cuestionando el mundo y pensando en una forma más eficiente de hacer las cosas. Desde pequeño, una parte de mí quería descubrir, aprender cosas nuevas y hallar nuevos puntos de vista para todo lo cotidiano. Lo cual desentonaba con la visión de la educación de muchos colegios e institutos de la época, en la que querían formar a todos los alumnos con el mismo molde. Fueron tiempos en los que teóricamente se atendía a las necesidades de los alumnos, se valoraba lo que cada uno necesitaba en cada momento. Pero en la práctica, la inmensa mayoría del profesorado no quería complicarse la vida.
Este fragmento pertenece a una de esas historias que entran en mi cabeza un momento y necesitan ser plasmadas para salir de ella. Estoy repartiéndola en varios posts de este blog porque me ha salido demasiado larga. Los capítulos no están por orden cronológico. Por ahora puedes leer:
- Un Universo creado de la nada
- Cómo su vida se desvaneció en mis manos
- Un día normal en el 2040
- Miedos irracionales y universos paralelos (primera parte)
- Miedos irracionales y universos paralelos (segunda parte)
- Automóviles eléctricos y un empresario de mal genio
- Imperecedero
- El chip subdérmico
- Bucarest – Ginebra – Madrid – Sevilla
- Oopart
- Reflexiones desde el calabozo
Con el tiempo este afán no cesa, sino que se reprime, ahora tengo obligaciones, una empresa que acapara gran parte de mi tiempo, una familia a la que adoro. Soy inmensamente feliz, pero necesito algunas horas a la semana para dejar que mi mente fluya y descargue toda la información que va acumulando y, por suerte, suelo tener esos momentos por la noche.
Hace dos semanas me disponía a cenar con la pequeña Amaranta mientras Esther se daba un baño con un poco de música, al mismo tiempo que leía algunos capítulos de un libro. Estaba sirviendo la cena y le preguntaba a mi hija por su día en el colegio y cómo lo había pasado con sus amigos. Ella estaba emocionada, contándome que ese día habían bajado por primera vez al patio grande, ¡el de los mayores! Por un momento me quedé pasmado, pensando en ese mundo de descubrimientos que experimentó entusiasmada. Un campo de juegos enorme, con mucha más gente. Por una parte nuevos peligros, porque los mayores iban corriendo a toda velocidad sin mirar a quién podían llevarse por delante, pero por otra, un universo enorme por explorar. Seguro que los veinticinco minutos de recreo fueron horas para ella. Me relataba los juegos que hacía con sus compañeros. Su profesora escondió pequeños juguetes en la clase y, aunque ella no encontró ninguno, su mejor amiga compartió su juguete con ella. Me saltaba de un tema a otro, en un momento estábamos en el patio y al siguiente en clase, o en el camino de vuelta con su madre. Me fascinaba.
La conversación con Amaranta me dejó algo inquieto y me llevé varios pensamientos a la cama aquel día. No eran algo que no se hubiera preguntado nadie, al contrario, pero me gustaría investigar sobre el tema, saber un poco más. ¿Cómo puede una persona aprender desde un estado inicial en blanco? Aunque no está totalmente en blanco, habría ciertas constantes. Los bebés tienen ciertos reflejos como coger el dedo del padre o la madre, el reflejo de alimentarse, imitar algunos gestos, nadar, incluso esa habilidad para captar información del exterior a un ritmo vertiginoso. Poco a poco, se va desarrollando física e intelectualmente para prepararse para el mundo. Pero si variamos esas condiciones iniciales, ¿se podría desarrollar igualmente el niño? ¿Qué reflejos son estrictamente necesarios para garantizar la vida y aprendizaje de un bebé? No quiero experimentar con humanos y menos con un hijo mío, pero ¿sería posible crear un ente informático, capaz de aprender y desarrollarse de la misma manera que lo haría un humano?
En ocasiones me hago este tipo de preguntas, casi sin conocer nada de psicología, anatomía o biología. Aunque los seres humanos estamos hechos de materia, como decía Carl Sagan: “Somos polvo de estrellas” y las estrellas tuvieron un comienzo, el universo tuvo un cominezo, la existencia, el tiempo tuvo un principio. Un tiempo igual a cero a partir del cual, hace catorce mil millones de años, empezó todo. En muchos estudios cosmológicos se han utilizado ordenadores muy potentes para simular el universo desde ese punto inicial, el Big Bang, pero ¿podríamos ir más allá? ¿Sería posible simular por completo la generación de cada una de las partículas que conforman el universo? A día de hoy hay muchas incógnitas, pero tal vez se podrían definir algunas reglas de interacción básicas para así poder generar partículas, energía, colisiones… y recrear el universo para poder observarlo desde cualquiera de sus dimensiones.
Pero claro, el Big Bang fue el inicio de todo, incluidas las reglas con las que todas las partículas interactúan. ¿La velocidad de la luz estaba establecida un instante antes del Big Bang? Aunque con el fin de crear un modelo matemático podríamos definirlas un momento antes de empezar. Podríamos definir un algoritmo que pruebe diferentes condiciones iniciales, o combinaciones de reglas y vaya desarrollando el universo generado hasta ver dónde llega.
Sería como programar el juego de la vida de Conway, muy popular en los setenta. Es un juego en el que sólo el ordenador puede jugar, aunque más de uno nos hemos quedado embobados mirando cómo el ordenador simula la existencia de un grupo de células en una cuadrícula donde cada cuadro corresponde con una célula que puede estar viva o muerta. A partir de ahí van sucediendo turnos, que podemos acelerar en el tiempo y hay dos reglas básicas: si una célula muerta tiene tres vecinas vivas, la célula revivirá en el turno siguiente; si una célula viva tiene dos o tres vecinas vivas, seguirá viva, aunque podrá morir por soledad si tiene una célula viva o ninguna a su lado o superpoblación, si tiene más de tres células vivas alrededor. Pero a mi juego de simulación, tendremos que darle la capacidad de averiguar qué posiciones iniciales serían mejores y qué tipos de interacción de células son mejores para asegurar la perpetuidad del juego y tener una población numerosa y sostenible.
El problema viene al introducir el tiempo. Los ordenadores son capaces de realizar un número finito de operaciones por segundo, muy alto, pero finito. A la hora de visualizar una simulación el tiempo es un factor importante. Los humanos funcionamos con el tiempo, pero este tiempo no es fijo, ni lineal, ni absoluto. Podría tener una base temporal para determinar el orden en el que se realizan las operaciones de la simulación, pero no podría tomar ese tiempo como una ley inamovible. Existen muchas teorías sobre la flecha del tiempo, ¿realmente el pasado, el presente y el futuro son una ilusión? ¿El orden en el que percibimos los acontecimientos es realmente el orden en el que suceden? Tal vez nosotros, que vivimos en un mundo de cuatro dimensiones, incapaces de percibir y casi de imaginar un mundo con más dimensiones no podamos ser jamás conscientes de esa inmensidad. Puede que otros seres superiores a nosotros sí puedan percibirlas, incluso manipularlas de la misma manera que nosotros podemos manipular un papel, un mundo en dos dimensiones y mediante unos movimientos concretos crear figuras en tres dimensiones. ¿Cómo percibirían ese cambio los habitantes del mundo de dos dimensiones?
En ingeniería de software siempre se habla acerca de la importancia de la planificación, el segundo factor. Aún hoy hay muchos que piensan que pueden embarcarse a hacer un proyecto a gran escala sin apenas planificar, simplemente poniéndose a codificar sin parar. Es algo que todos hemos hecho hasta que llega un momento de epifanía que todo buen programador tiene y empiezas a dedicar cada vez más tiempo a pensar en cómo hacer las cosas optimizando el tiempo que dedicas en la realización de los proyectos. Aunque esto es solo una prueba de concepto, una prueba de concepto enorme, quiero ponerme a trabajar ahora mismo.
A día de hoy existen cientos de lenguajes de programación. Cada uno de ellos con sus virtudes y sus carencias. Estos lenguajes son solo herramientas para que una máquina sea capaz de entender lo que un humano quiere de ellas. Y existen varios niveles de adaptación. Hay lenguajes muy cercanos a la máquina, para los cuales, el programador tiene que aprender a pensar como lo hace la máquina, comprender sus entresijos a la perfección, imaginar cada mínima acción que puede realizar un sistema informático y sus repercusiones. En estos lenguajes tendremos que tener en cuenta muchos factores constantemente y un pequeño programa supondrá una importante inversión de tiempo. En estos casos, si queremos que las persianas de nuestra casa se suban automáticamente al amanecer, tendremos que conocer cómo se comunican cada uno de los circuitos involucrados, protocolos, frecuencias, incluso características propias de los chips que conforman cada sistema, conocer las direcciones de memoria reservadas, códigos especiales para cada mínima acción, umbrales de voltaje requeridos para detectar el día y la noche o las persianas abiertas y cerradas… En contraposición, encontramos algunos lenguajes de programación modernos que son capaces de alejar al programador de un pensamiento puramente artificial, de pensar como una máquina; permiten que el programador pueda pedir acciones más humanas, para que simplemente le digamos con palabras, a viva voz, a nuestro sistema domótico “cuando amanezca sube la persiana”, de modo que él detecte cuándo hay suficiente claridad, o si el día es oscuro cuando sea una determinada hora tope, para no llegar tarde al trabajo. Subirá las persianas hasta un punto en el que me despierte pero no me moleste, porque previamente le habré enseñado al sistema cómo me gusta y será lo suficientemente inteligente de guardar mis preferencias para cada estación del año y respetar los fines de semana cuando quiero dormir un poco más. En cierto modo, se necesita capacidad computacional para deshacer las capas de abstracción introducidas por el programador. Cuanto más fácil es programar para el humano, más costoso es entenderle para una máquina y viceversa.
A día de hoy podemos encontrar lenguajes de programación en todos los niveles, desde los más cercanos a la máquina, o de un nivel más bajo, a los más próximos al hombre o de más alto nivel. Al mismo tiempo, muchos lenguajes están pensados para realizar ciertas funciones más que otros y es nuestra decisión utilizar el mejor en cada caso. Aunque, actualmente, cuando un sistema necesita toda la potencia que el ordenador puede darle, se sigue recurriendo al lenguaje C, uno de los primeros que aprendí. No es el lenguaje más próximo a la máquina, pero sí uno de los que más nos obliga a pensar como una de ellas. Es cierto que el mantenimiento de un programa puede ser costoso. En mi empresa, por ejemplo, utilizamos Python o Java para muchos procesos. Estos lenguajes están más cerca del humano, aunque aún requieren de muchos conocimientos. El mismo programa puede estar muy optimizado en C, puede correr muy rápido, pero necesitaría miles de líneas de código, mientras que en Python, solo necesitaría decenas. Al mismo tiempo, aunque en la bolsa de trabajo encontramos miles de candidatos que afirman tener experiencia en C, ya que aún se estudia en muchas universidades del mundo, es muy difícil encontrar a alguien que de verdad domine este lenguaje, y también será muy caro contratarle. Además, a día de hoy, los sistemas informáticos están lo suficientemente avanzados como para que no sea necesario en muchos casos pensar demasiado como un ordenador. Aunque la interfaz de entrada predominante sigue siendo un simple teclado, en la inmensa mayoría de los casos, el aumento de rendimiento entre un lenguaje de más bajo o más alto nivel, no justifica el tiempo ni la inversión.
Soy consciente de que me enfrento a un proyecto muy grande, debo manejar gran cantidad de memoria y realizar una infinidad de operaciones por segundo, incluso con máquinas como las actuales, no me gustaría desaprovechar ni un solo ciclo de procesador. Necesitaré mucha potencia para evaluar las condiciones de mi universo en cada momento del tiempo, saber los tipos de partícula que hay en cada punto del espacio en cada momento y desarrollar su interacción con las partículas vecinas así como sus consecuencias. Todo esto multiplicado por el número de partículas que encontramos en el universo. Por si fuera poco, si tengo que mantener un registro de todas las partículas, necesitaría una cantidad inmensa de universos enteros para almacenar el estado y las propiedades de cada una de ellas, ya que la memoria necesaria para almacenar toda esa información serían varios cientos de partículas elementales. Aunque la memoria necesaria para la simulación será inmensa debo desarrollar un método inteligente para que sea humanamente almacenable.
Hace años que no empiezo a desarrollar un programa desde cero, a enfrentarme con una pantalla oscura, vacía, esperando que empiece a rellenar los huecos para dar forma a todo lo que tengo en mente. Solos, un pequeño cursor en la esquina superior izquierda de la pantalla, parpadeando, y yo. Es una sensación que recuerdo con cariño a la vez que me desespera, me recuerda que en mi mente todo está mucho más avanzado que en mi ordenador. Mis manos quieren ir más rápido y su velocidad es limitada. Incluso los interfaces psíquicos no son más rápidos para esta clase de tareas.
Al cabo de unas dos horas y media, llevo escritas cerca de dos mil líneas de código y prácticamente no tengo nada hecho. Es normal, casi todo corresponden a estructuras de memoria y código mecánico que no tiene nada que ver con la tarea que quiero desempeñar, pero quiero crear unos buenos cimientos, una base bien hecha para que todo funcione bien. A estas horas de la noche es cuando alcanzo una mayor concentración, es algo que me emociona y me hace disfrutar.
¿Continuar leyendo?
Para seguir la historia, mira el siguiente capítulo: El efecto mariposa. Espero que te guste.
Licencia
Foto principal: Julian Voss Andreae