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
fuente
Respuestas:
-Eso no es necesariamente correcto. Por lo general, truncamos e iniciamos un nuevo backprop debido a restricciones de hardware, como la memoria o la velocidad computacional. El gradiente de fuga se puede mejorar por otros medios, como la Normalización de degradado: ampliar el vector de gradiente si se vuelve demasiado pequeño más allá de ciertas capas, o reducirlo si está a punto de explotar. O incluso usando Batch Normalization
Es importante entender cómo actualizar cualquier módulo DNI. Para aclarar las cosas, considere un ejemplo de red con varias capas y 3 módulos DNI:
Las capas anteriores tendrán que contentarse con gradientes sintéticos, porque ellos o su DNI nunca presenciarán el "gradiente verdadero".
Con respecto al entrenamiento en paralelo con minibatches en lugar de Paralelizar a través de graduados sintéticos:
Las secuencias más largas son más precisas que los minibatches, sin embargo, los minibatches agregan un efecto de regulización . Pero, dada alguna técnica para evitar que el gradiente explote o desaparezca, el entrenamiento de secuencias más largas puede proporcionar una mejor comprensión del contexto del problema. Esto se debe a que la red infiere salida después de considerar una secuencia de entrada más larga, por lo que el resultado es más racional.
Para la comparación de los beneficios otorgados por SG, consulte los diagramas de la página 6 del documento , principalmente para poder resolver secuencias más largas, lo que creo que es más beneficioso (de todos modos, ya podemos paralelizar a través de Minibatches, por lo que SG no debería acelerar el proceso cuando se realiza en la misma máquina, incluso si de hecho solo propagamos hasta el próximo DNI).
Sin embargo, cuantos más módulos DNI tengamos, más ruidosa debería ser la señal. Por lo tanto, podría valer la pena entrenar las capas y el DNI mediante el backprop heredado, y solo después de que hayan transcurrido algunas épocas comenzamos a usar el DNI-bootstrapping discutido anteriormente.
De esa manera, el DNI más temprano adquirirá al menos una idea de qué esperar al comienzo de la capacitación. Esto se debe a que los siguientes DNI no están seguros de cómo se ve realmente el gradiente real, cuando comienza la capacitación, por lo que inicialmente recomendarán un gradiente de "basura" a cualquiera que se siente antes que ellos.
No olvide que los autores también experimentaron con la predicción de las entradas reales para cada capa.
Si sus capas tienen un backprop costoso (tal vez tenga Batch-Normalization o algunas funciones de activación sofisticadas), corregir con DNI podría ser mucho más barato, una vez que esté suficientemente bien entrenado. Solo recuerde que el DNI no es gratuito: requiere multiplicación de matriz y probablemente no proporcionará mucha velocidad en una capa densa simple.
Minibatches nos da aceleración (a través de la paralelización) y también nos da la regularización. Los degradados sintéticos nos permiten inferir mejor trabajando con secuencias más largas y (potencialmente) degradados menos costosos. Todos juntos este es un sistema muy poderoso.
fuente
Los gradientes sintéticos hacen que el entrenamiento sea más rápido, no reduciendo el número de épocas necesarias o acelerando la convergencia del descenso del gradiente, sino más bien haciendo que cada época sea más rápida de calcular. El gradiente sintético es más rápido de calcular que el gradiente real (calcular el gradiente sintético es más rápido que la retropropagación), por lo que cada iteración del descenso del gradiente se puede calcular más rápidamente.
fuente