25 · Entrenamiento de LSTMs en la práctica
El entrenamiento LSTM usa la misma maquinaria BPTT que las RNNs vanilla — pero la actualización aditiva del estado de celda hace que los gradientes de largo alcance sobrevivan. Así se ve en números.
El entrenamiento LSTM usa la misma maquinaria BPTT que las RNNs vanilla — pero la actualización aditiva del estado de celda hace que los gradientes de largo alcance sobrevivan.
Sin esto:
Sin ver el entrenamiento LSTM en acción asumirías que la arquitectura es mágica; en realidad es solo backprop estándar con un mejor flujo de gradientes.
La novedad arquitectónica del LSTM es el estado de celda — pero una vez construida la red, entrenarla usa exactamente el mismo algoritmo que una RNN vanilla: Retropropagación a través del tiempo (BPTT). Despliegas el grafo de computación a través de cada paso temporal, calculas la pérdida en la salida y ejecutas loss.backward(). PyTorch hace todo eso automáticamente.
Lo que cambia es por dónde fluyen los gradientes. En una RNN vanilla cada señal de gradiente debe pasar a través de la matriz de pesos recurrente W_hh y a través de la derivada de tanh (1 - tanh^2) en cada paso temporal. En cuanto esos factores son menores a 1 (generalmente lo son), el producto de 50 de esos factores se redondea a cero. La RNN es ciega a eventos que ocurrieron hace más de ~20 pasos.
En el LSTM el gradiente del estado de celda c_t respecto al estado de celda anterior c_{t-1} es simplemente f_t — el valor del gate de olvido, elementalmente. Cuando el gate de olvido está cerca de 1 (la red aprendió a recordar), el producto de 50 valores del gate de olvido puede permanecer cerca de 1. Esto es lo que Hochreiter y Schmidhuber llamaron el carrusel de error constante: una ruta de gradiente a través del estado de celda que evita por completo el problema del aplastamiento.
Pero "cerca de 1" no está garantizado. La red aprende los valores del gate de olvido. Si la tarea genuinamente requiere olvidar (dependencias de corto alcance), los gates de olvido serán pequeños y los gradientes se desvanecerán — intencionalmente. El LSTM da la opción de memoria de largo alcance; no la fuerza.
Python (in browser)
Magnitud del gradiente vs pasos hacia atrás: RNN vanilla desaparece en el paso 20; LSTM con forget~0.95 sobrevive 100 pasos
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
El carrusel de error constante: el gradiente del estado de celda está controlado por los gates de olvido, no por radios espectrales de matrices
El recorte de gradientes es estándar para el entrenamiento LSTM — siempre usar clip_grad_norm_ antes de optimizer.step()
Ciclo completo de entrenamiento LSTM: embedding → LSTM → cabeza lineal, con recorte de gradientes
Tips de entrenamiento LSTM: inicialización del bias del gate de olvido, tamaño oculto, placement del dropout, optimizador
¿Por qué los LSTMs evitan el problema del gradiente desvanecido en la práctica?
- El entrenamiento LSTM es BPTT estándar; la ventaja de gradientes viene de la ruta aditiva del estado de celda, no de un algoritmo de entrenamiento diferente.
- Siempre usar recorte de gradientes (clip_grad_norm_ con max_norm=1.0) al entrenar LSTMs — los gradientes explosivos a través de la ruta del estado oculto todavía son posibles.
- Inicializar los biases del gate de olvido en 1, usar dropout entre capas LSTM apiladas (no dentro de los pasos temporales), y evitar BatchNorm dentro de los LSTMs.
Todo modelo basado en LSTM en producción usa recorte de gradientes + inicialización del bias del gate de olvido = 1. Estos son pequeños trucos que convierten 'no entrena' en 'entrena limpiamente'. El modelo de pronóstico AWS DeepAR, muchos backends de reconocimiento de voz y pipelines de NLP clínico dependen de estos valores predeterminados.
Si lo quitas: Tratarías el entrenamiento LSTM como una caja negra, perdiendo las dos intervenciones más baratas (recorte de gradientes + inicialización del bias) que a menudo arreglan un entrenamiento roto antes de necesitar ajustar la arquitectura o los datos.