Intercambie el tamaño del lote frente al número de iteraciones para entrenar una red neuronal

222

Al entrenar una red neuronal, qué diferencia hace establecer:

  • tamaño del lote a y el número de iteraciones para bab
  • vs. tamaño de lote a y número de iteraciones a dcd

donde ?ab=cd

Para decirlo de otra manera, suponiendo que entrenemos la red neuronal con la misma cantidad de ejemplos de entrenamiento, ¿cómo establecer el tamaño de lote óptimo y el número de iteraciones? (donde el tamaño del lote * número de iteraciones = número de ejemplos de entrenamiento que se muestran a la red neuronal, con el mismo ejemplo de entrenamiento potencialmente mostrado varias veces)

Soy consciente de que cuanto mayor es el tamaño del lote, más espacio de memoria se necesita, y a menudo hace que los cálculos sean más rápidos. Pero en términos de rendimiento de la red capacitada, ¿qué diferencia hace?

Franck Dernoncourt
fuente
1
Consulte este blog que describe cómo elegir el tamaño de lote correcto mientras compara los efectos de diferentes tamaños de lote en la precisión del conjunto de datos Cifar-10.
Teja Sreenivas

Respuestas:

208

De Nitish Shirish Keskar, Dheevatsa Mudigere, Jorge Nocedal, Mikhail Smelyanskiy, Ping Tak Peter Tang. Sobre la formación de lotes grandes para el aprendizaje profundo: brecha de generalización y Sharp Minima. https://arxiv.org/abs/1609.04836 :

El método de descenso de gradiente estocástico y sus variantes son algoritmos de elección para muchas tareas de Deep Learning. Estos métodos operan en un régimen de lotes pequeños en el que se muestrea una fracción de los datos de entrenamiento, generalmente de 32 a 512 puntos de datos, para calcular una aproximación al gradiente. Se ha observado en la práctica que cuando se usa un lote más grande hay una degradación significativa en la calidad del modelo, medida por su capacidad de generalización.Ha habido algunos intentos de investigar la causa de esta caída de generalización en el régimen de lotes grandes, sin embargo, la respuesta precisa para este fenómeno es, hasta ahora, desconocida. En este documento, presentamos una amplia evidencia numérica que respalda la opinión de que los métodos de lotes grandes tienden a converger en minimizadores agudos de las funciones de entrenamiento y prueba, y que los mínimos agudos conducen a una generalización más pobre. Por el contrario, los métodos de lotes pequeños convergen consistentemente con minimizadores planos, y nuestros experimentos respaldan una opinión común de que esto se debe al ruido inherente en la estimación del gradiente. También discutimos varias estrategias empíricas que ayudan a los métodos de lotes grandes a eliminar la brecha de generalización y concluir con un conjunto de ideas de investigación futuras y preguntas abiertas.

[...]

2f(x)2f(x)

[...]

ingrese la descripción de la imagen aquí

Además, algunas buenas ideas de Ian Goodfellow respondieron a por qué no usar todo el conjunto de entrenamiento para calcular el gradiente. en Quora:

El tamaño de la tasa de aprendizaje está limitado principalmente por factores como cuán curvada es la función de costo. Puede pensar en el descenso de gradiente como una aproximación lineal a la función de costo, luego se mueve cuesta abajo a lo largo de ese costo aproximado. Si la función de costo es altamente no lineal (altamente curvada), la aproximación no será muy buena por mucho tiempo, por lo que solo los pasos pequeños son seguros. Puede leer más sobre esto en el Capítulo 4 del libro de texto de aprendizaje profundo, sobre computación numérica: http://www.deeplearningbook.org/contents/numerical.html

Cuando coloca m ejemplos en un minibatch, necesita hacer un cálculo de O (m) y usar memoria O (m), pero reduce la cantidad de incertidumbre en el gradiente en un factor de solo O (sqrt (m)). En otras palabras, hay rendimientos marginales decrecientes para poner más ejemplos en el minibatch. Puede leer más sobre esto en el Capítulo 8 del libro de texto de aprendizaje profundo sobre algoritmos de optimización para el aprendizaje profundo: http://www.deeplearningbook.org/contents/optimization.html

