• No results found

Lineární klasifikátor je speciálním případem neuronové sítě, která má pouze jednu vrstvu neuronů, kde počet neuronů je rovný počtu tříd. Toto je však velmi omezující, protože nelze vytvořit téměř žádnou abstrakci.

Neuronová síť vždy obsahuje vstupní vrstvu, která je tvořená vstupním vektorem a výstupní vrstvu, což je poslední řada neuronů o stejném počtu neuronů, jako je počet tříd. Mezi těmito dvěma vrstvami je však libovolný počet skrytých vrstev o libovolném počtu neuronů. Každý neuron ve skryté vrstvě lze chápat jako nový příznak a další vrstvy mohou kombinovat tyto nové příznaky, čímž se neuronová síť může naučit rozpoznávat mnohem složitější souvislosti dat ve vstupního vzorku.

Toto je dobře vidět na obrázku 13, kde jsou data rozprostřena ve tvaru spirály. Tento problém by lineární klasifikátor nezvládl, protože nelze oddělit všechny tyto body pouhými dvěma přímkami jako v obrázku 10. Neuronová síť má více parametrů a tím může vytvořit složitější funkce.

Obrázek 13: Rozdělení tříd jednoduché neuronové sítě s dvěma vstupy z [2]

Obrázek 13 je vytvořen z interaktivního dema [2], které umožnuje vytvářet a tré-novat jednoduché neuronové sítě. Pro vytvoření tohoto obrázku jsem použil spirá-lovitá vstupní data, aktivační funkci ReLu a jednu skrytou vrstvu s 30 neurony.

Větší množství neuronů ve skryté vrstvě umožnuje vytvářet více nových přízna-ků a větší počet skrytých vrstev umožňuje vyšší úroveň abstrakce. Je tedy vhodné vytvořit hned několik skrytých vrstev a sestrojit tak hlubokou neuronovou síť, v an-gličtině Deep Neural Network nebo ve zkratce DNN. Neuronové síti se také někdy říká dopředná neuronová síť, v angličtině Feed-forward Neural Network, nebo Fully-connected Neural Network. Fully-Fully-connected znamená plně propojená, což naznačuje, že všechny neurony sousedních vrstev jsou navzájem propojeny.

Obrázek 14: Schéma neuronové sítě. Červená oblast značí vstupní vrstvu, modré oblasti značí skryté vrstvy a zelená část označuje výstupní vrstvu. Obrázek je z kurzu CS231n [4]

Počet skrytých vrstev a počet neuronů ve skrytých vrstvách lze považovat za hyperparametry, které se běžně volí na základě zkušeností. Počet neuronů ve vrstvě je omezený výpočetním výkonem, protože při zvolení 10000 neuronů v první skry-té vrstvě, by matice vah měla rozměry 10000x1024. Maticové násobení takto velké matice je výpočetně náročné, a proto je výhodnější vytvořit více skrytých vrstev s menším počtem neuronů. Omezený je však i počet vrstev a to hned z několika důvodů. Prvním problémem je mizející gradient. Samotná vrstva neuronů má ten-denci zmenšovat gradient, kdy po několika vrstvách je gradient příliš malý na to, aby probíhalo učení. Druhým problémem je, že každá úloha dokáže využít jen ur-čité úrovně abstrakce a poté již nelze nalézt složitější souvislosti, které by přispěly ke klasifikaci. Z těchto důvodů je zvolení nejlepší architektury neuronové sítě velmi složitou úlohou.

Jelikož neuronová síť vznikne složením více vrstev neuronů a lineární klasifiká-tor je tvořený jednou řadou neuronů, není potřeba vytvářet nové lokální derivace.

Gradient je vytvořen vynásobením lokálního gradientu s gradientem výstupu, podle pravidla o derivaci složené funkce.

Nejlepší architektura neuronové sítě pro rozpoznávání písmen, kterou jsem expe-rimentálně našel, má čtyři skryté vrstvy. První dvě skryté vrstvy mají 512 neuronů a další dvě mají 256 neuronů. Velikost dávky jsem zvolil 1024. Rychlost učení začala na hodnotě 1 a poté byla snižována o 0,9995 při každé iteraci. Drop faktor jsem mě-nil pro každou trénovací sadu, protože se jedná o různě početná data a tím pádem má neuronová síť různou tendenci k přetrénování. Trénování jsem nechal probíhat v rámci hodin. Po několika hodinách se již přesnost rozpoznávání validačních dat nezlepšovala, a proto jsem trénování ukončil. Rozpoznání jednoho vzorku trvalo 3 ms.

37

Tabulka 5: Výsledy rozpoznávání hlubokou neuronovou sítí Sada dat Přesnost Drop faktor Přesnost MATLAB

Data1 87,9 % 0,75 91,2 %

Data3 90 % 0,80 94,9 %

