Wersja demonstracyjna propagacji
$$ \definecolor{input}{RGB}{66, 133, 244} \definecolor{output}{RGB}{219, 68, 55} \definecolor{dinput}{RGB}{244, 180, 0} \definecolor{doutput}{RGB}{15, 157, 88} \definecolor{dweight}{RGB}{102, 0, 255} $$

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 \(w_{ij}\), które są parametrami sieci.

Funkcja aktywacji

Każdy węzeł ma łączną łączną liczbę \(\color{input}x\), funkcję aktywacji \(f(\color{input}x\color{black})\)i dane wyjściowe \(\color{output}y\color{black}=f(\color{input}x\color{black})\). \(f(\color{input}x\color{black})\) 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(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\).

Funkcja błędu

Ma to na celu automatyczne poznanie wag sieci na podstawie danych, aby przewidywane dane wyjściowe \(\color{output}y_{output}\)były zbliżone do wartości docelowej \(\color{output}y_{target}\) w przypadku wszystkich danych wejściowych \(\color{input}x_{input}\).

Do określenia, jak daleko jesteśmy od celu, używamy funkcji błędu \(E\). Typowa funkcja błędu to \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \).

Przekaż dalej

Zaczniemy od przykładowego wprowadzenia \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) 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 \( \color{output}y_1 \color{black} = \color{input} x_{input} \).

Przekaż dalej

Teraz aktualizujemy pierwszą ukrytą warstwę. Sprawdzamy dane wyjściowe \(\color{output}y\) węzłów z poprzedniej warstwy i używamy wag do obliczania ich danych wejściowych \(\color{input}x\) w następnej warstwie.
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$

Przekaż dalej

Następnie aktualizujemy dane wyjściowe węzłów w pierwszej ukrytej warstwie. Do tego celu używamy funkcji aktywacji \( f(x) \).
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$

Przekaż dalej

Korzystając z tych 2 formuł, rozpowszechniamy resztę sieci i pobieramy jej ostateczne dane wyjściowe.
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$

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. \(\color{dweight}\frac{dE}{dw_{ij}}\)
Gdy otrzymamy pochodne błędów, możemy zaktualizować wagi, korzystając z prostej reguły aktualizacji:
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
gdzie \(\alpha\) 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 (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)), a następnie zwiększ wagę, a gdy wzrośnie, gdy waga wzrośnie (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\)), a potem zmniejsz wagę.

Dodatkowe pochodne

Aby ułatwić obliczenie funkcji \(\color{dweight}\frac{dE}{dw_{ij}}\), 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 \(\color{dinput}\frac{dE}{dx}\) i
  • dane wyjściowe węzła \(\color{doutput}\frac{dE}{dy}\).

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 = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) mamy:
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$

Propagacja wstecz

Teraz \(\color{doutput} \frac{dE}{dy}\) możemy \(\color{dinput}\frac{dE}{dx}\) używać reguły łańcuchowej.
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
gdzie \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) jeśli \(f(\color{input}x\color{black})\) 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.
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$

Propagacja wstecz

Korzystając z reguły łańcucha, możemy też \(\frac{dE}{dy}\) uzyskać dostęp do poprzedniej warstwy. Zrobiliśmy już koło
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$

Propagacja wstecz

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

Koniec

Przetwarzam...