Gráficos computacionales

La retropropagación se implementa en marcos de aprendizaje profundo como Tensorflow, Torch, Theano, etc., mediante el uso de gráficos computacionales. Más significativamente, la comprensión de la retropropagación en gráficos computacionales combina varios algoritmos diferentes y sus variaciones, como backprop a través del tiempo y backprop con pesos compartidos. Una vez que todo se convierte en un gráfico computacional, siguen siendo el mismo algoritmo, solo retropropagación en gráficos computacionales.

¿Qué es el gráfico computacional?

Un gráfico computacional se define como un gráfico dirigido donde los nodos corresponden a operaciones matemáticas. Los gráficos computacionales son una forma de expresar y evaluar una expresión matemática.

Por ejemplo, aquí hay una ecuación matemática simple:

$$ p = x + y $$

Podemos dibujar un gráfico computacional de la ecuación anterior de la siguiente manera.

El gráfico computacional anterior tiene un nodo de suma (nodo con el signo "+") con dos variables de entrada xey y una salida q.

Tomemos otro ejemplo, un poco más complejo. Tenemos la siguiente ecuación.

$$ g = \ left (x + y \ right) \ ast z $$

La ecuación anterior está representada por el siguiente gráfico computacional.

Gráficos computacionales y retropropagación

Los gráficos computacionales y la retropropagación son conceptos centrales importantes en el aprendizaje profundo para el entrenamiento de redes neuronales.

Pase adelantado

El pase hacia adelante es el procedimiento para evaluar el valor de la expresión matemática representada por gráficos computacionales. Hacer un pase hacia adelante significa que estamos pasando el valor de las variables en la dirección hacia adelante desde la izquierda (entrada) hacia la derecha donde está la salida.

Consideremos un ejemplo dando algún valor a todas las entradas. Supongamos que se dan los siguientes valores a todas las entradas.

$$ x = 1, y = 3, z = −3 $$

Al dar estos valores a las entradas, podemos realizar un pase hacia adelante y obtener los siguientes valores para las salidas en cada nodo.

Primero, usamos el valor de x = 1 e y = 3, para obtener p = 4.

Luego usamos p = 4 yz = -3 para obtener g = -12. Vamos de izquierda a derecha, hacia adelante.

Objetivos de Backward Pass

En el paso hacia atrás, nuestra intención es calcular los gradientes para cada entrada con respecto a la salida final. Estos gradientes son esenciales para entrenar la red neuronal mediante el descenso de gradientes.

Por ejemplo, deseamos los siguientes gradientes.

Gradientes deseados

$$ \ frac {\ parcial x} {\ parcial f}, \ frac {\ parcial y} {\ parcial f}, \ frac {\ parcial z} {\ parcial f} $$

Pase hacia atrás (propagación hacia atrás)

Comenzamos el pase hacia atrás encontrando la derivada de la salida final con respecto a la salida final (¡en sí misma!). Por lo tanto, dará como resultado la derivación de identidad y el valor es igual a uno.

$$ \ frac {\ g parcial} {\ g parcial} = 1 $$

Nuestro gráfico computacional ahora se ve como se muestra a continuación:

A continuación, haremos el paso hacia atrás mediante la operación "*". Calcularemos los gradientes en py z. Dado que g = p * z, sabemos que -

$$ \ frac {\ parcial g} {\ parcial z} = p $$

$$ \ frac {\ parcial g} {\ parcial p} = z $$

Ya conocemos los valores de zyp del pase hacia adelante. Por lo tanto, obtenemos -

$$ \ frac {\ parcial g} {\ parcial z} = p = 4 $$

y

$$ \ frac {\ parcial g} {\ parcial p} = z = -3 $$

Queremos calcular los gradientes en xey -

$$ \ frac {\ parcial g} {\ parcial x}, \ frac {\ parcial g} {\ parcial y} $$

Sin embargo, queremos hacer esto de manera eficiente (aunque xyg están a solo dos saltos de distancia en este gráfico, imagina que están muy lejos uno del otro). Para calcular estos valores de manera eficiente, usaremos la regla de diferenciación de la cadena. De la regla de la cadena, tenemos:

$$ \ frac {\ g parcial} {\ parcial x} = \ frac {\ parcial g} {\ parcial p} \ ast \ frac {\ parcial p} {\ parcial x} $$

$$ \ frac {\ g parcial} {\ y parcial} = \ frac {\ g parcial} {\ p parcial} \ ast \ frac {\ p parcial} {\ y parcial} $$

Pero ya sabemos que dg / dp = -3, dp / dx y dp / dy son fáciles ya que p depende directamente de xey. Tenemos -

$$ p = x + y \ Rightarrow \ frac {\ parcial x} {\ parcial p} = 1, \ frac {\ parcial y} {\ parcial p} = 1 $$

Por lo tanto, obtenemos -

$$ \ frac {\ g. parcial} {\ f parcial} = \ frac {\ g parcial} {\ p parcial} \ ast \ frac {\ p parcial} {\ parcial x} = \ izquierda (-3 \ derecha) .1 = -3 $$

Además, para la entrada y -

$$ \ frac {\ g parcial} {\ y parcial} = \ frac {\ g parcial} {\ p parcial} \ ast \ frac {\ p parcial} {\ y parcial} = \ izquierda (-3 \ derecha) .1 = -3 $$

La razón principal para hacer esto al revés es que cuando tuvimos que calcular el gradiente en x, solo usamos valores ya calculados y dq / dx (derivada de la salida del nodo con respecto a la entrada del mismo nodo). Usamos información local para calcular un valor global.

Pasos para entrenar una red neuronal

Siga estos pasos para entrenar una red neuronal:

  • Para el punto de datos x en el conjunto de datos, pasamos adelante con x como entrada y calculamos el costo c como salida.

  • Hacemos un pase hacia atrás comenzando en cy calculamos los gradientes para todos los nodos en el gráfico. Esto incluye nodos que representan los pesos de la red neuronal.

  • Luego, actualizamos los pesos haciendo W = W - tasa de aprendizaje * gradientes.

  • Repetimos este proceso hasta que se cumplan los criterios de parada.