Data5 92 % 0,87 95,5 %

MNIST 96,2 % 0,9 98,21 %

Opět jsem se pokusil o vytvoření podobné neuronové sítě v MATLABu, kde jsem narazil na problém s aplikací Dropoutu. Neuronová síť v MATLABu se učí dobře, i když se zdá, že dochází k silnému přetrénování, a proto jsem Dropout v MATLABu nepoužil. I tak jsou dosažené přesnosti v MATLABu značně lepší, než přesnosti v mé implementaci. MATLAB je z mého pohledu neuvěřitelně dobře optimalizován, protože trénování této hluboké neuronové sítě, trvalo přibližně jednu minutu, což je ohromný rozdíl proti mé implementaci. Optimalizovaná není pouze rychlost výpočtů, ale i samotné učení. Zatímco moje implementace ”prohlédla” každý trénovací vzorek přibližně 1000 krát, MATLAB byl naučený za 30 generací.

2.4.1 Aktivační funkce

Oddělování bodů v N dimenzionálním prostoru pouhými nadrovinami, by bylo ob-tížné a vyžadovalo by velký počet neuronů. Proto se za každou skrytou vrstvu neu-ronové sítě přidává takzvaná aktivační funkce neboli nelinearita. Tato funkce je aplikována na každý prvek výstupního vektoru a výrazně zlepšuje funkci neuronové sítě. Výstupní vektor upravený aktivační funkcí se nazývá vektor aktivací σ.

Aktivačních funkcí je velké množství, a proto jsem zde uvedl jen několik příkladů.

Jednou z nejznámějších nelinearit je takzvaná sigmoida ve formě σ (x) = 1 (1+e−x). Tato funkce má však několik nepraktických vlastností, a proto se v současné době nepoužívá.

Dnes nejpoužívanější aktivační funkcí je ReLu – Rectified Linear Unit, ve vol-ném překladu – Jednotka lineárního usměrňovače. Tato funkce má tvar σ (x) = max (0, x) a i když je tato funkce jednoduchá v porovnání se sigmoidou, tak řeší většinu nedostatků sigmoidy. ReLu je sice univerzální volbou aktivační funkce, ale i přes to má jeden nedostatek. Pokud jsou váhy nastaveny tak, že při jakémkoliv vstupu bude některý prvek výstupního vektoru vždy záporný, pak bude gradient tohoto neuronu vždy rovný 0 a neuron se přestane učit. Tento problém se nazývá umírání neuronů a lze ho vyřešit drobnou modifikací této funkce.

V této práci jsem použil pouze takzvanou funkci leaky ReLu. Tato modifikovaná nelinearita ReLu řeší problém umírajících neuronů tím, že záporné hodnoty pouze utlumí, místo jejich nastavení na hodnotu 0.

σ (x) = max (0.1· x, x) (12)

Obrázek 15: Průběh funkce leaky ReLu

Lokální derivací nelinearity leaky ReLu je skoková funkce, kde záporné hodnoty vytvoří konstantní hodnotu 0,1 a kladné hodnoty mají derivaci rovnou 1. Toto je dobře vidět v implementaci, kde je vytvořena maska hodnot 0,1 nebo 1, podle toho, jestli je daný prvek vstupního vektoru kladný nebo záporný. Tato maska je rovná lokálnímu gradientu vstupního vektoru a po vynásobení se vstupním vektorem je výsledkem výstupní vektor aktivací.

Zdrojový kód 2: Implementace aktivační funkce leaky ReLu

mask = ( x−>GetArray ( ) > 0) . cast <f l o a t >() * 0 .9 + 0 . 1 ;

2 z = mask . a r r a y ( ) * x−>GetArray ( ) ; dx = mask . a r r a y ( ) * dz . a r r a y ( ) ;

Pro správné učení neuronové sítě je velmi důležitá inicializace matic vah. Univer-zálním pravidlem je, že jsou váhy inicializovány na náhodnou hodnotu z Gaussova rozdělení, dělenou odmocninou počtu vstupů. Tato inicializace zaručí přibližně stej-nou distribuci výstupů z každé vrstvy, což napomáhá rychlejšímu učení. V případě, že je použita nelinearita ReLu, pak lze inicializovat váhy lépe, pokud jsou náhodné hodnoty násobeny odmocninou z dvojnásobku počtu vstupů.

Zdrojový kód 3: Inicializace matice vah

1 w = Eigen : : MatrixXf : : Random( nNeurons , n I n p u t s ) * s q r t( 2 . 0 f / n I n p u t s ) ;

2.4.2 Dropout

V dnešní době není problém trénovat poměrně velké neuronové sítě i na osobním počítači, jak dokazuje tato práce. Při rozšiřování neuronové sítě však začíná být problémem přetrénování, kdy se neuronová síť naučí přesně rozpoznávat trénovací vzorky, ale nenaučí se obecné informace o vzorcích, a proto špatně rozpoznává nové vzorky, které nebyly použity k trénování. Čím větší neuronová síť je, tím víc má sklon k přetrénování.

