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.