Al entrenar redes neuronales artificiales, ¿qué técnica de aprendizaje se prefiere: calcular el error para cada neurona y luego regresar y ajustar los pesos, o calcular el error y ajustar los pesos de una neurona a la vez?

Como ya mencionó en un comentario, la segunda forma es matemáticamente incorrecta. El flujo de trabajo de entrenar una red neuronal es básicamente

  1. Calcule implícitamente el gradiente de la función objetivo en los pesos actuales , haciendo propagación de error. Los errores en la capa de origen son iguales a los pesos (conectando src y dst) multiplicados por los errores en la capa de destino.
  2. Actualice los pesos usando el gradiente de arriba. Tenga en cuenta que, por razones de rendimiento, el gradiente a veces no se calcula explícitamente. Está codificado en los valores neuronales y los errores. (La derivada con respecto a un peso, es decir, la conexión, es el producto del valor de origen y el error de destino).

(Para obtener una descripción matemática, consulte la publicación de mi blog Mejores prácticas de la red neuronal).

Si actualiza los pesos antes de actualizar los errores en la capa de origen, ya no está haciendo entrenamiento basado en gradiente, punto.

El error para las neuronas en la capa i-1 depende de los pesos que llevan la capa i-1 a la i-ésima, y ​​el error de la capa i-ésima.

Entonces, si calcula el error para una capa, luego ajusta los pesos, trabajando desde la capa más externa a la más interna, no tendrá ningún problema.

Por lo tanto, no importa si ajusta los pesos a medida que avanza o si ya ha calculado todos los errores.

Ejemplo

Veamos cómo funciona esto para un caso muy simple con tres neuronas y sin neuronas de sesgo [matemáticas] A \ a B \ a C [/ matemáticas]. Para explicar lo que está sucediendo, necesitamos establecer alguna notación.

Deje que [matemática] A [/ matemática] sea la neurona de entrada, [matemática] B [/ matemática] sea la neurona oculta y
[matemáticas] C [/ matemáticas] sea la neurona de salida.

El peso de [matemáticas] A \ a B [/ matemáticas] es [matemáticas] w_A [/ matemáticas] y el peso de [matemáticas] B \ a C [/ matemáticas] es [matemáticas] w_B [/ matemáticas].

Las funciones de activación para las neuronas son [matemáticas] f_A, f_B, f_C [/ matemáticas] respectivamente.

Ahora, para una entrada dada [matemática] x [/ matemática], escriba [matemática] I_A, I_B, I_C [/ matemática] para las entradas a cada neurona y [matemática] O_A, O_B, O_C [/ matemática] para las salidas de cada neurona, donde [matemáticas] O_A = f_A (I_A) [/ matemáticas] y así sucesivamente.

Ahora definimos el error en cada neurona suponiendo que tengamos una salida
[math] y [/ math] y estamos usando la función de pérdida cuadrada [math] \ frac {1} {2} (O_C-y) ^ 2 [/ math].

Deje [math] E_C = f_C ‘(I_C) \ cdot (O_C – y) [/ math].

Entonces [math] E_B = f_B ‘(I_B) \ cdot E_C \ cdot w_B [/ math] y
[matemáticas] E_A = f_A ‘(I_A) \ cdot E_B \ cdot w_A [/ math].

Entonces, para ajustar [matemática] w_B [/ matemática] primero calculamos [matemática] E_C [/ matemática], luego usando [matemática] w_B [/ matemática] y [matemática] E_C [/ matemática] calculamos [matemática] E_B [/ mates]. Solo entonces podemos ajustar [math] w_B [/ math]. Entonces verá que ajustar el peso no cambia el cálculo del error.

Luego calculamos [matemáticas] E_A [/ matemáticas] usando [matemáticas] E_B [/ matemáticas] y [matemáticas] w_A [/ matemáticas], observe que no necesitamos usar el ajuste
[matemáticas] w_B ^ * [/ matemáticas] para esto. Luego ajustamos [math] w_A [/ math] y terminamos.

Si desea ver una derivación de todos estos términos, puede consultar las Redes neuronales Parte 1: Alimentación hacia adelante y propagación hacia atrás (descargo de responsabilidad: mi blog).

Parece que los dos métodos equivalen a la misma cosa, la única diferencia es que en uno de ellos debe mantener una lista de todos los cambios que se realizarán en lugar de solo hacerlos.