Introducción
La optimización de los modelos es uno de los desafíos más difíciles en la implementación de soluciones de aprendizaje automático. Ramas enteras del aprendizaje automático y la teoría del aprendizaje profundo se han dedicado a la optimización de modelos.
La optimización de hiper parámetros en el aprendizaje automático tiene por objeto encontrar los hiper parámetros de un determinado algoritmo de aprendizaje automático que ofrezcan el mejor rendimiento medido en un conjunto de validación. Los hiper parámetros, a diferencia de los parámetros de los modelos, son establecidos por el ingeniero de aprendizaje de máquinas antes del entrenamiento. El número de árboles en un bosque aleatorio es un hiper parámetro, mientras que los pesos en una red neuronal son parámetros del modelo aprendidos durante el entrenamiento. Me gusta pensar que los hiper parámetros son los ajustes del modelo para que el modelo pueda resolver de manera óptima el problema de aprendizaje automático
Algunos ejemplos de hiper parámetros del modelo incluyen:
- La tasa de aprendizaje para el entrenamiento de una red neuronal.
- Los hiper parámetros c y 𝛾 para máquinas de vectores de soporte
- La k en k-vecinos más cercanos.
Lea También:
La optimización de hiper parámetros encuentra una combinación de hiper parámetros que devuelve un modelo óptimo que reduce una función de pérdida predefinida y a su vez aumenta la precisión en datos independientes dados.
Métodos de optimización de hiper parámetros
Los hiper parámetros pueden tener un impacto directo en el entrenamiento de los algoritmos de aprendizaje automático. Por lo tanto, para lograr el máximo rendimiento, es importante entender cómo optimizarlos. Aquí hay algunas estrategias comunes para optimizar los hiper parámetros:
1. Ajuste manual de hiper parámetros
Tradicionalmente, los hiper parámetros se ajustaban manualmente por ensayo y error. Esto todavía se hace comúnmente, y los ingenieros experimentados pueden "adivinar" los valores de los parámetros que ofrecerán una muy alta precisión para los modelos de aprendizaje automático. Sin embargo, hay una búsqueda continua de métodos mejores, más rápidos y más automáticos para optimizar los hiper parámetros.
2. Búsqueda de cuadrícula
La búsqueda en la red es posiblemente el método más básico de ajuste de hiper parámetros. Con esta técnica, simplemente construimos un modelo para cada posible combinación de todos los valores de hiper parámetros proporcionados, evaluando cada modelo y seleccionando la arquitectura que produce los mejores resultados.
Representación visual de la búsqueda en cuadrícula
La búsqueda por cuadrículas no sólo se aplica a un tipo de modelo, sino que puede aplicarse en todo el aprendizaje automático para calcular los mejores parámetros a utilizar para un modelo determinado.
Por ejemplo, un clasificador SVM típico de margen suave equipado con un núcleo RBF tiene al menos dos hiper parámetros que deben ser optimizados para un buen rendimiento en datos no vistos: una constante de regularización C y un hiper parámetro del Kernel γ. Ambos parámetros son continuos, por lo que para realizar la búsqueda de cuadrícula, se selecciona un conjunto finito de valores "razonables" para cada uno, digamos
La búsqueda en la cuadrícula entrena entonces una SVM con cada pareja (C, γ) en el
producto cartesiano de estos dos conjuntos y evalúa su rendimiento en un conjunto de validación (o por validación cruzada interna en el conjunto de entrenamiento, en cuyo caso se entrenan múltiples SVM por pareja). Por último, el algoritmo de búsqueda de cuadrículas da como resultado los ajustes que lograron la mayor puntuación en el procedimiento de validación.
from sklearn.datasets import load_iris
from sklearn.svm import SVC
iris = load_iris()
svc = SVR()
Aquí hay una implementación pitón de búsqueda en cuadrícula usando GridSearchCV de la biblioteca Sklearn.
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVR
grid = GridSearchCV(
estimator=SVR(kernel='rbf'),
param_grid={
'C': [0.1, 1, 100, 1000],
'epsilon': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10],
'gamma': [0.0001, 0.001, 0.005, 0.1, 1, 3, 5]
},
cv=5, scoring='neg_mean_squared_error', verbose=0, n_jobs=-1)
Ajustando la búsqueda de cuadrícula
grid.fit(X,y)
Métodos para correr en la cuadrícula de búsqueda:
#print the best score throughout the grid search
print grid.best_score_
#print the best parameter used for the highest score of the model.
print grid.best_param_
Luego usamos el mejor conjunto de valores de hiper parámetros elegidos en la búsqueda de la cuadrícula, en el modelo real como se muestra arriba.
Uno de los inconvenientes de la búsqueda de la cuadrícula es que cuando se trata de dimensionalidad, sufre al evaluar un número de hiper parámetros que crece exponencialmente. Sin embargo, no hay garantía de que la búsqueda produzca la solución perfecta, ya que normalmente la encuentra al alienar alrededor del conjunto correcto.
Lea También:
3. Búsqueda aleatoria
A menudo algunos de los hiper parámetros importan mucho más que otros. Realizar una búsqueda aleatoria en lugar de una búsqueda por cuadrículas permite un descubrimiento mucho más preciso de los buenos valores para los importantes.
Representación de la búsqueda aleatoria
La Búsqueda Aleatoria establece una cuadrícula de valores hiper paramétricos y selecciona combinaciones aleatorias para entrenar y puntuar el modelo. Esto permite controlar explícitamente el número de combinaciones de parámetros que se intentan. El número de iteraciones de búsqueda se establece en función del tiempo o los recursos. Scikit Learn ofrece la función RandomizedSearchCV para este proceso.
Aunque es posible que RandomizedSearchCV no encuentre un resultado tan preciso como GridSearchCV, sorprendentemente escoge el mejor resultado más a menudo y en una fracción del tiempo que GridSearchCV habría tardado. Con los mismos recursos, la Búsqueda Aleatoria puede incluso superar a la Búsqueda por Cuadrículas. Esto se puede visualizar en el gráfico de abajo cuando se utilizan parámetros continuos.
Las posibilidades de encontrar el parámetro óptimo son comparativamente mayores en la búsqueda aleatoria debido al patrón de búsqueda aleatoria en el que el modelo podría acabar siendo entrenado en los parámetros optimizados sin ningún tipo de solapamiento. La búsqueda aleatoria funciona mejor para datos de dimensiones inferiores, ya que el tiempo necesario para encontrar el conjunto adecuado es menor con un número menor de iteraciones. La búsqueda aleatoria es la mejor técnica de búsqueda de parámetros cuando hay menos número de dimensiones.
En el caso de los algoritmos de aprendizaje profundo, supera a la búsqueda por cuadrículas.
En la figura anterior, que tiene dos parámetros, con la búsqueda en cuadrícula de 5x6 se comprueban sólo 5 valores de parámetros diferentes de cada uno de los parámetros (seis filas y cinco columnas en el gráfico de la izquierda), mientras que con la búsqueda aleatoria se comprueban 14 valores de parámetros diferentes de cada uno de los parámetros.
¿Cómo funciona en Python?
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestRegressor
iris = load_iris()
rf = RandomForestRegressor(random_state = 42)
Aquí hay una implementación en Python de la búsqueda en cuadrícula usando RandomizedSearchCV de la biblioteca Sklearn.
from sklearn.model_selection import RandomizedSearchCV
random_grid = {'n_estimators': n_estimators,
'max_features': max_features,
'max_depth': max_depth,
'min_samples_split': min_samples_split,
'min_samples_leaf': min_samples_leaf,
'bootstrap': bootstrap}
rf_random = RandomizedSearchCV(estimator = rf,
param_distributions = random_grid, n_iter = 100, cv = 3,
verbose=2, random_state=42, n_jobs = -1)# Fit the random search model
Ajustando la búsqueda aleatoria:
rf_random.fit(X,y)
Métodos para correr en la cuadrícula de búsqueda
#print the best score throughout the grid search
print rf_random.best_score_
#print the best parameter used for the highest score of the model.
print rf_random.best_param_
Output:
{'bootstrap': True,
'max_depth': 70,
'max_features': 'auto',
'min_samples_leaf': 4,
'min_samples_split': 10,
'n_estimators': 400}
4. Optimización Bayesiana
Los dos métodos anteriores realizaron experimentos individuales construyendo modelos con varios valores de hiper parámetros registrando el rendimiento del modelo para cada uno. Debido a que cada experimento se realizó de forma aislada, es muy fácil paralelizar este proceso. Sin embargo, debido a que cada experimento se realizó de forma aislada, no podemos utilizar la información de un experimento para mejorar el siguiente. La optimización bayesiana pertenece a una clase de algoritmos de optimización basada en modelos secuenciales (SMBO) que permiten utilizar los resultados de nuestra iteración anterior para mejorar nuestro método de muestreo del siguiente experimento.
Esto, a su vez, limita el número de veces que un modelo necesita ser entrenado para la validación, ya que sólo aquellos ajustes que se espera que generen una mayor puntuación de validación se pasan para su evaluación.
La optimización bayesiana funciona construyendo una distribución posterior de funciones (proceso gaussiano) que describe mejor la función que se quiere optimizar. A medida que aumenta el número de observaciones, la distribución posterior mejora, y el algoritmo se vuelve más seguro de qué regiones del espacio de parámetros vale la pena explorar y cuáles no
Podemos ver esto en la imagen de abajo:
A medida que itera una y otra vez, el algoritmo equilibra sus necesidades de exploración y explotación teniendo en cuenta lo que sabe sobre la función del objetivo. En cada paso, se ajusta un Proceso Gaussiano a las muestras conocidas (puntos previamente explorados), y la distribución posterior, combinada con una estrategia de exploración (como UCB (Upper Confidence Bound), o EI (Expected Improvement)), se utiliza para determinar el siguiente punto que debe ser explorado.
Usando la Optimización Bayesiana, podemos explorar el espacio de parámetros de forma más inteligente, y así reducir el tiempo necesario para realizar este proceso.
Puede revisar la implementación en Python de la optimización Bayesiana
aca
5. Optimización basada en el gradiente
Se utiliza especialmente en el caso de las redes neuronales. Calcula el gradiente con respecto a los hiper parámetros y los optimiza utilizando el algoritmo del descenso del gradiente.
El cálculo del gradiente es el menor de los problemas. Al menos en tiempos de software de
diferenciación automática avanzada. (Implementar esto de manera general para todos los clasificadores de sklearn, por supuesto, no es fácil).
Y aunque hay trabajos de personas que usaron este tipo de idea, sólo lo hicieron para algún problema específico y bien formulado (por ejemplo, el ajuste de SVM). Además, probablemente había muchas suposiciones.
¿Por qué no es una buena idea?
- La optimización de hiper parámetros es en general no suave
- Al gradiente descendiente le gustan las funciones suaves, ya que un gradiente de cero no es útil.
- Cada hiper parámetro que se define por algún conjunto discreto (por ejemplo, la elección de la penalización de l1 vs. l2) introduce superficies no lisas.
- La optimización de hiper parámetros es generalmente no convexa
- Toda la teoría del descenso de gradiente asume que el problema subyacente es convexo.
- En un buen caso: se obtiene un mínimo local (puede ser arbitrariamente malo)
- En el peor de los casos, el descenso de gradiente no converge ni siquiera en un mínimo local.
Para obtener la implementación en Python y más información sobre el algoritmo de optimización de descenso de gradiente,
haga clic aquí.
6. Optimización evolutiva
La optimización evolutiva sigue un proceso inspirado en el concepto biológico de la evolución y, puesto que la evolución natural es un proceso dinámico en un entorno cambiante, también se adaptan bien a los problemas de optimización dinámica.
Los algoritmos evolutivos se utilizan a menudo para encontrar buenas soluciones aproximadas que no pueden ser fácilmente resueltas por otras técnicas. Los problemas de optimización a menudo no tienen una solución exacta, ya que puede llevar demasiado tiempo y ser muy intensivo desde el punto de vista informático para encontrar una solución óptima. Sin embargo, los algoritmos evolutivos son ideales en esas situaciones, ya que pueden utilizarse para encontrar una solución casi óptima que a menudo es suficiente.
Una ventaja de los algoritmos evolutivos es que desarrollan soluciones libres de cualquier concepto erróneo o sesgo humano, lo que significa que pueden producir ideas sorprendentes que tal vez nunca generemos nosotros mismos.
Puedes aprender más sobre los algoritmos evolutivos
aquí. También puedes comprobar la implementación de la python
aquí.
Como regla general, cuando quieras optimizar los hiper parámetros, piensa en la Búsqueda de cuadrícula y en la Búsqueda Aleatoria.
Conclusión
En este artículo, hemos aprendido que encontrar los valores correctos para los hiper parámetros puede ser una tarea frustrante y puede llevar a que los modelos de aprendizaje automático se sub ajusten o se sobreajusten. Vimos cómo este obstáculo puede superarse mediante el uso de la búsqueda de cuadrículas y la búsqueda aleatoria y otros algoritmos, que optimizan el ajuste de los hiper parámetros para ahorrar tiempo y eliminar la posibilidad de sobreajustar o sub ajustar por medio de adivinanzas aleatorias.
Bueno, así concluye este artículo. Espero que hayan disfrutado de la lectura, no duden en compartir sus comentarios/pensamientos/opiniones en la sección de comentarios.
Gracias por leerlo!!!