Algoritmi di ottimizzazione parallela per un problema con funzione obiettivo molto costosa


15

Sto ottimizzando una funzione di 10-20 variabili. La cattiva notizia è che ogni valutazione delle funzioni è costosa, circa 30 minuti di calcolo seriale. La buona notizia è che ho un cluster con poche decine di nodi computazionali a mia disposizione.

Quindi la domanda: ci sono algoritmi di ottimizzazione disponibili che mi permetterebbero di utilizzare tutta quella potenza computazionale in modo efficiente?

Su un lato dello spettro sarebbe una ricerca esaustiva: suddividere l'intero spazio di ricerca in una griglia fine e calcolare la funzione su ciascun punto della griglia in modo indipendente. Questo è certamente un calcolo molto parallelo, ma l'algoritmo è orribilmente inefficiente.

Dall'altro lato dello spettro ci sarebbero algoritmi quasi-Newton: aggiornare in modo intelligente la prossima stima dei parametri in base alla storia precedente. Questo è un algoritmo efficiente, ma non so come renderlo parallelo: il concetto di "stima dei parametri basata sulla storia precedente" suona come un calcolo seriale.

Gli algoritmi quadratici sembrano essere da qualche parte nel mezzo: si può costruire il "modello surrogato" iniziale calcolando un gruppo di valori in parallelo, ma non so se le iterazioni rimanenti siano parallelizzabili.

Qualche suggerimento su quale tipo di metodi di ottimizzazione senza gradiente funzionerebbe bene su un cluster? Inoltre, sono attualmente disponibili implementazioni parallele di algoritmi di ottimizzazione?


1
Puoi sempre calcolare il gradiente in parallelo (per i metodi quasi-Newton usando differenze finite) e ottenere uno speedup proporzionale al numero di parametri, cioè 10x-20x.
Stali,

@stali: per l'ottimizzazione hai bisogno dell'Assia per i metodi quasi-Newton. Il calcolo dell'Assia attraverso differenze finite nelle valutazioni delle funzioni non è davvero una buona idea. Anche il calcolo approssimazioni delle differenze finite del gradiente per l'ottimizzazione non è generalmente una buona idea.
Geoff Oxberry,

Molti metodi quasi-Newton come BFGS non richiedono esplicitamente l'assia. Penso che usando i gradienti, in combinazione con L-BFGS, l'OP possa raggiungere rapidamente ciò che vuole.
Stali,

@stali: ho sottolineato perché l'uso di un'approssimazione di differenza finita al gradiente sarebbe una cattiva idea nella mia risposta. Degraderà la convergenza introducendo errori nella parte destra dell'iterazione quasi-Newton. Inoltre, spreca le valutazioni delle funzioni perché non c'è alcuna possibilità di riutilizzare le vecchie valutazioni (diversamente dai metodi surrogati). L'uso di BFGS risolve solo metà dei problemi con l'approccio proposto.
Geoff Oxberry,

Questo è più appropriato un commento, non una risposta. Ma non ho scelta, dal momento che non ho abbastanza rappresentante per pubblicare un commento. Michael, ho un tipo di problema molto simile: costose valutazioni delle funzioni che coinvolgono simulazioni complesse in esecuzione su un cluster. Hai mai trovato un codice appropriato per eseguire l'ottimizzazione quando la valutazione della funzione comporta una simulazione su un cluster?
MoonMan,

Risposte:


16

Come afferma Paul, senza ulteriori informazioni, è difficile dare consigli senza ipotesi.

Con 10-20 variabili e costose valutazioni delle funzioni, la tendenza è quella di raccomandare algoritmi di ottimizzazione senza derivati. Non sarò molto d'accordo con il consiglio di Paul: generalmente hai bisogno di un gradiente di precisione automatica a meno che tu non stia usando una sorta di metodo speciale (per esempio, la discesa stocastica del gradiente nell'apprendimento automatico sfrutterà la forma dell'obiettivo per trovare ragionevole stime del gradiente).

Ogni passaggio di quasi Newton sarà nella forma:

H~(XK)dK=-f(XK),

