Come definire la condizione di terminazione per la discesa gradiente?


24

In realtà, volevo chiederti come posso definire la condizione terminale per la discesa del gradiente.

Posso interromperlo in base al numero di iterazioni, ovvero considerando i valori dei parametri per, diciamo, 100 iterazioni?

O dovrei aspettare in modo tale che i diversi valori dei due parametri "nuovo" e "vecchio" siano molto piccoli nell'ordine di diciamo ? Questo richiederà sicuramente molto tempo.10-6

Qual è il modo migliore? Nel mio caso anche una sola iterazione richiede molto tempo. In questa situazione, se aspetto la seconda condizione, immagino che potrebbero volerci anche settimane.

Quindi quale approccio dovrei usare. Come affrontare questo scenario?


1
Non è esplicitamente dichiarato, ma presumo che tu stia cercando di trovare un MLE. Il risultato dipende davvero interamente dallo spazio dei parametri, dalla funzione di probabilità e dalle esigenze (ovvero, il migliore non è ben definito). Se stai solo cercando una giustificazione teorica come l'efficienza asintotica; in condizioni Le'Cam puoi semplicemente usare il MLE in un solo passaggio (sotto l'ulteriore presupposto che stai usando il metodo di Newton e la funzione di punteggio per la discesa del gradiente). Ciò richiede che il valore iniziale è tale che in probabilità. n1/2θ^0θ
Jonathan Lisic,

quindi aspetta, quando hai detto "nuovo" - "vecchio" è sufficientemente piccolo, è una condizione di terminazione errata per la discesa del gradiente? (se si applicano punti fissi come i teoremi, quella condizione dovrebbe essere ok?)
Charlie Parker,

Si potrebbe fermare quando uno qualsiasi di: valori di funzione , o gradienti f i , o parametri x i , sembrano fermarsi, sia relativi che assoluti. Ma in pratica i parametri 3 × 2 .. sono troppi, quindi sono piegati, ma ogni programma lo fa diversamente. Vedere le tolleranze di Mathworks e i criteri di arresto per un'immagine. fiofioXio3×2ftolabs ftolrelxtolabs
denis,

Risposte:


19

Bella domanda Ho visto molte regole di arresto in letteratura e ci sono vantaggi e svantaggi per ciascuno, a seconda del contesto. La optimfunzione in R, ad esempio, ha almeno tre diverse regole di arresto:

  • maxit, ovvero un numero massimo predeterminato di iterazioni. Un'altra alternativa simile che ho visto in letteratura è un numero massimo di secondi prima del timeout. Se tutto ciò che serve è una soluzione approssimativa, questa può essere molto ragionevole. In effetti, ci sono classi di modelli (in particolare modelli lineari) per i quali l'arresto anticipato è simile all'inserimento di un gaussiano prima dei valori dei parametri. Un frequentatore direbbe che hai una "norma L2" piuttosto che una precedente, ma la considerano anche una cosa ragionevole da fare. Ho solo sfogliato questo documento , ma parla della relazione tra l'interruzione anticipata e la regolarizzazione e potrebbe aiutarti a indirizzarti verso ulteriori informazioni. Ma la versione breve è, sì, l'arresto anticipato può essere una cosa perfettamente rispettabile da fare, a seconda di ciò che

  • abstol, vale a dire, si ferma quando la funzione si "avvicina abbastanza" a zero. Questo potrebbe non essere pertinente per te (non sembra che ti aspetti uno zero), quindi lo salterò.

  • reltol, che è come il tuo secondo suggerimento: fermati quando il miglioramento scende al di sotto di una soglia. In realtà non so quanta teoria ci sia su questo, ma probabilmente tenderai a ottenere minimi più bassi in questo modo che con un piccolo numero massimo di iterazioni. Se questo è importante per te, potrebbe valere la pena eseguire il codice per più iterazioni.

Un'altra famiglia di regole di arresto ha a che fare con l'ottimizzazione di una funzione di costo su un set di dati di validazione (o con validazione incrociata) piuttosto che sui dati di addestramento. A seconda di ciò per cui si desidera utilizzare il modello, è possibile che si desideri interrompere prima di raggiungere il minimo locale sui dati di allenamento, poiché ciò potrebbe comportare un eccesso di adattamento. Sono abbastanza sicuro che Trevor Hastie abbia scritto di buoni modi per farlo, ma non ricordo la citazione.

Altre possibili opzioni per trovare minimi inferiori in un ragionevole lasso di tempo potrebbero includere:

  • Discesa gradiente stocastica, che richiede solo la stima dei gradienti per una piccola porzione di dati alla volta (ad es. Un punto dati per SGD "puro" o piccoli mini-batch).

  • Funzioni di ottimizzazione più avanzate (ad es. Metodi di tipo Newton o gradiente coniugato), che utilizzano informazioni sulla curvatura della funzione obiettivo per aiutarti a orientarti verso direzioni migliori e ad adottare misure di passi migliori mentre ti muovi in ​​discesa.

  • Un termine "momentum" nella regola di aggiornamento, in modo che l'ottimizzatore faccia un lavoro migliore nel rotolare in discesa piuttosto che delimitare le pareti del canyon nella funzione oggettiva.

Questi approcci sono tutti discussi in queste note di lezione che ho trovato online.

Spero che sia di aiuto!

Modifica oh e puoi anche provare a ottenere valori iniziali migliori (ad esempio risolvendo una versione più semplice del problema) in modo che siano necessarie meno iterazioni per avvicinarti all'ottimale dal tuo "avvio a caldo".


il problema con la scelta di un numero fisso di iterazioni è che, a meno che tu non sia in grado di tracciare chiaramente la tua curva dei costi (e abbia un piccolo rumore), allora è difficile sapere quante iterazioni sono troppe, specialmente se la funzione di ottimizzazione è complicata e chissà quanti minimi locali ha e se hai inizializzato in modo casuale, questo peggiora ulteriormente il problema, dal momento che rende ancora più difficile indovinare qual è un buon "piccolo" numero di iterazioni. Come si affrontano questi problemi nella realtà se si desidera effettivamente utilizzare l'arresto anticipato? Come ti assicuri di non sparare eccessivamente o di non tirare troppo?
Charlie Parker,

Vorrei chiarire che cosa significa reltol(cioè quando smette di essere un "miglioramento"). Il primo miglioramento significa ridurre la funzione di costo. Quindi suppongo che ciò che intendi è che, quando la funzione di costo smette di diminuire abbastanza (o inizia ad aumentare), uno si ferma, giusto? In realtà non si fa "| old - new |" tipo di regola di aggiornamento, giusto?
Charlie Parker,

1
Il abstolparametro ha senso solo se si prende in considerazione la tolleranza del gradiente della funzione di costo, non la funzione di costo stessa. In un ottimizzatore locale, il valore del gradiente è zero; ma non il valore della funzione.
Mario Becerra,

"warm start" è un trucco molto intelligente! grazie
Mehdi LAMRANI il
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.