ML Atlas

01 · Podstawy · 4 min czytania · Interaktywne · aktualizacja

Czym jest gradient i jak działa spadek gradientu w sieci neuronowej?

W skrócie

Gradient to wektor pochodnych straty po wagach, wskazujący kierunek jej najszybszego wzrostu. Spadek gradientu przesuwa wagi małymi krokami w przeciwną stronę.

Co to jest

Gradient funkcji straty to wektor złożony z pochodnych cząstkowych straty po każdej wadze: mówi, o ile zmieni się strata, gdy daną wagę lekko ruszyć. Wskazuje kierunek najszybszego wzrostu straty, więc uczenie robi krok w przeciwną stronę — to spadek gradientu (gradient descent).

Backpropagation to algorytm, który liczy ten gradient dla wszystkich wag sieci naraz. Metoda jest wspólna dla sieci neuronowych, regresji logistycznej i dużych modeli językowych; w boostingu drzew gradient straty wyznacza, co ma dopasować kolejne drzewo.

Intuicja: stoisz we mgle na zboczu i chcesz zejść do doliny. Nie widzisz dna, ale czujesz pod stopami, w którą stronę teren opada najbardziej. Robisz krok w tę stronę, znów sprawdzasz nachylenie, znów krok. Gradient to właśnie to „czucie nachylenia” — w milionach wymiarów naraz.

Mechanizm — dlaczego tak działa

Krok uczenia to w ← w − η∇L, gdzie η to długość kroku (learning rate). Z rozwinięcia Taylora pierwszego rzędu strata po kroku wynosi w przybliżeniu L(w) − η‖∇L‖². Ponieważ kwadrat normy jest nieujemny, dla dostatecznie małego kroku strata musi spaść. Gradient jest prostopadły do poziomic krajobrazu straty, czyli wskazuje najkrótszą drogę w dół na tym konkretnym zboczu.

Backpropagation to reguła łańcuchowa zastosowana od wyjścia do wejścia (tryb wsteczny różniczkowania automatycznego). Pochodna straty po wagach ostatniej warstwy jest prosta; pochodna po wagach wcześniejszej warstwy to pochodna po jej wyjściu pomnożona przez to, jak wyjście zależy od wag. Każdą pośrednią pochodną liczymy raz i przekazujemy w głąb. Dlatego koszt policzenia całego gradientu to około 2–3 przebiegi w przód, niezależnie od liczby wag — a nie jeden przebieg na wagę. Bez tej własności sieci z miliardami parametrów nie dałoby się trenować.

Konsekwencja w głębokich sieciach: gradient dla wag warstwy l to iloczyn jakobianów wszystkich warstw powyżej. Jeśli ich normy są mniejsze niż 1, gradient zanika z głębokością; jeśli większe — wybucha. Stąd znaczenie ReLU, dobrej inicjalizacji i połączeń residualnych.

Zastrzeżenie: gradient jest informacją lokalną. Mówi o zboczu w tym punkcie, nic o reszcie krajobrazu, więc spadek gradientu kończy w najbliższej dolinie i wymaga doboru długości kroku. W praktyce liczy się go na mini-batchu: to nieobciążony, ale szumny estymator pełnego gradientu. Szum pomaga uciekać z siodeł, lecz przy dnie powoduje zygzaki.

Na przykładzie

Zaimplementowałem w numpy zwykły (pełny) spadek gradientu dla regresji logistycznej na Breast Cancer Wisconsin: 426 guzów treningowych, 30 standaryzowanych cech, start z wag zerowych, η = 0,1 (podział 75/25, random_state=0). Gradient straty ma tu prostą postać: Xᵀ(p − y)/n.

Na starcie strata wynosi 0,693 (= ln 2, model nic nie wie), a norma gradientu 1,44. Po jednym kroku strata spada do 0,519, a trafność testowa skacze z 37% do 91%. Po 10 krokach strata to 0,235, po 100 — 0,097, po 1000 — 0,054, a trafność testowa dochodzi do 96,5%. Norma gradientu maleje przy tym z 1,44 do 0,0098: im bliżej dna, tym łagodniejsze zbocze i tym mniejsze kroki, choć η się nie zmienia. Sprawdziłem też gradient numerycznie (różnica skończona z krokiem 10⁻⁵): wzór analityczny i przybliżenie różnią się o mniej niż 10⁻¹¹.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: kulka staczająca się po powierzchni straty w stronę minimum; suwak zmienia punkt startu.

Dane: Breast Cancer Wisconsin (diagnostyka raka piersi)

W praktyce

  • PyTorch: loss.backward() liczy gradienty do pól .grad, optimizer.step() robi krok, optimizer.zero_grad() kasuje poprzednie — zapomnienie o zerowaniu to klasyczny błąd (gradienty się sumują).
  • scikit-learn: SGDClassifier, LogisticRegression(solver='saga'), MLPClassifier — wszystkie oparte na gradiencie; lbfgs używa też przybliżenia krzywizny.
  • XGBoost/LightGBM: „gradient boosting” — każde nowe drzewo dopasowuje ujemny gradient straty względem obecnych przewidywań (plus hesjan w XGBoost).
  • W LLM gradient liczy się na batchach po miliony tokenów; przycinanie normy gradientu (clip_grad_norm_, typowo do 1,0) chroni przed wybuchem.
  • Typowy błąd: trening na danych bez standaryzacji — kolumny o dużej skali dominują gradient i jeden learning rate nie pasuje do wszystkich wag.

Najczęstsze pytania

Czym jest gradient w prostych słowach?
To lista „czułości”: dla każdej wagi liczba mówiąca, czy strata rośnie, czy maleje, gdy tę wagę odrobinę zwiększyć, i jak szybko. Razem tworzą strzałkę pokazującą najbardziej stromy kierunek pod górę w krajobrazie straty.
Jak działa backpropagation krok po kroku?
Najpierw przebieg w przód: liczymy wyjścia każdej warstwy i stratę. Potem od końca: pochodna straty po wyjściu, po logitach, po wagach ostatniej warstwy, po wyjściu poprzedniej warstwy — każda pochodna to iloczyn poprzedniej i lokalnej pochodnej danej operacji (reguła łańcuchowa).
Dlaczego spadek gradientu idzie w kierunku przeciwnym do gradientu?
Gradient wskazuje kierunek najszybszego wzrostu funkcji. Chcemy stratę zmniejszyć, więc idziemy w stronę przeciwną: tam, lokalnie, funkcja maleje najszybciej. Przy małym kroku rozwinięcie Taylora gwarantuje spadek o około η‖∇L‖².

Źródła

  • Rumelhart, D., Hinton, G., Williams, R. (1986). "Learning representations by back-propagating errors". Nature 323, 533–536. doi:10.1038/323533a0
  • Goodfellow, Bengio, Courville (2016). Deep Learning, rozdz. 4.3 "Gradient-based optimization", 6.5 "Back-propagation and other differentiation algorithms". https://www.deeplearningbook.org/contents/mlp.html
  • Bishop (2006). Pattern Recognition and Machine Learning, rozdz. 5.2.4 "Gradient descent optimization", 5.3 "Error backpropagation".
  • Baydin, Pearlmutter, Radul, Siskind (2018). "Automatic differentiation in machine learning: a survey". JMLR 18(153). arXiv:1502.05767
  • Zhang i in. Dive into Deep Learning, rozdz. 5.3 "Forward propagation, backward propagation, and computational graphs". https://d2l.ai/chapter_multilayer-perceptrons/backprop.html

Zobacz też