Gradientes sintéticos: ¿cuál es el beneficio práctico?

8

Puedo ver dos motivos para usar degradados sintéticos en RNN:

  1. Para acelerar el entrenamiento, corrigiendo inmediatamente cada capa con gradiente predicho
  2. 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

Kari
fuente
¿Por qué crees que esto no acelerará el entrenamiento? La única justificación que veo es la simple afirmación de que esto "no debería mejorar la velocidad del entrenamiento", pero no proporciona su razonamiento. Tampoco está claro qué quiere decir con "paso 1)", ya que no ha descrito ningún paso en la pregunta. En cualquier caso, el documento demuestra que sí proporciona aceleraciones. Los datos superan la teoría cualquier día. ¿Has leído el periódico?
DW
Los datos superan la teoría cualquier día, estoy de acuerdo, pero el mejor ejemplo de contador que puedo hacer es GPU vs CPU. En todas partes la gente sigue diciendo que la GPU ejecuta órdenes de magnitudes más rápido que la CPU, y proporciona comparaciones. Sin embargo, una CPU multiproceso correctamente codificada es solo 2-3 veces más lenta que su GPU de la misma categoría y es más barata que la GPU. larsjuhljensen.wordpress.com/2011/01/28/… Una vez más, no voy en contra de Synthetic Gradients, parecen increíbles, solo hasta que pueda obtener respuesta a mi publicación, no podré descansar: D
Kari
No estoy seguro de que una publicación de blog de 7 años sobre BLAST sea terriblemente relevante aquí.
DW
Lo que estoy tratando de decir es "hay maneras de hacer que el paralelismo parezca mejor de lo que realmente podría ser", en cualquier escenario
Kari

Respuestas:

2

¡Pero hey! Estos "gradientes sintéticos" pronosticados serán muy pequeños (insignificantes) de todos modos, después de todo, es por eso que comenzamos una nueva sesión de backprop B. No eran demasiado pequeños, simplemente analizaríamos los 6 pasos en una sola sesión larga de bkprop "A ".

-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:

 input
   |
   V
Layer_0 & DNI_0
Layer_1
Layer_2
Layer_3 & DNI_3
Layer_4
Layer_5 & DNI_5
Layer_6
Layer_7
   | 
   V
output

El DNI_0 siempre se entrena con un gradiente sintético que llega desde DNI_3 (que fluye a través de la Capa_2 y la Capa_1, por supuesto), ubicando varias capas más.

Del mismo modo, el DNI_3 siempre se entrena con un gradiente sintético que llega desde DNI_5

DNI_0 o DNI_3 nunca verán el gradiente verdadero, porque el gradiente verdadero solo se entrega a DNI_5 , y no antes.

Para cualquiera que todavía tenga dificultades para comprenderlos, lea esta impresionante publicación de blog , parte 3

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.

Kari
fuente
0

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.

DW
fuente
Según tengo entendido, en el tiempo, los gradientes no deberían alcanzar el DNI más rápido, es solo que ahora se deslizan en el tiempo y se calculan de forma asíncrona mientras se produce el apoyo hacia adelante. El DNI todavía tendrá que obtener el verdadero gradiente de entrenar en sí . Por lo tanto, los degradados sintéticos deben requerir el mismo número de cálculos que se realizarán en paralelo que con el BPTT estándar. ¿Es esto correcto?
Kari
Por lo tanto, no habría ninguna aceleración simplemente introduciendo el SG entre las capas. Sí, obtenemos el gradiente pronosticado inmediato del DNI, pero para cada una de esas predicciones eventualmente tendremos que pagar el precio por propagación asincrónica de retorno completo hacia ese DNI, un poco más tarde
Kari
@Kari, no, eso no me suena bien. Si necesita la misma cantidad de iteraciones, pero ahora cada iteración toma el mismo 50% menos de tiempo en la GPU, entonces el cálculo resultante se realizará antes. Incluso si necesita un 10% más de iteraciones / épocas (porque los gradientes se retrasan o los gradientes sintéticos no coinciden perfectamente con los gradientes reales), eso sigue siendo una victoria: la aceleración de poder calcular el gradiente sintético más rápido que el gradiente real supera otros efectos. Parece seguro de que esto no puede ayudar, pero los datos en el documento muestran que sí ayuda.
DW
Hm, bueno, por ejemplo, tenemos 4 capas sentadas después de nuestro DNI; En backprop normal, tendríamos 4 intercambios "hacia adelante" entre las capas, y luego 4 "intercambios hacia atrás", y mientras esto ocurre, el sistema está bloqueado. Con DNI podemos corregir de inmediato nuestros pesos, pero más adelante tendremos que obtener gradientes verdaderos, pero ahora, el sistema no está bloqueado, lo que permite mientras tanto pasar más pases hacia adelante. Pero aún debemos el gradiente verdadero de antes, a nuestro DNI ... Para obtener y entregar este gradiente de regreso a DNI, tomará el 100% del tiempo (los mismos 4 pasos hacia adelante, los mismos 4 pasos hacia atrás).
Kari
Es solo que nuestro DNI dice "bien, dales cuando sea posible, más adelante", pero aún así tenemos que pagar el precio completo, por lo que no veo un aumento en el rendimiento. Estoy de acuerdo, los documentos muestran excelentes resultados, pero ¿cómo es que? De todos modos, ya podemos entrenar minibatches en paralelo: /
Kari