Czy podawanie przybliżonych gradientów optymalizatorowi opartemu na gradientach jest bezużyteczne?

9

Czy nie ma sensu używać algorytmów optymalizacji opartych na gradiencie, jeśli można podać tylko gradient liczbowy? Jeśli nie, to po co podawać gradient liczbowy, jeśli przeprowadzanie różnicowania skończonego dla samej biblioteki optymalizacji jest banalne?

[EDYTOWAĆ]

  • Aby wyjaśnić, moje pytanie rzeczywiście ma bardziej ogólny sens niż konkretne zastosowanie. Chociaż moim obszarem zastosowania jest optymalizacja prawdopodobieństwa w różnych ramach statystycznych.

  • Mój problem z automatycznym różnicowaniem polega na tym, że zawsze wydaje się, że jest jakiś haczyk. Zarówno biblioteka AD nie może się propagować do zewnętrznych wywołań bibliotecznych (jak BLAS), albo musisz przeprojektować swój przepływ pracy tak drastycznie, że trudno jest sobie z tym poradzić ... szczególnie jeśli pracujesz z językami wrażliwymi na typy. Moje problemy z AD to zupełnie osobny problem. Ale chcę wierzyć!

  • Chyba muszę lepiej sformułować swoje pytanie, ale robię to źle. Jeśli masz opcję albo użycia algorytmu optymalizacji bez pochodnych, albo algorytmu optymalizacji opartego na pochodnych z zastrzeżeniem, że mogę dać mu tylko gradient liczbowy, który z nich będzie lepszy?

profesor Bigglesworth
źródło
2
Czy zastanawiasz się, dlaczego dostarczyłby gradient analityczny zamiast tylko obliczenia przybliżonego z wykorzystaniem różnic skończonych?
spektr
1
Moje pytanie brzmi, inaczej mówiąc, przypuśćmy, że twoje równania są zbyt zaangażowane, aby obliczyć analityczne gradienty, czy algorytmy optymalizacji zależne od gradientu nadal mogą być lepsze niż te, które wcale nie wymagają gradientów?
profesor bigglesworth,
To inne pytanie, które postawiłeś powyżej. Możesz być w stanie obliczyć pochodne numeryczne innymi metodami, np. Elementami skończonymi.
nicoguaro
1
@nicoguaro Tak, w kontekście optymalizacji za pomocą równań różniczkowych cząstkowych, z pewnością tak jest (a ponieważ jest to jeden z moich obszarów badań, to była moja pierwsza myśl). Ale pytanie nie wspomina nic w tym kierunku (i jest bardziej przydatne w tej ogólności. Myślę, że).
Christian Clason,
1
Również w tym przypadku jest rozsądne pytanie: co zrobić, jeśli twoje (system) PDE (-y) są tak skomplikowane, że nie możesz wyprowadzić równania przyległego do rozwiązania numerycznego w celu uzyskania gradientu? (Te rzeczy mogą stać się dość nieprzyjemne, zwłaszcza jeśli w grę wchodzą niestandardowe warunki brzegowe.)
Christian Clason,

Odpowiedzi:

11

