28 · Encoder-Decoder: la arquitectura Seq2Seq
Dos RNNs en tándem: el encoder comprime la entrada en un vector de contexto; el decoder genera tokens de salida uno a uno, inicializado con ese contexto.
Dos RNNs en tándem: el ENCODER comprime la secuencia de entrada en un vector de contexto; el DECODER genera la secuencia de salida token a token, condicionado en ese contexto.
Sin esto:
Sin seq2seq no puedes modelar traducción automática, resumen de texto, ni ninguna tarea de secuencia a secuencia.
Cada arquitectura de RNN que hemos estudiado hasta ahora mapea una secuencia a un vector de longitud fija (muchos a uno) o a una secuencia de la misma longitud (muchos a muchos). Pero la traducción, el resumen y la respuesta a preguntas comparten una estructura diferente: las secuencias de entrada y salida tienen longitudes distintas y desconocidas. "The cat sat." son tres palabras en inglés; "Le chat s'est assis." son cinco palabras en francés.
El modelo secuencia a secuencia (seq2seq) — introducido por Sutskever, Vinyals y Le en 2014 — resuelve esto con dos pilas que se comunican:
-
Encoder: un LSTM (o GRU) procesa toda la secuencia de entrada y la condensa en un único vector de tamaño fijo — el vector de contexto (también llamado vector de pensamiento). Este es el estado oculto final del encoder.
-
Decoder: un LSTM separado inicializado con el vector de contexto. Genera un token de salida por paso temporal. Crucialmente, el decoder es autoregresivo: cada token de salida que genera se retroalimenta como entrada al siguiente paso. El decoder se ejecuta hasta producir un token especial
<EOS>(fin de secuencia).
Los dos LSTMs tienen matrices de pesos completamente separadas — el encoder aprende a resumir la entrada; el decoder aprende a expandir un resumen en tokens de salida. Solo el estado oculto final del encoder se pasa al decoder; después de eso, las dos pilas proceden de forma independiente.
Arquitectura Seq2Seq: encoder LSTM → vector de contexto → decoder LSTM generación autorregresiva
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Trucos de entrenamiento Seq2Seq: teacher forcing, tokens SOS/EOS, muestreo programado
Read-along de PyTorch: clase Seq2Seq con módulos Encoder y Decoder nn.LSTM separados
¿Por qué se usa teacher forcing durante el entrenamiento seq2seq?
- Seq2Seq usa dos LSTMs separados: el encoder lee la entrada completa y produce un vector de contexto; el decoder se inicializa con ese vector y genera tokens de salida de forma autorregresiva.
- Teacher forcing alimenta tokens anteriores correctos durante el entrenamiento para evitar la acumulación de errores; el muestreo programado cambia gradualmente a usar las propias predicciones del modelo para consistencia en inferencia.
- El problema del cuello de botella: toda la entrada se comprime en un único vector de contexto de tamaño fijo — esto perjudica el rendimiento en secuencias largas y motiva la atención (lección 29).
El sistema de traducción en producción de Google en 2016 era un seq2seq profundo con atención. Síntesis de voz (Tacotron), resumen de texto, generación de código — todos son variantes de seq2seq.
Si lo quitas: Encontrarías 'encoder', 'decoder', 'vector de contexto' y 'decodificación autorregresiva' en cada paper de NLP sin entender qué significan mecánicamente — conceptos que las arquitecturas transformer heredaron directamente de seq2seq.