Optimización de hiperparámetros para Deep Learning Structures utilizando Bayesian Optimization

He construido una estructura CLDNN (Convolucional, LSTM, Red Neuronal Profunda) para la tarea de clasificación de señal en bruto.

Cada época de entrenamiento dura aproximadamente 90 segundos y los hiperparámetros parecen ser muy difíciles de optimizar.

He estado investigando varias formas de optimizar los hiperparámetros (p. Ej., Búsqueda aleatoria o en cuadrícula) y descubrí la optimización bayesiana.

Aunque aún no entiendo completamente el algoritmo de optimización, me alimento como me ayudará mucho.

Me gustaría hacer algunas preguntas sobre la tarea de optimización.

  1. ¿Cómo configuro la optimización bayesiana con respecto a una red profunda? (¿Cuál es la función de costo que estamos tratando de optimizar?)
  2. ¿Cuál es la función que estoy tratando de optimizar? ¿Es el costo del conjunto de validación después de N épocas?
  3. ¿Es la menta verde un buen punto de partida para esta tarea? ¿Alguna otra sugerencia para esta tarea?

Apreciaría enormemente cualquier idea sobre este problema.

Aunque aún no entiendo completamente el algoritmo de optimización, me alimento como me ayudará mucho.

Primero, permítanme explicar brevemente esta parte. Los métodos de optimización Bayesian apuntan a lidiar con el intercambio de exploración y explotación en el problema de los bandidos con múltiples arms . En este problema, hay una función desconocida , que podemos evaluar en cualquier punto, pero cada evaluación cuesta (penalización directa o costo de oportunidad), y el objective es encontrar su máximo utilizando el menor número de ensayos posible. Básicamente, la compensación es la siguiente: conoce la función en un conjunto finito de puntos (de los cuales algunos son buenos y otros son malos), por lo que puede probar un área alrededor del máximo local actual, con la esperanza de mejorarlo (explotación), o puede probar un área de espacio completamente nueva, que potencialmente puede ser mucho mejor o peor (exploración), o en algún punto intermedio.

Los métodos Bayesianos de optimización (p. Ej. PI, EI, UCB) construyen un modelo de la función objective utilizando un Proceso Gaussiano (GP) y en cada paso eligen el punto más “prometedor” según su modelo GP (tenga en cuenta que puede ser “prometedor” definido de manera diferente por diferentes métodos particulares).

Aquí hay un ejemplo:

sin (x) * x

La verdadera función es f(x) = x * sin(x) (curva negra) en el intervalo [-10, 10] . Los puntos rojos representan cada ensayo, la curva roja es la media GP, la curva azul es la media más o menos una desviación estándar . Como puede ver, el modelo de GP no coincide con la función real en todas partes, pero el optimizador identificó rápidamente el área “caliente” alrededor de -8 y comenzó a explotarlo.

¿Cómo configuro la optimización bayesiana con respecto a una red profunda?

En este caso, el espacio está definido por hiperparámetros (posiblemente transformados), generalmente un hipercubo de unidad multidimensional.

Por ejemplo, supongamos que tiene tres hiperparámetros: una tasa de aprendizaje α in [0.001, 0.01] , el regularizador λ in [0.1, 1] (ambos continuos) y el tamaño de capa oculta N in [50..100] (entero). El espacio para la optimización es un cubo tridimensional [0, 1]*[0, 1]*[0, 1] . Cada punto (p0, p1, p2) en este cubo corresponde a una trinidad (α, λ, N) mediante la siguiente transformación:

 p0 -> α = 10**(p0-3) p1 -> λ = 10**(p1-1) p2 -> N = int(p2*50 + 50) 

¿Cuál es la función que estoy tratando de optimizar? ¿Es el costo del conjunto de validación después de N épocas?

Correcto, la función objective es la precisión de validación de la neural network. Claramente, cada evaluación es costosa, ya que requiere al menos varias épocas para el entrenamiento.

También tenga en cuenta que la función objective es estocástica , es decir, dos evaluaciones en el mismo punto pueden diferir ligeramente, pero no es un bloqueador de la optimización bayesiana, aunque obviamente aumenta la incertidumbre.

¿Es la menta verde un buen punto de partida para esta tarea? ¿Alguna otra sugerencia para esta tarea?

spearmint es una buena biblioteca, definitivamente puedes trabajar con eso. También puedo recomendar hipervelocidad .

En mi propia investigación, terminé escribiendo mi propia pequeña biblioteca, básicamente por dos razones: quería codificar el método bayesiano exacto para usar (en particular, encontré una estrategia de portafolio de UCB y PI convergida más rápido que cualquier otra cosa, en mi caso ); Además hay otra técnica que puede ahorrar hasta 50% del tiempo de entrenamiento llamado predicción de la curva de aprendizaje (la idea es omitir el ciclo completo de aprendizaje cuando el optimizador confía en que el modelo no aprende tan rápido como en otras áreas). No conozco ninguna biblioteca que implemente esto, así que lo codifiqué yo mismo, y al final valió la pena. Si estás interesado, el código está en GitHub .

    Intereting Posts