HyperOpt desmitificado

Cómo automatizar el ajuste de modelos con HyperOpt

¿Te encantan los modelos de tuning? Si su respuesta es "sí", esta publicación es no para ti.

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Una caricatura de mi abuelo — página web del NDN Collective .

En este blog, cubriremos el extremadamente popular algoritmo automatizado de ajuste de hiperparámetros llamado Estimadores de Parzen basados ​​en árboles (TPE). TPE es compatible con el paquete de código abierto, HyperOpt. Al aprovechar HyperOpt y TPE, los ingenieros de aprendizaje automático pueden desarrolle rápidamente modelos altamente optimizados sin ningún ajuste manual.

Sin más preámbulos, ¡sumergámonos!

HyperOpt es un paquete de Python de código abierto que utiliza un algoritmo llamado Tree-based Parzen Esimtors (TPE) para seleccionar hiperparámetros de modelo que optimizan una función objetivo definida por el usuario. Simplemente definiendo la forma funcional y los límites de cada hiperparámetro, TPE busca de manera exhaustiva pero eficiente a través del hiperespacio complejo para alcanzar los valores óptimos.

TPE es un algoritmo secuencial que aprovecha la actualización bayesiana y sigue la siguiente secuencia.

  1. Entrene un modelo con varios conjuntos de hiperparámetros seleccionados aleatoriamente, devolviendo valores de función objetivo.
  2. Dividir los valores de nuestra función objetivo observados en grupos "buenos" y "malos", de acuerdo con algún umbral gamma (γ).
  3. Calcule el puntaje de "prometedor", que es solo P(x|bueno) / P(x|malo).
  4. Determine los hiperparámetros que maximizan la promesa a través de modelos mixtos.
  5. Ajuste nuestro modelo usando los hiperparámetros del paso 4.
  6. Repita los pasos 2 a 5 hasta un criterio de parada.

Aquí hay un ejemplo de código rápido.

Ok, eso fue un montón de grandes palabras. Reduzcamos la velocidad y entendamos realmente lo que está pasando.

1.1 — Nuestro objetivo

Los científicos de datos están ocupados. Queremos producir modelos realmente buenos, pero hacerlo de una manera eficiente e idealmente sin intervención.

Sin embargo, ciertos pasos en el ciclo de vida del modelado de ML son muy difíciles de automatizar. El análisis exploratorio de datos (EDA) y la ingeniería de características, por ejemplo, suelen ser específicos de un tema y requieren la intuición humana. El ajuste del modelo, por otro lado, es un proceso iterativo en el que las computadoras pueden sobresalir.

Nuestro objetivo a lo largo de esta publicación es comprender cómo aprovechar los algoritmos para automatizar el proceso de ajuste del modelo.

Para ayudarnos a pensar en ese objetivo, usemos una analogía: somos piratas en busca de un tesoro enterrado. También es importante tener en cuenta que somos piratas muy eficientes que buscan minimizar nuestro tiempo buscando el tesoro enterrado. Entonces, ¿cómo debemos minimizar el tiempo dedicado a la búsqueda? La respuesta es usa un mapa!

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 1: ejemplo de espacio de búsqueda de hiperparámetros 3D. La ubicación del cofre del tesoro es un óptimo global. Imagen del autor.

En la figura 1, tenemos un mapa ficticio que muestra dónde se encuentra nuestro tesoro. Después de muchas escaladas y excavaciones, no sería demasiado difícil llegar a ese tesoro porque sabemos exactamente dónde está ubicado.

Pero, ¿qué pasa cuando no tenemos un mapa?

Cuando tenemos la tarea de ajustar un modelo, lamentablemente no recibimos un mapa. Nuestro terreno, que corresponde al espacio de búsqueda de hiperparámetros, es desconocido. Además, también se desconoce la ubicación de nuestro tesoro, que corresponde al conjunto óptimo de hiperparámetros.

Con esa configuración, hablemos de algunas formas potenciales de explorar este espacio de manera eficiente y encontrar algún tesoro.

1.2 — Soluciones potenciales

El método original para el ajuste del modelo es "manual": el ingeniero probará manualmente muchas configuraciones diferentes y verá qué combinación de hiperparámetros produce el mejor modelo. Si bien es informativo, este proceso es ineficiente. Tiene que haber una mejor manera…

1.2.1 — Búsqueda en cuadrícula (peor)

