BFGS vs. metodo del gradiente coniugato


25

Quali considerazioni dovrei prendere nella scelta tra BFGS e gradiente coniugato per l'ottimizzazione? La funzione che sto cercando di adattare a queste variabili sono funzioni esponenziali; tuttavia, l'effettiva funzione oggettiva comporta l'integrazione, tra le altre cose, ed è molto costosa se ciò aiuta affatto.


3
Bene, BFGS è sicuramente più costoso in termini di archiviazione rispetto a CG. Uno richiede il mantenimento di un'Assia approssimativa, mentre l'altro richiede solo pochi vettori. D'altra parte, entrambi richiedono il calcolo di un gradiente, ma mi è stato detto che con BFGS, puoi cavartela usando approssimazioni alle differenze finite invece di dover scrivere una routine per il gradiente (ma la versione che usa le differenze finite converge un po ' più lento di quello che utilizza i gradienti reali, ovviamente). Se disponi di una funzione di differenziazione automatica, l'unica preoccupazione è la conservazione.
JM il

devono contenere solo ~ 7 (sicuramente meno di 10) variabili significa che l'approssimazione della tela di iuta è solo (al massimo) una matrice 10x10 corretta? nel qual caso, uno è più veloce dell'altro?
drjrm3,

Non penso che ci sarebbe molta differenza nella velocità; semmai, penso che la parte del tuo calcolo che probabilmente richiederebbe più tempo siano le quadrature che devi fare per la valutazione delle funzioni. Dovresti davvero fare alcuni esperimenti da solo, se il numero di parametri è piccolo come dici.
JM,

Risposte:


13

JM ha ragione sull'archiviazione. BFGS richiede un hessiano approssimativo, ma è possibile inizializzarlo con la matrice identità e quindi calcolare gli aggiornamenti di secondo rango per il hessiano approssimativo mentre si procede, purché si disponga di informazioni sul gradiente, preferibilmente analiticamente piuttosto che attraverso differenze finite. BFGS è un metodo quasi-Newton, e converge in meno passaggi rispetto a CG, e ha una tendenza un po 'meno a "bloccarsi" e richiede lievi modifiche algoritmiche per ottenere una discesa significativa per ogni iterazione.

Al contrario, CG richiede prodotti a matrice vettoriale, che potrebbero esserti utili se puoi calcolare derivati ​​direzionali (di nuovo, analiticamente o usando differenze finite). Un calcolo della differenza finita di un derivato direzionale sarà molto più economico di un calcolo della differenza finita di un hessiano, quindi se scegli di costruire il tuo algoritmo usando differenze finite, calcola direttamente il derivato direzionale. Questa osservazione, tuttavia, non si applica in realtà a BFGS, che calcolerà gli assiani approssimativi utilizzando prodotti interni di informazioni sul gradiente.

In termini di tassi di convergenza, se è il numero di variabili decisionali nel tuo problema, allora iterazioni CG equivalgono approssimativamente a un passo del metodo di Newton. BFGS è un metodo quasi-Newton, ma lo stesso tipo di osservazione dovrebbe valere; è probabile che si ottenga convergenza in meno iterazioni con BFGS a meno che non ci siano un paio di direzioni CG in cui vi è molta discesa, quindi dopo alcune iterazioni CG, si riavvia. I metodi di tipo CG sono più economici se i prodotti a matrice vettoriale sono economici e il tuo problema è così grande che la memorizzazione dell'Assia è difficile o impossibile. BFGS comporta alcuni altri prodotti vettoriali vettoriali per aggiornare la sua hessiana approssimativa, quindi ogni iterazione di BFGS sarà più costosa, ma ne avrai bisogno di meno per raggiungere un minimo locale.nnn

Confronterei i due algoritmi su un piccolo problema di test per la tua applicazione se sai che l'archiviazione non sarà un problema. Senza conoscere i dettagli specifici del tuo problema, suppongo che BFGS sarà più veloce, ma dovresti davvero testare i due algoritmi per avere un'idea migliore di quale funzionerà meglio.

