Intuitivamente, ¿cómo afecta el tamaño del mini lote al rendimiento del descenso de gradiente (estocástico)?

Hablando algorítmicamente, el uso de mini lotes más grandes en SGD le permite reducir la variación de sus actualizaciones de gradiente estocástico (tomando el promedio de los gradientes en el mini lote), y esto a su vez le permite tomar pasos más grandes , que significa que el algoritmo de optimización hará que el progreso sea más rápido. Sin embargo, la cantidad de trabajo realizado (en términos de número de cálculos de gradiente) para alcanzar una cierta precisión en el objetivo será la misma: con un tamaño de mini lote de n, la variación de la dirección de actualización se reducirá en un factor n, entonces la teoría le permite tomar pasos de tamaño que son n veces más grandes (ver, por ejemplo, [1, final de la Sección 4.2]), de modo que un solo paso lo llevará aproximadamente a la misma precisión que n pasos de SGD con un tamaño de mini lote de 1.

Esto suena como una gran noticia, ya que sugiere que tomar mini lotes muy grandes convergerá tan rápido en términos de cálculos de gradiente como usar un solo ejemplo a la vez, lo cual es excelente porque calcular el gradiente en un mini lote grande es trivial para Paralelizar (en una GPU, múltiples GPU o incluso muchas máquinas), mientras que usar un solo ejemplo por iteración requiere sincronización después de cada ejemplo, lo que hace que la paralelización sea mucho más desafiante.

