¿El batch_size en Keras tiene algún efecto en la calidad de los resultados?

38

Estoy a punto de entrenar una gran red LSTM con 2-3 millones de artículos y estoy luchando con errores de memoria (uso AWS EC2 g2x2large).

Descubrí que una solución es reducir el batch_size. Sin embargo, no estoy seguro de si este parámetro solo está relacionado con problemas de eficiencia de memoria o si afectará mis resultados. De hecho, también noté que el batch_sizeuso en ejemplos es generalmente como una potencia de dos, que tampoco entiendo.

No me importa si mi red tarda más en entrenarse, pero me gustaría saber si reducirla batch_sizedisminuirá la calidad de mis predicciones.

Gracias.

hipoglucido
fuente
Esta pregunta no es específica de los keras. Creo que el consenso general es que los tamaños de muestra más pequeños convergen más lentamente, pero son menos propensos a quedarse atascados en los mínimos locales
Alex
He visto casos en los que un tamaño de lote demasiado grande puede evitar la convergencia incluso con el mismo número de épocas de entrenamiento.
Curtis White

Respuestas:

43

Después de un año y medio, vuelvo a mi respuesta porque mi respuesta anterior era incorrecta.

El tamaño del lote afecta el aprendizaje de manera significativa. Lo que sucede cuando coloca un lote a través de su red es que promedia los gradientes. El concepto es que si el tamaño de su lote es lo suficientemente grande, esto proporcionará una estimación lo suficientemente estable de cuál sería el gradiente del conjunto de datos completo. Al tomar muestras de su conjunto de datos, estima el gradiente mientras reduce significativamente el costo computacional. Cuanto más bajo vaya, menos preciso será su estimación, sin embargo, en algunos casos, estos gradientes ruidosos pueden ayudar a escapar de los mínimos locales. Cuando es demasiado bajo, los pesos de su red pueden saltar si sus datos son ruidosos y es posible que no puedan aprender o converjan muy lentamente, lo que afecta negativamente el tiempo total de cálculo.

Otra ventaja del procesamiento por lotes es para el cálculo de GPU, las GPU son muy buenas para paralelizar los cálculos que suceden en redes neuronales si parte del cálculo es el mismo (por ejemplo, multiplicación de matriz repetida sobre la misma matriz de peso de su red). Esto significa que un tamaño de lote de 16 tomará menos del doble de la cantidad de un tamaño de lote de 8.

En el caso de que necesite tamaños de lote más grandes pero no se ajuste a su GPU, puede alimentar un lote pequeño, guardar las estimaciones de gradiente y alimentar uno o más lotes, y luego hacer una actualización de peso. De esta manera obtienes un gradiente más estable porque aumentaste el tamaño de tu lote virtual.

RESPUESTA INCORRECTA, ANTIGUA: [[[No, el tamaño del lote en promedio solo influye en la velocidad de su aprendizaje, no en la calidad del aprendizaje. Tampoco es necesario que los tamaños de lote sean potencias de 2, aunque entiendo que ciertos paquetes solo permiten potencias de 2. Debe intentar obtener su tamaño de lote lo más alto posible que aún se ajuste a la memoria de su GPU para obtener la máxima velocidad posible .]]]]

Jan van der Vegt
fuente
No puedo pagar 32 pero puedo pagar 16. Sin embargo, noté que es demasiado lento. ¿Crees que debería probar algunos valores entre 16-32 o seguir con 16?
hipoglucido
Intentaría cronometrar algunos valores. Cada época debe ser aproximadamente al mismo tiempo para que no tarde demasiado. Pruebe 17 primero para ver si es más rápido o más lento porque estoy interesado en esto, dado que esta potencia de 2 depende de la GPU y / o el backend de Keras. Pero creo que lo mejor es llenarlo hasta el borde
Jan van der Vegt
9
¿Estás seguro de que el tamaño del lote no influye en la calidad del aprendizaje? Recuerdo haber leído algunos blogs / documentos (?) Donde decían que los lotes más pequeños producen gradientes más ruidosos que los lotes más grandes, pero el ruido puede ser útil para salir de las minimas locales. Sin embargo, no estoy seguro de si esto se aplica a los LSTM.
stmax
No estoy completamente convencido, no he tenido suficiente experiencia, pero eso es lo que leí. Puedo ver que los gradientes son menos estables, así que podría estar apagado.
Jan van der Vegt
2
Un año y medio después y mucho más informado ahora y estoy de acuerdo. Voy a cambiar mi respuesta
Jan van der Vegt
11

Siento que la respuesta aceptada es posiblemente incorrecta. Hay variantes en los algoritmos de descenso de gradiente .

  1. Descenso de gradiente de vainilla : aquí se calcula el gradiente en todos los puntos de datos en un solo disparo y se toma el promedio. Por lo tanto, tenemos una versión más suave del gradiente que lleva más tiempo aprender.

  2. Descenso de gradiente estocástico : aquí un punto de datos a la vez, por lo tanto, el gradiente es agresivo (gradientes ruidosos), por lo tanto, habrá muchas oscilaciones (usamos parámetros Momentum, por ejemplo, Nesterov para controlar esto). Por lo tanto, existe la posibilidad de que sus oscilaciones hagan que el algoritmo no alcance un mínimo local (divergente).

  3. Descenso de gradiente de mini lote : que toma las ventajas de los dos promedios anteriores de un lote pequeño. Por lo tanto, no es demasiado agresivo como SGD y permite el aprendizaje en línea que Vanilla GD nunca permitió.

Cuanto más pequeño sea el Mini-Batch, mejor será el rendimiento de su modelo (no siempre) y, por supuesto, tiene que ver con sus épocas de aprendizaje más rápido. Si está entrenando en un gran conjunto de datos, desea una convergencia más rápida con un buen rendimiento, por lo tanto, elegimos Batch-GD.

SGD tenía un parámetro de aprendizaje fijo, por lo tanto, iniciamos otros optimizadores adaptativos como Adam, AdaDelta, RMS Prop, etc., que cambia el parámetro de aprendizaje en función de la historia de los degradados.

Jil Jung Juk
fuente
3) generalmente se llama minibatch
Alex
@Alex: agregó el cambio.
Jil Jung Juk
1
Estoy de acuerdo en que no hay una regla con respecto al parámetro de tamaño de lote. Pero esta afirmación: "Cuanto más pequeño sea el Mini-Batch, mejor será el rendimiento de su modelo", es contrario a la regla general. En general, desea maximizar el tamaño del lote
MonsieurBeilto
4

Por extraño que parezca, descubrí que los lotes más grandes con keras requieren más épocas para converger.

Por ejemplo, el resultado de este script basado en la prueba de integración de keras es

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

Relacionado

Usar un tamaño de lote demasiado grande puede tener un efecto negativo en la precisión de su red durante el entrenamiento, ya que reduce la estocasticidad del descenso del gradiente.

Editar: la mayoría de las veces, batch_sizese desea aumentar para acelerar la computación, pero hay otras formas más simples de hacerlo, como usar tipos de datos de una huella más pequeña a través del dtypeargumento, ya sea en keras o tensorflow , por ejemplo, en float32lugar defloat64

Shadi
fuente
Con lotes más grandes (y, por lo tanto, menos por época), tendrá menos actualizaciones de gradiente por época. "epoch" es solo la jerga ML para "una pasada a través de sus datos durante el entrenamiento". Si está tratando de acelerar el entrenamiento, mida el tiempo de la pared e ignore las épocas.
Andrew Wagner