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

Commit

Permalink
docs: upravy
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrej-salat committed Mar 29, 2024
1 parent 3985c7f commit fa226f5
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 31 deletions.
6 changes: 3 additions & 3 deletions docs/sections/implementace.tex
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
\section{Implementace v programu}
Program slouží k vytváření a trénování neuronových sítí podle vstupních parametrů.
Samotný program se dá spustit s přepínači, které určují chování programu.
Program je schopen na požadavek buď, vytvořit novou síť podle vstupních parametrů, nebo načíst existující síť ze souboru JSON.
Program je schopen na požadavek buď vytvořit novou síť podle vstupních parametrů, nebo načíst existující síť ze souboru JSON.
S takto vytvořenou neuronovou sítí je program dále schopen pracovat dvěma způsoby.
Neuronovou síť může trénovat nebo jí jen načte a čeká na vstupní data, která neuronová síť zpracuje a vrátí výsledek.

Expand Down Expand Up @@ -49,7 +49,7 @@ \subsection{Trénování neuronové sítě}
Metoda v průběhu počítá průměrnou chybu pro vstupní data, kterou vypisuje na standardní výstup společně s progresem trénování (procento vykonaných iterací).

Metoda \(backpropagate\) funguje na principu popsaném v kapitole \ref{strojove_uceni} strojové učení. Funkce je rozdělena do dvou částí.
První část spočíta chybu pro nejposlednější vrstvu, která se počítá jednodušeji, protože neurony ovlivňují chybu pouze jednou cestou.
První část spočíta chybu pro poslední vrstvu, která se počítá jednodušeji, protože neurony ovlivňují chybu pouze jednou cestou.
Druhá část naváže na první a počítá zpětně chybu pro zbytek vrstev. Pro výpočty jsou použity vzorce z kapitoly \ref{strojove_uceni} o strojovém učení.

\subsection{Spouštění programu}
Expand All @@ -64,7 +64,7 @@ \subsection{Spouštění programu}

\item Vytvoří neuronovou síť podle zadaných parametrů.
Formát pro zadání neuronů je vždy počet neuronů pro každou vrstvu, který je oddělen čárkou.
Př. "10,2,2,10", tato síť by měla čtyři vrstvy z čehož vstupní i výstupní by měla 10 neuronů a obě skryté by měly 2 neurony.
Př. "10,2,2,10", tato síť by měla čtyři vrstvy, z čehož vstupní i výstupní by měla 10 neuronů a obě skryté by měly 2 neurony.
\begin{lstlisting}[language=bash, backgroundcolor=\color{backcolor}]
$ ./digitor -n <neurony> <aktivace>
\end{lstlisting}
Expand Down
6 changes: 3 additions & 3 deletions docs/sections/neuronovasit.tex
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ \section{Neuronová síť}

Mezi hlavní výhody neuronových sítí patří schopnost učit se z dat a adaptovat se novým informacím.
Neuronové sítě dokáží řešit komplexní úlohy, které jsou extrémně náročné pro běžné algoritmy.
Tyto sítě jsou také vhodné pro práci s velými objemi dat.
Tyto sítě jsou také vhodné pro práci s velkými objemi dat.

\subsection{Fungování neuronových sítí}
Neuronová síť načte vstup a postupně se počítají hodnoty neuronů po vrstvách.
Až hodnoty projdou celou sítí nakonec, ve výstupní vrstvě je výsledek.
Po průchodu hodnot celou sítí bude ve výstupní vrstvě výsledek.

Hodnota konkrétního neuronu se spočítá z jeho vstupů. Každý neuron, až na vstupní vrstvu, má vstupní neurony.
Jeho hodnota se vypočíta ta, že se sečte hodnota všech jeho vstupních neuronů vynásobena spojujícími vahami každého neuronu.
Jeho hodnota se vypočíta tak, že se sečte hodnota všech jeho vstupních neuronů vynásobena spojujícími vahami každého neuronu.
Dále se přičte bias daného neuronu, který slouží jako práh aktivace. Nakonec se použije aktivační funkce.
Aktivačních funkcí je řada.
Mezi nejběžnější patří:
Expand Down
18 changes: 9 additions & 9 deletions docs/sections/strojoveuceni.tex
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,24 @@ \section{Strojové učení} \label{strojove_uceni}
Strojové učení je nedílnou součástí celé kapitoly neuronových sítí. Strojové učení se umožňuje sítím se učit ze známých dat.
Díky strojovému učení je možné řešit problémy, které byly do objevení těchto učících technik neřešitelné.
Existuje několik způsobů učení, ale v této práci bylo použito takzvané učení s učitelem.
To znamená, že všechny data, ze kterých se síť učí jsou předkládána síti se správným výsledkem.
Existují však metody bez učitele, které se dokáží učit i z nepopsaných dat.
To znamená, že všechna data, ze kterých se síť učí, jsou předkládána síti se správným výsledkem.
Existují však metody bez učitele, které dokáží síť učit i z nepopsaných dat.

