En una red neuronal recurrente, generalmente reenviaría la propagación a través de varios pasos de tiempo, "desenrollaría" la red y luego la propagación hacia atrás a través de la secuencia de entradas.
¿Por qué no simplemente actualizar los pesos después de cada paso individual en la secuencia? (el equivalente a usar una longitud de truncamiento de 1, por lo que no hay nada que desenrollar) Esto elimina por completo el problema de gradiente de fuga, simplifica enormemente el algoritmo, probablemente reduciría las posibilidades de quedarse atascado en los mínimos locales y, lo más importante, parece funcionar bien . Entrené un modelo de esta manera para generar texto y los resultados parecían comparables a los resultados que he visto de los modelos entrenados BPTT. Solo estoy confundido sobre esto porque cada tutorial sobre RNN que he visto dice usar BPTT, casi como si fuera necesario para un aprendizaje adecuado, lo cual no es el caso.
Actualización: agregué una respuesta
Respuestas:
Editar: cometí un gran error al comparar los dos métodos y tengo que cambiar mi respuesta. Resulta que lo estaba haciendo, simplemente propagándome en el paso de tiempo actual, en realidad comienza a aprender más rápido. Las actualizaciones rápidas aprenden los patrones más básicos muy rápidamente. Pero en un conjunto de datos más grande y con un tiempo de entrenamiento más largo, BPTT de hecho se destaca. Estaba probando una pequeña muestra durante unas pocas épocas y asumí que quien comience a ganar la carrera será el ganador. Pero esto me llevó a un hallazgo interesante. Si comienza su entrenamiento de nuevo propagándose en un solo paso de tiempo, luego cambie a BPTT y aumente lentamente la distancia de propagación, obtendrá una convergencia más rápida.
fuente
Un RNN es una red neuronal profunda (DNN) donde cada capa puede tomar una nueva entrada pero tiene los mismos parámetros. BPT es una palabra elegante para Back Propagation en dicha red, que en sí misma es una palabra elegante para Gradient Descent.
Decir que los RNN salidas y t en cada paso y e r r o r t = ( y t - y t ) 2y^t
Para aprender los pesos, necesitamos gradientes para que la función responda a la pregunta "¿cuánto afecta un cambio en el parámetro a la función de pérdida?" y mueva los parámetros en la dirección dada por:
Es decir, tenemos un DNN donde obtenemos comentarios sobre qué tan buena es la predicción en cada capa. Dado que un cambio en el parámetro cambiará cada capa en el DNN (paso de tiempo) y cada capa contribuye a las próximas salidas, esto debe tenerse en cuenta.
Tome una red simple de una capa de neurona uno para ver esto semi-explícitamente:
¿Quizás cada paso contribuirá con una dirección cruda que es suficiente en la agregación? ¡Esto podría explicar sus resultados, pero me interesaría saber más sobre su método / función de pérdida! También estaría interesado en una comparación con un ANN de ventana de dos pasos.
edit4: Después de leer los comentarios, parece que su arquitectura no es un RNN.
Su modelo: sin estado: estado oculto reconstruido en cada pasoedit2: se agregaron más referencias a DNNs edit3: corrección gradual y alguna edición de notación5: se corrigió la interpretación de su modelo después de su respuesta / aclaración.fuente
fuente