dove è un'approssimazione della matrice hessiana, d k è la direzione di ricerca, x k è il valore delle variabili di decisione nell'iterata corrente, f è la funzione obiettivo e f è il gradiente del tuo obiettivo e il le variabili decisionali vengono aggiornate come x k + 1 = x k + α k d k , dove α kH~dKXKffXK+1=XK+αKdKαKè una dimensione del passo determinata in qualche modo (come una ricerca per riga). Puoi allontanarti dall'approssimazione dell'Assia in certi modi e le tue iterazioni convergeranno, sebbene se usi qualcosa come approssimazioni a differenza finita dell'Assia attraverso gradienti esatti, potresti soffrire di problemi a causa di mal condizionamento. Tipicamente, l'Assia viene approssimata usando il gradiente (ad esempio, i metodi di tipo BFGS con aggiornamenti di grado 1 sull'Assia).

L'approssimazione dell'Assia e del gradiente sia tramite differenze finite è una cattiva idea per una serie di motivi:

  • avrai un errore nel gradiente, quindi il metodo quasi-Newton che stai applicando è simile a trovare la radice di una funzione rumorosa
  • se le valutazioni delle funzioni sono costose e stai cercando di valutare un gradiente rispetto a variabili, ti costerà N valutazioni di funzione per iterazioneNN
  • se hai un errore nel gradiente, avrai più errore nel tuo Hessian, che è un grosso problema in termini di condizionamento del sistema lineare
  • ... e ti costerà valutazioni di funzione per iterazioneN2

Quindi, per ottenere una brutta iterazione di quasi-Newton, stai facendo qualcosa come fino a 420 valutazioni di funzioni a 30 minuti per valutazione, il che significa che stai aspettando un po 'per ogni iterazione, o stai per serve un grande cluster solo per le valutazioni delle funzioni. Gli effettivi risolti lineari saranno di 20 per 20 matrici (al massimo!), Quindi non c'è motivo di parallelizzarli. Se puoi ottenere informazioni sul gradiente, ad esempio risolvendo un problema aggiuntivo, allora potrebbe essere più utile, nel qual caso, vale la pena guardare un libro come Nocedal & Wright.

Se hai intenzione di fare molte valutazioni di funzioni in parallelo, dovresti invece esaminare approcci di modellazione surrogata o generare metodi di ricerca set prima di considerare approcci quasi-Newton. I classici articoli di revisione sono quelli di Rios e Sahinidis sui metodi privi di derivati , che sono stati pubblicati nel 2012 e offrono un confronto davvero ampio e ampio; l'articolo di benchmarking di More e Wild del 2009; il libro di testo del 2009 "Introduzione all'ottimizzazione senza derivati" di Conn, Scheinberg e Vicente; e l' articolo di revisione sulla generazione di metodi di ricerca impostati da Kolda, Lewis e Torczon dal 2003.

Come indicato sopra, il pacchetto software DAKOTA implementerà alcuni di questi metodi, così come NLOPT , che implementa DIRECT, e alcuni dei metodi di modellazione surrogata di Powell. Potresti anche dare un'occhiata a MCS ; è scritto in MATLAB, ma forse puoi portare l'implementazione di MATLAB nella lingua che preferisci. DAKOTA è essenzialmente una raccolta di script che puoi usare per eseguire la tua costosa simulazione e raccogliere dati per algoritmi di ottimizzazione, e NLOPT ha interfacce in un gran numero di lingue, quindi la scelta del linguaggio di programmazione non dovrebbe essere un grosso problema nell'uso di entrambi i pacchetti software; DAKOTA impiega un po 'di tempo per imparare, e ha una grande quantità di documentazione da esaminare.


2
È un piacere per me essere completamente sbagliato e imparare qualcosa di nuovo e utile nel processo :).
Paolo

Grazie! Ancora un altro chiarimento: quali di questi algoritmi sono in grado di eseguire valutazioni di funzioni in parallelo? Ad esempio, sulla griglia k-way che esegue iterazioni n + 1, ..., n + k basato solo sulle informazioni ottenute dalle iterazioni 1, ..., n?
Michael,


3