Nuestro primer algoritmo de optimización es la búsqueda en cuadrícula. La búsqueda en cuadrícula prueba iterativamente todas las combinaciones posibles de hiperparámetros dentro de una cuadrícula especificada por el usuario.

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 2: ejemplo de diseño de búsqueda en cuadrícula. Imagen por autor

Por ejemplo, en la figura 2, donde vea un punto rojo es donde volveremos a entrenar y evaluaremos nuestro modelo. Este marco es ineficiente porque reutiliza hiperparámetros defectuosos. Por ejemplo, si el hiperparámetro 2 tiene poco impacto en nuestra función objetivo, aún probaremos todas las combinaciones de sus valores, aumentando así el número requerido de iteraciones en 10x (en este ejemplo).

Pero antes de continuar, es importante tener en cuenta que la búsqueda de cuadrícula sigue siendo bastante popular porque garantiza encontrar un óptimo dada una cuadrícula correctamente especificada. Si decide utilizar el método, asegúrese de transformar su cuadrícula para reflejar la forma funcional de sus hiperparámetros. Por ejemplo, profundidad_máxima para un clasificador de bosque aleatorio es un número entero, no permita que busque en un espacio continuo. También es poco probable que tenga una distribución uniforme: si conoce la forma funcional de su hiperparámetro, transforme la cuadrícula para reflejarla.

En resumen, La búsqueda en cuadrícula está sujeta a la maldición de la dimensionalidad y vuelve a calcular la información entre evaluaciones, pero todavía se usa ampliamente.

1.2.2 — Búsqueda aleatoria (buena)

Nuestro segundo algoritmo es la búsqueda aleatoria. La búsqueda aleatoria prueba valores aleatorios dentro de una cuadrícula especificada por el usuario. A diferencia de la búsqueda en cuadrícula, no estamos relegados a probar todas las combinaciones posibles de hiperparámetros, lo que aumenta la eficiencia.

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 3: ejemplo de búsqueda aleatoria. Imagen del autor.

Aquí hay un hecho interesante: la búsqueda aleatoria encontrará (en promedio) una configuración de hiperparámetro del 5% superior dentro 60 iteraciones. Dicho esto, al igual que con la búsqueda en cuadrícula, debe transformar su espacio de búsqueda para reflejar la forma funcional de cada hiperparámetro.

La búsqueda aleatoria es una buena línea de base para la optimización de hiperparámetros.

1.2.3 — Optimización bayesiana (mejor)

Nuestro tercer candidato es nuestro primer algoritmo de optimización basada en modelos secuenciales (SMBO). La diferencia conceptual clave de las técnicas anteriores es que utilice de forma iterativa ejecuciones anteriores para determinar futuros puntos de exploración.

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 4: ejemplo de optimización bayesiana — src. Imagen del autor.

La optimización bayesiana de hiperparámetros busca desarrollar una distribución probabilística de nuestro espacio de búsqueda de hiperparámetros. A partir de ahí, utiliza una función de adquisición, como la mejora esperada esperada, para transformar nuestro hiperespacio para que sea más "buscable". Finalmente, utiliza un algoritmo de optimización, como el descenso de gradiente estocástico, para encontrar los hiperparámetros que maximizan nuestra función de adquisición. Esos hiperparámetros se usan para ajustar nuestro modelo y el proceso se repite hasta la convergencia.

La optimización bayesiana normalmente supera a la búsqueda aleatoria, sin embargo, tiene algunas limitaciones fundamentales, como la necesidad de hiperparámetros numéricos.

1.2.4 — Estimadores de Parzen basados ​​en árboles (mejor)

Finalmente, hablemos de la estrella del espectáculo: Estimadores de Parzen basados ​​en árboles (TPE). TPE es otro algoritmo SMBO que normalmente supera la optimización bayesiana básica, pero el punto de venta principal es que maneja relaciones complejas de hiperparámetros a través de una estructura de árbol.

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 5: ejemplo de estructura jerárquica para TPE — src. Imagen del autor.

Usemos la figura 5 para entender esto estructura de árbol. Aquí estamos entrenando un clasificador de máquina de vectores de soporte (SVM). Probaremos dos núcleos: linear y RBF. La linear kernel no toma un parámetro de ancho pero RBF lo hace, por lo que al usar un diccionario anidado podemos codificar esta estructura y, por lo tanto, limitar el espacio de búsqueda.

TPE también admite variables categóricas que la optimización bayesiana tradicional no admite.

