Źle uwarunkowana macierz kowariancji w regresji GP dla optymalizacji bayesowskiej


12

Tło i problem

Korzystam z procesów Gaussa (GP) do regresji i późniejszej optymalizacji bayesowskiej (BO). Do regresji używam pakietu gpml dla MATLAB z kilkoma niestandardowymi modyfikacjami, ale problem jest ogólny.

Jest dobrze znanym faktem, że gdy dwa dane treningowe znajdują się zbyt blisko w przestrzeni wejściowej, macierz kowariancji może stać się niezbyt pozytywna (istnieje kilka pytań na ten temat na tej stronie). W rezultacie rozkład Cholesky'ego macierzy kowariancji, niezbędny do różnych obliczeń GP, może zawieść z powodu błędu numerycznego. Zdarzyło mi się to w kilku przypadkach podczas wykonywania BO przy użyciu funkcji celu, których używam, i chciałbym to naprawić.

Proponowane rozwiązania

AFAIK, standardowe rozwiązanie w celu złagodzenia złego uwarunkowania polega na dodaniu grzbietu lub bryłki do przekątnej macierzy kowariancji. W przypadku regresji GP oznacza to dodanie (lub zwiększenie, jeśli już występuje) szumu obserwacyjnego.

Jak na razie dobrze. Zmodyfikowałem kod dla dokładnego wnioskowania o gpml , aby za każdym razem, gdy rozkład Cholesky'ego nie powiedzie się, staram się naprawić macierz kowariancji do najbliższej symetrycznej macierzy dodatniej określonej (SPD) w normie Frobenius, zainspirowanej tym kodem MATLAB autorstwa Johna d'Errico. Uzasadnieniem jest zminimalizowanie interwencji na oryginalnej matrycy.

To obejście spełnia swoje zadanie, ale zauważyłem, że wydajność BO znacznie się zmniejszyła dla niektórych funkcji - być może za każdym razem, gdy algorytm musiałby powiększyć w pewnym obszarze (np. Ponieważ zbliża się do minimum lub dlatego, że skala długości problemu stają się nierównomiernie małe). To zachowanie ma sens, ponieważ skutecznie zwiększam hałas, ilekroć dwa punkty wejściowe są zbyt blisko, ale oczywiście nie jest to idealne. Alternatywnie, mogłem po prostu usunąć problematyczne punkty, ale czasami czasami potrzebuję, aby punkty wejściowe były blisko.

Pytanie

Nie sądzę, że problemy numeryczne z rozkładem Cholesky'ego na macierze kowariancji GP to nowy problem, ale ku mojemu zaskoczeniu nie znalazłem do tej pory wielu rozwiązań, oprócz zwiększenia hałasu lub usunięcia punktów, które są zbyt blisko siebie. Z drugiej strony prawdą jest, że niektóre z moich funkcji są dość źle wykonywane, więc być może moja sytuacja nie jest tak typowa.

Wszelkie sugestie / referencje, które mogą być przydatne tutaj?


Możesz zastanowić się nad tworzeniem wpisów macierzy kowariancji, a także obliczaniem lub aktualizowaniem jej faktoryzacji Cholesky'ego, z większą precyzją, na przykład czterokrotnie lub nawet wyższą. Oprócz problemów obliczenia mogą być wolniejsze o rząd wielkości. Istnieją dodatkowe dodatki precyzji dla MATLAB. Nie twierdzę, że jest to idealne rozwiązanie, ale może to być opcja. Nie wiem, jak dobrze grają z gpml, ale jeśli możesz zmienić kod źródłowy gpml (pliki m), być może możesz to zrobić.
Mark L. Stone,

Czy próbowałeś dodać mały jitter do przekątnej macierzy kowariancji?
Zen

@ MarkL.Stone Dzięki za sugestię. Niestety kod szkoleniowy musi być szybki, więc wysoce precyzyjna numeracja prawdopodobnie nie będzie dobrym wyborem dla mojej aplikacji.
lacerbi

2
To pytanie jest naprawdę interesujące. Podczas dodawania Nugget wpływ na twój covaraince matryca takich jak ty optymalizacji Sigma w swojej prawdopodobieństwa, czy jest σ podane. Zauważyłem, że optymalizacja efektu samorodków przechwytuje szum pomiarowy i pomaga procesowi gaussaσ2)jaσ
Wis

