È inutile fornire gradienti approssimativi a un ottimizzatore basato sul gradiente?


9

È inutile utilizzare algoritmi di ottimizzazione basati sul gradiente se è possibile fornire solo un gradiente numerico? In caso contrario, perché fornire innanzitutto un gradiente numerico se è banale eseguire una differenziazione finita per la libreria di ottimizzazione stessa?

[MODIFICARE]

  • Giusto per chiarire, la mia domanda è davvero in un senso più generale di un'applicazione specifica. Anche se il mio campo di applicazione sembra essere l'ottimizzazione della probabilità in vari contesti statistici.

  • Il mio problema con la differenziazione automatica è che sembra esserci sempre un problema. O la libreria AD non può propagarsi a chiamate di librerie esterne (come BLAS) o devi rielaborare il tuo flusso di lavoro in modo così drastico da renderlo un problema da gestire ... specialmente se stai lavorando con linguaggi sensibili al tipo. Le mie lamentele con AD sono del tutto separate. Ma io voglio credere!

  • Immagino di dover formulare meglio la mia domanda, ma sto facendo un cattivo lavoro. Se ho un'opzione per utilizzare un algoritmo di ottimizzazione privo di derivati ​​o un algoritmo di ottimizzazione basato su derivati ​​con l'avvertenza che posso solo dargli un gradiente numerico, quale in media sarà superiore?


2
Stai cercando di chiedere perché uno dovrebbe fornire un gradiente analitico invece di calcolarne uno approssimativo usando differenze finite?
spektr

1
La mia domanda è, dichiarata in un altro modo, supponiamo che le vostre equazioni siano troppo coinvolte per voi per calcolare i gradienti analitici, gli algoritmi di ottimizzazione dipendenti dal gradiente possono ancora essere superiori a quelli che non richiedono affatto i gradienti?
Professor Bigglesworth,

Questa è una domanda diversa da quella che hai posto sopra. Potresti essere in grado di calcolare derivati ​​numerici con altri mezzi, ad esempio elementi finiti.
Nicoguaro

1
@nicoguaro Sì, nel contesto dell'ottimizzazione con equazioni differenziali parziali, questo è certamente il caso (e, essendo questa una delle mie aree di ricerca, è stato anche il mio primo pensiero). Ma la domanda non menziona nulla in quella direzione (ed è più utile in questa generalità. Penso).
Christian Clason,

1
Inoltre, anche in quel caso, è una domanda ragionevole: cosa succede se il tuo (sistema di) PDE è così complicato da non poter derivare un'equazione aggiunta da risolvere numericamente per ottenere il gradiente? (Queste cose possono diventare piuttosto brutte, specialmente se sono implicate condizioni al contorno non standard.)
Christian Clason,

Risposte:


11

Per completare l'eccellente risposta di Brian, lasciatemi dare un po 'di background (editoriale). I metodi di ottimizzazione senza derivati ​​sono definiti come metodi che utilizzano solo le valutazioni delle funzioni e sono sostanzialmente tutte variazioni di "campionare l'insieme ammissibile più o meno sistematicamente e salvare il miglior valore di funzione" - questo è tutto ciò che puoi fare dato le informazioni. Questi metodi possono essere suddivisi approssimativamente

  1. 1 sulla tua funzione, questo è tutto ciò che puoi fare e potresti essere fortunato.

  2. Metodi deterministici , in cui la selezione dei campioni non è casuale, ovvero basata esclusivamente su precedenti valutazioni delle funzioni. L'esempio più famoso è probabilmente il metodo simplex Nelder - Mead; altri stanno generando metodi di ricerca impostati . È importante rendersi conto che ciò può funzionare solo se esiste una relazione (sfruttabile) tra il valore della funzione in punti diversi, ovvero una certa scorrevolezza della funzione. In effetti, la teoria della convergenza per, ad esempio, il metodo Nelder - Mead si basa sulla costruzione di una non uniformeapprossimazione delle differenze finite del gradiente in base ai valori della funzione ai vertici del simplex e mostrando che converge sia al gradiente esatto sia a zero mentre il simplex si contrae ad un punto. (La variante basata su un'approssimazione standard della differenza finita si chiama ricerca della bussola .)

  3. Metodi basati su modello , in cui i valori della funzione vengono utilizzati per costruire un modello locale della funzione (ad es. Per interpolazione), che viene quindi ridotto a icona utilizzando metodi standard (basati su gradiente / iuta). Poiché un'approssimazione di differenza finita è equivalente alla derivata esatta di un interpolante polinomiale, anche il classico approccio del "gradiente numerico" rientra in questa classe.

Come puoi vedere, i confini tra queste classi sono fluidi e spesso solo una questione di interpretazione. Ma la morale dovrebbe essere chiara: assicurati di utilizzare tutte le informazioni disponibili sulla funzione che stai minimizzando. Per citare Cornelius Lanczos:

Una mancanza di informazioni non può essere risolta da alcun trucco matematico.

Dopotutto, se non sai nulla della tua funzione, potrebbe anche essere completamente casuale e ridurre al minimo un valore casuale è una commissione da pazzi ...


17

Se il tuo obiettivo è fluido, utilizzare approssimazioni a differenza finita rispetto alla derivata è spesso più efficace rispetto all'utilizzo di un algoritmo di ottimizzazione senza derivate. Se si dispone di un codice che calcola esattamente le derivate, di solito è meglio usare quel codice piuttosto che usare approssimazioni alle differenze finite.