Descargo de responsabilidad rápido antes de continuar, hay muchos otros paquetes de ajuste de hiperparámetros. Cada uno admite una variedad de algoritmos, algunos de los cuales incluyen bosques aleatorios, procesos gaussianos y algoritmos genéticos. TPE es un algoritmo muy popular y de propósito general, pero no es necesariamente el mejor.

En general, TPE es una solución de optimización de hiperparámetros realmente robusta y eficiente.

Ahora que tenemos una comprensión general de algunos algoritmos populares de optimización de hiperparámetros, profundicemos en cómo funciona TPE.

Volviendo a nuestra analogía, somos piratas en busca de un tesoro enterrado pero no tengo un mapa. Nuestro capitán necesita el tesoro lo antes posible, por lo que debemos excavar en lugares estratégicos que tengan una alta probabilidad de tener un tesoro, utilizando excavaciones anteriores para determinar la ubicación de futuras excavaciones.

2.1 — Inicialización

Para empezar, nosotros definir las restricciones en nuestro espacio. Como se señaló anteriormente, nuestros hiperparámetros a menudo tienen una forma funcional, valores máximos/mínimos y una relación jerárquica con otros hiperparámetros. Usando nuestro conocimiento sobre nuestros algoritmos ML y nuestros datos, podemos definir nuestro espacio de búsqueda.

A continuación, debemos definir nuestra función objetivo, que se utiliza para evaluar qué tan "buena" es nuestra combinación de hiperparámetros. Algunos ejemplos incluyen funciones clásicas de pérdida de ML, como RMSE o AUC.

¡Excelente! Ahora que tenemos un espacio de búsqueda acotado y una forma de medir el éxito, estamos listos para comenzar a buscar...

2.2 — Optimización bayesiana iterativa

La optimización bayesiana es un algoritmo secuencial que encuentra puntos en el hiperespacio con una alta probabilidad de ser “exitoso” según una función objetivo. TPE aprovecha la optimización bayesiana pero utiliza algunos trucos inteligentes para mejorar el rendimiento y manejar la complejidad del espacio de búsqueda...

2.2.0 — La configuración conceptual

El primer truco es modelar. P(x|y) en lugar de P(y|x)…

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 6: probabilidad condicional que TPE busca resolver. Imagen del autor.

La optimización bayesiana generalmente busca modelar P(y|x), que es la probabilidad de un valor de función objetivo (y), hiperparámetros dados (x). TPE hace lo contrario: busca modelar P(x|y), cuál es la probabilidad de los hiperparámetros (x), dado el valor de la función objetivo (y).

En resumen, TPE intenta encontrar los mejores valores de la función objetivo y luego determina los hiperparámetros asociados.

Con esa configuración muy importante, entremos en el algoritmo real.

2.2.1 — Dividir nuestros datos en grupos "buenos" y "malos"

Recuerde, nuestro objetivo es encontrar los mejores valores de hiperparámetros de acuerdo con alguna función objetivo. Entonces, ¿cómo podemos aprovechar P(x|y) ¿Para hacer eso?

Primero, TPE divide nuestros puntos de datos observados en dos grupos: candidato, denotado g (x), y malos, denotado l(x). El límite entre bueno y malo está determinado por un parámetro definido por el usuario gamma (γ), que corresponde al percentil de la función objetivo que divide nuestras observaciones (y*).

Entonces, con γ = 0.5, el valor de nuestra función objetivo que divide nuestras observaciones (y*) será la mediana de nuestros puntos observados.

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 7: descomposición de p(x|y) en dos conjuntos. Imagen del autor.

Como se muestra en la figura 7, podemos formalizar p(x|y) utilizando el marco anterior. Y, para seguir con la analogía del pirata...

Perspectiva pirata: observando los lugares que ya hemos explorado, l(x) enumera lugares con muy pocos tesoros y g(x) enumera lugares con muchos tesoros.

2.2.32— Calcular el puntaje de “promesa”

En segundo lugar, TPE define cómo debemos evaluar una combinación de hiperparámetros no observada a través de la puntuación de "promesa".

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 8: definición de puntaje de promesa. Imagen del autor.

La Figura 8 define nuestra puntuación de promesa (P), que es solo una relación con los siguientes componentes...

  • Numerador: la probabilidad de observar un conjunto de hiperparámetros (x), dado que el valor de la función objetivo correspondiente es “candidato."
  • Denominador: la probabilidad de observar un conjunto de hiperparámetros (x), dado que el valor de la función objetivo correspondiente es “malos."

Cuanto mayor sea el valor de "prometedor", es más probable que nuestros hiperparámetros x producirá una “buena” función objetivo.