1
Zazwyczaj optymalizuję. W kilku przypadkach próbowałem zepchnąć na margines, ale nie uzyskałem dużej poprawy w zakresie optymalizacji (zakładam, że tył był bardzo wąski).
lacerbi

Odpowiedzi:


7

Inną opcją jest zasadniczo uśrednienie punktów powodujących - na przykład, jeśli masz 1000 punktów i 50 powoduje problemy, możesz wziąć optymalne przybliżenie niskiej rangi za pomocą pierwszych 950 wartości własnych / wektorów. Nie jest to jednak dalekie od usuwania punktów danych blisko siebie, co, jak powiedziałeś, wolisz nie robić. Pamiętaj jednak, że dodając jitter zmniejszasz stopnie swobody - tzn. Każdy punkt ma mniejszy wpływ na twoje prognozy, więc może być gorzej niż przy użyciu mniejszej liczby punktów.

rexk(x,x)rexrexk(x,x)

Edytować:

Na podstawie komentarzy pomyślałem, że rozwinę to, co miałem na myśli, włączając w to obserwacje pochodne. Jeśli użyjemy jądra gaussowskiego (jako przykładu),

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

jego pochodne są,

krex,x=rek(x,x)rex=-2)(x-x)l2)σexp(-(x-x)2)l2))

krex,rex=re2)k(x,x)rexrex=2)l2)-2)(x-x)l4σexp(-(x-x)2)l2))

{xja,yja;ja=1,...,n}x1m1

Y=[m1,y1,,yn]

K.=(krex0,rex0krex0,x0krex0,xnkrex0,x0kx0,x0kx0,xnkrex0,xnkx0,xnkxn,xn)

Reszta GP jest taka sama jak zwykle.


Czy chciałbyś rozszerzyć szczegóły dotyczące proponowanego wykorzystania informacji o przybliżonym gradiencie?
Mark L. Stone,

@j Dzięki - Pomyślałem o zrobieniu przybliżenia niskiej rangi, mógłbym spróbować (do tej pory unikałem, ponieważ będę musiał przepisać duże części kodu). Jeśli chodzi o połączenie dwóch punktów w jeden, zaproponowałem to w poprzednim pytaniu , ale nie myślałem o uzyskaniu informacji pochodnych. Zasadniczo brzmi to ładnie, ale nie jestem pewien, jak bym go użył, ponieważ miałbym tylko kilka obserwacji pochodnych (odpowiadających połączonym punktom), z ciężarem dodania jednego GP na wymiar wejściowy.
lacerbi

@ j Dziękujemy za dodatkowe wyjaśnienie. To naprawdę wygląda bardzo schludnie. Czy masz odniesienia do tego podejścia (lub czegoś wystarczająco podobnego)?
lacerbi

2
Sprawdź tezę Mike'a Osborne'a na stronie 67 ( robots.ox.ac.uk/~mosb/public/pdf/136/full_thesis.pdf ) - wprowadza on pochodne i całkowe obserwacje. Mam nadzieję, że to pomoże :)
j__

4

Jednym z rozwiązań, które wykopaliśmy w biurze, jest zmiana kłopotliwych punktów. Może to przybierać formę prostego usuwania lub czegoś bardziej wyrafinowanego. Zasadniczo, obserwacja jest taka, że ​​punkty pobliskie są wysoce zbędne: w rzeczywistości tak zbędne, że zmniejszają rangę macierzy kowariancji. Z tego samego powodu, jeden punkt i tak wnosi niewiele informacji do danego problemu, więc usunięcie jednego lub drugiego (lub zrobienie czegoś innego, na przykład uśrednienie ich lub „odbicie” jednego punktu od drugiego na minimalną akceptowalną odległość) tak naprawdę wcale nie zmieniaj swojego rozwiązania.

Nie jestem pewien, jak ocenić, w którym momencie dwa punkty stają się „zbyt blisko”. Być może może to być opcja tuningu pozostawiona użytkownikowi.

(Ups! Po tym, jak to opublikowałem, znalazłem tutaj twoje pytanie, które przesuwa tę odpowiedź do znacznie bardziej skomplikowanego rozwiązania. Mam nadzieję, że łącząc się z nią z mojej odpowiedzi, pomogę w SEO ...)


jest to bardzo pomocne, czy możesz proszę rzucić nieco światła na to, jeśli to możliwe.
GENIVI-LEARNER
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.