2. Optymalizacja jednowymiarowa

Podobne dokumenty
Optymalizacja ciągła

KADD Minimalizacja funkcji

Optymalizacja ciągła

13. Równania różniczkowe - portrety fazowe

KADD Minimalizacja funkcji

Pochodna i różniczka funkcji oraz jej zastosowanie do obliczania niepewności pomiarowych

Optymalizacja ciągła

; B = Wykonaj poniższe obliczenia: Mnożenia, transpozycje etc wykonuję programem i przepisuję wyniki. Mam nadzieję, że umiesz mnożyć macierze...

3. Macierze i Układy Równań Liniowych

Programowanie celowe #1

1 Pochodne wyższych rzędów

ZADANIA OPTYMALIZCJI BEZ OGRANICZEŃ

METODY ROZWIĄZYWANIA RÓWNAŃ NIELINIOWYCH

FUNKCJA KWADRATOWA. Zad 1 Przedstaw funkcję kwadratową w postaci ogólnej. Postać ogólna funkcji kwadratowej to: y = ax + bx + c;(

Optymalizacja ciągła

Funkcje wymierne. Funkcja homograficzna. Równania i nierówności wymierne.

Pochodna i różniczka funkcji oraz jej zastosowanie do rachunku błędów pomiarowych

Rozdział 2: Metoda największej wiarygodności i nieliniowa metoda najmniejszych kwadratów

Szukanie rozwiązań funkcji uwikłanych (równań nieliniowych)

Funkcja kwadratowa. f(x) = ax 2 + bx + c,

RÓWNANIA NIELINIOWE Maciej Patan

1 Metody rozwiązywania równań nieliniowych. Postawienie problemu

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

0 + 0 = 0, = 1, = 1, = 0.

1. A 2. A 3. B 4. B 5. C 6. B 7. B 8. D 9. A 10. D 11. C 12. D 13. B 14. D 15. C 16. C 17. C 18. B 19. D 20. C 21. C 22. D 23. D 24. A 25.

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

5. Metody Newtona. 5.1 Wzór Taylora

IX. Rachunek różniczkowy funkcji wielu zmiennych. 1. Funkcja dwóch i trzech zmiennych - pojęcia podstawowe. - funkcja dwóch zmiennych,

CIĄGI wiadomości podstawowe

KADD Metoda najmniejszych kwadratów funkcje nieliniowe

Metody numeryczne I Równania nieliniowe

3a. Wstęp: Elementarne równania i nierówności

2. Układy równań liniowych

UKŁADY ALGEBRAICZNYCH RÓWNAŃ LINIOWYCH

Metody Numeryczne Optymalizacja. Wojciech Szewczuk

2. Definicja pochodnej w R n

3. FUNKCJA LINIOWA. gdzie ; ół,.

1 Funkcje dwóch zmiennych podstawowe pojęcia

Rozwiązania prac domowych - Kurs Pochodnej. x 2 4. (x 2 4) 2. + kπ, gdzie k Z

1 Układy równań liniowych

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Statystyka opisowa. Wykład V. Regresja liniowa wieloraka

Pochodna funkcji odwrotnej

Iteracyjne rozwiązywanie równań

Techniki Optymalizacji: Stochastyczny spadek wzdłuż gradientu I

Lista 6. Kamil Matuszewski 13 kwietnia D n =

Następnie przypominamy (dla części studentów wprowadzamy) podstawowe pojęcia opisujące funkcje na poziomie rysunków i objaśnień.

Znaleźć wzór ogólny i zbadać istnienie granicy ciągu określonego rekurencyjnie:

RÓWNANIA RÓŻNICZKOWE ZWYCZAJNE

Aproksymacja funkcji a regresja symboliczna

Notatki z Analizy Matematycznej 3. Jacek M. Jędrzejewski

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Kurs ZDAJ MATURĘ Z MATEMATYKI MODUŁ 6 Teoria funkcje cz. 2

3. Metoda najszybszego spadku

Elementy inteligencji obliczeniowej

Metody numeryczne Wykład 4

Układy równań nieliniowych (wielowymiarowa metoda Newtona-Raphsona) f(x) = 0, gdzie. dla n=2 np.

Układy równań i nierówności liniowych

Definicja pochodnej cząstkowej

4. Postęp arytmetyczny i geometryczny. Wartość bezwzględna, potęgowanie i pierwiastkowanie liczb rzeczywistych.

Z52: Algebra liniowa Zagadnienie: Zastosowania algebry liniowej Zadanie: Operatory różniczkowania, zagadnienie brzegowe.

4b. Badanie przebiegu zmienności funkcji - monotoniczność i wypukłość

MATEMATYKA WYKAZ UMIEJĘTNOŚCI WYMAGANYCH NA POSZCZEGÓLNE OCENY DLA KLASY DRUGIEJ

1 Równania różniczkowe zwyczajne o rozdzielonych zmiennych

13. Funkcje wielu zmiennych pochodne, gradient, Jacobian, ekstrema lokalne.

Rozwiązywanie równań nieliniowych

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

III. Wstęp: Elementarne równania i nierówności

Pochodną funkcji w punkcie (ozn. ) nazywamy granicę ilorazu różnicowego:

Optymalizacja systemów

Kurs ZDAJ MATURĘ Z MATEMATYKI MODUŁ 2 Teoria liczby rzeczywiste cz.2

FUNKCJE I RÓWNANIA KWADRATOWE. Lekcja 78. Pojęcie i wykres funkcji kwadratowej str

Wykład 4 Przebieg zmienności funkcji. Badanie dziedziny oraz wyznaczanie granic funkcji poznaliśmy na poprzednich wykładach.

Geometria analityczna

Wprowadzenie Metoda bisekcji Metoda regula falsi Metoda siecznych Metoda stycznych RÓWNANIA NIELINIOWE

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

Oznacza to, że chcemy znaleźć minimum, a właściwie wartość najmniejszą funkcji

Metody numeryczne. materiały do wykładu dla studentów. 7. Całkowanie numeryczne

Logarytmy. Funkcje logarytmiczna i wykładnicza. Równania i nierówności wykładnicze i logarytmiczne.

w analizie wyników badań eksperymentalnych, w problemach modelowania zjawisk fizycznych, w analizie obserwacji statystycznych.

Propozycje rozwiązań zadań otwartych z próbnej matury rozszerzonej przygotowanej przez OPERON.

Interpolacja. Marcin Orchel. Drugi przypadek szczególny to interpolacja trygonometryczna

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

UKŁADY ALGEBRAICZNYCH RÓWNAŃ LINIOWYCH

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

WYRAŻENIA ALGEBRAICZNE

Zaawansowane metody numeryczne Komputerowa analiza zagadnień różniczkowych 4. Równania różniczkowe zwyczajne podstawy teoretyczne

Czym jest całka? Całkowanie numeryczne

a 11 a a 1n a 21 a a 2n... a m1 a m2... a mn x 1 x 2... x m ...

Funkcje dwóch zmiennych

Zajęcia nr. 5: Funkcja liniowa

Otrzymaliśmy w ten sposób ograniczenie na wartości parametru m.

Siły wewnętrzne - związki różniczkowe

1) 2) 3) 5) 6) 7) 8) 9) 10) 11) 12) 13) 14) 15) 16) 17) 18) 19) 20) 21) 22) 23) 24) 25)

