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 Apr 1, 2024
1 parent 7744eea commit 73d312c
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 29 deletions.
5 changes: 5 additions & 0 deletions docs/literature.bib
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,9 @@ @online{delta
@online{chain_rule,
title = {Řetězové pravidlo},
url = {https://en.wikipedia.org/wiki/Chain_rule},
},
@online{mnist,
title = {Databáze MNIST},
url = {https://yann.lecun.com/exdb/mnist},
}
12 changes: 6 additions & 6 deletions docs/sections/implementace.tex
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ \subsection{Vytváření a načítání neuronové sítě}
Pole \(neuron\) má dva rozměry tzn. pole v poli.
První (nulté) pole v \(neuron\) reprezentuje první vrstvu neuronů (vstupní) vrstvu.
Naopak poslední prvek pole \(neuron\) reprezentuje poslední (výstupní) vrstvu.
Počet skrytých vrstev v neuronové síti se tedy rovná \((neuron.size() - 2)\).
Počet skrytých vrstev v neuronové síti se tedy rovná \(neuron.size() - 2\).
Každé toto pole uložené v \(neuron\) obsahuje \(n\) hodnot, které reprezentují hodnoty konkrétních neuronů. Hodnoty jsou typu long double.

Dále je potřeba pole \(rawNeuron\), které je uplně stejné jako pole \(neuron\), ale jsou do něj ukládány neaktivované hodnoty neuronů.
Dále je potřeba pole \(rawNeuron\), které je úplně stejné jako pole \(neuron\), ale jsou do něj ukládány neaktivované hodnoty neuronů.

Další pole \(bias\) má také dva rozměry a jeho velikost je identická jako velikost pole \(neuron\).
Hodnoty v jednotlivých polích reprezentují hodnotu biasu konkrétního neuronu. Hodnoty jsou také typu long double.
Expand All @@ -26,7 +26,7 @@ \subsection{Vytváření a načítání neuronové sítě}
Při vytváření nové neuronové sítě se v konstruktoru vytvoří zmiňovaná pole o velikostech, které odpovídají zadaným parametrům.
Hodnoty vah a biasů se incializují s náhodnou hodnotou. Dále se celá neuronová síť serializuje do souboru JSON, který se následně uloží.
V názvu souboru je obsažen počet vrstev sítě navíc s náhodným číslem, které se pokusí zabránit kolizi na disku.
Soubor obsahuje všechny potrebné data pro pozdější načtení neuronové sítě.
Soubor obsahuje všechna potřebná data pro pozdější načtení neuronové sítě.
To znamená velikost, aktivační funkce neuronů, hodnoty vah a hodnoty biasů.

Pokud program pouze načítá neuronovou síť z již existujícího souboru, konstruktor pouze očekává název souboru.
Expand All @@ -36,19 +36,19 @@ \subsection{Trénování neuronové sítě}
Jak už bylo zmíněno v kapitole o strojovém učení, proces učení neuronové sítě se skládá ze čtyř částí. Tedy průchod dat sítí a vyhodnocení chyby,
zpětné počítání chyby, aktualizace vah a biasů a nakonec se vše zopakuje. Průchod dat sítí neboli přímý průchod je vyřešen jako tři vnořené \(for\) cykly.
Hodnota každého neuronu se vypočítá podle vzorce na výpočet hodnoty neuronu, a tudíž \(z_{j}^{l} = \left( \sum (w^{l}_{jk} \cdot a^{l-1}_k) + b^l_j \right)\).
Z důvodu, že při zpětném počítání chybe je potřeba aktivovaný i neaktivovaný neuron, tak se do paměti uloží obě hodnoty (do pole \(neuron\) a \(rawNeuron\)).
Z důvodu, že při zpětném počítání chyb je potřeba aktivovaný i neaktivovaný neuron, tak se do paměti uloží obě hodnoty (do pole \(neuron\) a \(rawNeuron\)).
Pro samotné učení je v programu metoda \(train\), která všechny tyto kroky provede.

Při volání metody \(train\), funkce očekává dvojrozměrné pole typy \(TrainData\), které obsahuje vstupní hodnoty a správný výsledek průchodu,
počet trénovacích cyklů (iterací) a jako poslední parametru očekává tzv. rychlost učení (learning rate).
Learning rate určuje míru změny při aktualizaci vah a biasů. Hodnota rychlosti učení se běžně pohubuje v rozmezí od 0.1 do 0.0001.
Pole \(TrainData\) je dvojrozměrné z důvodu, že data jsou rozdělena do tzv. seté, které zajišťují rychlejší a univerzálnější učení.
Tím pádem metoda \(train\) funguje tak, že zavolá metodu \(backpropagate\) na všechny členy setu.
Aktualizované hodnoty vah a bíasů se ukládají do externího pola a skutečné váhy a biasy neuronové sítě se aktualizují až po dokončení.
Aktualizované hodnoty vah a bíasů se ukládají do externího pole a skutečné váhy a biasy neuronové sítě se aktualizují až po dokončení.
Takto se postupně trénuje síť pomocí všech setů dat. Následně se celý tento proces opakuje podle počtu iterací.
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í.
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 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í.

Expand Down
8 changes: 4 additions & 4 deletions docs/sections/neuronovasit.tex
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
\section{Neuronová síť}
Neuronová síť je výpočetní model, který je inspirován fungováním lidského mozku.
Neuronová sít se skláda z tzv. umělých neuronů a váh.
Neuronová sít se skládá z tzv. umělých neuronů a vah.
Neurony jsou propojeny váhami mezi vrstvami.

Struktura neuronové sítě:
Expand All @@ -12,7 +12,7 @@ \section{Neuronová síť}

Počty neuronů v každé vrstvě závisí na konkrétním využití a na problému, který má neuronová síť řešit.

Každý neuron představuje jednoduchý výpočetní prvek, který zpravová vstupy a generuje výstup.
Každý neuron představuje jednoduchý výpočetní prvek, který zpracovává vstupy a generuje výstup.
Vstupy a výstupy jsou spojeny váhami, které ovlivňují hodnoty neuronů, ze kterých váha vede.
Dále má každý neuron svůj bias, který ovlivňuje jeho hodnotu.

Expand All @@ -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 velkými objemi dat.
Tyto sítě jsou také vhodné pro práci s velkými objemy dat.

\subsection{Fungování neuronových sítí}
Neuronová síť načte vstup a postupně se počítají hodnoty neuronů po vrstvách.
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 tak, ž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čítá 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
12 changes: 6 additions & 6 deletions docs/sections/strojoveuceni.tex
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
\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.
Strojové učení je nedílnou součástí celé kapitoly neuronových sítí. Strojové učení 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šechna data, ze kterých se síť učí, jsou předkládána síti se správným výsledkem.
Expand All @@ -22,10 +22,10 @@ \subsection{Počítání chyby a aktualizace vah a biasů}
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ě.
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.
Důležitá část pro pochopení vzorce algoritmu zpětného 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 zpětném 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í,
Pro 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í.

\begin{figure}[h]
Expand Down Expand Up @@ -76,9 +76,9 @@ \subsection{Počítání chyby a aktualizace vah a biasů}
Jakmile máme odvozený vztah pro \(\frac{\delta C_0}{\delta w^{(L)}}\), můžeme odvodit pravidlo rozšířit, aby fungovalo obevně pro všechny neuronové sítě.
Tím pádem nás zajímá \(\frac{\delta C_0}{\delta w_{jk}^{(L)}}\). Prvním rozdílem je, že \(C_0 = \sum_{j=1}^{n_L}(a_j^{(L)} - y_j)^2 \).
Druhým rozdílem je, že \(\frac{\delta C_0}{\delta a_j^{(L-1)}}\) se bude počítat trochu složitěji. Protože neuron \(n_j^{(L-1)}\) ovlivňuje chybu skrz několik cest.
Tím pádem \(\frac{\delta C_0}{\delta a_j^{(L-1)}} = \sum_{j=1}^{n_L} \frac{\delta z_j^{(L)}}{\delta a_k^{(L-1)}} \cdot \frac{\delta a_j^{(L)}}{\delta z_j^{(L)}} \cdot \frac{\delta C_0}{\delta a_j^(L)}\)
Tím pádem \(\frac{\delta C_0}{\delta a_j^{(L-1)}} = \sum_{j=1}^{n_L} \frac{\delta z_j^{(L)}}{\delta a_k^{(L-1)}} \cdot \frac{\delta a_j^{(L)}}{\delta z_j^{(L)}} \cdot \frac{\delta C_0}{\delta a_j^(L)}\).
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)}} \).
To samé platí i pro výpočet chyby vůči biasu. Tím pádem vzorec zůstane stejný, 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šímu.
\newpage
2 changes: 1 addition & 1 deletion docs/sections/uvod.tex
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
\section{Úvod}
Cílem maturitní práce je vytvořit neuronovou síť a naprogramovat k ní základní učící algoritmus bez použití knihoven pro strojové učení (jako TensorFlow, nebo PyTorch).
Záměrem je hlubší pochopení a prozkoumání různých implementací neuronových sítí.
Neuronová síť Digitor bude natrénována pro rozpoznávání rukou napsaných číslic [0-9].
Neuronová síť Digitor bude natrénována pro rozpoznávání rukou napsaných číslic [0-9]. Jako učící data jsem použil databázi MNIST\cite{mnist}.
Síť dostane na vstup čtvercový obrázek a výstupem bude číslice obsažena v obrázku.