Aby uzupełnić doskonałą odpowiedź Briana, pozwólcie, że przedstawię nieco (redakcyjne) tło. Metody optymalizacji bez pochodnych są zdefiniowane jako metody, które wykorzystują tylko oceny funkcji, i są w zasadzie wszystkimi odmianami „próbkowania dopuszczalnego zestawu mniej więcej systematycznie i zapisywania najlepszej wartości funkcji” - to wszystko, co możesz zrobić, biorąc pod uwagę informacje. Metody te można z grubsza podzielić

  1. Metody stochastyczne , w których wybór próbek jest zasadniczo losowy (co oznacza, że ​​losowość jest kluczowym składnikiem; mogą istnieć inne, deterministyczne składniki). Metody te są często motywowane procesami fizycznymi lub biologicznymi i mają odpowiednie nazwy, takie jak „symulowane wyżarzanie”, „algorytmy genetyczne” lub „metoda roju cząstek / świetlika / mrowiska”. Rzadko istnieje jakakolwiek teoria konwergencji poza „jeśli spróbujesz wystarczająco długo, trafisz wszystkie punkty (w tym minimalizator) z prawdopodobieństwem1„(czy to się stanie - z dużym prawdopodobieństwem - przed śmiercią wszechświata przed upałem to inna sprawa ...) Jako matematyk rozważałbym te metody w ostateczności: jeśli nie wiesz nic o swojej funkcja, to wszystko, co możesz zrobić, i możesz mieć szczęście.

  2. Metody deterministyczne , w których dobór próbek nie jest przypadkowy, tj. Oparty wyłącznie na wcześniejszych ocenach funkcji. Najbardziej znanym przykładem jest prawdopodobnie metoda simpleksowa Neldera-Meada; inne generują metody wyszukiwania zestawów . Ważne jest, aby zdać sobie sprawę, że może to zadziałać tylko wtedy, gdy istnieje jakakolwiek (możliwa do wykorzystania) zależność między wartością funkcji w różnych punktach - tj. Pewna płynność funkcji. W rzeczywistości teoria zbieżności dla np. Metody Neldera-Meada opiera się na konstruowaniu niejednorodnościprzybliżenie różnic skończonych gradientu na podstawie wartości funkcji w wierzchołkach simpleksu i pokazanie, że zbiega się on zarówno z dokładnym gradientem, jak i zerem, gdy simpleks kurczy się do punktu. (Wariant oparty na standardowym przybliżeniu różnic skończonych nazywa się wyszukiwaniem kompasu ).

  3. Metody oparte na modelu , w których wartości funkcji są wykorzystywane do budowy lokalnego modelu funkcji (np. Przez interpolację), który jest następnie minimalizowany przy użyciu standardowych metod (opartych na gradiencie / Hesji). Ponieważ przybliżenie skończonej różnicy jest równoważne dokładnej pochodnej interpolantu wielomianowego, klasyczne podejście „gradientu numerycznego” również należy do tej klasy.

Jak widać, granice między tymi klasami są płynne, a często tylko kwestią interpretacji. Ale morał powinien być jasny: upewnij się, że wykorzystujesz wszystkie dostępne informacje o funkcji, którą minimalizujesz. Cytując Corneliusa Lanczosa:

Brakowi informacji nie można zaradzić żadną matematyczną sztuczką.

W końcu, jeśli nie wiesz nic o swojej funkcji, równie dobrze może ona być całkowicie losowa, a minimalizowanie losowej wartości jest zadaniem głupca ...

Christian Clason
źródło
17

Jeśli twój cel jest płynny, to zastosowanie przybliżenia różnic skończonych do pochodnej jest często bardziej skuteczne niż użycie algorytmu optymalizacji bez pochodnych. Jeśli masz kod, który dokładnie oblicza pochodne, zwykle najlepiej jest użyć tego kodu, a nie przybliżonych różnic skończonych.

Chociaż niektóre biblioteki optymalizacyjne obliczą przybliżone różnice skończone dla Ciebie automatycznie za pomocą heurystyki w celu ustalenia parametrów wielkości kroku, lepiej może być użycie własnych procedur do obliczenia przybliżonych różnic skończonych, ponieważ masz lepszą wiedzę na temat odpowiednich rozmiarów kroków lub z powodu specjalna struktura w funkcji, którą twój kod może wykorzystać.

Inną opcją, która często się opłaca, jest zastosowanie technik automatycznego różnicowania w celu utworzenia podprogramu, który oblicza pochodne analityczne z kodu źródłowego do obliczania samej funkcji celu.

Brian Borchers
źródło
3
+1 za automatyczne różnicowanie . Jest to często znacznie lepsze niż albo symboliczne wyrażenie a priori dla gradientu, albo przybliżenie różnic skończonych.
leftaroundabout o
Poleciłbym również stosowanie automatycznego różnicowania. W przypadku fortran wypróbuj tapenade firmy INRIA Sophia-Antipolis, która opiera się na transformacji źródła. W przypadku C / C ++ istnieje większy wybór, np. Adol-c, adept, sacado (część Trilinos). Wszystko to opiera się na przeciążeniu operatora i jest łatwiejsze w użyciu, choć niezbyt wydajne w przypadku bardzo dużych problemów.
cfdlab,
Istnieją również pewne okoliczności, w których automatyczne różnicowanie (AD) może być trudne do zastosowania, ale zróżnicowanie etapów złożonych, które czasami może wynosić prawie to samo co AD (inne niż możliwość obliczenia całego gradientu naraz w trybie odwrotnym AD) mogą mieć zastosowanie i stosunkowo łatwe do zastosowania.
Mark L. Stone,
W odpowiedzi na zmienione pytanie: Jeśli twój cel jest płynny (nie ma sensu używać algorytmu optymalizacji opartego na pochodnych, jeśli tak nie jest) i jeśli liczba zmiennych jest względnie mała (wykonywanie pochodnych różnic skończonych nie działa w przypadku optymalizacji ograniczonej przez PDE ), wtedy najprawdopodobniej lepiej skorzystasz z metody optymalizacji opartej na pochodnych z przybliżeniami różnic skończonych zamiast z techniki DFO.
Brian Borchers,
4