2. LICZBY RZECZYWISTE Własności liczb całkowitych Liczby rzeczywiste Procenty... 24

2) R stosuje w obliczeniach wzór na logarytm potęgi oraz wzór na zamianę podstawy logarytmu.

Rozkład normalny, niepewność standardowa typu A

FUNKCJA LINIOWA - WYKRES

Pochodna funkcji c.d.-wykład 5 ( ) Funkcja logistyczna

Programowanie liniowe

Transkrypt:

. Optymalizacja jednowymiarowa.1 Metody bezgradientowe Metodami bezgradientowymi nazywamy algorytmy optymalizacyjne, które, jak sama nazwa wskazuje, nie wykorzystają informacji o gradiencie (pochodnej). Tego typu metody mogą być przydatne jeżeli nie znamy postaci minimalizowanej funkcji, zatem nie mamy bezpośredniego dostępu do gradientu (pochodnej). Poznawanie tych metod jest ważne również z innego powodu: są to metody które często są używane jako części większych i bardziej skomplikowanych algorytmów optymalizacyjnych, które będziemy poznawać w trakcie naszych zajęć..1.1 Przeszukiwanie jednostajne Jedną z najprostszych metod optymalizacji jest przeszukiwanie jednostajne, które polega na wyznaczeniu jednostajnie rozmieszczonych argumentów (np. od 0 do 1 co 0.1) i wybraniu tego, dla którego funkcja ma najmniejszą wartość. Analogicznie, możemy przeszukiwać losowo czyli ewaluować kilkanaście/kilkaset/... losowo wybranych argumentów i wybrać tego z najniższą wartością. Jeśli w przeszukiwanie jednostajnym zrezygnujemy z założenia, że badane argumenty muszą być rozmieszczone jednostajnie na osi otrzymamy metodę przeszukiwania siatki (ang. grid search), która wymaga od nas zdefiniowania siatki interesujących nas wartości które następnie będą przeszukiwane (np. 0,5,7,10). Przeszukiwanie siatki jest dość często stosowane np. w doborze hiperparametrów dla algorytmów optymalizacji (np. długość kroku algorytmy, wielkość populacji etc.). Dość typowym zwyczajem (np. w przypadku doboru długość kroku) jest korzystanie z argumentów skalujących się wykładniczo (np. kolejne potęgi dwójki) zamiast z rozkładu jednostajnego. Niewątpliwą zaletą przeszukiwania jednostajnego (i przeszukiwania siatki) jest brak jakichkolwiek założeń na temat optymalizowanej funkcji i jej wymiarowości oraz prostata działania i implementacji. Efektem ubocznym takiego podejścia jest brak jakichkolwiek

Laboratorium. Optymalizacja jednowymiarowa gwarancji - możemy nie znaleźć nawet przeciętnie dobrego wyniku dla trywialnych funkcji (nawet minimum lokalnego). Co więcej złożoność tych algorytmów efektywnie rośnie wykładniczo z wymiarowością..1. Przeszukiwanie dychotomiczne Przeszukiwanie dychotomiczne, jak sugeruje nazwa (dychotomia to z greckiego podział na dwie części), polega na dzieleniu przeszukiwanej przestrzeni na pół i odcinaniu połowy, która na pewno nie zawiera minimum. Tak działająca procedura, aby być pewna że w danej połowie na pewno nie ma minimum, nakłada ograniczenia na optymalizowaną funkcję. Wspomniana procedura wymaga aby dziedzina funkcji była jednowymiarowa, a sama funkcja była jednomodalna. Definicja.1 Funkcja unimodalna. Funkcja f () jest jednomodalna jeśli posiada dokładnie jedno ekstremum lokalne. Poniższy pseudokod pokazuje jak dokładnie działa przeszukiwanie dychotomiczne dla funkcji f na przedziale [ 1, ]: Definicja. Przeszukiwanie dychotomiczne. Wejście: 1, lewy i prawy koniec badanego obszaru, δ mała liczba np. 10 8, n liczba kroków a 1 b for k = 1,,3,..., n do m a+b l m δ r m + δ if f ( l ) f ( r ) then b r else a l end if end for return a+b Algorytm przeszukiwania dychotomicznego znajduje minimum z dokładnością zależną od liczby wykonanych kroków. Konkretnie, obszar lokalizacji minimum będzie zawężony do 1 n ( 1 ) gdzie przybliżenie wynika z pominięcia małej stałej algorytmu δ. Aby uniezależnić się od wyboru liczby kroków można zatrzymać algorytm po uzyskaniu zadanej dokładności dla funkcji celu lub po wyczerpaniu budżetu obliczeniowego. Dodatkowo warto zauważyć, że algorytm nie jest w stanie zawęzić obszaru poszukiwań bardziej niż do obszaru o długości δ..1.3 Metoda złotego podziału Na pierwszy rzut oka wydaje się, że algorytmy dychotomizacji jest najlepszą metodą tego typu jaką można zaproponować w każdej iteracji redukuje się obszar przeszukiwania o (prawie) połowę. Okazuje się jednak, że można zaproponować algorytm który nie dzieli obszaru o połowę (czyli, aby otrzymać tę samą szerokość przedziału musi wykonać więcej iteracji), a pomimo tego jest szybszy!

