BPTT tiene dos problemas con sus gradientes: el problema de explosión de los gradientes y el problema de desaparición del gradiente. Leí por primera vez sobre estos temas en Pascanu et al., 2013 [1].
Aquí están mis explicaciones para ellos. Comienza con la fórmula de vainilla RNN:
[matemáticas] h_t = f (R \ cdot h_ {t-1} + U \ cdot x_t), [/ math]
- ¿Cuál es el significado de muchas sinapsis entre dos neuronas en la red neuronal?
- ¿En qué año la publicidad de AI / Machine Learning se pondrá al día con la realidad?
- Después de las estructuras de datos y algoritmos (DSA), ¿qué debo aprender (ML, AI, ciencia de datos)? ¿O debería comenzar a hacer algunos proyectos sobre cosas que ya he aprendido?
- ¿Qué tan difícil es para un estudiante de pregrado ser aceptado en un grupo de investigación en la universidad?
- ¿Cómo se hizo Andrew Ng tan bueno en Machine Learning?
donde [math] x_t, h_t \ in \ mathbb {R} ^ {d} [/ math] son la señal de entrada y el estado oculto recurrente en el paso de tiempo [math] t [/ math], respectivamente y [math] R, U \ in \ mathbb {R} ^ {d \ times d} [/ math] son los parámetros.
BPTT calcula los gradientes en el paso de tiempo [matemática] t-1 [/ matemática] a partir de los del paso de tiempo [matemática] t [/ matemática], produciendo el siguiente término
[matemáticas] \ frac {\ partial L} {\ partial h_ {t-1}} = (…) + R ^ {\ top} \ cdot \ frac {\ partial L} {\ partial h_t} [/ matemática]
Ahora, si aplica el mismo razonamiento al paso de tiempo [matemáticas] t-2 [/ matemáticas], tendrá el siguiente término en sus gradientes:
[matemáticas] (R ^ {\ top}) ^ 2 \ cdot \ frac {\ partial L} {\ partial h_t} [/ math]
Y repita este argumento hasta el primer estado [matemáticas] h_1 [/ matemáticas], tendrá el término
[matemáticas] (R ^ {\ top}) ^ {t-1} \ cdot \ frac {\ partial L} {\ partial h_t} [/ math]
Este tipo travieso [matemáticas] (R ^ {\ top}) ^ {t-1} [/ matemáticas] es la raíz de todos los males. En efecto,
- Si [matemáticas] | R ^ {\ top} | > 1 [/ math] luego [math] | (R ^ {\ top}) ^ {t-1} | [/ math] se volverá muy grande cuando realices BPTT a través de una secuencia larga, lo que resultará en números muy grandes que potencialmente causar problemas con la estabilidad numérica, es decir, tendrá muchos
NaN
einf
. Esto se llama el problema de explosión de gradiente . - Si [matemáticas] | R ^ {\ top} | <1 [/ math] luego [math] | (R ^ {\ top}) ^ {t-1} | [/ math] se volverá muy pequeño, y pase lo que pase en el paso de tiempo [math] t [/ math] tener muy poco impacto en el primer estado [matemáticas] h_1 [/ matemáticas]. Esto no es deseado, ya que cuando usamos RNNs, queremos que modelen las dependencias a largo plazo en nuestras secuencias. Esto se llama el problema de desaparición de gradiente .
Dicho esto, el algoritmo BPTT y su variación BPTT truncada siguen siendo muy relevantes para los RNN, ya que son la única forma (suficientemente eficiente) de calcular gradientes de RNN. No son más que una aplicación de la regla de la cadena, también conocida como la misma regla que respalda el algoritmo normal de retropropagación. De hecho, si usa software de diferenciación automática como Torch, TensorFlow o Theano, todos usan la regla de la cadena para calcular los gradientes de sus gráficos computacionales. Al aplicarse en RNN, estos no serán más que BPTT o BPTT truncado. Entonces sí, deberías aprenderlos.
[1] http://www.jmlr.org/proceedings/…