Princip storjového učení je,že síť dostane data se správnými výsledky a síť si na základě těchto dat poupraví svoje hodnoty vah a biasů tak,
Princip storjového učení je, že síť dostane data se správnými výsledky a na základě těchto dat si poupraví svoje hodnoty vah a biasů tak,
aby při načtení těchto dat odpověděla příště správně.

\subsection{Zpětné počítání chyby}
Zpětné počítání chyby\cite{backpropagation}, neboli backpropagation, je algoritmus pro hluboké učení neuronových sítí.
Tento algoritmus funguje tak, že se šíří chyba výstupu zpátky do neuronové sítě a podle chyby upravuje postupně váhy a biasy.

Tento algoritmus se skládá ze 4 kroků. Nejprve se musí vyhodnotit chyba. To znamená, že se konkrétní dat nechají vyhodnotit sítí a spočítá se chyba.
Tento algoritmus se skládá ze 4 kroků. Nejprve se musí vyhodnotit chyba. To znamená, že se konkrétní data nechají vyhodnotit sítí a spočítá se chyba.
Chyba je v tomto případě rozdíl od očekávaného výsledku. Dále se chyba šíří zpět do sítě a počítá se derivace chyby vzhledem ke konkrétním vahám a biasům.
Na základě této derivace se váhy a biasy aktualizují. Tato aktualizace pomáhá zmírňovat celkovou chybu výsledku. Nakonec se tento proces pro všechny trénovací data opakuje.

\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 \).
Celková chyba 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ě.
Expand All @@ -37,7 +37,7 @@ \subsection{Počítání chyby a aktualizace vah a biasů}
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} \cdot a^{l-1}_k) + b^l_j \right)\).
Hodnota \(z_j^l\) je tedy součet součinů neunonů z předešlé vrsty a příslušných vah.
Hodnota \(z_j^l\) je tedy součet součinů neuronů 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)\).

Expand All @@ -49,15 +49,15 @@ \subsection{Počítání chyby a aktualizace vah a biasů}

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\).
Tento vztah nám v podstatě říká, jak se změní celková chyba při změně \(w\).

\begin{figure}[h]
\centering
\includegraphics[width=0.35\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\).
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, 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)}} \cdot \frac{\delta a^{(L)}}{\delta z^{(L)}} \cdot \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ů.

Expand All @@ -80,4 +80,4 @@ \subsection{Počítání chyby a aktualizace vah a biasů}
Z toho vyplývá, že \(\frac{\delta C_0}{\delta a_j^{(L-2)}} = \sum_{j=1}^{n_L} \frac{\delta C_0}{\delta a_j^{(L-1)}} \) a \(\frac{\delta C_0}{\delta a_j^{(L)}} = \sum_{j=1}^{n_L} 2(a_j^{(L) - y_j})\).

To samé platí i pro výpočet chyby vůči biasu. Tím pádem vzorec pro zůstane stejný a jen s tou změnou, že \(\frac{\delta C_0}{\delta a_j^{(L-2)}} = \sum_{j=1}^{n_L} \frac{\delta C_0}{\delta a_j^{(L-1)}} \).
V tuto chvíli už dokážeme spočítat chybu vůči všem vahám i biasům v síti, a tudíž upravovat jejich hodnoty k lepším.
V tuto chvíli už dokážeme spočítat chybu vůči všem vahám i biasům v síti, a tudíž upravovat jejich hodnoty k lepšímu.
12 changes: 6 additions & 6 deletions docs/sections/uvod.tex
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,18 @@ \subsection{Výběr tématu}
Zárověn bych na toto téma rád navázal při studiu na vyskoké škole.

\subsection{Použité technologie}
Hlavní část tohoto projektu byla naprogramována v jazyce C++.
Hlavní část tohoto projektu jsem naprogramoval v jazyce C++.
Jazyk jsem vybral z důvodu, že je velice rychlý a to za cenu, že uživatelský komfort je horší než například při použití Pythonu.
Jak už bylo zmíněno, pro tento projekt byla nejdůležitější rychlost, a proto jsem vybíral mezi jazykem C a C++.
Jak už jsem zmiňoval, pro tento projekt byla nejdůležitější rychlost, a proto jsem vybíral mezi jazykem C a C++.
Nakonec jsem zvolil C++ z důvodu, že i přes svoji rychlost a relativně velkou kontrolou je objektově orientován a obecně uživatelsky přívětivější.
Konkrétně byla použita verze C++23.
Konkrétně jsem použil verzi C++23.

Dále byl použit nástroj CMake, který slouží k buildění C++ kódu.
Dále jsem použil nástroj CMake, který slouží k buildování C++ kódu.
CMake umožňuje zjednodušení celého buildovacího procesu a dokáže zajistit přenositelnost.

Pro práci s formátem JSON byla použita C++ knihovna `nlohmann/json`\cite{json}.
Pro práci s formátem JSON jsem použil C++ knihovnu `nlohmann/json`\cite{json}.
Knihovna zjednodušuje práci s formátem JSON, který je v tomto projektu využit pro ukládání natrénovaných modelů.

Při práci s obrázky byl použit jazyk Python. V tomto jazyce byly napsány různé scripty,
Při práci s obrázky jsem použil jazyk Python. V tomto jazyce jsem napsal různé scripty,
které dokáží načíst obrázky ze souboru a převést je do formátu, se kterým dokáže neuronová síť dále pracovat.