.1 Metody bezgradientowe 3 Algorytm dychotomizacji wymaga dwóch wywołań funkcji celu w każdej iteracji. Można jednak ograniczyć liczbę odwołań do funkcji, i w każdej iteracji ewaluować funkcję tylko jeden raz (czyli iteracja algorytmu trwa dwukrotnie szybciej!) z takim zamysłem stworzono algorytm złotego podziału. Pomysł na poprawę polega na ponownym użyciu obliczonej wcześniej wartości funkcji dla jednego z wyznaczonych punktów. Podobnie jak w algorytmie dychotomizacji, w każdej iteracji porównujemy ze sobą wartości funkcji w dwóch punktach i zawężamy obszar przeszukiwania. Mamy jednak gwarancję, że w każdej iteracji jednym z dwóch punktów które będą ewaluowane będzie punkt już policzony w poprzedniej iteracji. Najtrudniejsze pytanie: w jaki sposób możemy wyznaczać takie dwa punkty w każdej iteracji aby mieć taką gwarancję? Nanieśmy na oś dwa punkty które ewaluujemy w iteracji algorytmu: Po wykonaniu iteracji zakres zwęża się do [a, p ] lub [ l,b]. Ponieważ nie wiemy, który przypadek nastąpi, ustalamy, że długości te są sobie równe tj. w każdej iteracji następuje redukcja przedziału poszukiwań o taki sam procent obszaru. p a = b l = l a = b p (.1) Załóżmy, że f ( l ) < f ( p ) czyli zawężamy obszar do [a, p ]. Chcąc skwantyfikować poziom redukcji obszaru zauważamy, że nowy obszar poszukiwań stanowi p a b a oryginalnego. W kolejnej iteracji jedynym punktem, który moglibyśmy użyć ponownie jest punkt l (ponieważ obliczony wcześniej p znajduje się teraz na końcu przedziału). W kolejnej iteracji używamy więc punktu l i pewnego punktu l (który jest zaznaczony na powyższym rysunku kreseczką bez podpisu). Znów załóżmy, że f ( l ) < f ( l) następuje więc redukcja obszaru do [a, l ], która stanowi l a p a poprzedniego obszaru. Jak wcześniej założyliśmy, chcielibyśmy aby w każdej iteracji algorytm redukował przedział poszukiwań o taką samą cześć czyli w obydwu iteracjach algorytmu chcielibyśmy uzyskać takie same proporcje podziału, czyli ustalamy: p a b a = l a p a (.) Przekształćmy prawą stronę tej równości poprzez podstawienie równania.1: l a p a = b p p a = b p + a a = b a ( p a) = b a p a p a p a p a p a = b a p a 1 czyli, wracając do równania.: p a b a = b a p a 1

4 Laboratorium. Optymalizacja jednowymiarowa Definiując q = p a b a (stosunek podziału) otrzymujemy równanie: q = 1 q 1 = q = 1 q q + q 1 = 0 którego rozwiązaniem 1 (5) 1 jest q = 0.618 czyli odwrotnosć złotej liczby. Liczba ta która wyznacza złoty podział odcinka (stąd nazwa metody). Poniższy pseudokod pokazuje jak działa metoda złotego podziału dla funkcji f na przedziale [ 1, ]. W gruncie rzeczy jest to kod bardzo zbliżony do poszukiwania dychotomicznego, ale to co wymaga dodatkowych linii kodu to zapamiętywanie i ponowne użycie poprzednio wyznaczonego punktu. Definicja.3 Metoda złotego podziału. Wejście: 1, lewy i prawy koniec badanego obszaru, n liczba kroków α 5 1 a 0 b 1 l αa + (1 α)b r (1 α)a + αb wyznacz f ( l ), f ( r ) for k = 1,..., n do if f ( l ) f ( r ) then b r p l l αa + (1 α)b wyznacz f ( l ) (wartość dla aktualnego f ( p ) była policzona wcześniej) else a l l r r (1 α)a + αb wyznacz f ( r ) (wartość dla aktualnego f ( l ) była policzona wcześniej) end if end for return a+b Jak pewnie zauważyłeś, nasze wymaganie żeby w każdej iteracji redukować obszar poszukiwań o taką samą cześć jest trochę sztuczne i sub-optymalne. Metoda analogiczna, która pozbywa się tego wymagania to algorytm Fibonacciego, która jest algorytmem o optymalnej zbieżności. Pomimo tego, metoda złotego podziału jest prostsza w implementacji (i zrozumieniu) a i tak osiąga zbieżność która jest asymptotycznie optymalna.. Algorytm spadku wzdłuż gradientu dla funkcji jednowymiarowej Na pierwszych laboratoriach podawaliście różne pomysły na algorytmy optymalizacyjne takie jak narysowanie wykresu funkcji celu (przeszukiwanie jednostajne) czy przeszuki- 1 Używając wzoru na tzw. deltę i pamiętając, że proporcja musi być dodatnia.