Perspectiva pirata: la promesa muestra la probabilidad de que un lugar determinado en nuestro terreno tenga muchos tesoros.

Dejando de lado antes de continuar, si está familiarizado con la optimización bayesiana, esta ecuación actúa como una función de adquisición y es proporcional a la Mejora Esperada (EI).

2.2.3— Crear estimaciones de densidad de probabilidad

En tercer lugar, TPE busca evaluar el puntaje de "prometedor" a través de modelos de mezcla. La idea de los modelos mixtos es tomar múltiples distribuciones de probabilidad y juntarlas usando una combinación lineal: src. Estas distribuciones de probabilidad combinadas se utilizan luego para desarrollar estimaciones de densidad de probabilidad.

En general, el proceso de modelado de mezclas es...

  1. Definir el tipo de distribución de nuestros puntos. En nuestro caso, si nuestra variable es categórica usamos una distribución categórica ponderada y si es numérica usamos una distribución gaussiana (es decir, normal) o uniforme.
  2. Iterar sobre cada punto e insertar una distribución en ese punto.
  3. Sume la masa de todas las distribuciones para obtener una estimación de la densidad de probabilidad.

Tenga en cuenta que este proceso se ejecuta individualmente para ambos conjuntos. l(x) y g(x).

Veamos un ejemplo en la figura 9...

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 9: ejemplo de distribuciones gaussianas truncadas ajustadas a 3 observaciones de hiperparámetros. Imagen del autor.

Para cada observación (puntos azules en el eje x), creamos una distribución normal ~N(μ, σ), donde...

  • µ (mu) es la media de nuestra distribución normal. Su valor es la ubicación de nuestro punto a lo largo del eje x.
  • σ (sigma) es la desviación estándar de nuestra distribución normal. Su valor es la distancia al punto vecino más cercano..

Si los puntos están muy juntos, la desviación estándar será pequeña y, por lo tanto, la distribución será muy alta y, por el contrario, si los puntos están separados, la distribución será plana (figura 10)...

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 10: ejemplo del impacto de la desviación estándar en la forma de una distribución normal. Imagen del autor.

Perspectiva pirata: NA: los piratas no son buenos con los modelos mixtos.

Otro comentario rápido antes de continuar: si está leyendo la literatura, notará que TPE usa gaussianos "truncados", lo que simplemente significa que los gaussianos están limitados por el rango que especificamos en nuestra configuración de hiperparámetros en lugar de extenderse a +/- infinito .

2.2.4 — ¡Determinación del próximo punto a explorar!

Juntemos estas piezas. Hasta ahora, hemos 1) adquirido observaciones de funciones objetivas, 2) definido nuestra fórmula de "promesa" y 3) creado una estimación de densidad de probabilidad a través de modelos mixtos basados ​​en valores anteriores. ¡Tenemos todas las piezas para evaluar un punto dado!

Nuestro primer paso es crear una función de densidad de probabilidad promedio (PDF) para ambos g (x) y l(x).

Hiperparámetro ajuste de hiperparámetro ajuste de modelo aprendizaje automático ciencia de datos modelo sklearn mllib chispa hyperopt árbol parzen estimador tpe árbol basado parzen esimtator mlflow databricks
Figura 11: superposición de la densidad de probabilidad promedio dados 3 puntos observados. Imagen del autor.

En la figura 11 se muestra un proceso de ejemplo: la línea roja es nuestro PDF promedio y es simplemente la suma de todos los PDF dividida por la cantidad de PDF.

Usando el PDF promedio, podemos obtener la probabilidad de cualquier valor de hiperparámetro (x) estar en g (x) or l(x).

Por ejemplo, digamos que los valores observados en la figura 11 pertenecen al conjunto "bueno", g (x). Según nuestro PDF promedio, es poco probable que un valor de hiperparámetro de 3.9 o 0.05 pertenezca al conjunto "bueno". Por el contrario, un valor de hiperparámetro de ~1.2 parece muy probable que pertenezca al conjunto "bueno".

Ahora bien, esto es sólo la mitad de la imagen. Aplicamos la misma metodología para el conjunto “malo”, l(x). Dado que buscamos maximizar g(x) / l(x), los puntos prometedores deben ubicarse donde g (x) es alto y l(x) es bajo.

Muy bien, ¿verdad?

Con estas distribuciones de probabilidad, podemos tomar muestras de nuestros hiperparámetros estructurados en árbol y encontrar el conjunto de hiperparámetros que maximizan la "promesa" y, por lo tanto, vale la pena explorarlos.