4 changes: 2 additions & 2 deletions docs/sections/zaver.tex
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
\section{Závěr}
Při vytváření tohoto projektu jsem se ponořil do problematiky neuronových sítí a zjistil jsem na jakém principu funguje strojové učení pomocí zpětného počítaní chyby.
Tento projekt mi pomohl vytvořit si představu jak neuronové sítě fungují a k čemu vůbec mohou sloužit.
Při vytváření tohoto projektu jsem se ponořil do problematiky neuronových sítí a zjistil jsem, na jakém principu funguje strojové učení pomocí zpětného počítaní chyby.
Tento projekt mi pomohl vytvořit si představu, jak neuronové sítě fungují a k čemu vůbec mohou sloužit.

\subsection{Prostor pro zlepšení}
V budoucnu bych chtěl v programu implementovat parelelní výpočet pomocí CUDA. Díky tomu by se mohlo trénování sítí řádově urychlit.
Expand Down
16 changes: 8 additions & 8 deletions docs/sections/zkoumani.tex
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
\section{Zkoumání architektur}
Při vytváření sítě na rozpoznávání rukou napsaných číslic jsme narazil na problém, že nevím jak velkou sít na to mám použít.
Při hledání na internetu jsem zjistil, že vlastě není žádná perfektní síť, a že ideální velikost sítě vždy závisí na problému, který má řešit.
Při vytváření sítě na rozpoznávání rukou napsaných číslic jsem narazil na problém, že nevím, jak velkou sít mám použít.
Při hledání na internetu jsem zjistil, že vlastě neexistuje žádná perfektní síť, a že ideální velikost sítě vždy závisí na problému, který má řešit.
Z toho důvodu jsem se rozhodl, že vytvořím malý výzkum na to, které síť má nejlepší výsledky.
Vytvořil jsem proto osm různých neuronových sítí, kterým jsem dal úplně stejný učící set a stejný počet iterací na natrénování.
Sítě měly vždy stejný počet vstupních a výstupních neuronů pouze se lišily v počtu skrytých vrstev a v počtu neuronů v těchto vrstvách.
Expand All @@ -15,14 +15,14 @@ \section{Zkoumání architektur}
\item 3 vrstvy po 56 neuronech
\item 3 vrstvy po 64 neuronech
\end{itemize}
Tyto konkrétní architektury byly zvoleny z důvodu, že se mi ještě před ukutečí tohoto zkoumání podařilo vytvořit model,
Tyto konkrétní architektury jsem zvolil z důvodu, že se mi ještě před uskutečněním tohoto zkoumání podařilo vytvořit model,
který měl 3 skryté vrstvy po 64 neuronech, a který dokázal rozpoznat obrázky s vysokou přesnotsí.
Proto mě napadlo zkusit kolik neuronů je potřeba, aby neuronová síť měla uspokujivé výsledky.
Zvolil jsme tedy neuronové sítě, které mají postupně nižsí počet neuronů a zkoumal jsem jaký to má vliv na výsledky.
Proto mě napadlo zkusit, kolik neuronů je potřeba, aby neuronová síť měla uspokujivé výsledky.
Zvolil jsme tedy neuronové sítě, které mají postupně nižsí počet neuronů a zkoumal jsem, jaký to má vliv na výsledky.

Vytvořil jsem tedy 8 těchto sítí a spustiol jsme trénování. Všechný sítě dostaly identická data a identický počet iterací.
Vytvořil jsem tedy 8 těchto sítí a spustil jsme trénování. Všechný sítě dostaly identická data a identický počet iterací.
Zárověň jsem měřil čas, za jak dlouho se síť s těmito parametry natrénuje. Sítě byly tedy na trénovány pomocí 10000 obrázků (1000 z od každé číslice).
Po ukončení trénování jsem sítě otestoval pomocí 27730 vyčleněných obrázků z databáze mnist, které sítě nikdy neviděli.
Po ukončení trénování jsem sítě otestoval pomocí 27730 vyčleněných obrázků z databáze mnist, které sítě nikdy neviděly.

\begin{center}
\begin{tabular}{||c c c||}
Expand All @@ -48,7 +48,7 @@ \section{Zkoumání architektur}
\end{tabular}
\end{center}

Z výsledků je zřejmé, že sítě s vyšším počtem neuronů mají v tomto případě lepší výsledky, ale trénování takových sítí trvá delší čas.
Z výsledků je zřejmé, že sítě s vyšším počtem neuronů mají v tomto případě lepší výsledky, ale trénování takových sítí trvá déle.
V tomto připadě jsem došel k závěru, že rozdíl mezi trénováním menších a větších sítí není tak markantní,
a tudíž se v tomto konkrétním připadě vyplatí použít sítě s většim počtem vrstev a neuronů.
Největší síť se dokázala vytrénovat v pozdějším trénování vytrénovat natolik, že dokázala poznat více než 98\% obrázků, které nikdy neviděla.

0 comments on commit fa226f5

Please sign in to comment.