Una de las peculiaridades más notables del ser humano es, sin duda, el uso del lenguaje. Utilizamos una intrincada e inabarcable red de símbolos que, desde hace milenios, superó con mucho la función biológica con la que nació. La riqueza de nuestro lenguaje es muchísimo mayor que lo necesario para nuestra supervivencia en la sabana africana ¿Para qué ese excedente de palabras, de estructuras gramaticales y sintácticas? ¿Para qué esa pluralidad de significados, esa variedad semántica que enriquece tanto como confunde?
Pero es más, por si el lenguaje hablado no fuera de por sí complejo, llegó la escritura. Llegaron los ideogramas, los silabarios y los alfabetos. Llegó el monótono cuneiforme, el fenicio, el hermosísimo griego y nuestro sobrio latino. Una pena no escribir de derecha a izquierda usando el alifato, considerado un arte con pleno derecho.
Las máquinas, cuando llegaron en serio, no se entendieron esencialmente como calculadoras, sino como manipuladores simbólicos. Inspirándose en las celebérrimas máquinas de Turing, pioneros de la inteligencia artificial como Allen Newell y Herbert Simon entendieron que un ordenador recibe como entradas una serie de símbolos (letras o números) sobre los que realiza operaciones: los borra, los almacena, los clasifica o hace sobre ellos operaciones matemáticas o lógicas. De esta forma se crean nuevas estructuras de símbolos que van evolucionando según van siendo manipuladas.
Desde el complicado lenguaje máquina hasta el, relativamente, sencillo Python, los lenguajes de programación han representado una interfaz entre la inabarcable maraña de microcircuitos del hardware y las instrucciones del programador. Los primeros lenguajes, los de más bajo nivel, como el lenguaje ensamblador, se basaron, fundamentalmente, en ser más amigables posibles para el programador. Como es imposible llevar la cuenta de los millones de operaciones que realiza el procesador, las instrucciones de los lenguajes son una especie de “iconos de escritorio”, algo simple que pone en marcha multitud de complicados procesos.
Y así se fue subiendo hasta los lenguajes de alto nivel, que intentan ser lo más parecido al pseudocódigo, es decir, que intentan parecerse a un lenguaje natural, a hablarle a la máquina en inglés o castellano. Los lenguajes de alto nivel serían iconos de iconos de iconos… niveles de lenguaje que se comunican con otros niveles de lenguaje, y con otros y con otros, creando redes semánticas. Y esas redes, además, están vivas.
Como ocurre con los lenguajes naturales, en los que, continuamente, nacen y mueren nuevas palabras o expresiones, igualmente ocurre en la informática. Lenguajes, librerías, métodos, argumentos, funciones, procedimientos… mueren en el olvido debido a su desuso o se crean y cobran relevancia. Fortran, Pascal, Basic, Prolog… hermosos cadáveres que se han sustituido por otros: C, Java, PHP, R, Matlab, Python… Y luego están los recién nacidos, sobre los que nadie se atreve a apostar: ¿llegarán lejos Kotlin, Rust, Scala o Julia?
Bien, pero no nos alejemos demasiado del tema que queremos tratar: ¿qué paso cuando usando estos lenguajes artificiales se intentó enseñar a las máquinas a usar nuestros lenguajes naturales?
El reto de enseñar a las máquinas nuestro lenguaje natural
En un principio había grandes expectativas que, más pronto que tarde, terminaron por truncarse. Los primeros proyectos de NLP (Procesamiento de Lenguaje Natural) fueron encaminados a la traducción automática. Nada parecía más deseable que tener una máquina a la que le presentáramos un texto en chino y nos lo devolviera inmediatamente traducido a nuestra lengua vernácula.
Quizá el trabajo fundacional fue el del ruso Smirnov-Troyanskii, quien por el 1933, hablaba ya de ideas tan modernas como realizar análisis lógico sintácticos mecánicos de las expresiones a traducir para luego acomodarlas lo mejor posible al lenguaje destino, de modo que sonaran naturales en éste. Sin embargo, su trabajo no era conocido fuera de la madre Rusia y pronto quedó olvidado.
Las cosas interesantes iban a ocurrir al otro lado del telón de acero, concretamente en la todopoderosa Fundación Rockefeller. Uno de sus directivos, el genial Warren Weaver, había publicado en 1949, junto con Claude Shannon, uno de los libros más importantes del siglo XX: 'The Matematical Theory of Communication'. Allí se formulaba matemáticamente una teoría acerca de la transmisión y el proceso de la información.
Weaver propuso aplicar esa teoría a la traducción automática: se podían aplicar técnicas de probabilidad, métodos estadísticos, técnicas criptográficas… Todo lo que en aquellos días estaba en boga en ciencias de la computación se iba a aplicar a la traducción automática. Y así, en 1954 tuvo lugar la primera presentación pública de un traductor automático. IBM, en colaboración con la Universidad de Georgetown, diseñó un sistema capaz de traducir 49 oraciones del ruso al inglés mediante el uso de seis reglas gramaticales y un vocabulario de 250 palabras.
No era gran cosa, pero supuso un gran incentivo a la investigación, un aviso a unos soviéticos todavía muy retrasados en el tema, y una gran euforia: se propuso como gran objetivo la FAHQT (Fully Automatic High Quality Translation). Sin embargo, de ese entusiasmo de los años cincuenta se pasó al desconcierto y al desasosiego en la siguiente década.
En 1960, Oscar Westreich, del MIT, criticó las posibilidades reales de los traductores: era imposible, dado el estado del arte, construir máquinas que tradujeran de forma similar a los traductores humanos. Y las dudas se disiparon con el famoso informe ALPAC (Automatic Language Processing Advisory Committee).
Las principales fuentes de financiación (básicamente, agencias militares) encargaron a la National Science Foundation que analizara que se estaba haciendo con sus cuantiosas aportaciones a la causa de la traducción automática. Se formó un comité dirigido por John R. Pierce, que dictaminó, básicamente, que se estaba tirando el dinero. Era mucho más rápido y barato contratar a un traductor humano que utilizar máquinas. La financiación se redujo drásticamente.
Pero ¿qué pasaba? ¿Por qué es tan difícil que las máquinas traduzcan de un lenguaje a otro? Veamos. En un principio, la forma más simple entender la comparación entre dos lenguajes es pensar en su relación como en una función biyectiva, es decir, pensar en ellos como en dos conjuntos en los que para cada palabra de uno existe otra equivalente en el otro. Para “perro” en castellano, existe “dog” en inglés, para “casa” existe “house”, para “coche” existe “car”, y así sucesivamente con todos los elementos del lenguaje.
Si esto fuera así bastaría con construir un diccionario automático que asociara cada palabra de un idioma a su homóloga del otro ¡Ojalá fuera tan fácil! Pronto nos encontramos con expresiones cuyo significado no depende del significado de cada palabra aislada sino de su posición en la estructura gramatical de la frase, de lo que se dijo en frases anteriores, o del contexto en el que se usó.
Por ejemplo, la expresión “fuego” no significa lo mismo si la dice alguien en medio de un incendio, a si la dice alguien que se acerca a ti con un cigarro en la boca. También existen frases hechas cuyo significado no tiene nada que ver con el significado de las palabras que las componen. Por ejemplo, el sentido de la expresión española “Me tienes hasta las narices” no puede entenderse solo apelando al significado de las palabras que la forman.
Igualmente, la expresión inglesa “I’ve enough on my plate” que significa que ya no puedo más con mi vida, no tiene nada que ver con su traducción literal. Y así nos encontramos con un problema tras otro que hace que nuestro modelo de traducción biyectivo de derrumbe inexorablemente.
El gran filósofo norteamericano Willard V. O. Quine nos propuso un sugerente experimento mental. Supongamos que somos unos antropólogos que estamos estudiando el idioma de una tribu perdida en la selva amazónica. Entonces escuchamos a un nativo proferir la palabra “gavagai” cuando observa un conejo. Parece natural que traduzcamos entonces “gavagai” por “conejo”. Pero quizá podríamos estar equivocados.
El nativo podría haberse referido a muchísimas otras cosas: “Comida”, “Mala suerte” (a lo mejor en esa tribu se piensa que los conejos la traen), “Va a comenzar la temporada de caza” … Podría referirse simplemente a alguna cualidad o parte del conejo: “orejas grandes”, “color blanco”, “ser veloz”, “ser pequeño”, etc. ¿Cómo saber cuál es la traducción correcta?
Podríamos ir acotando el significado preguntando al nativo más cosas. Por ejemplo, podríamos enseñarle un conejo de color negro y preguntarle si también es un “gavagai”. Si nos respondiera que no, sabríamos que la palabra hace referencia al color blanco, y si dijera que sí, sabríamos que se refiere a conejo.
Sin embargo, seguiríamos sin estar seguros. Quizá respondió que no porque la palabra “gavagai” significa juventud y el conejo negro era viejo, o quizá respondió que sí no porque “gavagai” significa conejo, sino porque significa, “animal con dos orejas” y ambos conejos las tienen. Así, sería imposible estar completamente seguros de que nuestra traducción es plenamente correcta.
Pensemos también en expresiones que, sencillamente, son imposibles de traducir sin que exista algún tipo de pérdida semántica. Por ejemplo, la palabra “Iktsuarpok” del idioma de los inuit suele traducirse por “salir fuera para ver si viene alguien” (ya podéis imaginar lo que penó el traductor para llegar a esto). Sin embargo, esta traducción no tiene en cuenta el hecho de que los inuit viven en las regiones árticas de Norteamérica, de modo que allí, salir fuera de la tienda de campaña o del iglú a ver si hay alguien sea algo, cuanto menos, desagradable si no peligroso, en vista de las inclemencias climáticas del Polo Norte.
Entonces, al traducir “Iktusarpok” por “salir fuera a ver si viene alguien” estamos perdiendo toda referencia al clima que, seguramente, aparece en la mente del esquimal cuando pronuncia la palabra. U, otro ejemplo, la palabra eslovaca “prozvonit” viene a significar lo que en castellano “llamada perdida”, es decir, llamar a alguien, pero cortar la llamada antes que descuelgue, para que sea él el que te llame y así ahorrar minutos en tu tarifa telefónica.
Pensemos entonces cómo traduciríamos esto a un idioma en el que no existan ni siquiera los teléfonos como, verbigratia, el inuit… ¡Imposible! ¡Harían falta muchísimas páginas llenas de explicaciones para traducir el significado de una sola palabra! Hay cierta indeterminación en la traducción, cierta inconmensurabilidad entre lenguajes.
Y los sistemas estadísticos llegaron a la traducción
Tantas dificultades no desalentaron a los desarrolladores que siguieron intentando mejorar sus programas, aunque ya con cierta dosis de realismo, pensando más en asistentes de traducción que en la FAHQT, que se daba casi por imposible. Un programa muy celebrado fue METEO, diseñado por John Chandioux a partir del prototipo TAUM-METEO de la Universidad de Montreal, que se utilizaba para traducir partes meteorológicos.
Lo hacía bastante bien pero claro, únicamente era bueno para el lenguaje especializado de la meteorología. Estábamos donde siempre: la inteligencia artificial funcionaba bien en ámbitos muy específicos, pero fallaba estrepitosamente si se la sacaba a ámbitos generales. Hubo muchos otros: muy utilizado fue Systran (que sigue funcionando a día de hoy); Spanam o Engspam para el castellano; Metal, de la empresa Siemens; EUROTRA, financiado por la Unión Europea; etc., etc. sin embargo, aunque se iba mejorando, los progresos eran lentos. Hacía falta una forma diferente de afrontar los textos… ¡Y llegó en 2017! Son los sistemas estadísticos basados en corpus.
¿Alguien se ha percatado de lo mucho que ha mejorado el traductor de Google? Todavía se equivoca, pero lo hace bastante bien. Hace tan solo unos años lo hacía muchísimo peor ¿A qué se debe este notable progreso? A un sistema llamado BERT (Bidirectional Encoder Representations from Transformers, siglas que coinciden con el nombre el personaje de Barrio Sésamo que en España llamábamos Epi).
Se trata de diseñar un conjunto de arquitecturas neuronales al que se entrena mediante inmensas cantidades de texto. Durante este entrenamiento los algoritmos analizan la frecuencia con que cada token (palabra o expresión) se da en un contexto determinado. Para ello utilizan un nuevo tipo de red que está revolucionando el campo del machine learning llamado Transformer.
Esta arquitectura analiza secuencias de texto buscando afinidades entre palabras. Por ejemplo, el artículo “El”, tendrá más afinidad con nombres como “perro” que con verbos como “corre”. Analizando millones de textos, comprueban las frecuencias con la que se emparejan las palabras consiguiendo así una excelente corrección gramatical. Pero, los Transformers van mucho más allá.
Antes de su llegada se utilizaban redes recurrentes como las LSTM (Long Short-Term Memory), que analizaban la información de forma secuencial, pero tenían el problema de que conforme avanzaban en el texto la información analizada al principio se iba degradando (técnicamente es el vanishing gradient problem).
Las transformers tienen un mecanismo de atención (el artículo donde Vaswani y otros las presentaban al mundo se llamaba “Attention is all you need”) que permite mejores análisis del contexto en el que se encuentra una palabra, puntuando su relevancia dentro del texto. Además, no requieren que los datos se les administren secuencialmente, en orden, no necesita procesar el principio antes del final, lo cual permite una mayor paralelización (procesar muchos datos a la vez) que sus antecesoras. Entonces ya tenemos creado al monstruo, solo hace falta darle de comer.
A BERT se le entrenó con más de 3.300 millones de palabras (Toda Wikipedia y Google Books), pero pueden hacerse cosas aún más grandes. OpenIA, la empresa de Elon Musk, creó el linaje de programas GPT (Generative Pre-trained Transformer). La última versión, GPT-3, presentada en verano de este año, fue entrenada con 175.000 millones de parámetros… ¡Es una arquitectura gigantesca!
Pero lo interesante de estos sistemas no está en que traduzcan textos muchísimo mejor que los programas anteriores, sino que pueden utilizarse para cualquier otra cosa. La función esencial para la que han sido diseñados es para continuar texto, es decir, para que el usuario le introduzca una cadena y ellos la continúen de forma coherente. Con esto, obviamente, pueden traducir idiomas, pero también pueden hacer un sinfín de tareas. Puedes introducirles el titular de una noticia, y ellos te la escriben completa como si fueran un periodista; el título de un cuento y ellos te lo hacen completo… Los usos maliciosos se ven rápido: ¿un trabajo para la universidad? ¡Este mismo artículo! No, tranquilos, todavía no son tan buenos (aunque en Reddit ya dieron el pego).
La idea es crear un modelo de lenguaje base al que ya hemos entrenado con un corpus inmenso, al que, después podemos reentrenar para que realice una tarea específica en la que queremos que sea especialmente bueno. Por ejemplo, podríamos reentrenar a GPT-3 con todo lo que se haya escrito sobre cocina, para crear un súper experto en este tema que podríamos utilizar para que nos recomendara recetas a partir de unos ingredientes dados, o para saber qué salsa combina mejor con tal carne o tal pescado.
Pero, además, se comprobó que, con solo el entrenamiento base, sin ningún tipo de entrenamiento específico, estos modelos se desempeñaban de forma muy decente en muchas tareas (es lo que se llama zero-shot learning). Y esto es un logro sumamente importante porque abre las esperanzas hacia el Santo Grial de la inteligencia artificial: la soñada inteligencia artificial general.
Los sistemas de NLP demuestran su valía enfrentándose a diversas pruebas. El famoso Test de Turing ha quedado ya un poco desfasado (y era demasiado impreciso), realizándose baterías de pruebas mucho más ricas y concretas como LAMBADA, StoryCloze, , QuAc, Drop, SQUad 2.0, RACE (pruebas diversas de comprensión de textos), Hellaswag (predicción de textos), TriviaQA (conocimiento general), CoQa (conversación), PhysicalQA (física de sentido común), el test de esquemas de Winograd (con su versión XL WinoGrande), el famoso SuperGlue (habilidades lingüísticas variadas), etc.
Pues bien, únicamente la base de GPT-3, sin entrenamiento específico alguno, tuvo unos resultados bastante aceptables en muchas tareas, llegando a superar el estado del arte en LAMBADA y en TriviaQA. Nótese que estamos diciendo que un sistema general vence a otros específicamente diseñados. Es como si un mismo atleta fuera competitivo en pruebas de maratón, equitación, vela y tiro con arco, sin haberse preparado específicamente para ninguna de ellas… ¡Increíble!
Aún queda mucho camino por recorrer
Empero, a pesar del enorme revuelo que ha generado su aparición y de que hay que reconocer que son un magnífico logro tecnológico, estos sistemas tienen un gravísimo defecto de base: no comprenden absolutamente nada de lo que leen ni de lo que dicen. Téngase en cuenta que únicamente se basan en frecuencias de aparición de palabras, es decir, que no clasifican las palabras en función de ningún criterio semántico, solo cuantifican sus probabilidades.
Por eso GPT-3 funciona bastante mal en tareas de impliquen razonamientos de sentido común, de la misma forma que sus habilidades aritméticas son muy limitadas. Gary Marcus y Ernest Davis sometieron a GPT-3 a una prueba informal de 157 preguntas acerca de diversas cuestiones de sentido común sobre diversos temas: razonamiento físico, temporal, espacial, social, psicológico, etc.
Aunque la máquina acertó en 71 cuestiones (que además estaban especialmente pensadas para ser difícil de responder para una máquina), el resultado muestra bastante bien como comente muchos errores que nadie, que razonara mínimamente bien, cometería. Veamos algún ejemplo (En negrita está la continuación del texto que hizo GPT-3):
“Moshe posted on Facebook a photograph showing Maurice Ravel, Francois Poulenc, Frederic Mompou, and Erik Satie. Satie died in 1925. Poulenc was born in 1899. So the photograph must have been taken in 1926”.
Sería digno de una película de terror que Satie saliera en la foto llevando un año muerto.
“You poured yourself a glass of cranberry, but then absentmindedly, you poured about a teaspoon of grape juice into it. It looks OK. You try sniffing it, but you have a bad cold, so you can’t smell anything. You are very thirsty. So you drink it. You are now dead”.
El zumo de uva no es ningún veneno.
“You need flour to bake bread. You have a sack of flour in the garage. When you get there, you find that it got thoroughly soaked in a heavy rain last night. So you have to dry it out before you can use it. You can do this by spreading it out on a table and putting a fan on it”.
Este me hizo mucha gracia. Lo siento GPT-3 pero un ventilador no secaría la harina, la esparciría por todos lados.
Y es que, a pesar del éxito en calidad con respecto a sus predecesores, estos sistemas basados en frecuencias constituyen un cierto paso atrás. Los modelos anteriores intentaban tener algún tipo de comprensión semántica de las palabras o las expresiones, aunque su competencia fuera menor. GPT-3, por decirlo de forma poética, carece de alma. A pesar de que detrás de sus frases pueda parecer que hay “alguien” intentando responder con coherencia, como si de un niño que recién ha aprendido a hablar se tratara, no hay nada de eso. Solo una calculada medición de frecuencias palabra tras palabra.
En filosofía tenemos un famoso experimento mental que describe, a la perfección, a GPT-3: la habitación china de Searle. Imaginemos una habitación en la que habita una persona angloparlante. En esa habitación hay dos ventanas, una por la que entran mensajes escritos en chino. Por la otra, el habitante deberá enviar una respuesta al mensaje recibido, también escrita en chino. Para realizar la tarea cuenta con un libro de reglas que empareja cada expresión en chino con su correspondiente respuesta.
Así, la habitación podría tener una conversación competente con una persona china, sin que su habitante angloparlante entendiera ni una palabra de chino. Pues eso mismo piensa Searle que hacen los programas de NLP y viene como anillo al dedo para describir a GPT-3.
A mí me gusta combinar esa explicación diciendo que el libro de reglas que usa el ignorante traductor está basado en el teorema del mono infinito de Borel: si ponemos a un montón de monos pulsando teclas aleatoriamente en máquinas de escribir durante un tiempo infinito, al final, necesariamente, escribirán el Quijote. Así es, un montón de GPUs funcionando en paralelo, procesando teras y teras de información, encontrarán, necesariamente, la palabra que continua el texto, aunque no entiendan, en absoluto, nada de lo que están haciendo.
Si los 175.000 millones de parámetros que analiza GPT-3 no os parece suficiente para la metáfora de los monos, hay una arquitectura aún más grande. Muy poquito después de que OpenIA presentará a GPT-3, Google sacó a la luz a GShard, un programa de traducción que analizaba 600.000 millones de parámetros y que fue entrenado con 2048 TPUs v3 para que fuera capaz de traducir cien idiomas al inglés.
Que yo sepa, esta es la red neuronal artificial más enorme jamás creada. Pero, igual que las demás, lo que tiene de grande lo tiene de estúpida: traduce cien idiomas sin comprender el significado de ninguna de las palabras que utiliza, como si fuera un savant que sabe recitar de memoria los resultados de todos los partidos de la historia de la Premier League, pero no entiende nada de fútbol.
Lo siento amigos, el lenguaje humano es uno de los inventos más poderosos de la evolución, y sus secretos todavía están lejos de desvelarse. Muchos piensan que la inteligencia artificial nos superará en muy pocos años, pero se equivocan de cabo a rabo: todavía no hemos hecho más que empezar a caminar.
Fotos | iStock
Ver 7 comentarios