. Algorytm spadku wzdłuż gradientu dla funkcji jednowymiarowej 5 wanie losowe. Algorytmem który jakoś szczególnie przypadł nam do gustu był algorytm wykorzystujący lokalną informację o funkcji. Taki algorytm (w przypadku funkcji 1D) patrzył sobie w prawo i w lewo i przesuwał się tam gdzie było niżej. Tę lokalną informację którą był kierunek najszybszego lokalnego wzrostu, nazywaliśmy gradientem. Nadszedł czas by dokładniej przyjrzeć się temu podejściu...1 Idea spadku wzdłuż gradientu Spróbujmy sformalizować to podejście używając bardzo prostego pseudokodu. Rozpoczynamy optymalizację od jakiegoś punktu startowego, który możemy wybrać np. losowo. Punkt ten będzie naszym aktualnym rozwiązaniem problemu optymalizacyjnego, a zadaniem naszego algorytmu będzie przesuwać go w kierunku dla którego funkcja celu osiąga minimum. W każdej iteracji nasz algorytm będzie rozglądać się w prawo i w lewo starając się określić kierunek w którym funkcja lokalnie rośnie. Następnie widząc, że funkcja rośnie w prawo (poprzez zwiększenie ) przesuwamy się w kierunku przeciwnym, aby funkcję zminimalizować. Wykonujemy więc aktualizację naszego aktualnego rozwiązania trochę w lewą stronę, mając nadzieję, że zbliżamy je do minimum funkcji. Analogicznie, jeżeli funkcja rośnie poprzez zmniejszanie to nasz algorytm zwiększy go, przesuwając aktualne w prawą stroną. INICJALIZUJ while warunek stopu nie jest spełniony do v ROZGLADAJ SIE I SPRAWDŹ KIERUNEK WZROSTU W BIEŻACEJ OKOLICY() v Przesuń w kierunku minimum end while Nasz kod wygląda w miarę sensownie, jednak nadal wymaga od nas ustalenia jak zaimplementujemy funkcję inicjalizuj, warunek stopu czy funkcję rozglądającą się. Na razie uprościmy sobie rozważania zakładając, że iterujemy w nieskończoność (brak warunku stopu, kiedyś ktoś wciśnie Ctrl+C :) a inicjalizacja jest losowa. Nadal jednak musimy zaimplementować najważniejszą część naszego algorytmu czyli funkcję rozglądającą się. Jak sprawdzić czy funkcja rośnie czy maleje w okolicach naszego aktualnego punktu? Cóż, możemy dodać/odjąć jakieś małe ε od naszego punktu i sprawdzić ile wynosi funkcja f ( + ε) oraz f ( ε), a następnie porównać te dwie wartości. Jeżeli f ( + ε) > f ( ε) to wiemy 3, że funkcja rośnie poruszając się w prawo, jeśli f ( + ε) < f ( ε) to funkcja lokalnie maleje. Kiedy f ( + ε) = f ( ε) to funkcja jest lokalnie stała i, tak jak dyskutowaliśmy, nasz algorytm utknie w tym punkcie. Choć jeżeli funkcja jest rzeczywiście stała w okolicach punktu to w zasadzie znaleźliśmy lokalne maksimum lub minimum. W takim razie przepiszmy pseudokod algorytmu wykorzystując nasz świeżo opisany sposób badania zmienności funkcji. Obecną w kodzie funkcję rozglądaj się... możemy zamienić po prostu jako różnicę f ( + ε) f ( ε). Ta różnica będzie dodatnia, kiedy f ( + ε) > f ( ε) i ujemna w przeciwnym wypadku. Dodatkowo, przesuwanie naszego aktualnego rozwiązania o tę różnicę ma potencjalną dodatkową zaletę. Jeśli ta różnica będzie duża (funkcja bardzo szybko rośnie) to po wykonaniu aktualizacji v (czyli ( f ( + ε) f ( ε)) przesuniemy nasze rozwiązanie mocno w lewo, robiąc duży patrzymy gdzie rośnie, a nie gdzie maleje po prostu przez przyjętą konwencję 3 Chyba lepszym słowem byłoby wydaje nam się na podstawie naszego prostego sposobu rozglądania się

6 Laboratorium. Optymalizacja jednowymiarowa krok. Jeśli zaś funkcja będzie rosła wolno to odpowiednio krok wykonany przez nas będzie mały. Dlaczego to może być potencjalnie dobre? Przypomnij sobie funkcję funkcja ta powoli rośnie/maleje w okolicach minimum i bardzo szybko rośnie z daleka od niego. W tym konkretnym przypadku informacja, że funkcja rośnie bardzo szybko jest równoznaczna z informacją jesteś daleko od minimum - wykonaj więc duży krok. Jeśli zaś funkcja rośnie wolno jesteś blisko minimum rób małe kroczki. Jest jednak pewien problem: jednostki. Wyobraź sobie, że chcemy np. minimalizować odległość od jakiegoś punktu 0. Możemy skonstruować dwie ekwiwalentne funkcje celu: jedna z nich będzie wyrażała odległość w centymetrach, a druga w metrach. Zwróć uwagę, że kroki oparte na różnicach w centymetrach będą automatycznie 100 razy większe niż w metrach! Z tego powodu potrzebujemy pewnej stałej η, którą będziemy wymnażać przez różnicę wartości funkcji w celu dodatkowego regulowania wielkości kroku. Stałą tę nazwiemy szybkościa optymalizacji. Problemem dobierania tej stałej, jak i lepszym wyjaśnieniem dlaczego jej potrzebujemy zajmiemy się na kolejnych laboratoriach. INICJALIZUJ η pewna stała (szybkość optymalizacji) while warunek stopu nie jest spełniony do v f ( + ε) f () ηv Przesuń w kierunku minimum end while W powyższym zapisie uprościliśmy jeszcze trochę różnicę: tak naprawdę jeśli znamy wartość funkcji w punkcie f () to żeby sprawdzić czy funkcja rośnie możemy policzyć jej różnicę z f ( + ε). Ok, to pozostał ostatni problem: jak wybrać ε? Sam wybrany przez nas symbol matematyczny sugeruje, że powinna to być jakaś mała liczba. Jednak dlaczego tak jest? Po pierwsze, chcieliśmy uzyskać lokalną informację o kierunku wzrostu/spadku funkcji i na jej podstawie poruszać się w kierunku minimum. Jeżeli nasz krok rozglądania się będzie zbyt duży ta cała analogia legnie w gruzach. Dodatkowo, funkcja f () może być dowolnie skoczna, więc wybierając zbyt duże ε ryzykujemy, że nasze rozglądanie się przegapi istotny spadek funkcji! Jednak jeśli chcemy wybrać tak małe ε jak to tylko możliwe... to biorąc granicę z ε dążącym do 0 otrzymujemy w zasadzie definicję pochodnej funkcji! Definicja.4 Algorytm spadku wzdłuż gradientu (1D). INICJALIZUJ η pewna stała szybkość optymalizacji while warunek stopu nie jest spełniony do η f () Przesuń w kierunku minimum end while Algorytm który właśnie opisaliśmy nazywamy algorytmem spadku wzdłuż gradientu (ang. gradient descent), a dla maksymalizacji algorytmem wzrostu wzdłuż gradientu (ang. gradient ascent). Aby go zaimplementować musimy być w stanie policzyć pochodną z funkcji celu - pora przypomnieć sobie jak to się robi ;).. Pochodna funkcji

