Loading [MathJax]/jax/output/HTML-CSS/jax.js
Wersja demonstracyjna propagacji

Algorytm propagacji

Algorytm propagacji jest niezbędny do szybkiego trenowania dużych sieci neuronowych. Z tego artykułu dowiesz się, jak działa ten algorytm.

Przewiń w dół...

Prosta sieć neuronowa

Po prawej stronie zobaczysz sieć neuronową z 1 wejściem, 1 węzłem wyjściowym i 2 ukrytymi warstwami po 2 węzły.

Węzły w sąsiednich warstwach są połączone wagami wij, które są parametrami sieci.

Funkcja aktywacji

Każdy węzeł ma łączną łączną liczbę x, funkcję aktywacji f(x)i dane wyjściowe y=f(x). f(x) musi być funkcją nielinearną. W przeciwnym razie sieć neuronowa będzie mogła uczyć się tylko modele liniowe.

Częstą funkcją aktywacji jest funkcja Sigmoid: f(x)=11+ex.

Funkcja błędu

Ma to na celu automatyczne poznanie wag sieci na podstawie danych, aby przewidywane dane wyjściowe youtputbyły zbliżone do wartości docelowej ytarget w przypadku wszystkich danych wejściowych xinput.

Do określenia, jak daleko jesteśmy od celu, używamy funkcji błędu E. Typowa funkcja błędu to E(youtput,ytarget)=12(youtputytarget)2.

Przekaż dalej

Zaczniemy od przykładowego wprowadzenia (xinput,ytarget) i zaktualizowania warstwy wejściowej sieci.

Aby zachować spójność, dane wejściowe są uznawane za każdy inny węzeł, ale bez funkcji aktywacji, dlatego dane wyjściowe są takie same jak dane wejściowe, czyli y1=xinput.

Przekaż dalej

Teraz aktualizujemy pierwszą ukrytą warstwę. Sprawdzamy dane wyjściowe y węzłów z poprzedniej warstwy i używamy wag do obliczania ich danych wejściowych x w następnej warstwie.
xj=
iin(j)wijyi+bj

Przekaż dalej

Następnie aktualizujemy dane wyjściowe węzłów w pierwszej ukrytej warstwie. Do tego celu używamy funkcji aktywacji f(x).
y=f(x)

Przekaż dalej

Korzystając z tych 2 formuł, rozpowszechniamy resztę sieci i pobieramy jej ostateczne dane wyjściowe.
y=f(x)
xj=
iin(j)wijyi+bj

Pochodna błędu

Algorytm propagacji decyduje o tym, jak duża ma być aktualizacja każdej wagi sieci po porównaniu prognozowanej wartości wyjściowej z oczekiwanymi danymi wyjściowymi dla danego przykładu. W tym celu musimy obliczyć zmianę wagi w poszczególnych wagach. dEdwij
Gdy otrzymamy pochodne błędów, możemy zaktualizować wagi, korzystając z prostej reguły aktualizacji:
wij=wijαdEdwij
gdzie α jest stałą dodatnią, zwaną współczynnikiem nauczania, który musimy dostosować w empiryczny sposób.

[Uwaga] Reguła aktualizacji jest bardzo prosta: jeśli błąd zniknie, gdy waga wzrośnie (dEdwij<0), a następnie zwiększ wagę, a gdy wzrośnie, gdy waga wzrośnie (dEdwij>0), a potem zmniejsz wagę.

Dodatkowe pochodne

Aby ułatwić obliczenie funkcji dEdwij, dodatkowo przechowujemy też dla każdego 2 pochodnych węzłów, w zależności od tego, jak zmienia się błąd:
  • łączną liczbę węzłów dEdx i
  • dane wyjściowe węzła dEdy.

Propagacja wstecz

Zaczynamy propagować pochodne w błędach. Zgodnie z prognozą danych wyjściowych z danego przykładu możemy obliczyć, jak zmienia się błąd w tych danych wyjściowych. Ze względu na funkcję błędów E=12(youtputytarget)2 mamy:
Eyoutput=youtputytarget

Propagacja wstecz

Teraz dEdy możemy dEdx używać reguły łańcuchowej.
Ex=dydxEy=ddxf(x)Ey
gdzie ddxf(x)=f(x)(1f(x)) jeśli f(x) to funkcja aktywacji Sigmoid.

Propagacja wstecz

Gdy tylko uzyskamy pochodną błędu dotyczącego całkowitej wartości jego węzła, możemy uzyskać jego pochodną wagę względem tego węzła.
Ewij=xjwijExj=yiExj

Propagacja wstecz

Korzystając z reguły łańcucha, możemy też dEdy uzyskać dostęp do poprzedniej warstwy. Zrobiliśmy już koło
Eyi=jout(i)xjyiExj=jout(i)wijExj

Propagacja wstecz

Musisz tylko powtórzyć 3 poprzednie formuły, dopóki nie obliczymy wszystkich pochodnych błędów.

Koniec

1y1xinput2y2x2dE/dy2dE/dx2fw12dE/dw3y3x3dE/dy3dE/dx3fw13dE/dw4y4x4dE/dy4dE/dx4fw24dE/dww34dE/dw5y5x5dE/dy5dE/dx5fw25dE/dww35dE/dw6youtputx6dE/dy6dE/dx6fw46dE/dww56dE/dwEytarget
Przetwarzam...