Sebbene alcune librerie di ottimizzazione calcolino approssimazioni delle differenze finite per l'utente automaticamente utilizzando l'euristica per determinare i parametri delle dimensioni dei passi, può essere meglio usare le proprie routine per calcolare le approssimazioni delle differenze finite o perché si ha una migliore conoscenza delle dimensioni dei passi appropriate o a causa di struttura speciale nella funzione che il tuo codice può sfruttare.

Un'altra opzione che spesso vale la pena è quella di utilizzare tecniche di differenziazione automatica per produrre una subroutine che calcola i derivati ​​analitici dal codice sorgente per calcolare la funzione obiettivo stessa.


3
+1 per la differenziazione automatica . Questo è spesso molto meglio di un'espressione simbolica a priori per il gradiente o un'approssimazione di differenza finita.
lasciato circa il

Vorrei anche raccomandare l'uso della differenziazione automatica. Per fortran, prova tapenade di INRIA Sophia-Antipolis, che si basa sulla trasformazione della fonte. Per C / C ++, c'è più scelta come adol-c, adept, sacado (parte di Trilinos). Tutti questi sono basati sul sovraccarico dell'operatore e più facili da usare, anche se non molto efficienti per problemi molto grandi.
cfdlab,

Ci sono anche alcune circostanze in cui la differenziazione automatica (AD) può essere difficile da applicare, ma la differenziazione a passi complessi, che a volte può equivalere a quasi la stessa cosa di AD (oltre a poter calcolare un intero gradiente contemporaneamente dalla modalità inversa di AD) può essere applicabile e relativamente facile da applicare.
Mark L. Stone,

In risposta alla domanda rivista: se il tuo obiettivo è fluido (non ha senso utilizzare un algoritmo di ottimizzazione basato su derivate se non lo è) e se il numero di variabili è ragionevolmente piccolo (fare derivati ​​a differenza finita non funziona nell'ottimizzazione vincolata PDE ), molto probabilmente starai meglio usando un metodo di ottimizzazione basato su derivati ​​con approssimazioni alle differenze finite piuttosto che usare una tecnica DFO.
Brian Borchers,

4

La tua domanda riguarda gli ottimizzatori basati sul gradiente, quindi penso che Brian avesse ragione. Condividerei solo, dal momento che sto lottando con questo me stesso, alcuni dei problemi.

I problemi con differenza finita sono 1) prestazioni, perché è necessario rivalutare nuovamente la funzione per ogni dimensione e 2) può essere difficile scegliere una buona dimensione del passo. Se il passo è troppo grande, il presupposto della linearità della funzione potrebbe non essere valido. Se il passo è troppo piccolo, potrebbe incorrere nel rumore nella funzione stessa, poiché i derivati ​​amplificano il rumore. Quest'ultimo può essere un vero problema se la funzione implica la risoluzione di equazioni differenziali. Se è possibile calcolare analiticamente i gradienti o usando equazioni di sensibilità, sarà sicuramente più preciso e forse più veloce.

C'è un altro approccio che puoi provare se non hai già investito troppo tempo nel software, e cioè eseguirlo con un'aritmetica complessa. Si chiama differenziazione dei passaggi complessi . L'idea di base è quando si valuta la funzione, se si desidera il suo gradiente rispetto al parametro X, si imposta la parte immaginaria di X su un numero eps molto piccolo . Dopo aver eseguito il calcolo, la parte immaginaria del valore della funzione, divisa per eps , è il gradiente rispetto a X. Quando si desidera il gradiente rispetto a Y, è necessario ripetere tutto, ovviamente. La cosa interessante è che epspuò essere reso molto piccolo. La ragione per cui funziona è che le normali regole del calcolo differenziale sono esattamente rispecchiate nelle regole dell'aritmetica complessa.

Detto questo, lo considero non una panacea, perché non è sempre facile svolgere una funzione complicata in aritmetica complessa, non ne vale la pena se il gradiente può essere calcolato analiticamente e nel caso di equazioni differenziali è esattamente equivalente alle equazioni di sensibilità , che sto facendo come necessario.


Penso che uno dei principali vantaggi sia il fatto che non stai facendo alcuna sottrazione in questa complessa formula della differenza finita. Quando ho letto un articolo qualche tempo fa parlando di derivazioni per questo metodo, quello era uno dei punti che sembravano validare sperimentalmente rispetto ad altre formule alle differenze finite. Questa differenza ha consentito di scegliere dimensioni di passo inferiori prima che gli errori di arrotondamento diventassero un problema.
spektr,

@choward: giusto. Questo è ciò che è carino. Ero scettico però. Alcuni dei miei colleghi sembravano pensare che fosse un proiettile magico. Sospettavo fosse equivalente alle equazioni di sensibilità e uno dei miei collaboratori, un matematico applicato, lo dimostrò.
Mike Dunlavey,

È interessante riguardo all'equazione della sensibilità. Questo è un approccio interessante, ma sicuramente può avere i suoi compromessi di implementazione. Supponendo che si desidera utilizzarlo, è necessario definire versioni complesse delle funzioni e quindi eseguire l'algebra / calcoli variabili complesse aggiuntive, il che rende più lunga la valutazione di ciascuna funzione. È una di quelle cose che dovresti capire se la valutazione della funzione più lenta merita la precisione derivata aggiuntiva.
spektr

@choward: questa è la conclusione a cui sono giunto, inoltre di solito ottimizziamo un vettore, il che significa una valutazione ripetitiva. Naturalmente, l'alternativa è che le equazioni di sensibilità possono essere difficili da derivare. Uso la differenziazione simbolica e sono ancora difficili. L'intero argomento è un po 'un campo minato.
Mike Dunlavey,
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.