Skip to content
Snippets Groups Projects
Commit eb12e66f authored by Radek Puš's avatar Radek Puš
Browse files

Latex - completed neural network chapter

parent 20c8c171
No related branches found
No related tags found
No related merge requests found
No preview for this file type
......@@ -17,6 +17,7 @@
\usepackage{float}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{textgreek}
% \usepackage{amssymb} %additional math symbols
 
\usepackage{dirtree} %directory tree visualisation
......@@ -117,6 +118,9 @@ Na českém trhu je, co se týče předpovídání transakcí, velmi pravděpodo
\caption[Moje zdravé finance]{Moje zdravé finance - předpovídání transakcí České spořitelny}\label{fig:float}
\end{figure}
 
%TODO vytvořit - MLNET, první pokusy
\subsection{Obdobné sítě}
\section{Obohacení dat}
Pro obohacení dat by bylo možné využít teoreticky využít veřejně dostupnou databázi MFČR - ARES (Adminstrativní registr ekonomických subjektů)\cite{ARES_zip}. Bohužel data v ní nejsou ukládána jednotným způsobem. Je sice zadefinována základní struktura dokumentu\cite{ARES_struktura}, avšak data v ní nejsou nijak strukturována. Živnosti jsou zadaný naprosto nahodile a není využito žádného oficiálního klíče. Nedefinované hodnoty obsahují výrázay jako: "0", "null", "NULL", "prázdné", "nic", "není", "nedefinováno",... Jako nejlepší příklad záznamu v databázi by pak mohla dobře posloužit Komerční banka. Ta nemá dokonce definováno vůbec nic, až na popis, který obsahuje přibližně 1500 znaků. Lze tedy usoudit, že využití tohoto zdroje je téměř nemožné a pro obohacení se nehodí.
 
......@@ -196,14 +200,15 @@ Tímto způsobem je vytvořen tzv. úplný k-partitní graf.
\end{figure}
 
\subsubsection{Předvídání}
%TODO zkontrolovat číslo obrázku - je to opravdu 3.2???
%TODO BIAS
Při předvídání výsledku se do počáteční (vstupní) vrstvy vloží vstupy. Tato vrstva je pošle do vrstvy vnitřní. V této vnitřní vrstvě se v každém neuronu všechny vstupy vynásobí s korespondujícími váhami a následně se sečtou. Výsledné číslo projde přes nějakou formu aktivační funkce ("squashing function"), která sníží velikost hodnoty na číslo v intervalu \textless -1;1 \textgreater .
 
Vzhledem k náročnosti na pochopení výroku výše, je pro lepší ilustraci, přiložen obrázek č. 3.2. Na obrázku jsou znázorněny jednotlivé vstupy neuronu (kompletní sada vstupů vrstvy) pomocí značek X1 - X3. W1 - W3 označuje váhy, kterými se vstupy násobí. Váhy směřují do aktivační funkce, která udržuje hodnotu výstupu v daném intervalu. Y je označuje výstupní hodnotu.
Vzhledem k náročnosti na pochopení výroku výše, je pro lepší ilustraci, přiložen obrázek č. \ref{single-neuron}. Na obrázku jsou znázorněny jednotlivé vstupy neuronu (kompletní sada vstupů vrstvy) pomocí značek X1 - X3. W1 - W3 označuje váhy, kterými se vstupy násobí. Váhy směřují do aktivační funkce, která udržuje hodnotu výstupu v daném intervalu. Y je označuje výstupní hodnotu.
\begin{figure}[h]
\includegraphics[width=0.75\textwidth]{img/neural-network-single-neuron.png}
\centering
\caption[Průchod neuronem]{Průchod neuronem\cite{ANN_neuron}}
\label{single-neuron}
\end{figure}
 