. Algorytm spadku wzdłuż gradientu dla funkcji jednowymiarowej 7 Definicja.5 Pochodna funkcji. Pochodną funkcji w punkcie nazywamy granicę d f () d f ( + ) f () 0 Przykład.1 Obliczmy ile wynosi pochodna z f () = d f () d f ( + ) f () ( + ) 0 0 + + 0 ( + ) = 0 Przykład. Pokażmy, że pochodna sumy to suma pochodnych: d ( ) ( f ( + ) + g( + )) ( f () + g()) f () + g() d 0 f ( + h) f () + g( + ) g() 0 f ( + ) f () 0 = f () + g () + lim 0 g( + ) g() Wzory na pochodne: d d ( f () + g()) = d d ( f ()) + d d (g()) pochodna sumy to suma pochodnych d d (a) = 0 pochodna ze stałej to 0 d d (n ) = n n 1 W szczególności powyższy wzór możemy użyć do obliczenia d d ( 1 ) = d d ( 1 ) = 1 = 1 d d (e ) = e d d (log()) = 1 d d ( f ()g()) ) = f ()g() + f ()g () ( d d f () g() d dz = dy dz dy d = f ()g() f ()g () g () reguła łańcuchowa..3 Pochodna jako najlepsze liniowe przybliżenie funkcji w punkcie Zastanawiając się czym jest pochodna często słyszymy, że jest to tangens kąta nachylenia stycznej do funkcji w danym punkcie. W rzeczywistości możemy spojrzeć na tę styczną jako na najlepsze liniowe przybliżenie różniczkowanej funkcji w danym punkcie. Załóżmy, że mamy daną (potencjalnie mocno nieliniową) funkcję f, jednak trzymamy kciuki, żeby w małej okolicy wybranego przez nas punktu 0 była możliwość dobrego przybliżenia tej funkcji linią prostą. Linia prosta ma oczywiście równanie postaci ˆf () =

8 Laboratorium. Optymalizacja jednowymiarowa 1.5 1 y = sin() 0.5 0 0.5 y = sin() 0.5 0.45 1 1 0.5 0 0.5 1 1.5.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 0.45 0.5 0.55 Rysunek.1: Funkcja sin() oraz jej liniowe przybliżenie (lewa). Obserwujemy duże błędy przybliżenia dla dużych, ponieważ funkcja sinus jest mocno nieliniowa. Jednak jeżeli spojrzymy na zbliżenie tej funkcji w okolicach = 0.5 (prawa) widzimy, że funkcję można dobrze lokalnie przybliżyć przez linię prostą. a + b. Zastanówmy się co dla nas oznacza dobrze przybliżenie funkcji f w okolicach punktu 0. Po pierwsze chcielibyśmy, żeby różnica f () ˆf () była jak najmniejsza. Jednak wiemy, że nie możemy tego uzyskać dla całego zakresu i próbujemy to uzyskać jedynie lokalnie, dla okolic naszego wybranego punktu 0. W związku z tym błąd przybliżenia będziemy skalować względem odległości od naszego punktu 0 : f () ˆf () 0 im odległość jest większa tym błąd podzielimy przez większą liczbę, jednocześnie go zmniejszając. Co więc ostatecznie rozumiemy przez funkcja liniowa ˆf () dobrze lokalnie przybliża funkcję f? No więc oznacza to, że (a) funkcja ˆf () przechodzi dokładnie przez punkt ( 0, f ( 0 )) czyli popełnia dokładnie zerowy błąd w wybranym przez nas punkcie ( ˆf ( 0 ) = f ( 0 )) (b) przynajmniej w bardzo maleńkiej okolicy (której wielkość dąży do 0, 0 ) nasze przybliżenie popełnia zerowy błąd! f () ˆf () f () (a + b) lim = 0 0 0 0 0 Jeżeli takiej linii nie można znaleźć to najzwyczajniej w świecie uważamy, że nie da się przybliżyć funkcji f w okolicach 0 linią prostą. Spróbujmy wyznaczyć tę linię. Skoro wiemy, że linia przechodzi przez punkt ( 0, f ( 0 )) to linia musi spełniać równanie: Dalej podstawiając do wzoru f ( 0 ) = a 0 + b b = f ( 0 ) a 0 f () (a + b) f () (a + f ( 0 ) a 0 ) lim 0 0 0 0 f () a f ( 0 ) + a 0 /wyciągnijmy a przed nawias/ 0 0 [ ] f () f ( 0 ) a( 0 ) f () f (0 ) a 0 0 0 0

. Algorytm spadku wzdłuż gradientu dla funkcji jednowymiarowej 9 Jeżeli więc wymagamy by tak zdefiniowany błąd (w bardzo maleńkim otoczeniu 0 ) był zerowy to po przyrównaniu go do zera otrzymujemy: a 0 f () f ( 0 ) 0 gdzie a to współczynnik kierunkowy naszego przybliżenia. Dokonując zamiany zmiennych = 0 odkrywamy, że w rzeczywistości wzór po prawej stronie znaku równości to definicja pochodnej! f () f ( 0 ) f ( 0 + ) f ( 0 ) a = f ( 0 ) 0 0 0 Można więc intuicyjnie powiedzieć, że pochodna istnieje tylko gdy funkcję można lokalnie przybliżyć linią prostą z zerowym błędem. Słowa przestrogi Idąc dalej z tą analogią można sądzić że funkcja jest różniczkowalna jeżeli przy dostatecznie dużym zoomie jest ona linią prostą. Nie jest to prawda. Spójrz na kolejne zbliżenia funkcji w punkcie 0 i 1. W obydwu punktach funkcja jest różniczkowalna, a pomimo tego niezależnie jak byśmy bardzo zbliżali wykres w punkcie 0, funkcja zawsze wygląda jak parabola. Dlaczego? Cóż, jak matematyk mówi o nieskończenie małej lokalnej okolicy to właśnie ma namyśli nieskończenie mała okolicę. Pomimo tego jest to użyteczna intuicja dot. pochodnej i przydaje się myśleć o pochodnej jako o liniowym przybliżeniu funkcji. y = y = 16 14 1 10 8 6 4 0 16 14 1 10 8 6 4 0 4 0 4 4 0 4 y = y = 1 0.8 0.6 0.4 0. 4 3 1 0 0 1 0.5 0 0.5 1 0 0.5 1 1.5 y = y = 1.3 1. 1.1 1 0.8 0.6 0.4 0. 1 0.9 0 10 0.1 5 10 0 5 10 0.1 0.8 0.9 0.95 1 1.05 1.1 y = 1 0.8 0.6 0.4 0. 1.0 1.01 10 18 0 1 0.5 0 0.5 1 1 0.99 10 9 0.98 0.99 1 1 1.01 1.01 Co na to nasz algorytm? Fakt, że pochodna w rzeczywistości jest rozwiązaniem problemu liniowego przybliżenia funkcji daje nam ciekawą zauważkę (ang. insight) dot. algorytmu spadku wzdłuż gradientu. Skoro liczymy w każdej iteracji pochodną to de facto w każdej iteracji konstruujemy liniowe przybliżenie naszej funkcji celu. Dalej wiemy, że aby znaleźć minimum 4 funkcji liniowej to przy współczynniku kierunkowym a > 0 musimy go szukać jak najbardziej w lewo ( ), a przy a < 0 musimy go szukać jak najbardziej w prawo. W związku z tym wykonujemy krok w kierunku przeciwnym do znaku a (czyli naszego liniowego 4 Formalnie minimum nie istnieje y =

10 Laboratorium. Optymalizacja jednowymiarowa przybliżenia, pochodnej). Gdyby nasze liniowe przybliżenie było prawidłowe na całej dziedzinie to chcielibyśmy wykonać nieskończenie duży krok w tym kierunku, jednak ponieważ nasze przybliżenie jest dobre jedynie lokalnie to wykonujemy pewien mały kroczek (którego wielkość reguluje η i a ) w kierunku minimum tego przybliżenia.! Można formalnie pokazać, że krok aktualizacji w algorytmie jest rozwiązaniem problemu minimalizacji zminimalizuj jak najbardziej funkcję stycznej + nie odchodź za bardzo od okolicy, bo przybliżenie jest lokalne. Ale o tym na kolejnych laboratoriach ;)..4 Przybliżanie pochodnej numerycznie Czasami nie możemy policzyć analitycznie pochodnej funkcji (bo np. jej postać nie jest nam znana), a pomimo tego chcielibyśmy użyć algorytmu który takiej pochodnej używa. Okazuje się, że jest na to sposób! Zauważ, że pochodna to zgodnie z definicją. Widzimy w niej, że dąży do 0, czyli tak naprawdę jest ono tak małe jak tylko się da. Gdyby stwierdzić że ta mała różnica wynosi = ε, to bez problemu obliczylibyśmy pochodną jako f (+ ) f () lim 0 f () f ( + ε) f () ε Powyższym wzorem możemy obliczyć przybliżoną wartość pochodnej poprzez dwukrotne obliczenie funkcji f () a wzór na pochodną nie musi być znany! Z tego powodu wzór ten często używamy w praktyce, gdy policzenie pochodnej nie jest możliwe lub gdy np. nie mamy czasu na implementacje funkcji liczącej pochodną. Oczywiście ε powinien być tak mały jak tylko to możliwe, jednak wybranie za niskiej wartości może doprowadzić do trudności numerycznych (dzielenie przez bardzo małą stałą prawdopodobnie i tak małej różnicy). Praktyczną wartością stosowaną w optymalizacji jest np. ε = 10 5.! Nawisem mówiąc, funkcja nawet nie musi być różniczkowalna żeby obliczenie takiego przybliżenia było możliwe. Przykład.3 Przybliżmy wartość pochodnej dla f () = w punkcie = i zakładając ε = 10 5. Obliczmy najpierw wartość funkcji w punkcie oraz w punkcie + ε: Przybliżmy pochodną: f () = = 4 f ( + ε) = ( + 0.00001) =.00001 = 4.00004 f () f ( + ε) f () ε = 4.00004 4 0.00001 = 0.00004 0.00001 = 4 Zwróć uwagę, że w żadnej chwili nie użyliśmy wzoru na pochodną funkcji, a do wykonania przybliżenia potrzebujemy jedynie czarnej skrzynki, która jest w stanie obliczyć funkcję celu f (). Oczywiście jest to przybliżenie i zwykle nie wychodzi ono równe dokładnie pochodnej ;)