\subsection{Výběr tématu}
Expand Down
6 changes: 3 additions & 3 deletions docs/sections/zaver.tex
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ \section{Závěr}

\subsection{Prostor pro zlepšení}
Při trénování modelu by se měla použít metoda špatných dat. To znamená, že se při trénování dávají modelu nejen správná data,
které se model má naučit, ale i chybná data, která má síť vyhodnodit jako chybná. Tím se zabrání tomu, že model vyhodnotí úplně špatná data jako správná.
která se model má naučit, ale i chybná data, která má síť vyhodnodit jako chybná. Tím se zabrání tomu, že model vyhodnotí úplně špatná data jako správná.
To jsem při trénování hlavního modelu na rozpoznávání číslic nepoužil.
Zaprvé z důvodu, že jsem neměl přístup k vélkému objemu chybných dat, zadruhé proto, že o existenci této metody jsem se dozvěděl až po ukončení trénování modelu.
Zaprvé z důvodu, že jsem neměl přístup k velkému objemu chybných dat, zadruhé proto, že o existenci této metody jsem se dozvěděl až po ukončení trénování modelu.
Při trénování dalších modelů bych tuto metodu určitě implementoval.

V budoucnu bych také chtěl v programu implementovat parelelní výpočet pomocí CUDA. Díky tomu by se mohlo trénování sítí řádově urychlit.
Dále bych chtěl v budoucnu přidat možnost pro vytváření jiných typů neuronových sítí než jen plně propojených.
Dále bych chtěl v budoucnu přidat možnost pro vytváření jiných typů neuronových sítí, než jen plně propojených.
18 changes: 9 additions & 9 deletions docs/sections/zkoumani.tex
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
\section{Zkoumání architektur}
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.
Při hledání na internetu jsem zjistil, že vlastně 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ítě májí 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.
Použité architektury byly následovné:
Expand All @@ -16,13 +16,13 @@ \section{Zkoumání architektur}
\item 3 vrstvy po 64 neuronech
\end{itemize}
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.
který měl 3 skryté vrstvy po 64 neuronech, a který dokázal rozpoznat obrázky s vysokou přesností.
Proto mě napadlo zkusit, kolik neuronů je potřeba, aby neuronová síť měla uspokojivé 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 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ěly.
Vytvořil jsem tedy 8 těchto sítí a spustil jsme trénování. Všechny 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 natré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\cite{mnist}, které sítě nikdy neviděly.

\begin{center}
\begin{tabular}{||c c c||}
Expand All @@ -49,6 +49,6 @@ \section{Zkoumání architektur}
\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á 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ů.
V tomto případě 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ším 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 73d312c

Please sign in to comment.