Come scegliere il giusto algoritmo di ottimizzazione?


16

Devo trovare il minimo di una funzione. Leggendo i documenti su http://docs.scipy.org/doc/scipy/reference/optimize.html Vedo che ci sono diversi algoritmi che fanno la stessa cosa, cioè trovano il minimo. Come faccio a sapere quale dovrei scegliere?

alcuni degli algoritmi elencati

  • Ridurre a icona una funzione utilizzando l'algoritmo simplex in discesa.
  • Ridurre a icona una funzione usando l'algoritmo BFGS.
  • Ridurre a icona una funzione con l'algoritmo del gradiente coniugato non lineare.
  • Ridurre al minimo la funzione f utilizzando il metodo Newton-CG.
  • Ridurre a icona una funzione usando il metodo Powell modificato.

La mia funzione è lineare. la dimensionalità è di circa 232750 (ecco quanti gradienti diversi devo calcolare ogni volta), ci vogliono circa 2 minuti per calcolare il gradiente e il costo una volta, quindi non è economico. Non credo di avere dei vincoli. è deterministico e continuo.


Bene, devi investigare la natura del tuo problema: è lineare o no? Qual è la dimensionalità di esso? La tua funzione di costo è economica da valutare? Puoi valutare i tuoi derivati ​​in modo analitico e / o economico? Hai dei vincoli? Se hai dei vincoli, puoi scrivere facilmente il tuo problema come non vincolato? Si prega di approfondire queste questioni di più.
usεr11852 dice Reinstate Monic il

@ user11852 È lineare. la dimensionalità è di circa 50 funzioni, ci vogliono circa 2 minuti per calcolare il gradiente e il costo una volta, quindi non è economico. Non credo di avere dei vincoli.
Siamii,

Non sono sicuro di cosa intendi per "lineare" qui. Se il tuo problema è lineare, il gradiente è costante ed economico da calcolare. Se la tua funzione oggettiva è lineare e non ha vincoli, il minimo è -infinito (o forse 0).
paul

@paul: nell'ottimizzazione la linearità di solito si riferisce ai vincoli, non alla funzione stessa. Io (erroneamente concesso) mi riferivo alla "linearità" in relazione alla fluidità della funzione e penso che sia anche ciò a cui si riferiva l'OP. Nella mia risposta mi sono basato principalmente sul fatto che in seguito ha detto "continuo".
usεr11852 dice Reinstate Monic il

Risposte:


14

Sulla base di quello che hai detto: suppongo che devi ottimizzare per 50 variabili; Suppongo anche che si stia verificando che è molto costoso trovare derivati ​​analitici (per non parlare di ottenere valori numerici) e che l'ottimizzazione non è vincolata.

Lasciami sottolineare, sei un po 'sfortunatamente causa tra 25-30 e 100 variabili, è un po' di zona crepuscolare quando si tratta di scegliere tra routine di ottimizzazione su larga o piccola scala. Detto questo, però, nulla è perduto.

Dato che anche i derivati ​​del primo ordine sono costosi per ottenere quel tipo, uccide l'idea del metodo di Newton. Potresti avere un po 'di fortuna con Quasi-Newton (BFGS) anche se il tuo Hessian è leggermente diagonale, come iniziare. CG è di solito un po 'più lento di BFGS, quindi probabilmente non migliorerà molto le cose; usalo se anche la memoria è un problema (o semplicemente scegli L-BFGS in quel caso). Inoltre, dato quanto sia lento valutare la tua funzione, un semplice algoritmo di ricerca di discesa / linea più ripido sarebbe tortuosamente lento; lo stesso vale per la ricottura simulata e altre varianti di ricerca casuali (suppongo che tu non abbia accesso a HMC e tutto quel jazz).

Quindi, quando hai bisogno del miglior rapporto qualità-prezzo per una valutazione a singola funzione: segui il metodo Powell e testa anche COBYLA; nonostante sia un algoritmo di ottimizzazione vincolato perché approssima internamente la pendenza della tua funzione per accelerare le cose, sarà in grado di sfruttare la linearità della tua funzione. Anche sicuramente provare nlopt per Python . Hanno molti ottimizzatori senza gradiente; prova UOBYQA; è anche un'idea di Powell (Unconstrained Optimization BY Quadratic Approximations).

Molto brevemente: gli algoritmi N-CG dipendono dal calcolo dell'Assia e la tua Assia sembra molto costosa da calcolare. NLCG e BFGS non lo richiedono, anche se potrebbero provare a provarlo una volta nel loro primo passo.

Ho omesso di proposito l'algoritmo simplex perché è una bestia totalmente diversa; nulla a che fare con i gradienti in quanto tali. Provalo ma non posso davvero commentarlo; dipende davvero dalla natura del tuo problema.

Per un primo buon riferimento sull'ottimizzazione numerica, il libro di Iterative Methods for Optimization di CTKelly ti porterà abbastanza lontano, abbastanza bene.


Per riferimento futuro: potresti essere interessato a consultare la beta di Computational Science su Stackexchange per domande simili.
usεr11852 dice Reinstate Monic il

Grazie per la risposta. In realtà, la mia dimensionalità è 232.750. Questo è il numero di gradienti che calcolo ogni volta. Faccio la valutazione della funzione e il calcolo del gradiente sulla GPU. Sarebbe compatibile con NLopt?
Siamii,

Non ho usato NLopt su GPU ma non vedo alcuna ragione ovvia per cui dovrebbe essere un problema per quanto riguarda la compatibilità. Potrei mettere in dubbio il problema, anche se di frequenti operazioni di I / O da e verso la GPU.
usεr11852 dice Reinstate Monic il

@ usεr11852, può anche discutere il confronto tra i metodi di discesa gradiente e decomposizione QR per minimizzare la funzione di costo della regressione lineare? Devo porre una domanda separata?
Dr Nisha Arora,

@DrNishaArora: Sì. Sarebbe appropriato per una domanda separata. Vedi la discussione Perché usare la discesa gradiente per la regressione lineare, quando è disponibile una soluzione matematica a forma chiusa? per evitare la duplicazione!
usεr11852 dice Reinstate Monic il

1

Forse dovresti procurarti un libro introduttivo sull'ottimizzazione numerica. Dovrai prendere in considerazione la tua funzione per decidere l'algoritmo.

Tra gli algoritmi che menzioni, differenze importanti sono se è necessario il giacobino o l'assia o solo la funzione stessa.

Considerando che si tratta di un sito di domande e risposte statistiche che tratta quindi di variabili casuali: assicurati che la tua funzione sia deterministica possa essere valutata in modo da produrre risultati continui sullo spazio di ricerca.


è deterministico e continuo.
Siamii,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.