.3 Wstęp do funkcji wielowymiarowych 11 Czy jednak takie przybliżenie ma jakieś poparcie teoretyczne? Okazuje się, że tak! Na przykład twierdzenie Lagrange a o wartości średniej mówi, że jeżeli dana funkcja f jest ciągła w przedziale [a, b] oraz różniczkowalna w przedziale (a, b) to istnieje taki punkt c (a,b), że f f (b) f (a) (c) = b a Podstawiając a = oraz b = + ε (czyli b a = ε) otrzymujemy f (c) = f ( + ε) f () ε gdzie c należy do przedziału (, + ε). Twierdzenie to nie mówi nam o tym jak dobre jest nasze przybliżenie pochodnej w punkcie. Wiemy jednak, że obliczona przez nas wartość równa się dokładnie pochodnej funkcji dla jakiejś wartości c która jest bardzo blisko naszego. Na początku mówiliśmy o algorytmie, który szuka minimum funkcji poprzez spoglądanie na wartości funkcji na prawo i na lewo. Teraz jednak dostaliśmy algorytm który patrzy tylko w prawo ( f ( + ε))! W praktyce okazuje się jednak, że nasza początkowa intuicja jest poprawna. Patrzenie również w lewą stronę f ( ε) daje stabilniejsze estymacje pochodnej niż tylko spoglądanie tylko w jedną stronę. Nasze przybliżenie uzyskujemy więc zwykle poprzez obliczenie: f () f ( + ε) f ( ε) ε Do wyjaśnienia dlaczego tak jest wrócimy jeszcze na kolejnych laboratoriach..3 Wstęp do funkcji wielowymiarowych Wstęp do funkcji wielowymiarowych warto rozpocząć od zastanowienia się, jak wyglądają funkcje wielowymiarowe. Na to pytanie najlepiej jest chyba odpowiedzieć sobie poprzez obejrzenie kilku wizualizacji i naszkicowaniu wykresów: https://www.youtube.com/watch?v=trccbdwwcbc&list=plsql0avh4hc5feha6rc5c0wbrt5 inde=1 https://www.youtube.com/watch?v=drmfkh_vi&list=plsql0avh4hc5feha6rc5c0wbrt5 inde=3 https://www.youtube.com/watch?v=e9bawp7ik80&list=plsql0avh4hc5feha6rc5c0wbrt5 inde=4 https://www.youtube.com/watch?v=wszj5rb6do8&list=plsql0avh4hc5feha6rc5c0wbrt5 inde=5.3.1 Gradient

