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: (1)
\[ x_{k+1} = x_k - \alpha \nabla f(x_k) \tag{1} \label{eq:fr1} \]
kde \(\alpha\) je učiaca rýchlosť a \(\nabla f(x_k)\) je gradient funkcie v bode \(x_k\).
Odkaz na rovnicu \(\eqref{eq:fr1}\) 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. (1)
Na obrázku Gradient môžeme vidieť vizualizáciu gradientného zostupu, zatiaľ čo na obrázku Vektory je znázornená trojrozmerná funkcia cieľovej funkcie.
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) \tag{2} \label{eq:gradient} \]
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}) \tag{3} \label{eq:update} \]
kde \(\alpha\) je malé kladné číslo nazývané učiaca rýchlosť.
Zoberme si jednoduchú kvadratickú funkciu:
\[ f(x) = x^2 + 4x + 4 \tag{4} \label{eq:example} \]
Jej gradient je:
\[ \nabla f(x) = 2x + 4 \tag{5} \label{eq:gradient_example} \]
Teraz môžeme odkazovať na tieto vzorce priamo v texte:
Gradientný zostup sa používa na minimalizáciu cieľovej funkcie \(f(x)\) pomocou aktualizácie parametrov podľa vzorca \(\eqref{eq:update}\).
V jednoduchom príklade s kvadratickou funkciou \(\eqref{eq:example}\), kde je jej gradient \(\eqref{eq:gradient_example}\), môžeme vidieť aplikáciu gradientného zostupu.
Týmto spôsobom vzorce sú priamo integrované do textu a môžu byť
odkazované pomocou \eqref, čo zjednodušuje navigáciu a
čitateľnosť dokumentu. (2)
Najskôr definujeme cieľovú funkciu a jej gradient:
library(ggplot2)
# Definícia cieľovej funkcie
objective_function <- function(x) {
return(x^2 + 4*x + 4)
}
# Definícia gradientu
gradient <- function(x) {
return(2*x + 4)
}
Počiatočné podmienky sú:
x = 10learning_rate = 0.1tolerance = 1e-6max_iter = 1000# Počiatočné podmienky
x <- 10
learning_rate <- 0.1
tolerance <- 1e-6
max_iter <- 1000
# Iterácie gradientného zostupu
for (i in 1:max_iter) {
x_new <- x - learning_rate * gradient(x)
if (abs(x_new - x) < tolerance) {
break
}
x <- x_new
}
cat("Minimum funkcie sa nachádza v bode:", x, "\n")
## Minimum funkcie sa nachádza v bode: -1.999995
# Vytvorenie grafu cieľovej funkcie
x_vals <- seq(-10, 10, 0.1)
y_vals <- sapply(x_vals, objective_function)
data <- data.frame(x = x_vals, y = y_vals)
ggplot(data, aes(x = x, y = y)) +
geom_line() +
geom_point(aes(x = x, y = objective_function(x)), color = "red") +
labs(title = 'Optimalizácia funkcie metódou gradientného zostupu',
x = 'x',
y = 'f(x)') +
theme_minimal()
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:
# Definícia cieľovej funkcie pre 3D
objective_function_3d <- function(x, y) {
return(x^2 + y^2)
}
# Gradient cieľovej funkcie pre 3D
gradient_3d <- function(x, y) {
return(c(2*x, 2*y))
}
# Počiatočné podmienky
x <- 10
y <- 10
learning_rate <- 0.1
tolerance <- 1e-6
max_iter <- 1000
# Iterácie gradientného zostupu pre 3D
for (i in 1:max_iter) {
grad <- gradient_3d(x, y)
x_new <- x - learning_rate * grad[1]
y_new <- y - learning_rate * grad[2]
if (sqrt((x_new - x)^2 + (y_new - y)^2) < tolerance) {
break
}
x <- x_new
y <- y_new
}
cat("Minimum funkcie sa nachádza v bode: (", x, ",", y, ")\n")
## Minimum funkcie sa nachádza v bode: ( 3.213876e-06 , 3.213876e-06 )
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\).
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
(%>%). (1)
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)
}
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\).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í.
Vizualizujeme priebeh gradientného zostupu na povrchu 3D funkcie, aby sme mohli sledovať cestu algoritmu k minimu.
# Načítanie balíkov
library(plotly)
library(magrittr) # Načítanie magrittr pre pipe operator
# Definícia funkcie
objective_function_3d <- function(x, y) {
return(x^2 + y^2)
}
# 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)
# Vytvorenie 3D grafu
plot_ly(x = ~x_vals, y = ~y_vals, z = ~z_vals) %>%
add_surface() %>%
layout(title = '3D Kvadratická Funkcia',
scene = list(xaxis = list(title = 'x'),
yaxis = list(title = 'y'),
zaxis = list(title = 'f(x, y)')))
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. (3)
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)} \]
# Generovanie údajov
set.seed(123)
m <- 100
x <- rnorm(m)
y <- 2 * x + 3 + rnorm(m, sd = 0.5)
# Inicializácia parametrov
theta0 <- 0
theta1 <- 0
learning_rate <- 0.01
num_iters <- 1000
# Gradientný zostup
for (i in 1:num_iters) {
y_pred <- theta0 + theta1 * x
error <- y_pred - y
theta0 <- theta0 - learning_rate * (1/m) * sum(error)
theta1 <- theta1 - learning_rate * (1/m) * sum(error * x)
}
cat("Optimalizované parametre: theta0 =", theta0, ", theta1 =", theta1, "\n")
## Optimalizované parametre: theta0 = 2.948593 , theta1 = 1.973525
# Vizualizácia lineárnej regresie
data <- data.frame(x = x, y = y)
ggplot(data, aes(x = x, y = y)) +
geom_point() +
geom_abline(intercept = theta0, slope = theta1, color = "blue") +
labs(title = 'Lineárna regresia metódou gradientného zostupu',
x = 'x',
y = 'y') +
theme_minimal()
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í.