Skip to content
This repository has been archived by the owner on Jun 4, 2024. It is now read-only.

Commit

Permalink
docs: chain rule
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrej-salat committed Mar 26, 2024
1 parent 23b1d4d commit 566e2e8
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 5 deletions.
Binary file added docs/images/delta.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions docs/literature.bib
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,14 @@ @online{backpropagation
@onlice{bias_a_neuron,
title = {Bias a neuron, obrázek},
url = {http://neuralnetworksanddeeplearning.com/images/tikz17.png},
},
@online{delta,
title = {Řetězové pravidlo, obrázek},
url = {https://youtu.be/tIeHLnjs5U8?si=IN_ja7N9fvgSU_PO&t=232},
},
@online{chain_rule,
title = {Řetězové pravidlo},
url = {https://en.wikipedia.org/wiki/Chain_rule},
}
6 changes: 3 additions & 3 deletions docs/sections/implementace.tex
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ \subsection{Vytváření a načítání neuronové sítě}
Hodnoty v jednotlivých polích reprezentují hodnotu biasu konkrétního neuronu. Hodnoty jsou také typu long double.

Poslední pole reprezentující samotnou neuronovou síť je trojrozměrné pole \(weight\). Velikost pole je rovno počtu vrstev mínus jedna.
První (nultý) prvek tj. \(weight[0]\) reprezentuje dvojrozměrné pole, které reprezentuje váhy spojující vstupní neuroný s neurony druhé vrstvy.
První (nultý) prvek tj. \(weight[0]\) reprezentuje dvojrozměrné pole, které reprezentuje váhy spojující vstupní neurony s neurony druhé vrstvy.
Pole \(weight[0][0]\) je pole hodnot jednotlivých vah, které míří do prvních (nultého) neuronu druhé vrstvy. Váhy jsou také typu long double.

Při vytváření nové neuronové sítě se v konstruktoru vytvoří zmiňovaná pole o velikostech, které odpovídají zadaným parametrům.
Expand Down Expand Up @@ -61,7 +61,7 @@ \subsection{Spouštění programu}

\item Vytvoří novou neuronovou síť podle požadavků a síť natrénuje stejným způsobem jako v předešlém bodě.
\begin{lstlisting}[language=bash, backgroundcolor=\color{backcolor}]
$ ./digitor -t -n <neurony> <iterace> <rychlost_uceni> <aktivace>
<počet_dávek> <počet_dat>
$ ./digitor -t -n <neurony> <iterace> <rychlost_uceni>
<aktivace> <pocet_davek> <pocet_dat>
\end{lstlisting}
\end{itemize}
29 changes: 27 additions & 2 deletions docs/sections/strojoveuceni.tex
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,12 @@ \subsection{Zpětné počítání chyby}
\subsection{Počítání chyby a aktualizace vah a biasů}
Celková chyba sítě se označuje velkým písmenem \(C\). Při zpětné úpravě vah a biasů nás zajímá jaká je derivace chyby vůči každé váze \(\frac{\delta C}{\delta w}\) a biasu \(\frac{\delta C}{\delta b}\).
V moment, kdy budeme znát tento vztah, tak víme jakým směrem upravit váhu nebo bias, abychom snížili celkovou chybu sítě.
Celkovou chybu sítě pro jeden konkrétní trénovací příklad se spočítá jako součet očekávaný výsledek všech neuronů ve výstupní vrstvě mínus jejich realný výsledek \(C_0 = \sum (target_i - output_i)^2 \).
Tím pádem celková chyba pro všechny trénovací data je \(C = \frac{1}{n}\sum (target_i - output_i)^2 \).

Důležitá část pro pochopení vzorce algoritmu zpětné počítání chyby je notace zápisu neuronové sítě.
Proto je potřeba nejprve definovat zápis a až dále se budu věnovat samotným vzorcům a vztahům při počítání zpětné počítání chyby.

Pro po popsání váhy budem zapisovat jako \(w_{jk}^l\), kde \(l\) je číslo vrstvy, \(j\) je označení,
do kterého neuronu v \(l\)-té vrstvě váha směřuje a číslo \(k\) označuje z kolikátého neuronu z vrstvy \((l-1)\) váha vychází.

Expand All @@ -31,14 +34,36 @@ \subsection{Počítání chyby a aktualizace vah a biasů}
\caption{Příklad zápisu váhy}\cite{vaha_v_siti}
\end{figure}

Podobná notace se použije také při popisu biasu, neaktivované a neaktivované hodnoty neuronu.
Podobná notace se použije také při popisu biasu, neaktivované a aktivované hodnoty neuronu.
Bias neuronu se zapíše jako \(b_{j}^l\), kde \(l\) je vrstva neuronu a \(j\) je \(j\)-tý neuron v \(l\)-té vrstvě.
Hodnota neuronu před aktivací je označí písmenem \(z_{j}^{l} = \left( \sum (w^{l}_{jk} a^{l-1}_k) + b^l_j \right)\).
Hodnota aktivovaného neuronu ze zapíše jako \(a_j^l = \sigma(z_j^l)\).
Hodnota \(z_j^l\) je tedy součet součinů neunonů z předešlé vrsty a příslušných vah.
Hodnota aktivovaného neuronu ze zapíše jako \(a_j^l = f(z_j^l)\), kde funkce \(f(x)\) je nějaké aktivační funkce,
jako například funkce sigmoid \(\sigma(x)\).

\begin{figure}[h]
\centering
\includegraphics[width=0.4\textwidth]{images/bias_a_neuron.png}
\caption{Příklad zápisu biasu, aktivace a neaktivace neuronu} \cite{bias_a_neuron}
\end{figure}

Pokud máme upřesněnu notaci, můžeme se posunout k samotnému algoritmu počítání chyby.
Základem, jak už bylo zmíněno, je poměr \(\frac{\delta C}{\delta w}\). Tento vztah je pro výpočet klíčový.
Tento vztah nám vpodstatě říká, jak se změní celková chyba při změně \(w\).

\begin{figure}[h]
\centering
\includegraphics[width=0.4\textwidth]{images/delta.png}
\caption{Změny} \cite{delta}
\end{figure}

Nejprve si ukážeme pro jednoduchost jak funguje učení neuronové sítě pouze s jedním neuronem na vrstvu. Jak je z obrázku vidět, že když změníme hodnotu \(w^{(L)}\), tak to ovlivní hodnotu \(z^{(L)})\) a to zas nějak ovlivní \(a^{(L)}\) a to pak přímo ovlivní \(C_0\).
Existuje tedy pravidlo, řetězové pravidlo\cite{chain_rule}, které říká, že \(\frac{\delta C_0}{\delta w^{(L)}} = \frac{\delta z^{(L)})}{\delta w^{(L)}}\frac{\delta a^{(L)}}{\delta z^{(L)}}\frac{\delta C_0}{\delta a^{(L)}}\).
Toto pravidlo tedy říká, že pokud nějaký prvek nepřímo ovlivňuje poslední prvek, tak se ta změna rovná součinu změně přímo po sobě jdoucích členů.

Jakmile máme tento vztah, je potřeba spočítat derivaci čitatele vůči jmenovateli.

Protože \(C_0 = (a^{(L)} - y)^2\), tak potom bude derivace \(\frac{\delta C_0}{\delta a^{(L)})}= 2(a^{(L)} - y)\).
Parcialní derivace \(\frac{\delta a^{(L)}}{\delta z^{(L)}} = activation'(z^{(L)}) \).
Nakonec parcialní derivace \(\frac{\delta z^{(L)}}{\delta w^{(L)}} = a^{(L-1)})\).
Z toho vyplývá, že \(\frac{\delta C_0}{\delta w^{(L)}} = a^{(L-1)} activation'(z^{(L)}) (a^{(L)} - y)^2\)

0 comments on commit 566e2e8

Please sign in to comment.