1 Laboratorium. Optymalizacja jednowymiarowa Definicja.6 Gradient funkcji f () w punkcie to wektor pochodnych cząstkowych f () = Przykład.4 Policzmy sobie gradient dla funkcji f ( 1, ) = 1 +. Pochodne cząstkowe to odpowiednio: a więc gradient wynosi 1 = 1 f () = 1 3... [ ] 1 = = [ ] 1 Gradient jest więc w zasadzie użytecznym zapisem matematycznym pozwalającym nam na bardziej przejrzysty zapis oraz na operowanie na wszystkich pochodnych cząstkowych na raz. Wyznaczmy kilka użytecznych wzorów na gradient. Przykład.5 Gradient funkcji liniowej. Policzmy gradient następującej funkcji: f () = a T = [ ] 1 a 1 a a 3 = a 1 1 + a + a 3 3 3 Gradient to wektor składający się z kolejnych pochodnych cząstkowych. Obliczmy pierwszą pochodną cząstkową: = (a 1 1 + a + a 3 3 ) = (a 1 1 ) + (a ) + (a 3 3 ) = a 1 + 0 + 0 = a 1 1 1 1 1 1 A więc pochodną cząstkową po pierwszym 1 jest tylko odpowiadająca mu waga a 1. Analogiczne rozumowanie można przeprowadzić dla każdego kolejnego i. f = 1 3 = a 1 a a 3 = a Problem.1 Pokaż, że dla analogicznej funkcji f () = T a jej gradient również wynosi f = a. Pomimo tego, że wynik jest już teraz dość oczywisty, zwróć uwagę, że w pokazanym wyżej przykładzie a straciło w gradiencie swoją transpozycję tutaj nie pojawia się żadna dodatkowa transpozycja i przepisujemy a jak jest.! Zauważ, że powyższy wzór (jak i następne) pozwalają na policzenie gradientu dla dowolnie długiego wektora! Atakujemy więc tym zapisem nawet funkcje trylionwymiarowe!

.3 Wstęp do funkcji wielowymiarowych 13 Przykład.6 Gradient funkcji kwadratowej. Policzmy gradient następującej funkcji: f () = T = [ ] 1 1 3 = 1 + + 3 3 Gradient to wektor składający się z kolejnych pochodnych cząstkowych. Obliczmy pierwszą pochodną cząstkową: = ( 1 + + 3 ) = ( 1 ) + ( ) + ( 3 ) = 1 + 0 + 0 = 1 1 1 1 1 1 Analogiczne rozumowanie można przeprowadzić dla każdego kolejnego i. f = ( T ) 1 3 1 = = 3 Przykład.7 Gradient formy kwadratowej. Czas na coś trudniejszego! Policzmy gradient następującej funkcji: f () = T A = [ 1 ] [ a 11 a 1 a 1 a ][ 1 Zacznijmy wymnażanie powyższego iloczynu od lewej strony T A = [ ] [ ] a 1 11 a 1 = [ ] a a 1 a 11 1 + a 1 a 1 1 + a Zwróć uwagę, że elementy z pierwszego wiersza a 1 są zawsze mnożone przez 1, a elementy drugiego wiersza są mnożone przez. Dokończmy mnożenie: T A = [ ] [ ] a 11 1 + a 1 a 1 1 + a 1 = a 11 1 + a 1 1 + a 1 1 + a Znów, zwróć uwagę na ciekawą korespondecję pomiędzy indeksami elementów a wymnażanymi indeksami. Element a 1 stanowi wagę dla 1, element a 1 jest wagą 1. Z kolei element a to waga dla =. Jak będą wyglądały pochodne cząstkowe względem 1 i? = (a 111 + a 1 1 + a 1 1 + a ) = a 11 1 + (a 1 + a 1 ) 1 1 = (a 111 + a 1 1 + a 1 1 + a ) = (a 1 + a 1 ) 1 + a W poprzednich zadaniach byliśmy w stanie dojść do eleganckiego zapisu macierzowego, spróbujmy osiągnąć go także tym razem. Rozważmy na razie tylko pierwszą ]

