2024-06-11

Gradientný zostup

Gradientný zostup je základný optimalizačný algoritmus používaný v strojovom učení a štatistike. Pomocou gradientného zostupu sa snažíme minimalizovať cieľovú funkciu \(f(x)\) iteratívnym pohybom v smere gradientu (záporného smeru pre minimalizáciu). Počnúc náhodným počiatočným bodom aktualizujeme parametre podľa vzorca:

\[ x_{k+1} = x_k - \alpha \nabla f(x_k) \tag{1} \label{eq:gradient} \]

kde \(\alpha\) je učiaca rýchlosť a \(\nabla f(x_k)\) je gradient funkcie v bode \(x_k\).

Odkaz na rovnicu demonštruje aktualizačný vzorec v gradientnom zostupe.

Zelená čiara ukazuje, že v tomto bode bude derivácia pozitívna, červená - negatívna.

Vyberte ľubovoľný bod funkcie. Chcete „klesnúť“ na najbližšie minimum k tomuto bodu. Ak je derivácia vo vašom bode kladná (zelená čiara), znamená to, že minimum je „za vami“ a aby ste sa k nemu dostali, musíte odpočítať od súradnice vášho bodu X hodnotu vášho derivátu.

Ak je vo vašom bode derivácia záporná (červená čiara), znamená to, že minimum je „pred vami“ a aby ste sa k nemu dostali, musíte znova odpočítať od súradnice X hodnotu vášho derivátu. Jeho hodnota je záporná, a preto odpočítaním zápornej hodnoty zväčšíte súradnicu X.

No, aby zostup nebol neznesiteľne dlhý alebo chybne rýchly, vynásobte hodnotu vášho derivátu vo vybranom bode nejakým faktorom.

Túto funkciu si môžete predstaviť ako „pohár“ v 3D priestore

Matematické základy

Gradientný zostup funguje tak, že sa pohybuje v smere najstrmšieho klesania funkcie. Formálne, gradient \(f\) je vektor parciálnych derivácií:

\[ \nabla f(x) = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n} \right) \]

Derivácie a gradienty

Gradient poskytuje smer, v ktorom funkcia rastie najrýchlejšie. Preto, ak sa chceme dostať k minimu, pohybujeme sa v opačnom smere gradientu:

\[ x_{new} = x_{current} - \alpha \cdot \nabla f(x_{current}) \]

kde \(\alpha\) je malé kladné číslo nazývané učiaca rýchlosť.

Jednoduchý príklad

Zoberme si jednoduchú kvadratickú funkciu:

\[ f(x) = x^2 + 4x + 4 \]

Jej gradient je:

\[ \nabla f(x) = 2x + 4 \]

Implementácia v R

Najskôr definujeme cieľovú funkciu a jej gradient:

Inicializácia

Počiatočné podmienky sú:

  • Počiatočná hodnota: x = 10
  • Učiaca rýchlosť: learning_rate = 0.1
  • Tolerancia: tolerance = 1e-6
  • Maximálny počet iterácií: max_iter = 1000
# Počiatočné podmienky
x <- 10
learning_rate <- 0.1
tolerance <- 1e-6
max_iter <- 1000

Iterácie gradientného zostupu

## Minimum funkcie sa nachádza v bode: -1.999995

Vizualizácia výsledkov

Graf cieľovej funkcie

Pokročilé príklady

Gradientný zostup na 3D funkcii

Uvažujme 3D kvadratickú funkciu:

\[ f(x, y) = x^2 + y^2 \]

Jej gradient je:

\[ \nabla f(x, y) = (2x, 2y) \]

Definujeme cieľovú funkciu a gradient pre 3D funkciu:

Iterácie gradientného zostupu pre 3D

## Minimum funkcie sa nachádza v bode: ( 3.213876e-06 , 3.213876e-06 )

Vizualizácia 3D

Na vizualizáciu 3D funkcie použijeme balík plotly, ktorý umožňuje interaktívne grafy a vizualizácie. V tomto príklade vytvoríme 3D povrchový graf pre kvadratickú funkciu \(f(x, y) = x^2 + y^2\).

Inštalácia a načítanie balíkov

Najskôr musíme nainštalovať a načítať potrebné balíky, plotly pre interaktívne vizualizácie a magrittr pre pohodlné používanie pipe operátora (%>%).

Definícia 3D funkcie

Definujeme cieľovú funkciu \(f(x, y) = x^2 + y^2\), ktorú chceme vizualizovať.

# Definícia funkcie
objective_function_3d <- function(x, y) {
  return(x^2 + y^2)
}

Generovanie dát

Generujeme hodnoty \(x\) a \(y\) v intervale od -10 do 10 s krokom 0.5. Použijeme funkciu outer, ktorá nám umožní vypočítať hodnoty \(z\) pre každú kombináciu \(x\) a \(y\).

# Generovanie dát
x_vals <- seq(-10, 10, 0.5)
y_vals <- seq(-10, 10, 0.5)
z_vals <- outer(x_vals, y_vals, objective_function_3d)

Tu sa použijú nasledujúce funkcie:

  • seq(-10, 10, 0.5): Generuje postupnosť čísel od -10 do 10 s krokom 0.5 pre \(x\) a \(y\).
  • outer(x_vals, y_vals, objective_function_3d): Vypočíta maticu hodnôt \(z\) aplikovaním funkcie objective_function_3d na všetky kombinácie hodnôt \(x\) a \(y\).

Vytvorenie 3D grafu

Použijeme balík plotly na vytvorenie interaktívneho 3D povrchového grafu. Funkcia plot_ly inicializuje graf, add_surface pridá povrchovú vrstvu a layout nastaví popisy osí a názov grafu.

V tomto kóde: - plot_ly(x = ~x_vals, y = ~y_vals, z = ~z_vals): Vytvára základ pre 3D graf s osami \(x\), \(y\), a \(z\). - add_surface(): Pridáva povrchovú vrstvu do grafu na základe hodnôt \(z\). - layout(title = '3D Kvadratická Funkcia', ...): Nastavuje názov grafu a popisy osí.

Vizualizácia výsledkov gradientného zostupu v 3D

Vizualizujeme priebeh gradientného zostupu na povrchu 3D funkcie, aby sme mohli sledovať cestu algoritmu k minimu.

Použitie gradientného zostupu v strojovom učení

Gradientný zostup sa často používa v strojovom učení, najmä v regresii a neuronových sieťach, kde sa optimalizuje nákladová funkcia, aby sa minimalizovala chyba predpovede.

Lineárna regresia

Uvažujme jednoduchú lineárnu regresiu s nákladovou funkciou:

\[ J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 \]

kde \(h_\theta(x)\) je hypotéza a \(y\) sú skutočné hodnoty.

Gradient nákladovej funkcie je:

\[ \nabla J(\theta) = \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) x^{(i)} \]

Implementácia gradientného zostupu pre lineárnu regresiu

## Optimalizované parametre: theta0 = 2.948593 , theta1 = 1.973525

Vizualizácia lineárnej regresie

Záver

Gradientný zostup je univerzálny nástroj pre optimalizáciu a nájdenie minima funkcií. V tomto dokumente sme diskutovali jeho teoretické základy, ukázali sme jednoduchú aj pokročilú implementáciu v R, a použili ho na lineárnu regresiu. Gradientný zostup je základom mnohých algoritmov v strojovom učení a je kľúčový pre tréning neuronových sietí.