- Allen Newell y Herbert Simon definieron computadora como un «manipulador simbólico», es decir, como un dispositivo en el que entran unos determinados símbolos que son «manipulados» para obtener unos determinados resultados (que serán nuevos «símbolos»).
- «Manipular» es un verbo de un significado tremendamente vago para hablar de lo que una computadora hace con los símbolos, ya que significa, prácticamente, hacer cualquier cosa con algo. Aunque me parece interesante que Newell y Simon no dijeran directamente que la computadora realiza computaciones, es decir, cálculos, con los símbolos, dando a entender que una computadora pretende ser más que una mera máquina de cálculos aritméticos.
- «Símbolo» es un término aún más complicado que el anterior, dando lugar a toda una rama de la lingüística a la que denominamos semiótica. Lo definiré de la forma más prosaica que he encontrado en la historia de la filosofía: símbolo es aquello que es capaz de estar en el lugar de otra cosa. Así, cuando yo veo la palabra «perro» escrita en un libro, en mi cerebro recreo la imagen de un perro sin la necesidad de tener un perro delante. La palabra «perro» como símbolo es capaz de ponerse en el lugar de un perro real (Esto no es más que la teoría de la supossitio de Guillermo de Ockham).
- ¿Qué «símbolos» manipula una computadora? Si nos vamos al nivel más bajo posible, al nivel más pequeño del hardware encontramos que las computadoras codifican («simbolizan») la información en bits utilizando flujos de corriente eléctrica. Una corriente de, aproximadamente, cinco voltios se va a simbolizar con un «1» y una corriente nula o con muy poquito voltaje se simbolizará con un «0». Nótese que aquí se da una traducción que, como tal, es una falsificación: se pasa de una corriente continua a una clasificación discreta. Digitalizar consiste precisamente en hacer eso, en interpretar lo continuo como si fuera discreto, falsear lo continuo. Ahora, siguiendo a Ockham, en vez de un flujo de voltaje tengo un «1».
- Importante ver que la relación entre el símbolo y su referencia no es del todo arbitraria, al contrario que lo que ocurre en nuestro lenguajes ordinarios. La palabra «perro» no se parece en nada a un perro real, pero, a pesar de que un flujo de electrones a un determinado voltaje no se parece en nada a un «1», la dualidad voltaje/no-voltaje tiene similitud con la dualidad 1/0, que pretende significar presencia o ausencia total. Habría, en mucho sentido, no una relación simbólica, sino una relación icónica entre las corrientes eléctricas y la paridad binaria. Esto vuelve más borrosa, si cabe, la distinción entre software y hardware.
- Téngase cuidado y piénsese que a nivel ontológico solo siguen existiendo los flujos eléctricos. Los ceros y los unos no existen en ningún lugar del computador más que en la mente del ingeniero. Siguiendo, de nuevo, a Ockham, no multipliquemos los entes sin necesidad. Creo que es muy recomendable intentar atenerse a una ontología materialista sensu stricto cuando se analizan las computadoras porque en este contexto surgen muchos espejismos ontológicos.
- Una fantasía muy evocadora consiste en pensar que si pudiésemos conseguir crear un ordenador con una memoria continua en vez de discreta, tendríamos una memoria infinita, ya que algo continuo es infinitamente divisible de forma que siempre podríamos dividirlo otra vez para crear un nuevo espacio de memoria.
- Tenemos entonces los símbolos primitivos, los átomos de la computadora ¿Qué tipo de «manipulaciones» hace con ellos el ordenador? Para hacerlo más fácil, pensemos en la versión simplificada par excellence de un ordenador: una máquina de Turing. Ésta solo hace cinco cosas: lee, escribe, borra, mueve la cinta a la derecha o mueve la cinta a la izquierda. Si nos ponemos exquisitos, una máquina de Turing solo cambia cosas de sitio (Véase que la instrucción Mov era una de las esenciales del lenguaje ensamblador). Y esto es lo verdaderamente alucinante: solo cambiando cosas de sitio conseguimos llegar hacer ingenios como ChatGTP o AlphaFold.
- Además, como lenguaje solo necesitamos dos tipos de símbolos (0 y 1), ya que podemos traducir todos los números y las letras, es decir, todo símbolo imaginable, a código binario. No hay nada que pueda hacerse con un conjunto de símbolos cualesquiera (pongamos el alfabeto chino) y que no pueda hacerse con código binario. Todo código es bi-reductible.
- Por eso, para fabricar un computador, lo único que necesitamos es encontrar, o fabricar, elementos biestables (flip-flop), es decir, cosas que puedan mantenerse de forma razonablemente estable en uno de dos estados posibles.
- Recapitulando: solo necesitamos un mecanismo capaz cambiar dos tipos de cosas de sitio para llegar hacer ingenios como ChatGTP o AlhaFold. Es completamente increíble el poder generativo de algo tan sencillo.
- En 2007 saltó la noticia de que la máquina de Turing (2,3) era universal, es decir, de que una máquina de Turing de dos estados y tres colores era capaz de realizar cualquier cálculo imaginable. Un chaval de veinte añitos, un tal Alex Smith, había sido el diseñador de la máquina (si bien todavía el asunto es controvertido y, hasta donde yo sé, no ha sido aclarado aún). Adjunto la tesis doctoral de Turlough Neary y un artículo de Yurii Rogozhin por si alguien quiere profundizar en las máquinas de Turing mínimas.
- Pero esto nos debe hacer desconfiar de las explicaciones reduccionistas. Reducir lo que es un ordenador a su mínima expresión puede tener cierto valor explicativo pero no es, para nada, toda la historia. Intentar explicar todo lo que es un programa como Windows por ejemplo, únicamente apelando a voltajes y tensiones, sería lo mismo que intentar explicar la literatura de Cervantes solo apelando a los átomos de un ejemplar del Quijote. La mejor explicación aparecerá en niveles intermedios y no en los inferiores.
- Los distintos lenguajes de programación que aparecieron progresivamente fueron echando capas simbólicas sobre el hardware. Lo que se pretendía era, sencillamente, hacer más fácil el uso del ordenador al programador. Programar directamente con código binario es un auténtico infierno, por lo que, muy pronto se crearon instrucciones que ejecutaban un conjuntos enteros de procesos y que resultaban más amigables para los pobres ingenieros. Así surgió el ensamblador y demás lenguajes que fueron subiendo más y más de nivel simbólico o de abstracción. Famoso fue COBOL, basado en las ideas de la simpar Grace Murray Hopper, que casi puede entenderse sabiendo inglés. Hoy en día lenguajes como Python son de altísimo nivel, edificios con muchísimas plantas de símbolos, de instrucciones que están en lugar de otras que, a su vez, están en lugar de otras, y así sucesivamente muchísimas veces. El último nivel sería el de la interfaz de usuario, en donde se intenta que una persona sin conocimientos informáticos sea capaz de manejar la computadora.
- Esto genera una sensación engañosa de simplicidad. Al usuario le parece que no hay nada entre que pulsa el icono en pantalla y el vídeo empieza a verse. Aquí viene al pelo la famosa frase de Clarke: “Cualquier tecnología lo suficientemente avanzada es indistinguible de la magia”. Y esto puede ser muy peligroso.
- En el famoso argumento de la habitación china, Searle critica que el comportamiento de la máquina siempre es sintáctico y nunca semántico, es decir, que la computadora trata los símbolos no como símbolos sino como «lugares», como cosas que cambia de sitio sin ningún tipo de comprensión de su significado. Eso es verdad y no lo es. Es cierto que la computadora solo cambia cosas de sitio, pero lo hace según unas reglas y esas reglas sí que son semánticas. Por ejemplo, si hacemos un circuito para conseguir una puerta lógica AND, es cierto que la máquina no comprende lo que hace ni sabe lo que es un AND, pero el circuito sí que crea una puerta AND que se comporta, con todas las de la ley, como tal y podrá ser utilizada para esa tarea. Me gusta utilizar la expresión «semántica prestada» para hacer referencia a que toda la semántica se la ha puesto el ingeniero. Ciertamente, tal como dice Searle, la computadora no comprende lo que hace, pero se comporta como si lo hiciera y sus resultados son completamente válidos: las inferencias a partir de la puerta lógica AND son correctas.
- ChatGTP no comprende nada de lo que hace y su forma de funcionar mediante modelos de lenguaje basados en semánticas distribuidas es muy estúpida. Sin embargo, su espectacular éxito se debe a lo bien que maneja la semántica que ya encontró en los millones de textos con los que fue entrenado. Si ChatGTP sabe que «Hoy hace un buen día porque…» encaja mejor con «…no llueve» que con «… hace una terrible ventisca», es porque alguien que sí comprendía semánticamente lo que escribía se lo dejó preparado.
- Lo interesante viene cuando cualquier programa de procesamiento de lenguaje se encuentra con que tiene que inferir nuevas semánticas a partir de las que ya tiene. Por ejemplo, si sabe que «parachoques» suele llevarse bien con «automóvil», ¿se llevará bien con «helicóptero» o con «barco»? ChatGTP, y sus modelos homólogos, buscan con su colosal fuerza bruta otros casos en los que «parachoques» aparezca junto a «helicóptero» o «barco» pero, ¿y si no aparecieran? Lo salvaje de estos modelos es que casi siempre aparecen de alguna forma, porque tienen en su memoria todo lo que jamás ha sido escrito y, hablando en esos órdenes de magnitud, es muy difícil sorprenderles. La fuerza bruta es mucho más poderosa de lo que hubiéramos pensado.
- Pero, si nos olvidamos de ella, lo interesante sigue siendo crear IA de la forma tradicional: enseñando a que piensen de verdad y no solo a que busquen correlatos estadísticos. Como defiende Judea Pearl, hay que enseñarles causalidad. ChatGTP relaciona «nubes» con «lluvia» pero no comprende qué relación causal hay entre ambas, solo sabe que las nubes causan lluvia porque lo ha leído mil veces así, pero aceptaría felizmente que la lluvia causara nubes si así lo hubiera leído. Eso además, hace a estos sistemas muy frágiles al engaño o al fallo absurdo.
- En esta línea estoy muy de acuerdo con Gary Marcus en que no podemos partir de un sistema que no sabe absolutamente nada y meterle millones de datos, sino que hay que introducirles mucho más conocimiento incorporado. Parece que hay que volver a la vieja IA simbólica y diseñar sistemas híbridos que aprovechen lo mejor de ambos mundos. Hay que volver a recuperar los viejos sistemas expertos.
- De igual forma hay que dar más importancia al diseño del hardware. Debido al error de creer en el argumento funcionalista de la independencia de substrato o realizabilidad múltiple, se ha pensado en que el hardware no tenía ni la más mínima importancia. Fatal confusión: la mente ha co-evolucionado biológicamente con el cuerpo durante eones. En este proceso evolutivo la mente ha ido determinando el diseño óptimo de su sustrato, mientras que el sustrato habrá impuesto limitaciones y posibilidades al desarrollo mental. La estructura y las propiedades físicas del material condicionan, sin duda, el pensamiento.
- Y no solo las propiedades físicas, sino las del entorno en el que la mente se ha desarrollado. El contexto, el ecosistema, las características del entorno quedan profundamente reflejadas en la naturaleza de nuestros pensamientos. De aquí las nuevas corrientes en ciencias cognitivas: la cognición corporeizada, embebida, situada o encarnada.