Forse gli algoritmi di ottimizzazione basati su surrogati sono ciò che stai cercando. Questi algoritmi utilizzano modelli surrogati per sostituire i veri modelli computazionalmente costosi durante il processo di ottimizzazione e cercano di ottenere una soluzione adeguata usando il minor numero possibile di valutazioni dei modelli computazionalmente costosi.

Penso che il metodo Pursuing Sampling possa essere usato per risolvere il tuo problema. Questo algoritmo utilizza il modello surrogato RBF per approssimare la costosa funzione obiettivo e può gestire vincoli non lineari. Ancora più importante, seleziona più candidati per eseguire le costose valutazioni delle funzioni in modo da poter distribuire questi candidati per il calcolo parallelo per accelerare ulteriormente il processo di ricerca. Il codice è open-source e scritto in MATLAB.

Riferimento

Wang, L., Shan, S. e Wang, GG (2004). Metodo di campionamento che persegue la modalità per l'ottimizzazione globale delle costose funzioni della scatola nera. Ottimizzazione dell'ingegneria, 36 (4), 419-438.


2

Non sono sicuro che un algoritmo parallelo sia davvero quello che stai cercando. Le valutazioni delle tue funzioni sono molto costose. Quello che vuoi fare è parallelizzare la funzione stessa, non necessariamente l'algoritmo di ottimizzazione.

Se non puoi farlo, allora c'è una via di mezzo tra ricerca esaustiva e algoritmo di Newton, sono i metodi Monte Carlo. Puoi, su un gruppo di diversi core / nodi, avviare lo stesso algoritmo che tende a cadere in optima locale (diciamo algoritmi quasi-Newton), ma tutti con condizioni iniziali casuali. La tua migliore ipotesi quindi per il vero optima è il minimo dei minimi. Questo è banale da parallelizzare e può essere usato per estendere qualsiasi metodo. Sebbene non sia perfettamente efficiente, se hai abbastanza potenza di calcolo a tua disposizione, può sicuramente vincere la battaglia tra produttività della programmazione e prestazioni dell'algoritmo (se hai molta potenza di calcolo, questo può finire prima che tu abbia mai finito di creare un algoritmo più elaborato).


0

La scelta dell'algoritmo di ottimizzazione (e quindi la sua parallelizzazione) dipende fortemente dalle proprietà della funzione e dei vincoli oggettivi. Senza sapere di più sul problema, è difficile dare qualsiasi tipo di consiglio significativo.

Ma dalle tue considerazioni sui metodi di Newton, deduco che la tua funzione oggettiva è differenziabile. Se possibile, il problema trarrebbe grande vantaggio dal parallelizzare la valutazione della funzione. Se non è possibile, puoi anche prendere in considerazione un metodo Newton inesatto che sostituisce i gradienti / iessiani esatti con approssimazioni alle differenze finite. Quindi, puoi utilizzare tutti quei processori a tua disposizione per calcolare ogni elemento diverso da zero del jacobian, come suggerisce @stali.

Per ulteriori informazioni, leggi l'ottimizzazione numerica di Nocedal & Wright, capitolo 7 . Esistono molti pacchetti software di ottimizzazione che implementano questo in parallelo. Tra i freeware più utilizzati c'è il pacchetto software DAKOTA (Sandia National Labs) .


5
N

-2

Ecco una soluzione al tuo problema.

La descrizione di un metodo matematico è fornita in questo documento .


3
Benvenuti in SciComp.SE. Potete fornire dettagli sull'approccio descritto nel documento e implementato nel software? Qual è il metodo usato? Perché va bene? Cosa viene fornito in questo approccio che le altre risposte non coprono?
Nicoguaro

2
Inoltre, sembra che questo sia il tuo lavoro. Se questo è vero, si prega di dichiararlo esplicitamente nella risposta.
Nicoguaro

@nicoguaro: grazie, ma so come fare clic sui collegamenti.
Michael,

2
@Michael, non è per te. La filosofia di questo sito è quella di essere una raccolta di risposte. Stai ottenendo la tua risposta oggi, ma in futuro qualcun altro potrà aver bisogno dello stesso aiuto. Questo è il motivo per cui ci sono standard di fatto su quale sia una buona risposta.
Nicoguaro
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.