Matrice di covarianza mal condizionata nella regressione GP per l'ottimizzazione bayesiana


12

Contesto e problema

Sto usando i processi gaussiani (GP) per la regressione e la successiva ottimizzazione bayesiana (BO). Per regressione uso il pacchetto gpml per MATLAB con diverse modifiche personalizzate, ma il problema è generale.

È risaputo che quando due input di training sono troppo vicini nello spazio di input, la matrice di covarianza può diventare definita non positiva (ci sono diverse domande su questo sito). Di conseguenza, la decomposizione di Cholesky della matrice di covarianza, necessaria per vari calcoli GP, potrebbe non riuscire a causa di un errore numerico. Questo mi è successo in diversi casi quando eseguivo BO con le funzioni oggettive che sto usando e mi piacerebbe risolverlo.

Soluzioni proposte

AFAIK, la soluzione standard per alleviare il mal condizionamento è aggiungere una cresta o pepita alla diagonale della matrice di covarianza. Per la regressione GP, ciò equivale ad aggiungere (o aumentare, se già presente) rumore di osservazione.

Fin qui tutto bene. Ho modificato il codice per l'inferenza esatta di gpml in modo che ogni volta che la decomposizione di Cholesky fallisca, provo a fissare la matrice di covarianza alla matrice definita simmetrica positiva positiva (SPD) nella norma Frobenius, ispirata da questo codice MATLAB di John d'Errico. La logica è minimizzare l'intervento sulla matrice originale.

Questa soluzione risolve il problema, ma ho notato che le prestazioni di BO si sono notevolmente ridotte per alcune funzioni, possibilmente ogni volta che l'algoritmo avrebbe bisogno di ingrandire in alcune aree (ad esempio, perché si sta avvicinando al minimo o perché le scale di lunghezza del problema diventa non uniformemente piccolo). Questo comportamento ha senso poiché sto effettivamente aumentando il rumore ogni volta che due punti di ingresso si avvicinano troppo, ma ovviamente non è l'ideale. In alternativa, potrei semplicemente rimuovere i punti problematici, ma ancora una volta, a volte ho bisogno che i punti di input siano vicini.

Domanda

Non penso che i problemi numerici con la fattorizzazione di Cholesky delle matrici di covarianza di GP siano un problema nuovo, ma con mia sorpresa non sono riuscito a trovare molte soluzioni finora, a parte aumentare il rumore o rimuovere punti troppo vicini tra loro. D'altra parte, è vero che alcune delle mie funzioni si comportano piuttosto male, quindi forse la mia situazione non è così tipica.

Qualche suggerimento / riferimento che potrebbe essere utile qui?


Potresti cercare di formare le voci della matrice di covarianza, oltre a calcolare o aggiornare la sua fattorizzazione di Cholesky, con maggiore precisione, ad esempio, quad precisione o persino superiore. A parte la seccatura, i calcoli possono essere più lenti degli ordini di grandezza. Esistono componenti aggiuntivi di precisione arbitrari per MATLAB. Non sto dicendo che questo è l'ideale, ma potrebbe essere un'opzione. Non so quanto bene giochino con gpml, ma se puoi cambiare il codice sorgente gpml (file m), forse puoi farlo.
Mark L. Stone,

Hai provato ad aggiungere un piccolo jitter alla diagonale della matrice di covarianza?
Zen

@ MarkL.Stone Grazie per il suggerimento. Sfortunatamente ho bisogno che il codice di allenamento sia veloce, quindi i numeri ad alta precisione probabilmente non saranno una buona scelta per la mia applicazione.
Lacerbi,

2
Questa domanda è davvero interessante. Quando aggiungi l'effetto nugget alla tua matrice di covaraince come , ottimizzi sigma nella tua verosimiglianza, o mi viene dato . Ho notato che l'ottimizzazione dell'effetto pepita cattura il rumore di misurazione e aiuta il processo gausssianoσσ2Iσ
Wis,

1
Di solito ottimizzo. In alcuni casi ho cercato di emarginare su di esso, ma non ho ottenuto molti miglioramenti rispetto all'ottimizzazione wrt (suppongo che il posteriore fosse molto stretto).
Lacerbi,

Risposte:


7