Výstup jednotlivých neuronů vytváří sadu dalších vstupů pro další jednu vrstvu v pořadí. Tímto způsobem se postupně prochází veškeré vrstvy, až po vrstvu výstupní. Výstupní vrstva se liší od všech ostatních pouze tím, že obsahuje jeden neuron. Výstup toho neuronu lze uvažovat jako pravděpodobnost, na kolik je něco pravda či nikoli. V kontextu současné práce to znamená, jestli se daná transakce opakovala, či nikoli.
......@@ -224,10 +229,65 @@ Právě z toho to důvodu jsou v řešení uvažovány váhy i vstupy jako vekto
\href{https://numerics.mathdotnet.com/}{[Math.NET Numerics]}. Aktivační funkce je pouhá hyperbolická funkce tangens z integrované knihovny Math.Tangh()
 
\subsubsection{Učení}
Aby síť měla nějakou vypovídací hodnotu, musí se nejdříve naučit, co má předpovídat. Prvotní předpovědi jsou čistě náhodné. Děje se tak proto, že při inicializaci jsou váhy v jednotlivých neuronech čistě náhodné. Je tedy nutné provést korekci vah a tím síť učit. Tomuto procesu se říká zpětná propagace ("backpropagation"). Nutnou podmínkou pro takové učení je pak samozřejmě, že je známý korektní výstup pro daný vstup.
Korekce probíhá tak, že síť nejdříve vyhodnotí nějaký vstup. Poté ji je řečeno, jaký byl očekávaný výsledek. Na základě rozdílu očekávaného výsledku a skutečného výsledku se vyhodnotí chyba pro výstup. Ta se následně musí propagovat napříč celou sítí. Musí se ale také brát v úvahu, že ne každý neuron přispěl stejnou měrou k výsledné chybě. Je nutné najít přesnou chybu pro každý z neuronů.
K tomuto výpočtu se dá využít vzorec:
\begin{figure}[H]
\[ \gamma = error \cdot (1 - output^2) \]
\end{figure}
Přičemž \textit{error} je chyba neuronu, \textit{output} výstup neuronu po průchodu aktivační funkcí a \textit{\textgamma} by se dala pochopit jako chyba vstupu současného neuronu. Chybu jednotlivých vah lze najít vynásobením vstupů do neuronu (vektorem) a vypočítané, skalární, hodnoty \textgamma, díky čemuž vznikne nový vektor. Tento vektor už po té stačí jen přičíst ke korespondující váze, čímž dojde k její opravě.
Je však stále třeba zjistit chybu každého celého neuronu ve vnitřní vrstvě, aby bylo možné využít výše zmíněný vzorec. Ve výstupní vrstvě je toho dosaženo, již zmíněným odečtením referenčního výsledku od předpokládaného. Pro vnitřní vrstvy tento způsob ale použít nelze. Zde toho je dosaženo tak, že se v každé vrstvě násobí vypočtená hodnota \textgamma s korespondujícími váhami neuronu a vektorově se tyto hodnoty sečtou. Výsledný vektor se vždy předá předcházející vrstvě jako seznam chyb každého z neuronů. Celý proces předávání vektoru chyb funguje na obdobném principu, jako předchozí vyhodnocování pravděpodobnosti. V tomto případě je postup ale opačný a vyhodnocuje se postupně od výstupní vrstvy ke vstupní.
Detailní odvezení vzorce (ačkoli pro odlišnou implementaci neuronové sítě) přehledně vysvětluje uživatel, vystupující pod přezdívkou \textit{The One} na svém videu o tvorbě neuronových stí.\cite{ANN_BackPropagation}
Jedním z problémům při učení neuronové sítě mohou být také vstupy samotné. Pokud se síť bude učit po samostatných vstupech a tyto vstupy budou rozděleny na samostatné celky, může se síť naučit nejdříve jeden a později přeučit na druhý.
Pokud se naopak využijí všechny vstupy najednou, může u velkých datasetů dojít ke značným problémům s mezipamětí. To může způsobit načítání vstupních dat samotných ale mnohem pravděpodobněji alokované prostředky ve vnitřních strukturách každého neuronu. Konkrétně jde o ukládání, vypočítaných korekcí jednotlivých vah, v generické kolekci \textit{List}. Ta se při dosažení maxima svého objemu automaticky realokuje na násobek současného. Tím vzniknou několikanásobky velikosti původního setu dat. Navíc se zjistilo, že tento přístup není ani příliš efektivní z hlediska učení.\cite{minibatchVsFullBatch} Pro učení je tedy využit přístup, který rozděluje data do několika, ne nutně stejně velkých, ale relativně malých, celků ("minibatch"). Tento celek se nejdříve celý vyhodnotí a váhy jsou upraveny na základě průměru všech korekcí v něm.
Tento přístup uspoří paměť, je schopen se lépe učit a zároveň tím lze eliminovat problém, kdy chodí data jednoho druhu a po sléze jiného (nemají uniformní rozdělení). Síť by se totiž připravila jen na jeden druh dat. Což je zároveň problém, ke kterému došlo kvůli porovnávání transakcí (detailně rozebráno v sekci \ref{komparator}).
\subsection{Export, Import sítě}
Aby bylo možné využít už jednou natrénovanou síť, je nutné si ji nějakým způsobem zapamatovat. Pro síť jsou důležité pouze dvě věci a totiž váhy neuronů společně s tvarem sítě. Tvarem sítě se rozumí množství vrstev a počet neuronů v nich obsažených.
Pro řešení uložení sítě si ji lze představit jako 3D objekt. Prvním rozměrem jsou vrstvy, druhým počet neuronů v každé vrstvě a třetí jsou váhy v každém neuronu. Stejným způsobem se proto ukládají resp. načítají do/z databáze.
%TODO model databáze
\subsection{Testování funkčnosti neuronové sítě}
Pro zjištění funkčnosti sítě musely být vytvořeny nějaké dva primitivní problémy, na základě kterých by se dalo ověřit, že opravdu funguje. Byl tedy zvoleno předvídání sudých a lichých čísel společně s testováním operátoru XOR pro dvě čísla. Pro oba testované případy byl implementován čítač pokusů - kolik bylo správně a kolik špatně i kolikrát v testu mělo dojít k předpovědi o správném či špatném výsledku. Tento čítač zároveň ověřuje, jestli síť nepředpovídá jen jedno číslo případně generátor, který testy provádí funguje správně.
Dále bylo třeba zjistit, zda při exportu sítě a následném importu nedojde k porušení struktury sítě a bude fungovat i nadále.
\subsubsection{Sudá a lichá čísla}
Prvním bylo rozhodování se, jestli je číslo mezi nulou a sedmi sudé nebo liché. Čísla 0-7 byla zvolena protože je lze zapsat pomocí tří cifer v binární soustavě. Jediný rozdíl byl, že se číslo 0 zapisovalo jako -1. To je z důvodu že 0 není neutrální číslo pro násobení a tím pádem by nedocházelo ke správnému vyhodnocování vah. Využití čísel -1 a 1 bylo doporučeno i na konferenci Microsoftu \textit{Build 2013 - Developing Neural Networks using Visual Studio}\cite{MicrosoftBuild2013}. Při testování se podařilo síti předpovědět, zda-li je číslo sudé či liché na 100\% (viz. obr. č. \ref{OddEvenTest})
\begin{figure}[h]
\includegraphics[width=0.75\textwidth]{img/Odd_Even_Test_Evaluation.png}
\centering
\caption[Test sudých a lichých čísel]{Test sudých a lichých čísel}
\label{OddEvenTest}
\end{figure}
 
\subsubsection{XOR}
Druhým problémem byl operátor XOR. Tento operátor označuje množinovou operaci která je pravdou pouze pokud jedno z čísel má nulovou, resp. zápornou (-1), hodnotu a druhé kladnou (1). Jak už bylo naznačeno test pro test byla nulová hodnota nahrazena zápornou ze stejných důvodů, jako v předchozím testu. Výsledek testování dosáhl úspěšnosti 67.1\% (viz. obr. č. \ref{XORTest}), tedy téměř 3/4 vstupu byly odhadnuty správně. To je výsledek, který je lepší než čistý odhad a lze jej považovat za dostatečný.
\begin{figure}[h]
\includegraphics[width=0.7\textwidth]{img/XOR_Test_Evaluation.png}
\centering
\caption[Test XOR operátoru]{Test XOR operátoru}
\label{XORTest}
\end{figure}
 
\subsection{Testování základní části}
\subsection{Komprátor}
\subsubsection{Export, Import}
Export a import sítě lze ověřit snad jen jediným způsobem. A totiž exportováním již natrénované sítě a jejím následným naimportováním zpět. Pokud došlo ke korektnímu importu, síť bude nadále správně předvídat testovaná data.
Bylo tedy implementováno simulované exportování a importování sítě a ověřeno, zda-li se předpovědi nezměnili. Výsledek opět dosáhl 100\%, proto lze předpokládat, že funkčnost je bezchybná (viz obr. č. \ref{ImportExportTest}).
\begin{figure}[h]
\includegraphics[width=0.7\textwidth]{img/test_export_import.png}
\centering
\caption[Test exportu a importu sítě]{Test exportu a importu sítě}
\label{ImportExportTest}
\end{figure}
\subsection{Komprátor} \label{komparator}
\subsection{Testování komparátoru}
\subsection{Datafeeder}
 
......@@ -254,6 +314,24 @@ Při výběru formy zpracování umělé inteligence jsem se rozhodl pro využit
%\newline Pro druhou, backendovou část, jsem zvolil jazyk C\#
 
\chapter{Možnosti rozšíření}
\begin{enumerate}
\item vícejádrový výpočet
\item výpočet na grafických kartách
\item větší množství dat (současné je extrémě malé) - ideálně neanonimizovaná
\item zamyslet se nad úpravou minibatche na hodnotu v mocnině 2 (https://www.quora.com/What-is-a-minibatch-in-a-neural-network)
\item optimalizace LR (raději nezmiňovat?)
\item v případě obsáhlejších dat lépe rozlišit opakujicí se vs neopakující se transakce
\item doplnit uživatelské označování transakcí za opakující se či nikoliv
\item zvážit patchový a automatizovaný import
\item doporučování produktů na základě předpovědi
\item do webového rozhraní přidat obnovu emailem
\item sepsat UNIT testy
\item přidat do Dockeru
\item přepsat do C/C++ (je rychlejší než C\#), využít C++ knihovny. Kód s velkým množstvím iterací -> vyplatí se investovat do optimalizací.
\item využít jinou knihovnu než Math.NET
\item některé operace jde přepsat do maticových operací (ačkoli na úkor čitelnosti)
\item backpropagation psát cyklem místo rekurze (ačkoli mi rekurze přišla intuitivnější, tak je pomalejší)
\end{enumerate}
\chapter{Testování}
 
\begin{conclusion}
......@@ -389,21 +467,21 @@ Pro svou práci jsem si nastudoval syntaxi a použití jazyků, jmenovitě Types
% % % % % % % % % % % % % % % % % % % % % % % % % % % %
 
%============================== temporary disabled =======================
%\chapter{Obsah přiloženého CD}
\chapter{Obsah přiloženého CD}
 
%upravte podle skutecnosti
 
%\begin{figure}
% \dirtree{%
% .1 readme.txt\DTcomment{stručný popis obsahu CD}.
% .1 exe\DTcomment{adresář se spustitelnou formou implementace}.
% .1 src.
% .2 impl\DTcomment{zdrojové kódy implementace}.
% .2 thesis\DTcomment{zdrojová forma práce ve formátu \LaTeX{}}.
% .1 text\DTcomment{text práce}.
% .2 thesis.pdf\DTcomment{text práce ve formátu PDF}.
% .2 thesis.ps\DTcomment{text práce ve formátu PS}.
% }
%\end{figure}
\begin{figure}
\dirtree{%
.1 readme.txt\DTcomment{stručný popis obsahu CD}.
.1 exe\DTcomment{adresář se spustitelnou formou implementace}.
.1 src.
.2 impl\DTcomment{zdrojové kódy implementace}.
.2 thesis\DTcomment{zdrojová forma práce ve formátu \LaTeX{}}.
.1 text\DTcomment{text práce}.
.2 thesis.pdf\DTcomment{text práce ve formátu PDF}.
.2 thesis.ps\DTcomment{text práce ve formátu PS}.
}
\end{figure}
 
\end{document}
Latex/img/Odd_Even_Test_Evaluation.png

12 KiB

Latex/img/XOR_Test_Evaluation.png

11.9 KiB

Latex/img/test_export_import.png

27.8 KiB

......@@ -69,6 +69,17 @@
url = "https://wp-rocket.me/blog/difference-json-web-tokens-vs-session-cookies/"
}
 
@ARTICLE {minibatchVsFullBatch,
title = "Revisiting Small Batch Training for Deep Neural Networks",
author = "Dominic Masters, Carlo Luschi",
journal = "arXiv.org {[online]}",
howpublished = "[online]",
month = "20. " # "dubna",
year = "2018",
note = "[cit. 2019-16-11]",
url = "https://www.idnes.cz/technet/internet/youtube-software-google-umela-inteligence.A180514_114619_sw_internet_hege"
}
@Misc{ANN_Understanding,
author = "Grant Sanderson",
title = "But what is a Neural Network?",
......@@ -79,6 +90,27 @@
note = "[cit. 2019-14-11]",
}
 
@Misc{ANN_BackPropagation,
author = "The One",
title = "Neural Network - Back-Propagation Tutorial In C\#",
howpublished = "[online]",
url = {https://youtu.be/L_PByyJ9g-I},
month = "26." # "srpen",
year = "2017",
note = "[cit. 2019-15-11]",
}
@Misc{MicrosoftBuild2013,
author = "Dr. James McCaffrey",
title = "2013 Build Conference - Developing Neural Networks using Visual Studio",
publisher = "Microsoft Research",
howpublished = "[online]",
url = {https://youtu.be/-zT1Zi_ukSk},
month = "26." # "června",
year = "2013",
note = "[cit. 2019-16-11]",
}
@Misc{ANN_structure,
author = "clipartwiki.com",
title = "Artificial neural network",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment