¿Cómo actualiza el descenso de gradiente de minibatch los pesos para cada ejemplo en un lote?


12

Si procesamos digamos 10 ejemplos en un lote, entiendo que podemos sumar la pérdida para cada ejemplo, pero ¿cómo funciona la propagación hacia atrás en relación con la actualización de los pesos para cada ejemplo?

Por ejemplo:

  • Ejemplo 1 -> pérdida = 2
  • Ejemplo 2 -> pérdida = -2

Esto da como resultado una pérdida promedio de 0 (E = 0), entonces, ¿cómo actualizaría esto cada peso y convergería? ¿Es simplemente por la aleatorización de los lotes que convergemos "con suerte" tarde o temprano? Además, ¿esto no solo calcula el gradiente para el primer conjunto de pesos para el último ejemplo procesado?

Respuestas:


15

El descenso de gradiente no funciona del modo sugerido, pero puede ocurrir un problema similar.

No calculamos la pérdida promedio del lote, calculamos los gradientes promedio de la función de pérdida. Los gradientes son la derivada de la pérdida con respecto al peso y en una red neuronal el gradiente para un peso depende de las entradas de ese ejemplo específico y también depende de muchos otros pesos en el modelo.

Si su modelo tiene 5 pesos y tiene un tamaño de mini lote de 2, puede obtener esto:

Ejemplo 1. Pérdida = 2,gradients=(1.5,2.0,1.1,0.4,0.9)

Ejemplo 2. Pérdida = 3,gradients=(1.2,2.3,1.1,0.8,0.7)

El promedio de los gradientes en este mini lote se calcula, son(1.35,0.15,0,0.2,0.8)

El beneficio de promediar sobre varios ejemplos es que la variación en el gradiente es menor, por lo que el aprendizaje es más consistente y menos dependiente de los detalles de un ejemplo. Observe cómo el gradiente promedio para el tercer peso es , este peso no cambiará esta actualización de peso, pero probablemente no será cero para los siguientes ejemplos elegidos que se calculan con diferentes pesos.0

editar en respuesta a los comentarios:

En mi ejemplo anterior, se calcula el promedio de los gradientes. Para un tamaño de mini lote de donde calculamos la pérdida para cada ejemplo, nuestro objetivo es obtener el gradiente promedio de la pérdida con respecto a un peso .kLiwj

La forma en que lo escribí en mi ejemplo promedió cada gradiente como:Lwj=1ki=1kLiwj

El código tutorial al que se vinculó en los comentarios usa Tensorflow para minimizar la pérdida promedio.

Tensorflow tiene como objetivo minimizar1ki=1kLi

Para minimizar esto, calcula los gradientes de la pérdida promedio con respecto a cada peso y utiliza el descenso de gradiente para actualizar los pesos:

Lwj=wj1ki=1kLi

La diferenciación puede llevarse dentro de la suma, por lo que es la misma que la expresión del enfoque en mi ejemplo.

wj1ki=1kLi=1ki=1kLiwj


Gotcha ¿Aún querrías promediar la pérdida sobre el tamaño del lote correcto? No estoy seguro si está familiarizado con tensorflow, pero he estado tratando de conciliar mi comprensión con este tutorial: tensorflow.org/get_started/mnist/beginners Puede ver que la pérdida se promedia en el lote (código reduce_mean). ¿Supongo que tensorflow mantiene un recuento interno / promedios de los pesos?
Cálculo de carbono

1
@carboncomputed Oh, sí, tienes razón, promedian la pérdida de modo que cuando Tensorflow calcula los gradientes de la pérdida promedio, efectivamente calcula el promedio de los gradientes para cada pérdida. Editaré mi respuesta para mostrar las matemáticas para esto.
Hugh

Interesante. Gracias por la aclaración. Entonces, solo para profundizar un poco más, ¿se calculan los gradientes de peso por ejemplo durante el paso hacia adelante y se almacenan o se calculan durante el proceso de optimización en el flujo de tensor? Supongo que solo me falta "¿dónde" están estos gradientes en Tensorflow? Veo el avance y la pérdida, ¿entonces el tensorflow está haciendo estos cálculos de gradiente / promediando debajo del capó para mí?
calculado el

1
@carboncomputed Ese es el atractivo de Tensorflow, usa matemática simbólica y puede hacer la diferenciación bajo el capó
Hugh

Gracias por una buena respuesta. Sin embargo, no he logrado entender cómo TF sabe cómo hacer una copia propagan con una pérdida media como se muestra en este ejemplo , code line 170?
pecador

-1

La razón para usar mini lotes es tener una buena cantidad de ejemplos de entrenamiento de tal manera que el posible ruido se reduzca promediando sus efectos, pero tampoco es un lote completo que para muchos conjuntos de datos podría requerir una gran cantidad de memoria. Un hecho importante es que el error que evalúa es siempre una distanciaentre su salida pronosticada y la salida real: eso significa que no puede ser negativo, por lo que no puede tener, como dijiste, un error de 2 y -2 que se cancele, sino que se convertirá en un error de 4 Luego evalúa el gradiente del error con respecto a todos los pesos, para que pueda calcular qué cambio en los pesos lo reduciría más. Una vez que lo hace, da un "paso" en esa dirección, en función de la magnitud de su tasa de aprendizaje alfa. (Estos son los conceptos básicos, no voy a entrar en detalles sobre la propagación hacia atrás para NN profundo) Después de ejecutar esta capacitación en su conjunto de datos durante un cierto número de épocas, puede esperar que su red converja si su paso de aprendizaje no es demasiado grande para hazlo divergir. Todavía podrías terminar en un mínimo local, esto se puede evitar inicializando sus pesos de manera diferente, utilizando optimizadores de diferenciador e intentando regularizar.


Solo para agregar: utilizamos mini lotes principalmente para la eficiencia computacional. Tenemos una compensación entre la precisión del descenso y la frecuencia de actualización de los pesos. Los datos deben ser extremadamente grandes para que no quepan en la memoria.
Łukasz Grad

Entiendo cada uno, pero ¿cómo actualizamos nuestros pesos para un lote específico? ¿Se suman también los gradientes de peso para cada ejemplo?
calculado el

No, solo hay un gradiente, que es un vector de derivados, en el error de lote total. Esto significa que actualizamos una vez que nuestros pesos se basan en el gradiente, es decir, la dirección de actualización que hace que el error en este mini lote disminuya más. El gradiente está hecho de derivadas parciales, es decir, la derivada del error del mini lote con respecto a cada peso: esto nos dice si cada peso debería ser más pequeño o más grande, y cuánto. Todos los pesos obtienen una actualización por lote, para reducir el error en ese mini lote, que es independiente de otros mini lotes.
dante
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.