Cómo implementar el descenso de gradiente de mini lotes en una red neuronal

Creo que tengo la idea, así que la compartiré. Entiendo que es lo mismo que entrenar cualquier NN con Descenso de gradiente estocástico, pero terminarás con matrices para los valores de salida de las capas en lugar de vectores.

Solo tenemos que hacer un seguimiento de la dimensionalidad.

Mi ejemplo será un aprendizaje supervisado para una regresión.

NN con

  • una capa de entrada (dim 50),
  • una capa oculta (dim 25)
  • una capa de salida (dim 3).

L1 Regularización: [matemáticas] \ lambda [/ matemáticas]

La relación de minibatch: [matemática] r = 5 [/ matemática]

Parámetro de tasa de aprendizaje: [matemáticas] \ epsilon [/ matemáticas]

Parámetro de momento: [matemática] \ alfa [/ matemática]

X: datos de entrada, y los valores que queremos aprender.

a1 —-w1 ——-> (z2 | a2 = sigmoide (z2)) ——w2 —-> (z3 | a3 = sigmoide (z3))


División de datos para nuestro mini lote

Comencemos con un conjunto de datos de 10000 muestras de 50 características (las 50 entradas). Esto se puede ver como una matriz A de tamaño [math] \ mathbb {R} ^ {10000,50} [/ math]

Para implementar un mini lote, debe elegir una relación r para dividir su conjunto de datos en r partes. Terminará con una matriz de tamaño 10000 / r [math] \ mathbb {R} ^ {10000 / r, 50}. [/ Math]

Elija una de estas matrices, y será su primera matriz de entrada a1.


Entradas de reenvío

Escribamos la dimensionalidad:

  • a1: → tenue (2000,50)
  • w1: → tenue (25,50)
  • z2 = [matemáticas] w1 \ cdot [/ matemáticas] [matemáticas] a1 ^ t [/ matemáticas] → dim (25,2000)
  • a2 = sigmoide (z2), por ejemplo
  • w2: → tenue (3,25)
  • z3: → dim (3,2000)
  • a3 = sigmoide (z3)
  • ¡No menciono los biais!

Propagación hacia atrás

  • Primero necesitamos calcular el costo total de nuestra función.

Podemos elegir el error medio al cuadrado entre todos los elementos en a3 y el vector y, y agregar el término de regularización para todos los pesos.

  • Luego necesitamos calcular el gradiente para cada peso. Habrá un gradiente:

Simplemente escribo la fórmula, pero no es la pregunta aquí:

  • [matemáticas] grad2 = (a_3 – y) \ cdot a_2 ^ T + \ lambda w_1 [/ matemáticas] → dim (3,25)
  • [matemática] grad1 = w_2 \ intercal \ cdot (a_3 – y) \ cdot a_1 + \ lambda w_2 [/ math] → dim (25,50)

Luego necesitamos actualizar nuestros pesos en la dirección opuesta de su gradiente respectivo

  • [matemáticas] w1 – = \ Delta_w1 + \ alpha \ Delta_w1_prev [/ matemáticas]
  • [matemáticas] w2 – = \ Delta_w2 + \ alpha \ Delta_w2_prev [/ matemáticas]

Conclusión

Después del entrenamiento de nuestra red neuronal, podemos ajustar cualquier matriz de tamaño [:, 50], porque si usó descenso de gradiente estocástico, mini lote o lote, la única matriz que cambia de tamaño es el valor de salida de las neuronas y No las pesas.

Supongo que el mini lote es útil porque podemos abusar de la multiplicación de la matriz de vectorización.

No soy un experto en aprendizaje automático, así que no dudes en editar mis errores.

Si está buscando una guía paso a paso sobre la implementación, le recomiendo echar un vistazo al “Capítulo 1 Uso de redes neuronales para reconocer dígitos escritos a mano” del libro en línea de Michael Nielsen Redes neuronales y aprendizaje profundo. El capítulo comienza con una introducción y cómo pasar de los perceptrones a la formación de redes neuronales. Una vez que llegue a las redes neuronales, lo guiará a través de la implementación de una red neuronal y el algoritmo de aprendizaje utilizando el descenso de gradiente estocástico de mini lotes en Python para clasificar los dígitos escritos a mano.

La misma implementación también se puede encontrar en Github: mnielsen / neural-networks-and-deep-learning

Lo bueno de esta implementación es que está escrita para seguirla fácilmente, sin demasiados trucos de rendimiento que pueden distraerlo de cómo implementar el algoritmo de aprendizaje.