Twoje pytanie dotyczy optymalizatorów opartych na gradiencie, więc myślę, że Brian miał rację. Chciałbym jedynie podzielić się niektórymi problemami, ponieważ sam obecnie mam z tym problem.

Problemy z różnicą skończoną to 1) wydajność, ponieważ musisz ponownie ocenić funkcję dla każdego wymiaru i 2) może być trudne wybranie dobrego rozmiaru kroku. Jeśli krok jest zbyt duży, założenie liniowości funkcji może się nie utrzymać. Jeśli krok jest zbyt mały, może napotkać szum w samej funkcji, ponieważ pochodne wzmacniają hałas. To ostatnie może stanowić prawdziwy problem, jeśli funkcja wymaga rozwiązania równań różniczkowych. Jeśli możliwe jest obliczenie gradientów analitycznie lub za pomocą równań wrażliwości, z pewnością będzie ono dokładniejsze i być może szybsze.

Istnieje inne podejście, które możesz wypróbować, jeśli nie zainwestowałeś już zbyt wiele czasu w oprogramowanie, a mianowicie uruchomić go ze złożoną arytmetyką. Nazywa się to złożonym różnicowaniem stopni . Podstawową ideą jest to, że kiedy oceniasz funkcję, jeśli chcesz jej gradient w stosunku do parametru X, ustaw wyobrażoną część X na bardzo małą liczbę eps . Po wykonaniu obliczeń urojoną częścią wartości funkcji podzielonej przez eps jest gradient w odniesieniu do X. Jeśli chcesz gradient w odniesieniu do Y, musisz oczywiście zrobić to wszystko ponownie. Interesujące jest to, że epsmoże być bardzo mały. Powodem tego jest fakt, że normalne reguły rachunku różniczkowego są dokładnie odzwierciedlone w regułach złożonej arytmetyki.

To powiedziawszy, uważam to za nie panaceum, ponieważ nie zawsze łatwo jest wykonać skomplikowaną funkcję w złożonej arytmetyce, nie warto, jeśli gradient można obliczyć analitycznie, aw przypadku równań różniczkowych jest to dokładnie równanie z równaniami wrażliwości , co robię w razie potrzeby.

Mike Dunlavey
źródło
Myślę, że jedną z głównych korzyści jest to, że nie robisz żadnych odejmowań w tej złożonej formule różnic skończonych. Kiedy jakiś czas temu czytałem artykuł o pochodnych dla tej metody, był to jeden z punktów, który wydawał się potwierdzać eksperymentalnie w porównaniu z innymi formułami różnic skończonych. Ta różnica pozwoliła wybrać mniejsze rozmiary stopni, zanim błędy zaokrąglenia stały się problemem.
spektr
@choward: Racja. To jest w tym piękne. Byłem jednak sceptyczny. Niektórzy z moich kolegów uważali, że to magiczna kula. Podejrzewałem, że jest to odpowiednik równań wrażliwości, i jeden z moich współpracowników, matematyk stosowany, udowodnił to.
Mike Dunlavey,
Fajnie jest z równania wrażliwości. To ciekawe podejście, ale z pewnością może mieć kompromisy związane z wdrażaniem. Zakładając, że chcesz go użyć, musisz zdefiniować złożone wersje swoich funkcji, a następnie wykonać dodatkową złożoną algebrę / obliczenia zmiennych, co wydłuża ocenę każdej funkcji. Jest to jedna z tych rzeczy, które trzeba by wymyślić, jeśli wolniejsza ocena funkcji jest warta dodatkowej dokładności pochodnej.
spektr
@choward: Do takiego wniosku doszedłem, a ponadto zwykle optymalizujemy wektor, co oznacza powtarzalną ocenę. Oczywiście alternatywą jest to, że wyprowadzenie równań wrażliwości może być trudne. Używam różnicowania symbolicznego, a one wciąż są trudne. Cały przedmiot to trochę pole minowe.
Mike Dunlavey,