Dropout řeší problém přetrénování tak, že každý neuron může být při trénování odpojen na jednu iteraci s určitou pravděpodobností a tím se sníží kapacita neurono-vé sítě. Tímto se zpomalí učení, ale neuronová síť je donucena se učit větší množství obecnějších informací, které platí pro všechny vzorky.

39

Obrázek 16: Ilustrace funkce Dropoutu. Nalevo je standardní NN. Napravo je neu-ronová síť po aplikaci Dropoutu. Obrázek je z původní práce o Dropoutu [8]

Umístění Dropoutu v síti nemá velký vliv, ale obecně se Dropout vkládá za akti-vační funkci. Dropout má jeden hyperparametr p, který má hodnotu v rozmezí od 0 do 1 a vyjadřuje pravděpodobnost odpojení každého neuronu. Tento hyperparametr se často nazývá Drop faktor. Tato technika je velmi jednoduchá na implementaci.

Stačí náhodné prvky vstupního vektoru nastavit na 0 a tím je neuron, jehož výstup je na dané pozici vektoru, odpojen. Při samotné klasifikaci testovacích nebo validač-ních prvků je potřeba využít plnou kapacitu neuronové sítě, a proto je při testování Dropout deaktivován.

Vyřazení některých neuronů oslabí aktivační vektor. Pro zachování správné funk-ce i při vyřazení Dropoutu je potřeba aktivační vektor vynásobit silou Dropoutu p.

Častěji se však používá invertovaný Dropout, který dělí aktivační vektor silou Dro-poutu p, neboli posiluje ty aktivace, které nebyly vyřazeny. Invertovaný Dropout má tu výhodu, že po jeho vyřazení již není potřeba upravovat aktivační vektor.

2.4.3 Batch-normalizace

Batch-normalizace je poměrně nová technika, která řeší hned několik problémů neu-ronových sítí a dělá je tak robustnější.

Principem je upravení průměru a variance každého příznaku. Toto je podobné jako předzpracování vstupních dat, které zrychluje učení neuronové sítě. BN lze považovat za předzpracování všech výstupních hodnot před tím, než jsou zpracovány aktivační funkcí. Takto lze nejen několikanásobně zrychlit učení, ale lze také vytvořit hlubší neuronové sítě, jelikož lokální derivace BN zabraňuje mizení gradientu. Dalším pozitivním efektem je, že BN regularizuje neuronovou síť a tím omezuje přetrénování.

Z toho vyplývá, že při použití BN není potřeba použít regularizaci a je možné použít slabší Dropout. Dropout se pak nejčastěji aplikuje mezi vrstvu neuronů a aktivační funkci.

Batch-normalizace obsahuje dva vektory parametrů γ a β. Tyto parametry se učí společně s parametry vah a dokáží tak upravovat hodnotu příznaku podle potřeby neuronové sítě. Tyto parametry se mohou nastavit i na hodnotu průměru a variance a tím zrušit účinek normalizace.

BN funguje lépe s větší dávkou dat, protože dokáže přesněji určit průměr a vari-anci každého příznaku. Vzorce jsou uvedeny zjednodušeně pro dávku o velikosti M s jediným příznakem x.

Nejprve je nutné vypočítat průměr a varianci příznaku z rovnic 13 a 14. Následně je příznak normalizován odečtením průměru a vydělením odmocninou z variance v rovnici 15. Z důvodu výpočetní stability je k odmocnině z variance přičtena malá hodnota η, aby nemohlo dojít k dělení 0. Nakonec je tento normalizovaný příznak v rovnici 16 posunut o β a znásoben γ a tím je upraven tak, jak je pro neuronovou síť nejvhodnější.

Vyjádření lokálních derivací těchto rovnic by bylo nepraktické, proto jsem zde uvedl plné gradienty, k jejichž vytvoření je potřeba gradient z následující vrstvy ∂L∂z.

∂L

Detailní vysvětlení jednotlivých derivací lze nalézt v článku od Frederika Kratzerta [6]. Tyto rovnice nejsou optimální z hlediska rychlosti výpočtů, proto jsem imple-mentoval optimalizované vzorce derivací od Clémenta Thoreyho [7], které jsem ná-sledně zoptimalizoval pro můj výpočetní model. Moje optimalizace spočívaly pouze v zajištění, aby co nejvíce výpočtů bylo provedeno jen jednou s výsledky uloženými v paměti. Tímto je moje implementace rychlejší za cenu větší spotřeby paměti. Je-likož jsou v mé implementaci vstupy sloupcovými vektory o velikosti N, výsledná matice dávky má rozměry N xM a BN se provádí vždy na jednom této matice.

41

Related documents