encyklopedia.run.place

Algorytm wstecznej propagacji

Algorytm wstecznej propagacji (backpropagation) jest podstawową metodą uczenia sieci neuronowych w ramach uczenia nadzorowanego. Pozwala on na efektywne minimalizowanie funkcji kosztu poprzez obliczanie gradientu względem wag sieci przy użyciu techniki spadku gradientu. Algorytm ten stał się fundamentem nowoczesnego uczenia głębokiego i przyczynił się do rozwoju dziedzin takich jak rozpoznawanie obrazów, przetwarzanie języka naturalnego czy robotyka.

Historia

Początkowo idea korygowania wag w sieciach wielowarstwowych pojawiła się w pracach Dave'a Rumelharta, Geoffreya Hinton'a i Ronalda Williams'a, opublikowanej w 1986 roku. Wcześniej, w latach 1960‑1970, badania nad perceptronem nie umożliwiały uczenia wielowarstwowych ze względu na brak efektywnego sposobu obliczania gradientu. Publikacja „Learning representations by back‑propagating errors” zapoczątkowała erę sztucznej inteligencji, w której sieci neuronowe stały się praktycznym narzędziem rozwiązywania złożonych problemów.

Zasada działania

Algorytm składa się z dwóch podstawowych faz:

  1. Propagacja wprzód – sygnały wejściowe przechodzą przez kolejne warstwy sieci, a w każdej warstwie obliczana jest funkcja aktywacji (np. sigmoidalna, ReLU), co prowadzi do wyjścia sieci ŷ.
  2. Propagacja wsteczna – obliczany jest błąd między wyjściem ŷ a wartością prawdziwą y, po czym przy pomocy reguły łańcuchowej (reguła łańcucha w rachunku różniczkowym) wyznaczany jest gradient funkcji kosztu względem każdego parametru (wag i biasów). Gradient ten jest następnie używany do aktualizacji parametrów z krokiem uczenia η (eta).

Równania podstawowe

Niech z^{(l)} oznacza wektor wyjść po warstwie l, a^{(l)} – wektor po zastosowaniu funkcji aktywacji, W^{(l)} – macierz wag, a b^{(l)} – wektor biasów. Dla warstwy l:

z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)}
a^{(l)} = σ(z^{(l)})

Gdzie σ jest funkcją aktywacji. Błąd w warstwie wyjściowej (L) to:

δ^{(L)} = ∇_{a^{(L)}} C ⊙ σ'(z^{(L)})

Natomiast propagacja błędu wstecznej dla warstw ukrytych:

δ^{(l)} = (W^{(l+1)})^T δ^{(l+1)} ⊙ σ'(z^{(l)})

Aktualizacja parametrów:

W^{(l)} ← W^{(l)} - η · δ^{(l)} (a^{(l-1)})^T
b^{(l)} ← b^{(l)} - η · δ^{(l)}

Warianty i usprawnienia

  • Stochastyczny spadek gradientu (SGD) – aktualizacje po pojedynczych próbkach zamiast całego zestawu treningowego.
  • Momentum – dodaje inercję, co przyspiesza zbieżność.
  • Adam – adaptacyjne skalowanie współczynników uczenia.
  • Normalizacja wsadu (Batch Normalization) – redukuje problem zanikającego gradientu w głębokich sieciach.
  • Dropout – technika regularizacji zapobiegająca przeuczeniu.

Zastosowania

Algorytm wstecznej propagacji jest używany w praktycznie wszystkich współczesnych modelach głębokiego uczenia. Przykładowe obszary to:

Implementacja w popularnych bibliotekach

Większość bibliotek do uczenia maszynowego udostępnia gotowe funkcje wykonujące wsteczną propagację, m.in.:

  • TensorFlow – warstwa tf.keras.layers automatycznie oblicza gradienty.
  • PyTorch – dynamiczny system autograd, w którym funkcja loss.backward() uruchamia wsteczną propagację.
  • Keras – wysokopoziomowy interfejs do definiowania i trenowania modeli.

Ograniczenia

Mimo swojej popularności, algorytm ma pewne wady:

  • Może cierpieć na problem zanikającego gradientu w bardzo głębokich sieciach.
  • Wrażliwy na wybór hiperparametrów (np. współczynnik uczenia η, architektura).
  • Wymaga dużej liczby danych treningowych, aby uniknąć przeuczenia.

Przykładowy pseudokod

def backpropagation(network, X, y, η):
    # 1. Propagacja wprzód
    activations, zs = forward_pass(network, X)

    # 2. Obliczanie błędu w warstwie wyjściowej
    δ = cost_derivative(activations[-1], y) * activation_prime(zs[-1])

    # 3. Propagacja wsteczna
    for l in reversed(range(1, len(network.layers))):
        nabla_b[l] = δ
        nabla_w[l] = np.dot(δ, activations[l-1].transpose())
        if l > 1:
            δ = np.dot(network.weights[l].transpose(), δ) * activation_prime(zs[l-2])

    # 4. Aktualizacja wag i biasów
    for l in range(1, len(network.layers)):
        network.weights[l] -= η * nabla_w[l]
        network.biases[l]  -= η * nabla_b[l]

Patrzenie w przyszłość

Badania nad optymalizacją procesu wstecznej propagacji trwają nieustannie. Rozwijane są nowe techniki, m.in. optymalizacje drugiego rzędu, metody oparte na uczeniu wzmacniającym oraz algorytmy inspirowane biologią (np. uczenie Hebba), które mogą uzupełnić lub zastąpić klasyczną wsteczną propagację w wybranych zastosowaniach.

Źródła i literatura wewnętrzna