Infine, una parola sulla differenziazione automatica: avendo una certa esperienza con una struttura di differenziazione automatica interna (AD) per Fortran ( DAEPACK ), posso dirti che gli strumenti AD sono spesso schizzinosi. Potrebbero non essere necessariamente in grado di differenziare il codice che si generano da soli. Esistono due tipi di strumenti AD:

  • strumenti AD da fonte a fonte
  • operatore che sovraccarica gli strumenti AD

Gli strumenti da sorgente a sorgente sono essenzialmente compilatori modificati che prendono il codice sorgente che hai scritto, analizzano e generano automaticamente un nuovo codice sorgente che calcola il gradiente delle funzioni nel codice sorgente. Gli strumenti di sovraccarico dell'operatore richiedono di utilizzare gli operatori di sovraccarico nel codice sorgente in modo da poter calcolare i derivati, il che richiederebbe un ulteriore sforzo da parte vostra per calcolare i derivati ​​analitici con l'AD.


22

Il costo associato di BFGS potrebbe essere più in linea con CG se si utilizzano varianti di memoria limitate anziché BFGS a memoria completa. Questo calcola in modo efficiente l'aggiornamento BFGS per gli ultimi aggiornamenti mediante una serie di aggiornamenti di livello uno senza dover memorizzare più delle ultime soluzioni e gradienti.mmm

Nella mia esperienza, BFGS con molti aggiornamenti memorizza informazioni troppo lontane dalla soluzione attuale per essere davvero utili per l'approssimazione del giacobino non ritardato, e puoi effettivamente perdere la convergenza se memorizzi troppo. Esistono varianti "senza memoria" di BFGS che assomigliano molto ai gradienti coniugati non lineari (vedi l'aggiornamento finale descritto per uno di questi) proprio per questi motivi. Pertanto, se si è disposti a fare L-BFGS anziché BFGS, i problemi di memoria scompaiono e i metodi sono correlati . Le prove aneddotiche indicano che il riavvio è un problema complicato, poiché a volte è superfluo e talvolta molto necessario.

La scelta tra i due dipende anche fortemente dai problemi che ti interessano. Se hai le risorse, puoi provare entrambi per i tuoi problemi e decidere quale funziona meglio. Ad esempio, personalmente non eseguo l'ottimizzazione con questi algoritmi, ma mi preoccupo invece della soluzione di sistemi di equazioni non lineari. Per questi ho scoperto che NCG funziona meglio ed è più semplice eseguire precondizionamenti non lineari. BFGS è più robusto.

Francamente, il mio metodo preferito per questo tipo di cose è N-GMRES . Ciò è particolarmente vero se la vostra valutazione di pendenza è molto costoso, come nella mia esperienza ti dà il maggior successo per il dollaro risolvendo un piccolo problema di minimizzazione sugli ultimi itera per costruire una nuova soluzione a basso residuo.m


Mi ero completamente dimenticato di L-BFGS. +1 per quello.
JM il

15

In dimensioni ridotte, un metodo BFGS ben implementato è generalmente sia più veloce che più robusto di CG, specialmente se la funzione non è molto lontana da un quadratico.

Né BFGS né CG necessitano di ipotesi sulla convessità; solo l'approssimazione iniziale dell'Assia (per BFGS) risp. il precondizionatore (per CG) deve essere definito positivo. Ma questi possono sempre essere scelti per essere la matrice dell'identità, in dimensioni ridotte senza molto danno. Vedi anche /scicomp//a/3213/1117

In assenza di un gradiente programmato, è un grande spreco di sforzo utilizzare gradienti numerici, specialmente quando i valori delle funzioni sono costosi. Piuttosto, si dovrebbe usare un algoritmo privo di derivati. Vedi http://archimedes.cheme.cmu.edu/?q=dfocomp per un sondaggio recente.


Il link mi dà un "404 Not Found", potresti risolverlo?
Stiefel,

@Stiefel: l'ho risolto. Il nuovo collegamento punta a una versione molto migliorata.
Arnold Neumaier,
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.