Un'altra opzione è essenzialmente fare una media dei punti che causano - ad esempio se si hanno 1000 punti e 50 problemi di causa, si potrebbe prendere l'approssimazione di basso rango ottimale usando i primi 950 autovalori / vettori. Tuttavia, questo non è molto lontano dalla rimozione ravvicinata dei punti dati che hai detto che preferiresti non fare. Tieni presente, tuttavia, che quando aggiungi jitter riduci i gradi di libertà - vale a dire che ogni punto influenza meno la tua previsione, quindi potrebbe essere peggio che usare meno punti.

Un'altra opzione (che personalmente ritengo ordinata) è quella di combinare i due punti in modo più intelligente. Ad esempio, potresti prendere 2 punti e combinarli in uno, ma anche usarli per determinare un'approssimazione anche per il gradiente. Per includere informazioni sul gradiente, tutto ciò di cui hai bisogno dal tuo kernel è trovare e . I derivati ​​di solito non hanno alcuna correlazione con la loro osservazione, quindi non si verificano problemi di condizionamento e si conservano le informazioni locali.dxk(x,x)dxdxk(x,x)

Modificare:

Sulla base dei commenti pensavo che avrei elaborato ciò che intendevo includendo le osservazioni derivate. Se usiamo un kernel gaussiano (come esempio),

kx,x=k(x,x)=σexp((xx)2l2)

i suoi derivati ​​sono,

kdx,x=dk(x,x)dx=2(xx)l2σexp((xx)2l2)

kdx,dx=d2k(x,x)dxdx=2l22(xx)l4σexp((xx)2l2)

Supponiamo ora di avere un punto di dati e una derivata in che chiamerò .{xi,yi;i=1,...,n}x1m1

Sia , quindi utilizziamo un singolo GP standard con matrice di covarianza come,Y=[m1,y1,,yn]

K=(kdx0,dx0kdx0,x0kdx0,xnkdx0,x0kx0,x0kx0,xnkdx0,xnkx0,xnkxn,xn)

Il resto del GP è lo stesso del solito.


Ti piacerebbe espandere i dettagli sull'uso proposto di informazioni approssimative sul gradiente?
Mark L. Stone,

@j Grazie - Ho pensato di fare un'approssimazione di basso rango, potrei provarlo (evitato così tanto dato che potrei dover riscrivere gran parte del codice). Riguardo alla combinazione di due punti in uno, l'avevo proposto in una domanda precedente , ma non pensavo di ottenere informazioni sui derivati. In linea di principio sembra pulito, ma non sono sicuro di come lo userei poiché avrei solo alcune osservazioni derivate (corrispondenti ai punti uniti), con l'onere di aggiungere un GP per dimensione di input.
Lacerbi,

@j Grazie per la spiegazione aggiuntiva. Sembra davvero molto pulito. Hai riferimenti per questo approccio (o qualcosa di abbastanza simile)?
Lacerbi,

2
Dai un'occhiata alla pagina di tesi di Mike Osborne 67 ( robots.ox.ac.uk/~mosb/public/pdf/136/full_thesis.pdf ) - introduce osservazioni derivate e integrali. Spero che sia d'aiuto :)
j__

4

Una soluzione che abbiamo preso in giro in ufficio è semplicemente modificare i punti problematici. Questo può assumere la forma di una cancellazione diretta o qualcosa di più sofisticato. In sostanza, l'osservazione è che i punti vicini sono altamente ridondanti: in effetti, così ridondanti da ridurre il rango della matrice di covarianza. Allo stesso modo, un punto fornisce comunque poche informazioni al problema in questione, quindi rimuovere l'uno o l'altro (o fare qualcos'altro, come fare una media o "rimbalzare" un punto dall'altro a una distanza minima accettabile) non cambia davvero tanto la tua soluzione.

Non sono sicuro di come giudicare in quale momento i due punti diventano "troppo vicini". Forse questa potrebbe essere un'opzione di ottimizzazione lasciata all'utente.

(Oops! Dopo aver pubblicato questo, ho trovato qui la tua domanda che fa avanzare questa risposta a una soluzione molto più elaborata. Spero che collegandomi alla mia risposta, aiuterò con SEO ...)


questo è abbastanza utile, puoi per favore far luce anche su questo, se possibile.
GENIVI-LEARNER
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.