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⁻¹¹.
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;lbfgsuż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