Además, si lo piensas bien, incluso usar todo el conjunto de entrenamiento realmente no te da el verdadero gradiente. El gradiente verdadero sería el gradiente esperado con la expectativa tomada de todos los ejemplos posibles, ponderada por la distribución de generación de datos. Usar todo el conjunto de entrenamiento es solo usar un tamaño de minibatch muy grande, donde el tamaño de su minibatch está limitado por la cantidad que gasta en la recopilación de datos, en lugar de la cantidad que gasta en el cálculo.

Relacionado: Descenso de gradiente por lotes versus descenso de gradiente estocástico

Franck Dernoncourt
fuente
Dado que batch_size solo divide el conjunto de datos de entrenamiento en lotes, ¿tendría sentido reorganizar el conjunto de datos (no temporal) para tener una variación uniforme en todos los lotes? Hacerlo podría reducir la necesidad de optimizar el tamaño del lote, lo cual solo es bueno para encontrar una convergencia más rápida. Si es así, ¿cómo se haría? Estaba pensando que puede no proporcionar un mínimo más plano. Agradecería una orientación detallada.
user12348
@ user12348 ¿Cómo reorganizará el conjunto de datos? ¿Cómo podría estimar que una determinada dimensión de datos producirá un vector de características específico después del entrenamiento?
Cloud Cho
46

Supongo que está hablando de reducir el tamaño de lote en un algoritmo de descenso de gradiente estocástico de mini lote y compararlo con tamaños de lote más grandes que requieren menos iteraciones.

Andrew Ng. proporciona una buena discusión sobre esto y algunas imágenes en su clase de curso en línea sobre ML y redes neuronales. Entonces, el resto de esta publicación es principalmente una regurgitación de sus enseñanzas de esa clase.

Tomemos los dos extremos, en un lado cada paso de descenso de gradiente está utilizando todo el conjunto de datos. Estás calculando los gradientes para cada muestra. En este caso, usted sabe exactamente lo mejor directamente hacia un mínimo local. No pierdas el tiempo yendo en la dirección equivocada. Entonces, en términos de pasos de descenso de gradiente de números, llegarás allí en la menor cantidad.

Por supuesto, calcular el gradiente en todo el conjunto de datos es costoso. Así que ahora vamos al otro extremo. Un tamaño de lote de solo 1 muestra. En este caso, el gradiente de esa muestra puede llevarlo completamente en la dirección equivocada. Pero bueno, el costo de calcular el gradiente era bastante trivial. A medida que toma medidas con respecto a una sola muestra, "deambula" un poco, pero en promedio se dirige hacia un mínimo local igualmente razonable como en el descenso de gradiente de lote completo.

Este podría ser un momento para señalar que he visto algo de literatura que sugiere que tal vez este rebote alrededor de ese descenso de gradiente estocástico de 1 muestra podría ayudarlo a rebotar desde un mínimo local que el modo de lote completo no evitaría, pero eso es discutible. Algunas otras buenas respuestas aquí abordan esta pregunta más directamente que yo.

En términos de potencia computacional, mientras que el proceso GD estocástico de una sola muestra requiere muchas más iteraciones, terminas llegando allí por un costo menor que el modo de lote completo, "típicamente". Así es como lo expresa Andrew Ng.

Ahora encontremos el término medio por el que preguntaste. Podríamos darnos cuenta de que las bibliotecas BLAS modernas hacen que la matemática vectorial sea bastante eficiente, por lo que calcular 10 o 100 muestras a la vez, suponiendo que haya vectorizado su código correctamente, será apenas más trabajo que calcular 1 muestra (gana eficiencia de llamadas de memoria y trucos computacionales integrados en las bibliotecas matemáticas más eficientes). Y promediando un lote de 10, 100, 1000 muestras va a producir un gradiente que es una aproximación más razonable del verdadero gradiente de modo de lote completo. Entonces, nuestros pasos ahora son más precisos, lo que significa que necesitamos menos de ellos para converger, y a un costo que es solo marginalmente más alto que el GD de muestra única.

