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_size
uso 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_size
disminuirá la calidad de mis predicciones.
Gracias.
deep-learning
keras
hipoglucido
fuente
fuente
Respuestas:
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 .]]]]
fuente
Siento que la respuesta aceptada es posiblemente incorrecta. Hay variantes en los algoritmos de descenso de gradiente .
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.
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).
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.
fuente
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
Relacionado
BatchNormalization
, lo que afectó los resultados.Editar: la mayoría de las veces,
batch_size
se 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 deldtype
argumento, ya sea en keras o tensorflow , por ejemplo, enfloat32
lugar defloat64
fuente