Me encuentro ante un problema de optimización que tendré que ejecutar (con una variedad de hiperparámetros diferentes) y me gustaría recibir algunos consejos sobre la mejor manera de optimizarlo. Tengo una función $f$ que sólo puedo evaluar de forma ruidosa, es decir, hay una varianza aleatoria. Tengo unas 7 variables en el grupo "A", y otras 4 variables en el grupo "B". Me gustaría maximizar la expectativa de $f$ con respecto a las variables A, mientras que simultáneamente se minimiza con respecto a "B". Cada evaluación de $f$ tarda entre unos segundos y un minuto, por lo que no me importa ejecutar un algoritmo relativamente complicado utilizando los datos de todas mis evaluaciones anteriores, con el fin de converger en menos llamadas a $f$ . La única restricción es que las variables sean todas positivas. Dado que también están operando en escalas muy diferentes (algunos son ~1, algunos son ~0,001, algunos son ~1000), por lo que estoy haciendo el problema un poco más fácil tomando el logaritmo de todos los parámetros primero. Es decir, en realidad estoy evaluando $f(\exp(\bf x))$ y ajustando mi vector de parámetros $\bf x$ . Espero que el cambio de mi destino óptimo sea dentro de $\pm 3$ en cada coordenada de $\bf x$ entonces. (Por lo tanto, dentro de un orden de magnitud de mis parámetros originales.) Esto también significa que el problema es esencialmente completamente sin restricciones ahora.
Esta es una idea que he tenido: Empezar por evaluar $f$ en un punto inicial $\bf x_0$ y, a continuación, evaluar $f$ a otros valores para $x_0$ con cada coordenada $\pm 1$ . Haga un ajuste cuadrático a estos puntos (ya tengo una biblioteca preparada para hacerlo), y luego inspeccione el término cuadrático. Si sólo tuviera variables del grupo A, entonces comprobaría que el término cuadrático es positivo definido, y luego haría una prueba en el óptimo global estimado de esa cuadrática. A medida que tome más y más puntos de prueba cerca del óptimo, el ajuste cuadrático empezará a prestar más atención a ajustarse correctamente alrededor de ahí (ya que tengo más muestras), y así esto debería converger al valor correcto. El inconveniente es que podría acabar ponderando "incorrectamente" los valores alejados del óptimo durante bastante tiempo; et No estoy seguro de cómo manejaría cuando no es positiva definitiva (sólo ejecutar un punto de prueba al azar cerca de un viejo óptimo esperado, tal vez??); et No estoy seguro de cómo manejaría la adición en las variables del grupo B manejaría esto.
Una posibilidad sería escribirla como la suma de una cuadrática A en y una cuadrática en B, y luego pasar al máximo de un término y al mínimo del otro. Pero esto descuida los términos cruzados de la variable A/B, que espero que importen aquí. De nuevo, lo ideal es que, a medida que se acumulen más datos alrededor del verdadero óptimo, éste converja (es decir, que todos los datos de B se recojan cerca del óptimo de A, y viceversa), pero esa convergencia podría ser muy lenta. Y todavía no estoy seguro de cómo abordar la definición positiva.
He podido encontrar algo de información sobre algoritmos de optimización estocástica, pero todos parecen estar mucho más diseñados para el caso con restricciones de memoria muy ajustadas, de forma que evitan utilizar demasiado las evaluaciones anteriores. Por ejemplo, este es el problema con el algoritmo de Python noisyopt
algoritmos. Dado que estoy min-maxing en diferentes variables, también, básicamente tengo que optimizar con respecto a A, y luego manteniendo A constante, optimizar el otro con respecto a B, que no es algo que la mayoría de los paquetes parecen gustar mucho, así que creo que tengo que rodar mi propio algoritmo aquí (y estoy muy feliz de hacerlo - Sólo quiero que estas optimizaciones sean rápidas!)
El código final en el que ejecuto muchos de estos problemas de optimización, espero ejecutarlo en el transcurso de un mes más o menos como parte de un proyecto de investigación, por lo que estoy muy contento de escribir mi propio algoritmo si creo que será más estable y requerirá menos invocaciones.