¿Por qué propagarse a través del tiempo en un RNN?

14

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

Frobot
fuente
Una dirección interesante para llevar a cabo esta investigación sería comparar los resultados que ha logrado en su problema con los puntos de referencia publicados en la literatura sobre problemas RNN estándar. Eso haría un artículo realmente genial.
Sycorax dice Reinstate Monica
Su "Actualización: agregué una respuesta" reemplazó la edición anterior con la descripción de su arquitectura y una ilustración. ¿Es a propósito?
ameba dice Reinstate Monica
Sí, lo saqué porque realmente no parecía relevante para la pregunta real y ocupaba mucho espacio, pero puedo agregarlo de nuevo si ayuda
Frobot
Bueno, la gente parece tener grandes problemas para comprender su arquitectura, por lo que creo que cualquier explicación adicional es útil. Puede agregarlo a su respuesta en lugar de su pregunta, si lo prefiere.
ameba dice Reinstate Monica

Respuestas:

4

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.

Frobot
fuente
Gracias por tu actualización. En la fuente de esa última imagen, dice esto sobre la configuración uno a uno : "Modo de procesamiento de vainilla sin RNN, desde entrada de tamaño fijo hasta salida de tamaño fijo (por ejemplo, clasificación de imagen)". Entonces eso es lo que estábamos diciendo. Si es como lo has descrito, no tiene estado y no es un RNN. "propagación hacia adelante a través de una sola entrada antes de propagación hacia atrás" - Yo lo llamaría un ANN. Pero estos no funcionarían tan bien con el texto, así que algo pasa y no tengo idea de qué porque no tengo el código
ragulpr
No leí esa parte y estás en lo correcto. El modelo que estoy usando es en realidad el "muchos a muchos" en el extremo derecho. Supuse que en la sección "uno a uno" había realmente muchos de estos todos conectados y el dibujo simplemente lo omitió. pero esa en realidad es una de las opciones en el extremo derecho que no noté (es extraño tenerla allí en un blog sobre RNN, así que asumí que todas eran recurrentes).
Editaré
Me imaginé que ese era el caso, por eso insistí en ver tu función de pérdida. Si se trata de muchos a muchos su pérdida es similar a y es idénticamente un RNN y ya está propaga / inputing toda la secuencia, pero entonces sólo truncar BPTT que decir' d calcular la parte roja en mi publicación pero no repetir más. error=t(yty^t)2
ragulpr
Mi función de pérdida no se suma con el tiempo. Tomo una entrada, obtengo una salida, luego calculo una pérdida y actualizo los pesos, luego paso a t + 1, por lo que no hay nada que sumar. Agregaré la función de pérdida exacta a la publicación original
Frobot
Simplemente publique su código. No voy a adivinar más, esto es una tontería.
ragulpr
2

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

errort=(yt-y^t)2

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:

errort=2(yty^t)y^t

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:

y^t+1=f(a+bxt+cy^t)ay^t+1=f(a+bxt+cy^t)cay^tby^t+1=f(a+bxt+cy^t)(xt+cby^t)cy^t+1=f(a+bxt+cy^t)(y^t+ccy^t)y^t+1=f(a+bxt+cy^t)([0xty^t]+cy^t)

δ

[a~b~c~][abc]+δ(yty^t)y^t

y^t+1y^tt

error=t(yty^t)2

¿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.

ht Statefull

Su modelo: sin estado: estado oculto reconstruido en cada paso stateless edit2: 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.

ragulpr
fuente
1
Gracias por su respuesta. Sin embargo, creo que puede haber entendido mal lo que estoy haciendo. En la propagación hacia adelante solo hago un paso, por lo que en la propagación hacia atrás también es solo un paso. No reenvío propagación a través de múltiples entradas en la secuencia de entrenamiento. Veo lo que quiere decir sobre una dirección cruda que es suficiente en la agregación para permitir el aprendizaje, pero he verificado mis gradientes con gradientes calculados numéricamente y coinciden con más de 10 decimales. El apoyo trasero funciona bien. Estoy usando la pérdida de entropía cruzada.
Frobot
1
Estoy trabajando para tomar mi mismo modelo y volver a entrenarlo con BPTT mientras hablamos para tener una comparación clara. También he entrenado un modelo usando este algoritmo de "un paso" para predecir si el precio de una acción aumentará o disminuirá para el día siguiente, lo que está obteniendo una precisión decente, por lo que tendré dos modelos diferentes para comparar BPTT versus un solo paso atrás.
Frobot
y^t+1=f(xt,xt1)
1
Estoy usando una ventana deslizante de tamaño 1, pero los resultados son muy diferentes a hacer una ventana deslizante de tamaño 2 ANN con entradas (xt, xt − 1). A propósito, puedo dejar que se ajuste demasiado al aprender un gran cuerpo de texto y puede reproducir todo el texto con 0 errores, lo que requiere conocer dependencias a largo plazo que serían imposibles si solo tuviera (xt, xt − 1) como entrada. La única pregunta que me queda es si usar BPTT permitiría que las dependencias se alarguen, pero honestamente no parece que lo haría.
Frobot
y^t2y^t=0
1

dF(g(x),h(x),m(x))dx=Fgdgdx+Fhdhdx+Fmdmdx

tHtθxtHt1HttLθ

θXtθun(Xt,θ)θ. Pero nuestro error también fue el resultado de alguna contribución deHt-1, que también era una función de θ, ¿derecho? Entonces necesitamos descubrirθHt-1, que era una función de Xt-1, θ y Ht-2. PeroHt-2 También era una función una función de θ. Y así.

Matthew Hampsey
fuente
Entiendo por qué se propaga a través del tiempo en un RNN tradicional. Estoy tratando de averiguar por qué un RNN tradicional usa múltiples entradas a la vez para el entrenamiento, cuando usar solo una a la vez es mucho más simple y también funciona
Frobot
El único sentido en el que puede alimentar múltiples entradas a la vez en un RNN es alimentar en múltiples ejemplos de capacitación, como parte de un lote. El tamaño del lote es arbitrario, y la convergencia está garantizada para cualquier tamaño, pero los tamaños de lote más altos pueden conducir a estimaciones de gradiente más precisas y una convergencia más rápida.
Matthew Hampsey
Eso no es lo que quise decir con "entradas múltiples a la vez". No lo dije muy bien. Me refería a que usualmente reenvías la propagación a través de varias entradas en la secuencia de entrenamiento, luego regresas la propagación a todas y luego actualizas los pesos. Entonces, la pregunta es, ¿por qué propagarse a través de una secuencia completa cuando hacer una sola entrada a la vez es mucho más fácil y sigue funcionando
Frobot
Creo que se requiere alguna aclaración aquí. Cuando dice "entradas", ¿se refiere a múltiples ejemplos de entrenamiento, o se refiere a múltiples pasos de tiempo dentro de un solo ejemplo de entrenamiento?
Matthew Hampsey
1
Publicaré una respuesta a esta pregunta para fines de hoy. Terminé de hacer una versión BPTT, solo tengo que entrenar y comparar. Después de eso, si todavía quieres ver algún código, avísame qué quieres ver y supongo que aún podría publicarlo
Frobot