Perspectiva pirata: la siguiente ubicación que excavamos es la ubicación que maximiza la (probabilidad de tener muchos tesoros) / (probabilidad de tener pocos tesoros).

Ahora que sabe cómo funciona, aquí hay algunos consejos prácticos para implementar TPE a través del paquete de código abierto, HyperOpt.

3.1 — Estructura de una aplicación HyperOpt

En general, hay tres pasos principales al aprovechar HyperOpt...

  1. Definir el espacio de búsqueda, que son solo los rangos y las formas funcionales de los hiperparámetros que busca optimizar.
  2. Definir la función de ajuste, que llama a tu model.fit() función en un determinado tren/fracción de prueba.
  3. Definir la función objetivo, que es cualquiera de las métricas de precisión clásicas, como RMSE o AUC.

Desafortunadamente, estos métodos de ajuste automatizado aún requieren aportes de diseño del científico de datos; no es un almuerzo completamente gratis. Sin embargo, anecdóticamente, TPE es bastante resistente a la especificación incorrecta de hiperparámetros (dentro de lo razonable).

3.2— Consejos y trucos

  • HyperOpt es paralelizable a través de ambos Apache Spark y MongoDB. Si está trabajando con múltiples núcleos, ya sea en la nube o en su máquina local, esto puede reducir drásticamente el tiempo de ejecución.
  • Si está paralelizando el proceso de ajuste a través de Apache Spark, use un SparkTrialsobjeto para modelos ML de un solo nodo (sklearn) y un Trails objeto para modelos ML paralelizados (MLlib). El código está debajo.
  • flujo ml es un método de código abierto para realizar un seguimiento de las ejecuciones de su modelo. Se integra fácilmente con HyperOpt.
  • No reduzca el espacio de búsqueda demasiado pronto. Algunas combinaciones de hiperparámetros pueden ser sorprendentemente efectivas.
  • Definir el espacio de búsqueda puede ser complicado, especialmente si no conoce el forma funcional de sus hiperparámetros. Sin embargo, por experiencia personal, TPE es bastante resistente a la especificación incorrecta de esas formas funcionales.
  • Elegir una buena función objetivo es muy útil. En la mayoría de los casos, el error no se crea igual. Si un cierto tipo de error es más problemático, asegúrese de incorporar esa lógica a su función.

3.3— Un ejemplo de código

Aquí hay un código para ejecutar HyperOpt de manera distribuida. Fue adaptado del código en el libro, Ingeniería de aprendizaje automático en acción - aquí esta la repositorio de git.

Algunas buenas características de este fragmento incluyen la paralelización a través de Apache Spark y modelo de registro a través de flujo ml. También tenga en cuenta que este fragmento optimiza un sklearn RandomForestRegressor: tendrá que cambiar el modelo y la función de ajuste para satisfacer sus necesidades.

Y ahí lo tienes: ¡HyperOpt en todo su esplendor!

Para martillar la esperanza de los puntos clave, recapitulemos rápidamente.

El ajuste de hiperparámetros es una parte necesaria del ciclo de vida del modelo de ML, pero requiere mucho tiempo. Los algoritmos de optimización basada en modelos secuenciales (SMBO) se destacan en la búsqueda de hiperespacios complejos para obtener valores óptimos, y se pueden aplicar al ajuste de hiperparámetros. Tree-based Parzen Estimators (TPE) es un SMBO muy eficiente y supera tanto a la optimización bayesiana como a la búsqueda aleatoria.

TPE repite los pasos a continuación hasta un criterio de parada:

  1. Divida los puntos observados en conjuntos "buenos" y "malos", de acuerdo con algún hiperparámetro, gamma.
  2. Ajuste un modelo mixto tanto al conjunto "bueno" como al "malo" para desarrollar una estimación de densidad de probabilidad promedio.
  3. Seleccione el punto que optimice la puntuación de "promesa", que aprovecha el paso 2 para estimar la probabilidad de estar en los conjuntos "bueno" y "malo".

Finalmente, tenemos un fragmento de código realmente genial que muestra cómo paralelizar HyperOpt a través de SparkTrials. También registra todas nuestras iteraciones en MLflow.

HyperOpt desmitificado republicado de la fuente https://towardsdatascience.com/hyperopt-demystified-3e14006eb6fa?source=rss—-7f60cf5620c9—4 a través de https://towardsdatascience.com/feed

<!–

->

Sello de tiempo:

Mas de Consultores Blockchain