Puedo ver dos motivos para usar degradados sintéticos en RNN:
- Para acelerar el entrenamiento, corrigiendo inmediatamente cada capa con gradiente predicho
- Para poder aprender secuencias más largas
Veo problemas con los dos. Tenga en cuenta que realmente me gustan los degradados sintéticos y me gustaría implementarlos. Pero necesito entender dónde mi rastro de pensamiento es incorrecto.
Ahora mostraré por qué el punto 1 y el punto 2 no parecen ser beneficiosos, y necesito que me corrijan, si en realidad son beneficiosos:
Punto 1:
Los degradados sintéticos nos dicen que podemos confiar en otra "mini-red auxiliar" (llamada DNI) para asesorar a nuestra capa actual sobre qué degradados llegarán desde arriba, incluso durante el apoyo fwd.
Sin embargo, tales gradientes solo vendrán varias operaciones más tarde. Tendrá que hacer la misma cantidad de Backprop que sin DNI, excepto que ahora también tenemos que entrenar nuestro DNI.
Agregar esta asincronía no debería hacer que las capas entrenen más rápido que durante la secuencia de fwdprop completa> bloqueada,> porque el dispositivo debe realizar la misma cantidad de cálculos. Es solo que los cálculos se deslizarán a tiempo
Esto me hace pensar que el punto 1) no funcionará. Simplemente agregar SG entre cada capa no debería mejorar la velocidad de entrenamiento.
Punto 2:
Ok, ¿qué tal si agregamos SG solo en la última capa para predecir el "gradiente del futuro" y solo si es el último paso de tiempo durante el apoyo hacia adelante .
De esta manera, aunque nuestro LSTM debe dejar de predecir y debe propagarse hacia atrás, aún puede predecir el gradiente futuro que habría recibido (con la ayuda de DNI en el último paso).
Considere varias sesiones de entrenamiento (sesión A, sesión B):
fwdprop timestep_1A ---> fwdprop timestep_2A ---> fwdprop timestep_3A ----> detener y bkprop!
fwdprop timestep_1B ---> fwdprop timestep_2B ---> fwdprop timestep_3B ----> detener y bkprop!
Acabamos de forzar a nuestra red a "analizar" 6 veces en dos mitades: 3 veces, luego 3 veces más.
Tenga en cuenta que tenemos nuestro DNI sentado al final de la "Sesión A" y que predice "qué gradiente obtendría desde el comienzo de la Sesión B (desde el futuro)". Debido a eso, timestep_3A estará equipado con un gradiente "que habría venido de timestep_1B", por lo que las correcciones realizadas durante A serán más confiables.
¡Pero hey! Estos "gradientes sintéticos" predichos serán muy pequeños (insignificantes) de todos modos, después de todo, es por eso que comenzamos una nueva sesión B de backprop . No eran demasiado pequeños, simplemente analizaríamos los 6 pasos en una sola "sesión A" larga de bkprop.
Por lo tanto, creo que el punto 2) tampoco debería beneficiar. Agregar SG en el último paso de tiempo de fwdprop permite entrenar efectivamente secuencias más largas, pero los gradientes que desaparecen no fueron a ninguna parte.
Okay. ¿Quizás podamos obtener el beneficio de entrenar "sesión A" , "sesión B", etc. en máquinas separadas? Pero entonces, ¿en qué se diferencia esto de simplemente entrenar con los habituales minibatches en paralelo? Tenga en cuenta que se mencionó en el punto 2: la sesión empeora las cosas, lo que predice gradientes que se desvanecen de todos modos.
Pregunta: Por favor, ayúdame a comprender el beneficio del Gradiente Sintético, porque los 2 puntos anteriores no parecen ser beneficiosos