La optimización del tamaño exacto del mini lote que debe usar generalmente se deja a prueba y error. Ejecute algunas pruebas en una muestra del conjunto de datos con números que van desde digamos decenas hasta unos pocos miles y vea cuál converge más rápido, luego vaya con eso. Los tamaños de lote en esos rangos parecen bastante comunes en toda la literatura. Y si sus datos realmente son IID, entonces el teorema del límite central sobre la variación de procesos aleatorios también sugeriría que esos rangos son una aproximación razonable del gradiente completo.

La decisión exacta de cuándo dejar de iterar generalmente se realiza mediante el monitoreo de su error de generalización contra un conjunto de validación no capacitado y eligiendo el punto en el que el error de validación se encuentra en su punto más bajo. El entrenamiento para demasiadas iteraciones eventualmente conducirá a un sobreajuste, en cuyo punto su error en su conjunto de validación comenzará a subir. Cuando vea que esto sucede, vuelva a subir y deténgase en el punto óptimo.

David Parks
fuente
22

TL; DR: un tamaño de lote mini demasiado grande generalmente conduce a una precisión menor .

Para aquellos interesados, aquí hay una explicación.

Hay dos nociones de velocidad:

  • Velocidad computacional
  • Velocidad de convergencia de un algoritmo.

La velocidad computacional es simplemente la velocidad de realizar cálculos numéricos en hardware. Como dijiste, generalmente es mayor con un tamaño de mini lote más grande. Esto se debe a que las bibliotecas de álgebra lineal usan la vectorización para operaciones de vectores y matrices para acelerarlas, a expensas de usar más memoria. Las ganancias pueden ser significativas hasta cierto punto. Según mi experiencia, hay un punto después del cual solo hay ganancias marginales en velocidad, si las hay. El punto depende del conjunto de datos, el hardware y una biblioteca que se utiliza para cálculos numéricos (debajo del capó).

Pero, no olvidemos que también existe la otra noción de velocidad, que nos dice qué tan rápido converge nuestro algoritmo.

En primer lugar, ¿qué significa que nuestro algoritmo converja? Bueno, depende de nosotros definir y decidir cuándo estamos satisfechos con la precisión o error que obtenemos, calculado en el conjunto de validación. Podemos definirlo por adelantado y esperar a que el algoritmo llegue a ese punto, o podemos monitorear el proceso de entrenamiento y decidir detenerlo cuando el error de validación comience a aumentar significativamente (el modelo comienza a sobreajustar el conjunto de datos). Realmente no deberíamos detenerlo de inmediato, el primer momento en que el error comienza a aumentar, si trabajamos con mini lotes, porque usamos el Descenso de gradiente estocástico, SGD. En el caso de la pendiente de gradiente (lote completo), después de cada época, el algoritmo se establecerá en un mínimo, ya sea local o global. SGD nunca se conforma realmente en un mínimo. Sigue oscilando a su alrededor. Podría continuar indefinidamente

Ahora, después de toda esa teoría, hay una "trampa" a la que debemos prestar atención. Cuando se usa un tamaño de lote más pequeño, el cálculo del error tiene más ruido que cuando usamos un tamaño de lote más grande. Uno diría, bueno, eso es malo, ¿no? La cuestión es que el ruido puede ayudar al algoritmo a saltar de un mínimo local malo y tener más posibilidades de encontrar un mínimo local mejor o, con suerte, el mínimo global.

Por lo tanto, si podemos encontrar una mejor solución más rápidamente usando un tamaño de lote más pequeño en lugar de uno más grande, simplemente con la ayuda del ruido "no deseado", podemos sintonizar entre el tiempo total que tarda nuestro algoritmo en encontrar un producto satisfactorio solución y una mayor precisión.

Lo que quiero decir es que, para una precisión (o error) dada, un tamaño de lote más pequeño puede conducir a un tiempo de entrenamiento total más corto, no más largo, como muchos creen.