Entonces, ¿dónde está la trampa? Bueno, a pesar de que dijimos que los mini lotes más grandes le permiten usar tamaños de paso más grandes, el tamaño de paso no puede exceder un límite superior algorítmico y dependiente del problema que depende de la suavidad de la función objetivo (generalmente 1 / L, donde L es la constante de Lipschitz de los gradientes “completos”, de modo que una vez que haya alcanzado este tamaño de paso, aumentar el tamaño del mini lote ya no le permitirá aumentar el tamaño del paso, lo que significa el cálculo adicional en la computación Se perderán más gradientes. Como comentario adicional, tenga en cuenta que SGD con tamaño de mini lote fijo generalmente necesita tamaños de paso más pequeños cerca del óptimo, y en esa situación se podría considerar aumentar el tamaño del lote en lugar de disminuir los tamaños de paso, para un paralelismo mejorado.

En la práctica, especialmente en el caso del aprendizaje profundo con GPU, los mini lotes grandes son muy atractivos computacionalmente. Además del fácil paralelismo entre procesadores / máquinas, pueden proporcionar un rendimiento mucho mejor, por ejemplo, haciendo uso de la reutilización de datos eficiente durante la propagación inversa (por ejemplo, hacer una matriz de matriz-matriz es mucho más eficiente que hacer muchas multiplicaciones de matriz-vector, dado que este último probablemente necesita recargar los datos de la matriz en los registros con mayor frecuencia) y al perder menos tiempo en viajes de ida y vuelta de comunicación de datos. Por estas razones, es bastante común en la práctica elegir tamaños de lote que aprovechen completamente la GPU (por ejemplo, hasta que se llene la memoria), y simplemente elegir el tamaño de paso más grande que funcione bien en la práctica después de algunas pruebas rápidas. Si la elección del tamaño del paso se guía por la restricción de 1 / L (suavidad), entonces la variación de las actualizaciones probablemente será menor de lo necesario, pero eso está bien, ya que solo significa que podremos mantener el constante de tamaño de paso durante un período de tiempo más largo.

Actualización (junio de 2017): Facebook logró ampliar esta estrategia, que denominan “regla de escala lineal”, a un tamaño de mini lote de 8192 para capacitar a las CNN de última generación en ImageNet (SGD de minibatch grande y preciso: Entrenamiento de ImageNet en 1 hora). Lo lograron al incluir una fase inicial de “calentamiento” para evitar dificultades de optimización con pasos de gran tamaño en las primeras épocas, y al garantizar una sobrecarga de comunicación mínima.

[1] [1606.04838] Métodos de optimización para el aprendizaje automático a gran escala

Facebook acaba de lanzar un artículo que aboga por tamaños de mini lotes más grandes. Es una lectura obligada: Precisión, gran minibatch SGD: capacitación de ImageNet en 1 hora

“En este documento, mostramos empíricamente que en el conjunto de datos de ImageNet, los minibatches grandes causan dificultades de optimización, pero cuando se abordan, las redes capacitadas muestran una buena generalización. Específicamente, no mostramos pérdida de precisión al entrenar con minibatch de gran tamaño de hasta 8192 imágenes. Para lograr este resultado, adoptamos una regla de escala lineal para ajustar las tasas de aprendizaje en función del tamaño del minibatch y desarrollamos un nuevo esquema de calentamiento que supera los desafíos de optimización al inicio de la capacitación. Con estas técnicas simples, nuestro sistema basado en Caffe2 entrena a ResNet-50 con un tamaño de minibatch de 8192 en 256 GPU en una hora, al tiempo que combina la precisión del minibatch pequeño ”.

Como Alberto señala, un mini lote más grande requiere una tasa de aprendizaje más pequeña.

Para ver por qué, considere la siguiente figura (del artículo de mi revista en Neural Networks ). La figura a continuación muestra gradientes curvos en un espacio de peso en 2-D. Suponiendo un pequeño conjunto de entrenamiento de tamaño 15, podríamos evaluar las 15 instancias en el punto inicial en el espacio de peso, sumarlas, y esto apuntaría en la dirección del gradiente verdadero para el conjunto de entrenamiento (que se muestra a través de la línea discontinua) . Pero si te das cuenta, el verdadero gradiente es una línea tangente . No sigue el gradiente subyacente. Si el gradiente se curva demasiado para la tasa de aprendizaje dada, el entrenamiento “desaprende” las cosas y salta las curvas pasadas como se muestra en (b).

Con la capacitación en línea, por otro lado, los pesos se actualizan después de cada instancia. Sí, esto significa que algunos pasos están en una dirección “incorrecta”. Pero incluso cuando lo están, la próxima instancia puede dar un paso desde ese nuevo lugar, en lugar de tener que dar un paso a ciegas desde el lugar de inicio. En (b), con el entrenamiento por lotes, los pasos se realizan en una dirección “errónea”, pero con la desventaja adicional de que cada gradiente local se calcula en función de los pesos antiguos y desactualizados.

El entrenamiento en línea permite que cada instancia se evalúe en función de la nueva ubicación en el espacio de peso, por lo tanto, siga ruidosamente a lo largo de la curva de gradiente subyacente real en lugar de seguir ruidosamente a lo largo de la línea tangente que era solo la dirección correcta al principio.

Mini-lote tiene los mismos problemas, pero está entre estos dos extremos. Se puede esperar, por lo tanto, que cuanto más grande sea el mini lote, menor será la tasa de aprendizaje necesaria para entrenar con la misma precisión (como se demuestra en el documento mencionado anteriormente).

¿Qué significa esto para la paralelización? Significa que no aprenderá N veces más rápido con N máquinas si usa un mini lote de tamaño B, en comparación con una máquina que actualiza los pesos después de cada ejemplo de entrenamiento. Sin embargo, si puede pagar las máquinas adicionales, entonces podría aprender entre 1 y N veces más rápido con N máquinas (por ejemplo, sqrt (N) o algo así). Esto no quiere decir que las GPU no puedan acelerar un poco las cosas localmente. Pero sí significa que cuanto más espere para actualizar sus pesos, más probabilidades tendrá de seguir una tangente en lugar del verdadero gradiente curvo.

Basado en mi propia experiencia práctica, dos cosas:

  1. Utilizo lotes pequeños (16 – 64 muestras, generalmente 32 es el mejor) para comer rápidamente la mayor parte de la pérdida. Eso es generalmente alrededor del 95% – 99% de la disminución de la pérdida total posible. Entreno mi red hasta que la pérdida de validación claramente no muestre más mejoras en el conjunto de datos de validación. Elimine todo el progreso del entrenamiento que se realizó después de que se encontró la mejor precisión de validación, ya que es un ajuste excesivo. Tome este mejor modelo y vaya al paso 2.
  2. Una vez que la pérdida de validación deja de disminuir con un tamaño de lote pequeño, aumento el tamaño del lote al valor máximo posible que se puede ajustar a la memoria de la GPU. El entrenamiento de esta manera es mucho más lento, pero me da una ganancia adicional en los datos de validación.

Usualmente uso el optimizador Adam con una tasa de aprendizaje predeterminada de 0.001, una vez que la pérdida deja de disminuir, disminuyo la tasa de aprendizaje en un factor de 0.1. Solo avance al paso 2 una vez que la disminución de la tasa de aprendizaje no brinde más mejoras y continúo entrenando con esa tasa de aprendizaje más baja que estaba dando mejoras en los tamaños de lotes pequeños.

Las dos cosas principales a tener en cuenta al optimizar el tamaño del mini lote son la eficiencia en el tiempo del entrenamiento y el ruido de la estimación del gradiente.

Digamos que tenemos un conjunto de datos con 100,000 ejemplos de capacitación, y estamos considerando un tamaño de mini lote de 100 y 10,000. Calcular el gradiente de un lote generalmente implica calcular alguna función sobre cada ejemplo de entrenamiento en el lote y sumar las funciones. En particular, el cálculo de gradiente es aproximadamente lineal en el tamaño del lote. Por lo tanto, tomará aproximadamente 100 veces más para calcular el gradiente de un lote de 10,000 que de un lote de 100.

Esto significa que la versión de 100 lotes de nuestro modelo realizará 100 actualizaciones de parámetros en el tiempo que le toma al modelo de 10,000 lotes realizar 1 actualización. El gradiente de los 100 lotes no será tan preciso como el gradiente de un lote de 10,000, por lo que las 100 actualizaciones probablemente no serán 100 veces más productivas que la actualización individual del lote de 10,000 más grande. Pero podrían ser 10 veces más productivos, lo que reduce drásticamente el tiempo total de entrenamiento.

A la parte ruidosa de la ecuación. Cuando calculamos el gradiente de un mini lote, lo que realmente estamos haciendo es aproximar el gradiente de todo el conjunto de entrenamiento. Obviamente, el gradiente de un único punto de datos será mucho más ruidoso que el gradiente de un lote de 100 lotes. Esto significa que no necesariamente estaremos bajando la función de error en la dirección del descenso más pronunciado.

Pero el ruido no es del todo malo. En particular, suponga que nuestra función de error es particularmente perniciosa y tiene un montón de pequeños valles. Si utilizamos todo el conjunto de entrenamiento para calcular cada gradiente, nuestro modelo se quedaría atascado en el primer valle en el que cayó (ya que registraría un gradiente de 0 en este punto). Si usamos mini lotes pequeños, por otro lado, obtendremos más ruido en nuestra estimación del gradiente. Este ruido podría ser suficiente para sacarnos de algunos de los valles poco profundos en la función de error.

Por lo tanto, hay una importante compensación a tener en cuenta entre poder saltar de mínimos poco profundos y asegurarse de que eventualmente converja en un mínimo en lugar de rebotar.

En la práctica, generalmente se usan mini lotes de pequeños a moderados (10-500), combinados con una tasa de aprendizaje en descomposición, lo que garantiza la convergencia a largo plazo al tiempo que mantiene el poder de saltar de los mínimos superficiales que se encuentran al principio.

Además de las muy buenas respuestas, que son correctas, pero se centran principalmente en la eficiencia computacional, quiero agregar otra perspectiva a esta pregunta:

Imagine que usa el conjunto de datos completo para el que desea entrenar como tamaño de lote. Entonces opera en la verdadera superficie de error del problema. En este caso, se moverá desde un punto de partida específico de manera bastante determinista en un mínimo local.

¡Esto en realidad no es lo que queremos! Por lo tanto, agregamos alguna variación estadística mediante el uso de mini lotes mezclados. Con esto podemos saltar de los mínimos locales tempranos de la verdadera superficie de error, ya que solo operamos en una aproximación local (el lote) de la misma.

Con esta intuición, tiene sentido utilizar al principio un tamaño de lote bastante pequeño para evitar todos los mínimos locales cercanos. Una vez que el aprendizaje progresó y está cerca de un buen mínimo, ¡ aumenta el tamaño del lote para converger!

Esta intuición obtiene algo de respaldo de un artículo reciente de Smith et al. de Google Brain.
[1711.00489] No disminuya la tasa de aprendizaje, aumente el tamaño del lote

Hicimos un estudio muy detallado de la formación de redes convolucionales con grandes lotes. Usando la Escala de Frecuencia Adaptativa por Capa (LARS), capacitamos exitosamente a Alexnet y Resnet-50 con el lote 32K. Más detalles en el documento: [1708.03888] Capacitación en grandes lotes de redes convolucionales

More Interesting

Los datos financieros fluyen como 'gatos que cambian sus caras porque las computadoras los reconocen en YouTube'. ¿Hay una solución a este problema?

¿Cuál es la diferencia entre Deep Autoencoders y Deep Belief Networks?

¿Qué tan útil es un trabajo cuantitativo en Goldman Sachs para un doctorado posterior en Machine Learning?

¿Las redes de cápsulas reemplazarán a las redes neuronales?

¿Puede haber mejoras en el tiempo de ejecución al usar GPU para la red neuronal incluso si el conjunto de datos es de baja dimensión?

Cómo implementar Inteligencia Artificial en un Proyecto Arduino

¿Cómo comenzarías en Computación ubicua y programación para ello?

¿Aprendizaje automático sin historia matemática?

¿Para qué se puede utilizar el análisis de la marcha?

Cómo calcular la probabilidad de que una oración aparezca en algún lugar del texto usando Word2Vec

¿Cómo funciona el algoritmo de recomendación de YouTube?

Soy un ingeniero electrónico que conoce algoritmos de aprendizaje automático, big data, estadísticas, SQL, Matlab. ¿Puedo ser contratado como ingeniero de IA de nivel básico?

¿Cuál es el futuro del aprendizaje de refuerzo profundo? ¿Es una buena idea comenzar un doctorado ahora trabajando en ataques adversos en sistemas RL?

¿Cuáles son algunas buenas implementaciones para modelos gráficos probabilísticos? En particular, quiero poder crear y visualizar redes de creencias y aplicar varios algoritmos como la eliminación de variables y otros algoritmos de aproximación.

¿Cuál es la diferencia entre segmentación y clasificación en el procesamiento de imágenes?