27 · RNNs Bidireccionales
Ejecuta dos RNNs — adelante y atrás — y concatena sus estados ocultos. Cada token ve contexto pasado y futuro, crucial para tareas a nivel de token como NER.
Una RNN bidireccional ejecuta DOS RNNs — una hacia adelante, otra hacia atrás — y concatena sus estados ocultos. Cada posición de salida ve contexto pasado y futuro.
Sin esto:
Las RNNs unidireccionales solo ven el pasado; para tareas a nivel de token (NER, etiquetado POS) la siguiente palabra a menudo da contexto crucial.
Considera la oración: "The bank of the river flooded." Una RNN unidireccional que procesa "bank" solo ha visto ["The", "bank"] — no suficiente para decidir si "bank" se refiere a una institución financiera o a una orilla del río. El modelo unidireccional no verá "river" hasta dos pasos después, momento en el que "bank" ya ha sido procesado y su estado oculto transmitido.
Una RNN bidireccional resuelve esto ejecutando la secuencia dos veces:
- RNN hacia adelante — procesa token 1 → 2 → … → T. En la posición t, produce
h_forward_tque resume los tokens 1…t. - RNN hacia atrás — procesa token T → T-1 → … → 1. En la posición t, produce
h_backward_tque resume los tokens T…t.
Para cada token t, la representación final es la concatenación [h_forward_t; h_backward_t]. El estado oculto hacia adelante lleva contexto de la IZQUIERDA; el estado oculto hacia atrás lleva contexto de la DERECHA. En "bank", la RNN hacia adelante ha visto ["The", "bank"] y la RNN hacia atrás ha visto ["flooded", "river", "the", "of", "bank"] — más que suficiente para desambiguar.
Esto duplica la dimensionalidad de salida (2 × hidden_size por token) y cuesta aproximadamente el doble de computación — pero para tareas a nivel de token donde importa el contexto local en ambos lados, el intercambio casi siempre vale la pena.
RNN bidireccional: forward izquierda a derecha, backward derecha a izquierda, concat por token
Python (in browser)
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Cuándo usar bidireccional: secuencia completa disponible + tareas a nivel de token; nunca para generación autorregresiva
Read-along de PyTorch: bidirectional=True para nn.LSTM y nn.GRU
¿Por qué no puedes usar una RNN bidireccional para predicción de la siguiente palabra?
- Una RNN bidireccional ejecuta dos RNNs separadas (adelante + atrás) y concatena sus estados ocultos por token, dando a cada posición contexto izquierdo y derecho.
- La dimensionalidad de salida se duplica a 2 * hidden_size por token; en PyTorch agrega bidirectional=True y actualiza los tamaños de entrada de las capas downstream.
- Los modelos bidireccionales requieren la secuencia completa en tiempo de inferencia — nunca usarlos para generación autorregresiva o tareas de streaming online.
BiLSTM-CRF fue el estado del arte para el etiquetado de secuencias (NER, POS) desde aproximadamente 2015 hasta que llegó BERT en 2018. Los pipelines de NER en producción lo usaron durante años y muchos todavía lo hacen en idiomas con pocos recursos. BERT es el Transformer bidireccional que lo reemplazó.
Si lo quitas: Saltarías directamente a BERT sin entender por qué 'bidireccional' está en su nombre o por qué no puede usarse para generación — una distinción arquitectónica crítica que confunde a muchos profesionales.