O, si decidimos mantener el mismo tiempo de entrenamiento que antes, podríamos obtener una precisión un poco más alta con un tamaño de lote más pequeño, y muy probablemente lo haremos, especialmente si hemos elegido nuestra tasa de aprendizaje de manera adecuada.

Si tiene tiempo, consulte este documento: Evaluación sistemática de los avances de CNN en ImageNet Especialmente, consulte "3.7. Tamaño de lote y tasa de aprendizaje", y Figura 8. Verá que los tamaños de mini lotes grandes conducen a una peor precisión , incluso si ajusta la tasa de aprendizaje a una heurística.

En general, el tamaño de lote de 32 es un buen punto de partida, y también debe probar con 64, 128 y 256. Otros valores (más bajos o más altos) pueden estar bien para algunos conjuntos de datos, pero el rango dado es generalmente el mejor para empezar a experimentar con Aunque, por debajo de 32, puede ser demasiado lento debido a una velocidad de cálculo significativamente menor, por no explotar la vectorización en toda su extensión. Si obtiene un error de "falta de memoria", debería intentar reducir el tamaño del mini lote de todos modos.

Por lo tanto, no se trata simplemente de utilizar el tamaño de mini lote más grande posible que se ajuste a la memoria.

Para concluir y responder a su pregunta, un tamaño de mini lote más pequeño (no demasiado pequeño) generalmente conduce no solo a un número menor de iteraciones de un algoritmo de entrenamiento, que a un tamaño de lote grande, sino también a una mayor precisión general, es decir, Una red neuronal que funciona mejor, en la misma cantidad de tiempo de entrenamiento o menos.

No olvide que el ruido más alto puede ayudarlo a salir de un mínimo local malo, en lugar de dejarlo atrapado.

ivanbgd
fuente
14

Estoy agregando otra respuesta a esta pregunta para hacer referencia a un nuevo documento de conferencia ICLR (2018) de Google que casi directamente aborda esta pregunta.

Título: No disminuya la tasa de aprendizaje, aumente el tamaño del lote

https://arxiv.org/abs/1711.00489

El resumen del documento anterior se copia aquí:

Es una práctica común disminuir la tasa de aprendizaje. Aquí mostramos que generalmente se puede obtener la misma curva de aprendizaje tanto en el entrenamiento como en los conjuntos de prueba al aumentar el tamaño del lote durante el entrenamiento. Este procedimiento es exitoso para el descenso de gradiente estocástico (SGD), SGD con impulso, impulso de Nesterov y Adam. Alcanza precisiones de prueba equivalentes después del mismo número de épocas de entrenamiento, pero con menos actualizaciones de parámetros, lo que lleva a un mayor paralelismo y tiempos de entrenamiento más cortos. Podemos reducir aún más el número de actualizaciones de parámetros al aumentar la tasa de aprendizaje ϵ y escalar el tamaño de lote B∝ϵ. Finalmente, se puede aumentar el coeficiente de impulso m y la escala B∝1 / (1 − m), aunque esto tiende a reducir ligeramente la precisión de la prueba. Crucialmente nuestras técnicas nos permiten reutilizar los horarios de entrenamiento existentes para el entrenamiento por lotes grandes sin ajuste de hiperparámetros. Entrenamos ResNet-50 en ImageNet con una precisión de validación del 76.1% en menos de 30 minutos.

David Parks
fuente
1
Un requisito de memoria mayor parece una mala compensación por simplemente evitar disminuir un valor. Además, en mi humilde opinión, tener una huella de memoria cada vez mayor durante el entrenamiento hace que el algoritmo sea menos escalable.
P-Gn
3

Muestro algo de experiencia empírica aquí . Hice un experimento con el tamaño de lote 4 y el tamaño de lote 4096. El tamaño 4096 está haciendo 1024 veces menos propagaciones posteriores. Entonces, mi intuición es que los lotes más grandes hacen menos pasos de búsqueda más gruesos para la solución óptima, por lo que, por construcción, será menos probable que converjan en la solución óptima.

Lars Ericson
fuente