Redes Neuronales Recurrentes, Explicadas y Visualizadas desde Cero
Recurrent Neural Networks, Explained and Visualized from Scratch
Con una aplicación a la traducción automática
Las Redes Neuronales Recurrentes (RNN, por sus siglas en inglés) son redes neuronales que pueden operar secuencialmente. Aunque no son tan populares como lo fueron hace unos años, representan un importante desarrollo en la progresión del aprendizaje profundo y son una extensión natural de las redes de alimentación hacia adelante (feedforward).
En este artículo, cubriremos lo siguiente:
- El paso de las redes de alimentación hacia adelante a las redes recurrentes
- Redes recurrentes multicapa
- Redes de memoria a corto plazo y largo plazo (LSTM, por sus siglas en inglés)
- Salida secuencial (“salida de texto”)
- Bidireccionalidad
- Generación autoregresiva
- Una aplicación a la traducción automática (una comprensión de alto nivel de la arquitectura del modelo de Google Translate de 2016)
El objetivo del artículo no es solo explicar cómo funcionan las RNN (hay muchos artículos que lo hacen), sino explorar sus opciones de diseño y lógica intuitiva de alto nivel con la ayuda de ilustraciones. Espero que este artículo proporcione un valor único no solo para su comprensión de este tema técnico en particular, sino también para la flexibilidad del diseño de aprendizaje profundo en general.
El diseño de la Red Neuronal Recurrente (1985) se basa en dos observaciones sobre cómo un modelo ideal, como un humano que lee texto, procesaría información secuencial:
- Debe seguir la información “aprendida” hasta ahora para que pueda relacionar la nueva información con la información vista previamente. Para entender la frase “el rápido zorro marrón saltó sobre el perro perezoso”, necesito hacer un seguimiento de las palabras “rápido” y “marrón” para entender más adelante que estas se aplican a la palabra “zorro”. Si no retengo ninguna de esta información en mi “memoria a corto plazo”, por así decirlo, no entenderé la importancia secuencial de la información. Cuando termino la oración en “perro perezoso”, leo este sustantivo en relación con el “rápido zorro marrón” que había encontrado previamente.
- Aunque la información posterior siempre se leerá en el contexto de la información anterior, queremos procesar cada palabra (token) de manera similar independientemente de su posición. No deberíamos, por alguna razón, transformar sistemáticamente la palabra en la tercera posición de manera diferente a la palabra en la primera posición, aunque podríamos leer la primera en función de la segunda. Se debe tener en cuenta que el enfoque propuesto anteriormente, en el que se apilan las incrustaciones para todos los tokens lado a lado y se presentan simultáneamente al modelo, no posee esta propiedad, ya que no hay garantía de que la incrustación correspondiente a la primera palabra se lea con las mismas reglas que la incrustación correspondiente a la tercera. Esta propiedad general también se conoce como invarianza posicional.
Una Red Neuronal Recurrente está compuesta, en su núcleo, por capas recurrentes. Una capa recurrente, como una capa de alimentación hacia adelante, es un conjunto de transformaciones matemáticas que se pueden aprender. Resulta que podemos entender aproximadamente las capas recurrentes en términos de Perceptrones Multicapa.
- 50+ Nuevas Herramientas de Inteligencia Artificial de Vanguardia (J...
- Reduce el consumo de energía de tus cargas de trabajo de aprendizaj...
- Conoce a Seal Un marco de trabajo de IA que persigue Segmentar cual...
La “memoria a corto plazo” de una capa recurrente se conoce como su estado oculto. Este es un vector, simplemente una lista de números, que comunica información crucial sobre lo que la red ha aprendido hasta ahora. Luego, para cada token en el texto estandarizado, incorporamos la nueva información en el estado oculto. Hacemos esto utilizando dos Perceptrones Multicapa: uno transforma la incrustación actual, y el otro transforma el estado oculto actual. Las salidas de estos dos Perceptrones Multicapa se suman para formar el estado oculto actualizado o la “memoria a corto plazo” actualizada.
Luego repetimos esto para el siguiente token: la incrustación se pasa a un Perceptrón Multicapa y el estado oculto actualizado se pasa a otro; las salidas de ambos se suman. Esto se repite para cada token en la secuencia: un Perceptrón Multicapa transforma la entrada en una forma lista para incorporarse a la memoria a corto plazo (estado oculto), mientras que otro prepara la memoria a corto plazo (estado oculto) para su actualización. Esto satisface nuestro primer requisito: que queremos leer nueva información en el contexto de la información antigua. Además, ambos Perceptrones Multicapa son iguales en cada paso de tiempo. Es decir, usamos las mismas reglas para fusionar el estado oculto actual con la nueva información. Esto satisface nuestro segundo requisito: que debemos usar las mismas reglas para cada paso de tiempo.
Ambos Perceptrones Multicapa generalmente se implementan como una sola capa profunda: es decir, es solo una gran pila de regresiones logísticas. Por ejemplo, la siguiente figura demuestra cómo podría verse la arquitectura para el Perceptrón Multicapa A, suponiendo que cada incrustación tenga ocho números de longitud y que el estado oculto también consista en ocho números. Esta es una transformación simple pero efectiva para mapear el vector de incrustación a un vector adecuado para fusionarse con el estado oculto.
Cuando terminamos de incorporar el último token en el estado oculto, el trabajo de la capa recurrente finaliza. Ha producido un vector — una lista de números — que representa información acumulada al leer una secuencia de tokens de manera secuencial. Luego podemos pasar este vector a través de un tercer MLP, que aprende la relación entre el ‘estado actual de la memoria’ y la tarea de predicción (en este caso, si el precio de las acciones bajó o subió).
Los mecanismos para actualizar los pesos son demasiado complejos para discutir en detalle en este libro, pero son similares a la lógica del algoritmo de retropropagación. La complicación adicional es rastrear el efecto compuesto de cada parámetro actuando repetidamente en su propia salida (de ahí la naturaleza ‘recurrente’ del modelo), lo que matemáticamente puede abordarse con un algoritmo modificado denominado ‘retropropagación a través del tiempo’.
La Red Neuronal Recurrente es una forma bastante intuitiva de abordar la modelización de datos secuenciales. Es otro caso de arreglos complejos de modelos de regresión lineal, pero es bastante poderoso: nos permite abordar sistemáticamente problemas difíciles de aprendizaje secuencial como el lenguaje.
Para facilitar el diagramado y la simplicidad, a menudo se representa la capa recurrente simplemente como un bloque, en lugar de como una celda expandida que actúa secuencialmente sobre una serie de entradas.
Este es el modelo más simple de una Red Neuronal Recurrente para texto: los tokens de entrada estandarizados se asignan a embeddings, que se alimentan en una capa recurrente; la salida de la capa recurrente (el ‘estado de memoria más reciente’) es procesada por un MLP y asignada a un objetivo predicho.
Sabores complejos de redes recurrentes
Las capas recurrentes permiten que las redes aborden problemas secuenciales. Sin embargo, hay algunos problemas con nuestro modelo actual de una Red Neuronal Recurrente. Para comprender cómo se utilizan las redes neuronales recurrentes en aplicaciones reales para modelar problemas difíciles, necesitamos agregar algunos detalles más.
Uno de estos problemas es la falta de profundidad: una capa recurrente simplemente pasa una vez sobre el texto y, por lo tanto, obtiene solo una lectura superficial y superficial del contenido. Considere la frase “La felicidad no es un ideal de la razón sino de la imaginación”, del filósofo Immanuel Kant. Para comprender esta frase en su verdadera profundidad, no podemos simplemente pasar por encima de las palabras una vez. En su lugar, leemos las palabras y luego — este es el paso crítico — leemos nuestros pensamientos. Evaluamos si nuestra interpretación inmediata de la oración tiene sentido y tal vez la modificamos para que tenga un sentido más profundo. Incluso podríamos leer nuestros pensamientos sobre nuestros pensamientos. Todo esto sucede muy rápido y a menudo sin nuestro conocimiento consciente, pero es un proceso que nos permite extraer múltiples capas de profundidad del contenido del texto.
Correspondientemente, podemos agregar múltiples capas recurrentes para aumentar la profundidad de comprensión. Mientras que la primera capa recurrente recoge información a nivel superficial del texto, la segunda capa recurrente lee los ‘pensamientos’ de la primera capa recurrente. El ‘estado de memoria más reciente’ doblemente informado de la segunda capa se utiliza como entrada en el MLP que toma la decisión final. Alternativamente, podríamos agregar más de dos capas recurrentes.
Para ser específicos sobre cómo funciona este mecanismo de apilamiento, consulte la siguiente figura: en lugar de simplemente pasar cada estado oculto para que se actualice, también le damos este estado de entrada a la siguiente capa recurrente. Mientras que la primera entrada a la primera capa recurrente es un embedding, la primera entrada a la segunda capa recurrente es “lo que la primera capa recurrente pensó sobre la primera entrada”.
Casi todas las Redes Neuronales Recurrentes utilizadas para problemas reales de modelado de lenguaje utilizan pilas de capas recurrentes en lugar de una sola capa recurrente debido al aumento de la profundidad de comprensión y razonamiento del lenguaje. Para grandes pilas de capas recurrentes, a menudo usamos conexiones residuales recurrentes. Recuerde el concepto de una conexión residual, en la que una versión anterior de la información se agrega a una versión posterior de la información. De manera similar, podemos colocar conexiones residuales entre los estados ocultos de cada capa de manera que las capas puedan referirse a varios ‘niveles de pensamiento’.
Aunque los modelos recurrentes pueden funcionar bien en oraciones cortas y simples como “los federales anuncian una recesión”, los documentos financieros y los artículos de noticias a menudo son mucho más largos que unas pocas palabras. Para secuencias más largas, los modelos recurrentes estándar se enfrentan a un problema persistente de pérdida de memoria a largo plazo: a menudo, la señal o importancia de las palabras al principio de la secuencia se diluyen y se ven oscurecidas por las palabras posteriores. Como cada paso agrega su propia influencia al estado oculto, destruye parcialmente un poco de la información anterior. Por lo tanto, al final de la secuencia, la mayor parte de la información del principio se vuelve irreparable. El modelo recurrente tiene una ventana estrecha de enfoque / memoria atenta. Si queremos crear un modelo que pueda mirar y analizar documentos con una comprensión y profundidad comparables a las de un ser humano, debemos abordar este problema de memoria.
La capa Long Short-Term Memory (LSTM) (1997) es una capa recurrente más compleja. Sus mecánicas específicas son demasiado complejas para ser discutidas con precisión o completamente en este libro, pero podemos entenderlo aproximadamente como un intento de separar la “memoria a largo plazo” de la “memoria a corto plazo”. Ambos componentes son relevantes cuando “leemos” una secuencia: necesitamos memoria a largo plazo para rastrear información a través de grandes distancias en el tiempo, pero también memoria a corto plazo para enfocarnos en información específica y localizada. Por lo tanto, en lugar de solo almacenar un estado oculto, la capa LSTM también usa un “estado de celda” (que representa la “memoria a largo plazo”).
En cada paso, la entrada se incorpora al estado oculto de la misma manera que en la capa recurrente estándar. Después, sin embargo, vienen tres pasos:
- Borrado de la memoria a largo plazo. La memoria a largo plazo es valiosa; contiene información que guardaremos a través del tiempo. El estado actual de la memoria a corto plazo se usa para determinar qué parte de la memoria a largo plazo ya no es necesaria y la “elimina” para dejar espacio para nueva memoria.
- Actualización de la memoria a largo plazo. Ahora que se ha liberado espacio en la memoria a largo plazo, la memoria a corto plazo se utiliza para actualizar (añadir a) la memoria a largo plazo, lo que permite incorporar nueva información a la memoria a largo plazo.
- Información de la memoria a corto plazo. En este punto, el estado de la memoria a largo plazo está completamente actualizado con respecto al paso de tiempo actual. Debido a que queremos que la memoria a largo plazo informe la función de la memoria a corto plazo, la memoria a largo plazo ayuda a eliminar y modificar la memoria a corto plazo. Idealmente, la memoria a largo plazo tiene una supervisión mayor sobre lo que es importante y lo que no es importante para mantener en la memoria a corto plazo.
Por lo tanto, la memoria a corto plazo y la memoria a largo plazo, que, recordemos, son ambas listas de números, interactúan entre sí y con la entrada en cada paso de tiempo para leer la secuencia de entrada de una manera que permite una lectura detallada sin olvidos catastróficos. Este proceso de tres pasos se representa gráficamente en la figura siguiente. Un +
indica la adición de información, mientras que x
indica la eliminación o limpieza de información. (La adición y la multiplicación son las operaciones matemáticas que se utilizan para implementar estas ideas en la práctica. Supongamos que el valor actual del estado oculto es 10. Si lo multiplico por 0.1, se convierte en 1, por lo tanto, he “reducido” la información en el estado oculto.)
Usando pilas de LSTMs con conexiones residuales, podemos construir modelos de interpretación de lenguaje poderosos que son capaces de leer (o “entender”, si lo prefieres) párrafos e incluso artículos completos de texto. Además de ser utilizados en el análisis financiero para examinar grandes volúmenes de informes financieros y de noticias, estos modelos también pueden ser utilizados para predecir a individuos potencialmente suicidas o terroristas a partir de sus textos y mensajes de redes sociales, para recomendar a los clientes productos novedosos que es probable que compren dados sus comentarios de productos anteriores, y para detectar comentarios y publicaciones tóxicos o acosadores en plataformas en línea.
Tales aplicaciones nos obligan a pensar críticamente sobre sus implicaciones filosóficas materiales. El gobierno tiene un fuerte interés en detectar posibles terroristas, y los autores de los recientes ataques a menudo han mostrado tener un registro público de redes sociales preocupante, pero la tragedia fue que no fueron encontrados en un mar de información en Internet. Los modelos de lenguaje como los modelos recurrentes, como has visto por ti mismo, funcionan puramente matemáticamente: intentan encontrar los pesos y sesgos que mejor modelan la relación entre el texto de entrada y el texto de salida. Pero en la medida en que estos pesos y sesgos signifiquen algo, pueden “leer” información de manera efectiva y extremadamente rápida, mucho más rápidamente e incluso más efectivamente que los lectores humanos. Estos modelos pueden permitir al gobierno detectar, rastrear y detener a posibles terroristas antes de que actúen. Por supuesto, esto puede ser a costa de la privacidad. Además, hemos visto cómo los modelos de lenguaje, aunque son capaces de rastrear mecánicamente patrones y relaciones dentro de los datos, son realmente solo algoritmos matemáticos que son capaces de cometer errores. ¿Cómo se debe reconciliar la identificación errónea de un individuo como un posible terrorista por parte del modelo?
Las plataformas de redes sociales, tanto bajo presión de los usuarios como del gobierno, quieren reducir el acoso y la toxicidad en los foros en línea. Esto puede parecer una tarea engañosamente simple, conceptualmente hablando: etiquetar un corpus de comentarios de redes sociales como tóxicos o no tóxicos, luego entrenar un modelo de lenguaje para predecir la toxicidad de una muestra de texto particular. El problema inmediato es que el discurso digital es increíblemente desafiante debido a la dependencia de referencias cambiantes rápidamente (memes), bromas internas, sarcasmo bien velado y conocimiento contextual previo. El problema filosófico más interesante, sin embargo, es si realmente se puede y se debe entrenar un modelo matemático (un modelo “objetivo”) para predecir un objetivo aparentemente “subjetivo” como la toxicidad. Después de todo, lo que es tóxico para una persona puede no ser tóxico para otra.
A medida que nos aventuramos en modelos que trabajan con formas cada vez más personales de datos – el lenguaje siendo el Zepe a través del cual nos comunicamos y absorbemos casi todo nuestro conocimiento – encontramos una importancia creciente para pensar y trabajar en respuesta a estas preguntas. Si estás interesado en esta línea de investigación, es posible que desees investigar sobre alineación, aprendizaje de jurados, IA constitucional, RLHF y pluralismo de valores.
Traducción automática neuronal
Conceptos: modelos recurrentes de múltiples salidas, bidireccionalidad, atención
La traducción automática es una tecnología increíble: permite a las personas que anteriormente no podían comunicarse en absoluto sin dificultad significativa, participar en un diálogo libre. Un hablante de hindi puede leer un sitio web escrito en español con un clic de un botón “Traducir esta página”, y viceversa. Un hablante de inglés que ve una película rusa puede habilitar transcripciones traducidas en vivo. Un turista chino en Francia puede pedir comida obteniendo una traducción basada en fotos del menú. La traducción automática, de una manera muy literal, fusiona idiomas y culturas.
Antes del auge del aprendizaje profundo, el enfoque dominante para la traducción automática se basaba en tablas de búsqueda. Por ejemplo, en chino, “yo” se traduce como “我”, “conducir” se traduce como “开”, y “coche” se traduce como “车”. Por lo tanto, “yo conduzco coche” se traduciría palabra por palabra como “我开车”. Sin embargo, cualquier persona bilingüe conoce las debilidades de este sistema. Muchas palabras que se deletrean igual tienen diferentes significados. Un idioma puede tener varias palabras que se traducen en otro idioma como una sola palabra. Además, diferentes idiomas tienen diferentes estructuras gramaticales, por lo que las palabras traducidas en sí mismas necesitarían ser reorganizadas. Los artículos en inglés tienen múltiples traducciones contextuales diferentes en idiomas con género como el español y el francés. Se han ideado muchos intentos de reconciliar estos problemas con soluciones lingüísticas ingeniosas, pero están limitados en eficacia para frases cortas y simples.
Por otro lado, el aprendizaje profundo nos brinda la oportunidad de construir modelos que comprendan el lenguaje de manera más profunda, quizás incluso más cercana a cómo los humanos entendemos el lenguaje, y por lo tanto realizar de manera más efectiva la importante tarea de la traducción. En esta sección, presentaremos múltiples ideas adicionales de la modelización profunda del lenguaje y culminaremos en una exploración técnica de cómo funciona Google Translate.
Modelos recurrentes de salida de texto
Actualmente, el obstáculo más evidente para construir un modelo recurrente viable es la incapacidad para generar texto de salida. Los modelos recurrentes discutidos anteriormente podían “leer” pero no “escribir”: la salida, en cambio, era un solo número (o una colección de números, un vector). Para abordar esto, necesitamos dotar a los modelos de lenguaje con la capacidad de generar series completas de texto.
Afortunadamente, no tenemos que hacer mucho trabajo. Recordemos el concepto de apilamiento de capas recurrentes presentado anteriormente: en lugar de solo recolectar el “estado de memoria” después de que la capa recurrente haya pasado por toda la secuencia, recolectamos el “estado de memoria” en cada paso de tiempo. Por lo tanto, para generar una secuencia, podemos recolectar la salida de un estado de memoria en cada paso de tiempo. Luego, pasamos cada estado de memoria a una MLP designada que predice qué palabra del vocabulario de salida predecir dado el estado de memoria (marcado como “MLP C”). La palabra con la mayor probabilidad predicha se selecciona como salida.
Para ser absolutamente claros acerca de cómo se transforma cada estado de memoria en una predicción de salida, consideremos la siguiente progresión de figuras.
En la primera figura, se pasa el primer estado oculto generado (este es el estado oculto derivado después de que la capa ha leído la primera palabra, “the”) a MLP C. MLP C produce una distribución de probabilidad sobre el vocabulario de salida; es decir, le da a cada palabra en el vocabulario de salida una probabilidad que indica qué tan probable es que esa palabra sea elegida como la traducción en ese momento. Esto es una red de alimentación directa: esencialmente estamos realizando una regresión logística en el estado oculto para determinar la probabilidad de una palabra determinada. Idealmente, la palabra con la mayor probabilidad debería ser “les”, ya que esta es la traducción al francés de “the”.
El siguiente estado oculto, derivado después de que la capa recurrente haya leído tanto ‘the’ como ‘machines’, se pasa nuevamente a MLP C. Esta vez, la palabra con la probabilidad más alta debería ser idealmente ‘machine’ (esta es la traducción en plural de ‘machines’ en francés).
La palabra más probable seleccionada en el último paso de tiempo debería ser ‘gagnent’, que es la traducción de ‘win’ en su tiempo específico. El modelo debería seleccionar ‘gagnent’ y no ‘gagner’, ni algún otro tiempo de la palabra, basado en la información previa que ha leído. Aquí es donde brillan las ventajas de usar un modelo de aprendizaje profundo para la traducción: la capacidad de comprender reglas gramaticales que se manifiestan en toda la oración.
En términos prácticos, a menudo queremos apilar varias capas recurrentes juntas en lugar de solo una capa recurrente. Esto nos permite desarrollar múltiples capas de comprensión, primero ‘comprendiendo’ lo que significa el texto de entrada, y luego reexpresando el ‘significado’ del texto de entrada en términos del idioma de salida.
Bidireccionalidad
Tenga en cuenta que la capa recurrente procede secuencialmente. Cuando lee el texto “the machines win”, primero lee “the”, luego “machines” y luego “win”. Mientras que la última palabra, “win”, se lee en el contexto de las palabras anteriores “the” y “machines”, esto no es cierto al revés: la primera palabra, “the”, no se lee en el contexto de las palabras posteriores “machines” y “win”. Este es un problema, porque a menudo hablamos en anticipación a lo que diremos después. En un idioma con género como el francés, un artículo como “the” puede adoptar muchas formas diferentes: “la” para un objeto femenino, “le” para un objeto masculino y “les” para objetos plurales. No sabemos qué versión de “the” traducir. Por supuesto, una vez que leemos el resto de la oración – “the machines” – sabemos que el objeto es plural y que debemos usar “les”. Este es un caso en el que las partes anteriores de un texto están informadas por las partes posteriores. Más en general, cuando volvemos a leer una oración, lo hacemos a menudo instintivamente sin darnos cuenta, y leemos el principio en el contexto del principio. Aunque el lenguaje se lee en secuencia, a menudo debe interpretarse ‘fuera de secuencia’ (es decir, no estrictamente unidireccionalmente de principio a fin).
Para abordar este problema, podemos usar la bidireccionalidad, una modificación simple a los modelos recurrentes que permite a las capas ‘leer’ en ambas direcciones. Una capa recurrente bidireccional es realmente dos capas recurrentes diferentes. Una capa lee hacia adelante en el tiempo, mientras que la otra lee hacia atrás. Después de que ambas terminan de leer, sus salidas en cada paso de tiempo se suman.
La bidireccionalidad permite que el modelo lea el texto de manera que el pasado se lea en el contexto del futuro, además de leer el futuro en el contexto del pasado (la funcionalidad predeterminada de una capa recurrente). Tenga en cuenta que la salida de la capa recurrente bidireccional en cada paso de tiempo está informada por toda la secuencia en lugar de solo todos los pasos de tiempo anteriores. Por ejemplo, en una secuencia de 10 pasos de tiempo, el paso de tiempo en t = 3 está informado por un ‘estado de memoria’ que ya ha leído la secuencia [t = 0] → [t = 1] → [t = 2] → [t = 3], así como otro ‘estado de memoria’ que ya ha leído la secuencia [t = 9] → [t = 8] → [t = 7] → [t = 6] → [t = 5] → [t = 4] → [t = 3].
Esta simple modificación permite una comprensión del lenguaje mucho más profunda.
Generación autoregresiva
Nuestro modelo de trabajo actual de un modelo de traducción es una gran pila de capas recurrentes (bidireccionales). Sin embargo, hay un problema: cuando traducimos un texto A a otro texto B, no solo escribimos B en referencia a A, sino que también escribimos B en referencia a sí mismo.
No podemos traducir directamente oraciones complejas del ruso “Грузовик внезапно остановился потому что дорогу переходила курица” al inglés “The truck suddenly stopped because a chicken was crossing the road” leyendo directamente el ruso: si traducimos la palabra rusa palabra por palabra en orden, obtendríamos “Truck suddenly stopped because road was crossed by chicken”. En ruso, el objeto se coloca después del sustantivo, pero mantener esta forma en inglés es ciertamente legible, pero no es suave ni “óptimo”, por así decirlo. La idea clave es esta: para obtener una traducción comprensible y utilizable, no solo necesitamos asegurarnos de que la traducción sea fiel al texto original, sino también “fiel a sí misma” (autoconsistente).
Para hacer esto, necesitamos una generación de texto diferente llamada generación autoregresiva. Esto permite que el modelo no solo traduzca cada palabra en relación al texto original, sino también a lo que el modelo ya ha traducido. La generación autoregresiva es el paradigma dominante no solo para modelos de traducción neuronal, sino para todo tipo de modelos modernos de generación de texto, incluidos los chatbots avanzados y los generadores de contenido.
Comenzamos con un modelo “codificador”. El modelo codificador, en este caso, se puede representar como una pila de capas recurrentes. El codificador lee la secuencia de entrada y deriva una salida única, la representación codificada. Esta única lista de números representa la “esencia” de la secuencia de texto de entrada en forma cuantitativa, su “significado universal/real”, por así decirlo. El objetivo del codificador es destilar la secuencia de entrada en este paquete fundamental de significado.
Una vez que se ha obtenido esta representación codificada, comenzamos la tarea de decodificación. El decodificador está estructurado de manera similar al codificador: podemos pensar en él como otra pila de capas recurrentes que acepta una secuencia y produce una salida. En este caso, el decodificador acepta la representación codificada (es decir, la salida del codificador) y un “token de inicio” especial (denominado </s>). El token de inicio representa el comienzo de una oración. La tarea del decodificador es predecir la siguiente palabra en la oración dada; en este caso, se le da una “oración de cero palabras” y, por lo tanto, debe predecir la primera palabra. En este caso, no hay contenido traducido previo, por lo que el decodificador se basa completamente en la representación codificada: predice la primera palabra, “The”.
A continuación, se encuentra el paso autoregresivo clave: tomamos las salidas anteriores del decodificador y las volvemos a enchufar en el decodificador. Ahora tenemos una “oración de una palabra” (el token de inicio seguido de la palabra “The”). Ambos tokens se pasan al decodificador, junto con la representación codificada, la misma que antes, producida por el codificador, y ahora el decodificador predice la siguiente palabra, “truck”.
Este token se trata luego como otra entrada. Aquí, podemos darnos cuenta más claramente de por qué la generación autoregresiva es un andamio algorítmico útil para la generación de texto: al saber que la oración de trabajo actual es “The truck”, esto limita cómo podemos completarla. En este caso, la siguiente palabra probablemente será un verbo o un adverbio, lo cual “sabemos” como una estructura gramatical. Por otro lado, si el decodificador solo tuviera acceso al texto ruso original, no podría limitar efectivamente el conjunto de posibilidades. En este caso, el decodificador puede hacer referencia tanto a lo que se ha traducido previamente como al significado de la oración rusa original para predecir correctamente la siguiente palabra como “suddenly”.
Este proceso de generación autoregresivo continúa:
Por último, para terminar una oración, el modelo decodificador predice un ‘token final’ designado (denotado como </e>). En este caso, el decodificador habrá ‘comparado’ la oración traducida actual contra la representación codificada para determinar si la traducción es satisfactoria y detener el proceso de generación de la oración.
Google Translate 2016
Hasta ahora, hemos cubierto mucho terreno. Ahora, tenemos la mayoría de las piezas necesarias para desarrollar una comprensión bastante completa de cómo se diseñó el modelo de Google Translate. No necesito decir mucho acerca de la importancia de un modelo como el proporcionado por Google Translate: incluso si es áspero, un sistema de traducción neuronal preciso y accesible rompe muchas barreras del lenguaje. Para nosotros, este modelo particular ayuda a unificar muchos de los conceptos que hemos hablado en una aplicación cohesiva.
Esta información se toma del documento de traducción neuronal de Google de 2016, que presentó el sistema de aprendizaje profundo de Google para la traducción automática. Si bien es casi seguro que el modelo en uso ha cambiado en los muchos años desde entonces, este sistema sigue siendo un interesante estudio de caso en los sistemas de traducción neuronal automática. Para mayor claridad, nos referiremos a este sistema como ‘Google Translate’, reconociendo que probablemente no es actual.
Google Translate utiliza un modelo autoregresivo codificador-decodificador. Es decir, el modelo consta de un componente codificador y un componente decodificador; el decodificador es autoregresivo (recuerde que acepta las salidas generadas previamente como entrada, además de otra información, en este caso la salida del codificador).
El codificador es una pila de siete capas de memoria a corto y largo plazo (LSTM). La primera capa es bidireccional (por lo tanto, hay técnicamente 8 capas, ya que una capa bidireccional ‘cuenta como dos’), lo que le permite capturar patrones importantes en el texto de entrada en ambas direcciones (figura inferior, izquierda). Además, la arquitectura emplea conexiones residuales entre cada capa (figura inferior, derecha). Recuerde de la discusión anterior que las conexiones residuales en las redes neuronales recurrentes pueden implementarse mediante la adición de la entrada a una capa recurrente a la salida en cada paso de tiempo, de modo que la capa recurrente termine aprendiendo la diferencia óptima que se aplicará a la entrada.
El decodificador también es una pila de ocho capas LSTM. Acepta la secuencia generada previamente de manera autoregresiva, comenzando con el token de inicio </s>
. La arquitectura de traducción automática neuronal de Google, sin embargo, utiliza tanto la generación autoregresiva como la atención.
Se calculan puntuaciones de atención para cada una de las palabras originales del texto (representadas por los estados ocultos en el codificador, que transforman iterativamente el texto pero aún lo representan posicionalmente). Podemos pensar en la atención como un diálogo entre el decodificador y el codificador. El decodificador dice: “He generado [oración] hasta ahora, quiero predecir la próxima palabra traducida. ¿Cuáles son las palabras en la oración original más relevantes para esta próxima palabra traducida?” El codificador responde: “Déjame ver en qué estás pensando, y lo compararé con lo que he aprendido sobre cada palabra en la entrada original… ah, deberías prestar atención a [palabra A], pero no tanto a [palabra B] y [palabra C], son menos relevantes para predecir la próxima palabra en particular”. El decodificador agradece al codificador: “Pensaré en esta información para determinar cómo generar, de modo que me centre en [palabra A]”. La información sobre la atención se envía a cada capa LSTM, de modo que esta información de atención se conoce en todos los niveles de generación.
Esto representa la mayor parte del sistema de traducción neuronal de Google. El modelo se entrena en un gran conjunto de datos de tareas de traducción: dada la entrada en inglés, por ejemplo, predecir la salida en español. El modelo aprende las mejores formas de leer (es decir, los parámetros en el codificador), las mejores formas de prestar atención a la entrada (es decir, el cálculo de la atención) y las mejores formas de relacionar la entrada atendida con una salida en español (es decir, los parámetros en el decodificador).
Trabajos posteriores han ampliado los sistemas de traducción automática neuronal a la capacidad multilingüe, en la que un solo modelo puede ser utilizado para traducir entre múltiples pares de idiomas. Esto no solo es necesario desde un punto de vista práctico —es inviable entrenar y almacenar un modelo para cada par de idiomas— sino que también ha demostrado mejorar la traducción entre cualquier par de idiomas. Además, el documento GNMT proporciona detalles sobre el entrenamiento —esta es una arquitectura muy profunda que está limitada por el hardware— y la implementación real —los modelos grandes no solo son lentos para entrenar, sino también para obtener predicciones, pero los usuarios de Google Translate no quieren tener que esperar más de unos pocos segundos para traducir el texto.
Aunque el sistema GNMT ciertamente es un hito en la comprensión computacional del lenguaje, unos pocos años después una nueva, en algunos aspectos radicalmente simplificada, aproximación cambiaría por completo el modelado del lenguaje y prescindiría por completo de las capas recurrentes que trabajamos con tanto esfuerzo para entender. ¡Manténgase atento a una segunda publicación sobre los Transformers!
¡Gracias por leer!
En esta publicación, realizamos un estudio exhaustivo de las redes neuronales recurrentes: su lógica de diseño, características más complejas y aplicaciones.
Algunos puntos clave:
- Las RNN son una extensión natural de las redes de alimentación directa y se pueden utilizar para la traducción automática. Las RNN están diseñadas para rastrear la información aprendida hasta ahora y relacionar la nueva información con la información previamente vista, similar a cómo los humanos procesan la información secuencial.
- Las RNN utilizan capas recurrentes que tienen un estado oculto que representa la memoria a corto plazo.
- Las capas recurrentes se pueden apilar para aumentar la profundidad de comprensión y razonamiento en la red.
- Las redes LSTM (Memoria a Largo Plazo) son un tipo más complejo de capa recurrente que separa la memoria a largo plazo de la memoria a corto plazo. Las LSTM tienen mecanismos para borrar, actualizar e informar tanto la memoria a largo plazo como la memoria a corto plazo.
- Las RNN tienen aplicaciones en diversos campos como el análisis financiero, el análisis de redes sociales, los sistemas de recomendación y la traducción de idiomas.
- El uso de RNN en aplicaciones del mundo real plantea preguntas filosóficas y éticas sobre la privacidad, errores del modelo y subjetividad en la etiquetado de contenido tóxico o perjudicial.
- La traducción automática neuronal es una aplicación poderosa de las RNN que permite la traducción de idiomas diferentes, facilitando la comunicación y el intercambio cultural.
Todas las fotos son del autor.