¿Cómo elegir el algoritmo de optimización correcto?

16

Necesito encontrar el mínimo de una función. Leer los documentos en http://docs.scipy.org/doc/scipy/reference/optimize.html , veo que hay varios algoritmos que hacen lo mismo, es decir, encontrar el mínimo. ¿Cómo sé cuál debo elegir?

algunos de los algoritmos enumerados

  • Minimice una función usando el algoritmo downx simplex.
  • Minimice una función usando el algoritmo BFGS.
  • Minimice una función con un algoritmo de gradiente conjugado no lineal.
  • Minimice la función f usando el método Newton-CG.
  • Minimice una función usando el método de Powell modificado.

Mi función es lineal. la dimensionalidad es de alrededor de 232750 (esta es la cantidad de gradientes diferentes que tengo que calcular cada vez), toma aproximadamente 2 minutos calcular el gradiente y el costo una vez, por lo que no es barato. No creo que tenga limitaciones. Es determinista y continuo.

siamii
fuente
Bueno, tienes que investigar la naturaleza de tu problema: ¿es lineal o no? ¿Cuál es su dimensionalidad? ¿Su función de costo es barata de evaluar? ¿Puede evaluar sus derivadas analíticamente y / o a bajo costo? ¿Tienes limitaciones? Si tiene restricciones, ¿puede escribir su problema fácilmente como sin restricciones? Explique más sobre estos asuntos.
usεr11852 dice Reinstate Monic el
@ user11852 Es lineal. la dimensionalidad es de alrededor de 50 características, toma aproximadamente 2 minutos calcular el gradiente y el costo una vez, por lo que no es barato. No creo que tenga limitaciones.
siamii 05 de
No estoy seguro de qué quieres decir con "lineal" aquí. Si su problema es lineal, el gradiente es constante y económico de calcular. Si su función objetivo es lineal y no tiene restricciones, el mínimo es -infinito (o tal vez 0).
Paul
@paul: en la optimización, la linealidad generalmente se refiere a las restricciones, no a la función en sí. (Erróneamente concedido) me referí a la "linealidad" en relación con la suavidad de la función y creo que a eso también se refirió el OP. En mi respuesta, me basé principalmente en el hecho de que dijo "continuo" después de todos modos.
usεr11852 dice Reinstate Monic el

Respuestas:

14

Basado en lo que dijo: supongo que tiene que optimizar para 50 variables; También supongo que está teniendo una situación en la que es muy costoso encontrar derivados analíticos (y mucho menos obtener números) y que su optimización no tiene restricciones.

Permítanme enfatizar, usted es un poco desafortunado porque entre 25-30 y 100 variables es una zona de penumbra cuando se trata de elegir entre rutinas de optimización a gran o pequeña escala. Dicho esto, sin embargo, no se pierde nada.

Dado que incluso la derivada de primer orden es costosa, eliminar la idea del método de Newton. Sin embargo, es posible que tengas suerte con Quasi-Newton (BFGS) si tu Hessian es ligeramente diagonal como para empezar. CG generalmente es un poco más lento que BFGS, por lo que probablemente eso no mejore mucho las cosas; úselo si la memoria también es un problema (o simplemente elija L-BFGS en ese caso). Además, dado lo lento que es evaluar su función, un simple algoritmo de búsqueda de línea / descenso más empinado sería tortuosamente lento; Lo mismo ocurre con el recocido simulado y otras variantes de búsqueda al azar (supongo que no tiene acceso a HMC y todo ese jazz).

Entonces, cuando necesite el mejor rendimiento de su inversión cuando se trata de una evaluación de una sola función: vaya con el método de Powell y también pruebe COBYLA; a pesar de ser un algoritmo de optimización restringido porque internamente lineal se aproximará al gradiente de su función para acelerar las cosas, podrá aprovechar la linealidad de su función. Definitivamente, también prueba NLopt para Python . Tienen muchos optimizadores sin gradiente; prueba UOBYQA; también es una creación de Powell (Optimización sin restricciones por aproximaciones cuadráticas).

Muy brevemente: los algoritmos N-CG dependen de la computación del Hessian, y su Hessian parece muy costoso de computar. NLCG y BFGS no lo requieren, aunque podrían intentar calcularlo una vez en su primer paso.

Dejé el algoritmo simplex a propósito porque es una bestia totalmente diferente; nada que ver con gradientes como tales. Pruébalo pero realmente no puedo comentarlo; realmente depende de la naturaleza de su problema.

Para una primera buena referencia sobre optimización numérica, el libro de CTKelly, Métodos iterativos para la optimización, lo llevará bastante lejos, bastante bien.

usεr11852 dice Reinstate Monic
fuente
Para referencia futura: puede interesarle consultar la versión beta de Computational Science en Stackexchange para preguntas similares.
usεr11852 dice Reinstate Monic el
gracias por la respuesta. En realidad, mi dimensionalidad es 232,750. Este es el número de gradientes que calculo cada vez. Hago la evaluación de la función y el cálculo del gradiente en la GPU. ¿Sería eso compatible con NLopt?
siamii
No he usado NLopt en las GPU, pero no veo una razón obvia por la que debería ser un problema con respecto a la compatibilidad. Aunque podría cuestionar el problema de la operación frecuente de E / S desde y hacia la GPU.
usεr11852 dice Reinstate Monic el
@ usεr11852, ¿También puede analizar la comparación de los métodos de descenso de gradiente y descomposición QR para minimizar la función de costo de regresión lineal? ¿Necesito hacer una pregunta por separado?
Dra. Nisha Arora
@DrNishaArora: Sí. Eso sería apropiado para una pregunta separada. Consulte el hilo ¿Por qué utilizar el descenso de gradiente para la regresión lineal, cuando hay disponible una solución matemática de forma cerrada? para asegurarse de evitar la duplicación!
usεr11852 dice Reinstate Monic
1

Tal vez debería obtener un libro introductorio sobre optimización numérica. Deberá tener en cuenta su función para decidir el algoritmo.

Entre los algoritmos que menciona, las diferencias importantes son si se necesita el jacobiano o el hessiano o solo la función en sí.

Teniendo en cuenta que este es un sitio de preguntas y respuestas sobre estadísticas y, por lo tanto, trata con variables aleatorias: asegúrese de que su función sea determinista y pueda evaluarse de manera que produzca resultados continuos en el espacio de búsqueda.

cbeleites apoya a Monica
fuente
Es determinista y continuo.
siamii 05 de