14 Laboratorium. Optymalizacja jednowymiarowa pochodną cząstkową. Stosunkowo łatwo można zauważyć, że można ją wyrazić w postaci mnożenia dwóch wektorów: a 11 1 + (a 1 + a 1 ) = [ ] [ ] a 11 a 1 + a 1 1 Teraz dokładamy jeden dodatkowy wiersz do wektora po lewej stronie uzyskując dodatkowo pochodną po i w rezultacie otrzymując cały gradient: [ ][ ] a11 a f = 1 + a 1 1 a 1 + a 1 a Jak zapisać macierz po lewej stronie elegancko w rachunku macierzowym? Jest to po prostu A T + A! [ ] [ ] [ ] a11 a 1 a11 a + 1 a11 a = 1 + a 1 a 1 a a 1 a a 1 + a 1 a Ostatecznie otrzymujemy więc: f = ( T A) = (A T + A)! W szczególności, gdy macierz jest symetryczna zachodzi A T = A czyli f = A Inne ważne wzory na gradient: (a f () + bg()) = a f () + b g() zasada liniowości gradientu f (A) = A T f.3. Przykład regresji liniowej Rozważmy przykład znalezienia minimum wielowymiarowej funkcji celu metodami analitycznymi. Za przykład posłuży nam tutaj problem znajdowania minimalnej sumy błędów kwadratowych (ang. least squares) na przykładzie regresji. Regresja wieloraka to regresja liniowa w której uwzględniamy kilka zmiennych objaśniających. ŷ = β 0 + β 1 1 + β +... Na statystyce rozważaliśmy głównie przykład z tylko jedną zmienną i jeśli nadal to pamiętacie równania prowadzące nas do wzorów na (tylko dwa) współczynniki β były dość długie i żmudne. Spróbujmy zobaczyć jak to wygląda w przypadku wielowymiarowym używając naszej wiedzy o gradiencie. Korzystając z naszej wcześniejszej wiedzy o mnożeniu wektorów, równanie regresji trochę się upraszcza: ŷ = β 0 + T β Aby jeszcze uprościć ten zapis dodajemy do wektora sztuczną, dodatkową wartość równą jeden. Pozwala nam to na wpisanie stałej β 0 do wektora β i dalsze uproszczenie zapisu: ŷ = T β

.3 Wstęp do funkcji wielowymiarowych 15 Kontynuujmy upraszczanie: upakujmy kolejne obserwacje jako wiersze macierzy X zawierającej wszystkie obserwacje ze zbioru danych. Zauważ, że jej kolumny zawierają wartości kolejnych zmiennych modelu. Macierzy tej odpowiada wektor y mający tyle wierszy (elementów) ile jest obserwacji, i zawierający wartości zmiennej zależnej. W takim wypadku możemy zapisać globalne równanie regresji obliczające wartość ŷ dla każdej obserwacji na raz! ŷ = Xβ Zauważ, że po wykonaniu tego równania macierzowego otrzymujesz wektor ŷ, który zawiera od razu predykcje naszej regresji dla każdej obserwacji w macierzy! Suma kwadratów rezyduów może więc zostać wyrażona wzorem: SSE = (y Xβ) T (y Xβ) Dlaczego ten wzór jest prawdziwy? Wcześniej pokazaliśmy, że T to po prostu suma kwadratów +i + i. My chcemy policzyć sumę kwadratów błędów gdzie pojedynczy błąd to różnica między naszą predykcją (wynikającą z regresji liniowej) a tym co powinniśmy uzyskać. Pojedynczą predykcję uzyskujemy poprzez ŷ = T β. Przepisując to na nasz zapis macierzowy musimy z naszej macierzy zawierającej wszystkie dane X wyciągnąć pojedynczy wiersz zawierający dane naszego konkretnego. Otrzymujemy więc ŷ = X i, β, a błąd na tym pojedynczym przykładzie to y i X i, β. A więc wektor zawierający wszystkie błędy (dla wszystkich przykładów) to y Xβ. Suma kwadratów tego wektora uzyskujemy poprzez wyrażenie T czyli (y Xβ) T (y Xβ). Policzmy teraz gradient po SSE szukając współczynników regresji liniowej. Zacznijmy od wymnożenia nawiasów w SSE. SSE = (y Xβ) T (y Xβ) /* transpozycje wciągamy do środka */ = (y T β T X T )(y Xβ) /* wymnażamy*/ = y T y β T X T y y T Xβ + β T X T Xβ (.3) Na takiej postaci SSE jest już prosto zastosować poznane przez nas wzory na gradient. Dla uproszczenia zaaplikujmy gradient do każdej z części tego wyrażenia. Zwróć uwagę, że zmienną po której liczmy tutaj gradient jest wektor β. (β T X T y) = X T y (y T Xβ) = (y T X) T = X T y (β T X T Xβ) = X T Xβ W ostatniej pochodnej skorzystaliśmy z faktu, że X T X jest macierzą symetryczną. Zapisując cały gradient dostajemy: SSE = 0 X T y X T y + X T Xβ = X T y + X T Xβ Z przyrównania tego gradientu do zera (a w zasadzie wektora zer) otrzymujemy: X T y + X T Xβ = 0 X T Xβ = X T y β = (X T X) 1 X T y Co bardzo interesujące, takie postawienie problemu pozwala nam na zminimalizowanie sumy kwadratów poprzez jedno równanie macierzowe 5! Równanie to czasami jest nazwane równaniem normalnym (ang. normal equation). 5 W drugim równaniu korzystamy z pomnożenia obustronnie równania z lewej strony przez (X T X) 1. Ponieważ jest to odwrotność macierzy X T X macierze te się skracają. (X T X) 1 X T X = I

16 Laboratorium. Optymalizacja jednowymiarowa Literatura Literatura powtórkowa Dokładny opis pochodnych oraz przykłady obliczeń można znaleźć w dowolnej książce do analizy matematycznej np. [1]. Literatura dla chętnych W tym tygodniu zachęcamy do zapoznania się z algorytmami do automatycznego liczenia pochodnych. Wśród takich technik popularne jest pojęcie grafu obliczeń (ang. computational graph) i liczenie pochodnych na takim grafie. Opis grafów obliczeń wraz z algorytmem wstecznej propagacji można znaleźć np. na stronie http://colah.github.io/posts/ 015-08-Backprop/ Bibliografia [1] M. Gewert i Z. Skoczylas. Analiza matematyczna 1: Definicje, twierdzenia, wzory. Oficyna Wydawnicza GiS, 007.