• No results found

Rozpoznávání ručně psaného (tiskacího) písma pomocí neuronových sítí

N/A
N/A
Protected

Academic year: 2022

Share "Rozpoznávání ručně psaného (tiskacího) písma pomocí neuronových sítí"

Copied!
52
0
0

Loading.... (view fulltext now)

Full text

(1)

Rozpoznávání ručně psaného (tiskacího) písma pomocí neuronových sítí

Bakalářská práce

Studijní program: B2612 – Elektrotechnika a informatika

Studijní obor: 1802T007 – Elektronické informační a řídicí systémy Autor práce: Tomáš Blažek

Vedoucí práce: prof. Ing. Jan Nouza, CSc.

Liberec 2018

(2)
(3)

Recognition of handwritten (block) letters using neural networks

Bachelor thesis

Study programme: B2612 – Electrical Engineering and Informatics

Study branch: 1802T007 – Electronic Information and Control Systems

Author: Tomáš Blažek

Supervisor: prof. Ing. Jan Nouza, CSc.

Liberec 2018

(4)
(5)
(6)
(7)

Powered by TCPDF (www.tcpdf.org) Powered by TCPDF (www.tcpdf.org)

(8)
(9)

Poděkování

Rád bych poděkoval prof. Ing. Janu Nouzovi, CSc. především za motivaci při tvorbě této práce, ale také za užitečné rady a vedení.

Dále bych chtěl poděkovat všem, kteří obětovali chvilku času a vy- plnili formuláře, ze kterých je vytvořena databáze písmen použitá v této práci.

(10)

Abstrakt

Bakalářská práce popisuje metody rozpoznávání obrazu, založené na učení z velkého množství trénovacích dat. Popis metod je dopl- něn o praktické výsledky každé metody. Dále je zde popis chování každé metody s různou rozsáhlostí trénovacích dat. Součástí této práce je vytvoření databáze velkých tiskacích písmen. V závěru je nejúspěšnější metoda použita pro rozpoznávání písmen v reálném čase.

Metody rozpoznávání a programy pro vytvoření databáze a rozpo- znávání písmen, jsou napsány v C++. Tyto programy používají tři knihovny: OpenCV pro zpracování obrazu, Eigen pro rychlé mati- cové výpočty a Qt pro tvorbu uživatelského rozhraní.

Klíčová slova: nejbližší soused, neuronová síť, konvoluční neuronová sít, databáze písmen, rozpoznávání písmen

Abstract

Bachelor thesis describes methods of image recognition, based on learning from large quantity of training data. Description of me- thods is complemented with results from each method. Also, there is description of each method’s behavior with different sizes of tra- ining data. Part of this thesis is creation of database, made from block capital letters. In the end, the most succesful method is used for recognition of letters in real time.

Recognition methods and programs for creation of database and recognizing letters, are written in C++. Those programs use three libraries: OpenCv for image processing, Eigen for fast matrix com- putations and Qt for user interface.

Keywords: nearest neighbor, neural network, convolutional neural network, database of letters, letter recognition

(11)

Obsah

Seznam zkratek . . . 14

Úvod 15 1 Řešená úloha a data 17 1.1 Vymezení úlohy . . . 17

1.2 Definice tříd pro klasifikaci. . . 18

1.3 Sběr dat . . . 18

1.4 Implementace programů . . . 19

1.5 Automatické zpracování formulářů . . . 20

1.6 Rozdělení dat pro účely strojového učení . . . 21

1.7 Hodnocení experimentů . . . 22

2 Použité metody rozpoznávání 24 2.1 Metoda nejbližšího souseda . . . 25

2.1.1 K-nejbližších sousedů . . . 26

2.1.2 Nastavení hyperparametrů . . . 27

2.2 Metoda využívající etalony tříd . . . 28

2.3 Lineární klasifikátor . . . 29

2.3.1 Chybová funkce . . . 32

2.3.2 Učení . . . 32

2.3.3 Regularizace . . . 34

2.4 Dopředná hluboká neuronová síť . . . 35

2.4.1 Aktivační funkce . . . 37

2.4.2 Dropout . . . 38

2.4.3 Batch-normalizace . . . 39

2.5 Konvoluční hluboká neuronová síť . . . 41

2.6 Porovnání metod a shrnutí výsledků . . . 42

2.7 Implementace metod . . . 43

11

(12)

3 Ukázková aplikace 45 3.1 Implementace . . . 46

4 Závěr 47

Přílohy 50

(13)

Seznam obrázků

1 Definice všech 26 tříd. . . 18

2 Příklady písmen obtížných na rozpoznání. Zleva E, D, K, V, D, G a R 18 3 Uživatelské prostředí programu pro automatické zpracování formulářů 20 4 Uživatelské rozhraní programu pro implementaci metod rozpoznávání 24 5 Znázornění metody nejbližšího souseda. Obrázek je vytvořen v inter- aktivní aplikaci [3] . . . 25

6 Příklad metody K nejbližších sousedů z interaktivního dema [3] . . . 26

7 Hledání optimální hodnoty hyperparametru K . . . 27

8 Příklady etalonů písmen A, E, O, R a Z . . . 28

9 Schéma perceptronu . . . 29

10 Interpretace funkce lineárního klasifikátoru z interaktivní aplikace [1] 30 11 Příklady klasifikátorů písmen A, E, O, R a Z. . . 31

12 Příklad chybové funkce s dvěma proměnnými parametry . . . 32

13 Rozdělení tříd jednoduché neuronové sítě s dvěma vstupy z [2] . . . . 35

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] . . . 36

15 Průběh funkce leaky ReLu . . . 38

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 Dro- poutu [8]. . . 39

17 Shrnutí výsledků všech implementovaných metod . . . 42

18 Shrnutí výsledků metod aplikovaných v programu MATLAB . . . 43

19 Uživatelské prostředí programu pro rozpoznávání písmen . . . 45

13

(14)

Seznam zkratek

CNN Konvoluční neuronová síť FNN Dopředná neuronová síť DNN Hluboká neuronová síť SVM Support Vector Machine SGD Stochastic Gradient Descent MGD Mini-batch Gradient Descent ReLu Rectified Linear Unit

BN Batch-normalizace

GPU Graphics Processing Unit

(15)
(16)

Úvod

Strojové učení je obor, který je nezbytnou součástí pokročilé automatizace. Do oboru strojového učení patří neuronové sítě, které vycházejí z velmi zjednodušeného mode- lu neuronu. Tyto neuronové sítě umožňují vykonávat úkoly jako rozpoznávání řeči nebo obrazu, které by jinými technikami byly jen těžko realizovatelné. V posledních letech nastal rapidní rozvoj v oblasti neuronových sítí a jejich využití. Nejznámější úspěchy v oblasti umělé inteligence a rozpoznávání obrazu patří společnosti Google.

Velké pokroky však zaznamenaly i další aplikace neuronových sítí, jako je například rozpoznávání řeči.

Koncept neuronových sítí existuje již od 40. let minulého století. Základní od- lišností neuronových sítí od jiných technik je, že se neuronová síť učí z databáze trénovacích dat. Stává se tak univerzálním nástrojem, který se dokáže přizpůsobit širokému spektru problémů. Výhodou neuronových sítí je, že samotné rozpoznává- ní obvykle trvá kratší dobu než u jiných metod rozpoznávání. S rostoucí složitostí neuronové sítě se však prodlužuje doba učení.

Důvodů, proč neuronové sítě neměly dobré výsledky po tak dlouhou dobu, je několik, od nedostatku výpočetního výkonu až po špatnou inicializaci parametrů.

Původní koncept neuronových sítí se od počátku téměř nezměnil. V posledních letech byly však objeveny nové techniky, které zlepšily kvalitu a rychlost učení neurono- vých sítí. Tím se snížil nutný výpočetní výkon natolik, že v současné době je možné učit jednoduché neuronové sítě i na běžně dostupném osobním počítači v relativ- ně krátkém čase. Velmi známou technikou je konvoluce umožňující rozpoznávání obrazu, která v některých případech dokáže překonat zrak člověka.

V této práci je řešenou úlohou rozpoznávání ručně psaných velkých tiskacích písmen. Vytvoření algoritmu, který by rozpoznával jednotlivá písmena bez nutnosti učení, by bylo příliš složité. Proto se v této situaci nabízí možnost použití algoritmů, které se učí z trénovací databáze dat.

Z tohoto předpokladu vychází první část bakalářské práce - vytvoření databáze ručně psaných písmen. Tento úkol lze dále rozdělit na vytvoření formuláře, vlastní sběr dat a zpracování vyplněných formulářů.

Dalším krokem je použití metod pro učení a rozpoznávání písmen a následné učení z dat vytvořených v první části. V této bakalářské práci je implementová- no několik metod, od metody nejbližších sousedů až po konvoluční neuronové sítě.

Následně je vyhodnocena přesnost a rychlost jednotlivých metod v porovnání s před- chozími metodami.

(17)

Poslední částí této práce je aplikace nejúspěšnější metody do programu, který je schopný přepisovat písmena z vyfoceného formuláře. Tato část demonstruje, že algoritmus umožňuje rozpoznávat písmena v reálném čase.

Programy pro zpracování formulářů, rozpoznávání písmen a implementace metod učení je vytvořen v programovacím jazyce C++ s využitím tří knihoven.

První knihovnou je OpenCV, která poskytuje nástroje pro zpracování obrazu, jako jsou filtry, změna jasu a kontrastu nebo hledání kontur. Tato knihovna také obsahuje možnost využití grafické karty pro urychlení některých výpočtů.

Název druhé knihovny je Eigen. Tato knihovna obsahuje nástroje pro lineární algebru, umožňující velmi rychlé maticové výpočty, které jsou důležité pro učení neuronových sítí. Klíčovým faktorem je rychlost učení, protože složité konvoluční neuronové sítě se mohou učit až v řádu desítek dnů.

Qt je poslední knihovnou použitou v této práci. Umožňuje snadné vytvoření uživatelského rozhraní, které celkově usnadňuje vývoj metod, sledování vývoje učení a interpretaci výsledků.

17

(18)

1 Řešená úloha a data

1.1 Vymezení úlohy

Hlavní náplní této úlohy bylo vytvořit novou databázi písmen a implementovat me- tody klasifikace z kategorie data-driven metod. Databáze je tvořena obrázky písmen, o rozlišení 32x32 pixelů, a označením písmene, které je na obrázku. Dalším úko- lem bylo prozkoumat vlastnosti implementovaných metod a zjistit, která z metod je nejvhodnější pro vytvoření programu rozpoznávajícího ručně psaná velká tiskací písmena.

Cílem této práce bylo vytvořit program, který bude schopný rozpoznat ručně psaná písmena. Tato úloha je omezena pouze na rozpoznávání velkých tiskacích písmen bez diakritiky, především z důvodu náročnosti sběru dat. Jedná se o pros- tou klasifikační úlohu, kde program zařadí každý neznámý vzorek do jedné ze tříd.

V případě této práce každá třída reprezentuje jedno písmeno. Důraz byl kladen na přesnost a rychlost metod, pro možné využití rozpoznávání v reálném čase.

Všechny metody rozpoznávání uvedené v této práci jsou založeny na principu učení z databáze vzorků, které jsou již zařazeny do správné kategorie. Tento druh metod je označován jako data-driven. Jedná se o univerzální metody, které lze použít pro řešení mnoha úloh. Pro změnu řešené úlohy je nutné změnit trénovací databázi, ale algoritmy zůstávají stejné.

Tato úloha je velmi podobná rozpoznávání čísel. Více než dvojnásobný počet tříd ji však dělá obtížnější. Vzhledem k podobnosti těchto dvou úloh jsem se rozhodl porovnávat výsledky rozpoznávání čísel a písmen. Databáze čísel, kterou jsem využil k porovnání, se jmenuje MNIST a obsahuje 50000 trénovacích a 10000 testovacích vzorků.

Další známou databází je například CIFAR-10, která obsahuje obrázky o roz- měrech 32x32 pixelů patřících do deseti tříd. Jedná se o obrázky letadel, aut, koček a dalších.

Také již existuje databáze s názvem EMNIST, která obsahuje velká i malá tiskací písmena a číslice. Tuto databázi lze použít k rozpoznávání obsahu běžných formulářů bez diakritiky.

(19)

1.2 Definice tříd pro klasifikaci

Definováno je 26 tříd. Každá třída reprezentuje jedno písmeno z abecedy bez diakri- tiky a speciálních znaků. Zde je zobrazen jeden vzorek pro každou třídu jako příklad.

Obrázek 1: Definice všech 26 tříd

Největším problémem rozpoznávání ručně psaného písma je různorodost stylů, které lidé používají. Obtížnost rozpoznávání je patrná na následujících příkladech, kdy i pro člověka je obtížné poznat, které písmeno je na obrázku. Tyto znaky jsem vybral z písmen, která byla špatně rozpoznána konvoluční neuronovou sítí vytvoře- nou profesionálním nástrojem v programu MATLAB.

Obrázek 2: Příklady písmen obtížných na rozpoznání. Zleva E, D, K, V, D, G a R

1.3 Sběr dat

Pro úspěšné učení je zapotřebí kvalitní databáze trénovacích vzorků. Kvalita spočívá především v různorodosti vzorků, ale také v jejich množství.

Pro sběr dat jsem vytvořil formulář obsahující dvě tabulky, kde každý dobrovol- ník napsal pětkrát všech 26 písmen. Z praxe je známo, že jeden člověk píšící stejné písmeno desetkrát, pokaždé napíše písmena dostatečně odlišná na to, aby zlepšila kvalitu trénovací databáze. Pro vytvoření databáze jsem zvolil pouze pět vzorků pro každé písmeno od jedné osoby z důvodu časové náročnosti. Vyplnění všech 130 písmen trvá méně než pět minut. Přesto je překvapivá náročnost vyplňování, kdy na konci má člověk tendenci spěchat a tím psát nečitelně.

Formulář pro vepsání písmen také obsahuje stručný popis, k čemu jsou písmena využita. Dále obsahuje postup vyplnění formuláře, včetně doporučení, která zlep- šují kvalitu výsledných vzorků. Užitečnou součástí formuláře jsou záchytné body v rozích, které lze využít pro rozpoznání orientace stránky nebo polohy tabulek s písmeny. Formulář je k dispozici k nahlédnutí v Příloze B.

Vyplněné formuláře jsem získal od 328 osob, což je více než dostatečné množství pro moji práci. Mezi respondenty patřily osoby různého věku od dětí až po důchodce.

Tento fakt napomáhá různorodosti výsledné databáze. Díky rozsáhlosti a kvalitě dat je možné databázi použít i pro další účely.

19

(20)

1.4 Implementace programů

Pro bakalářskou práci jsem zvolil vytvoření vlastních programů. Rozhodl jsem se pro tento pracnější postup, který mi dává největší svobodu. Vytvoření vlastních algorit- mů je velmi dobrým způsobem pochopení vnitřního fungování metod, jejich výhody, nevýhody a případné modifikace. Přestože je v oboru strojového učení nejpoužívaněj- ším programovacím jazykem Python, zvolil jsem jazyk C++, který dovoluje silnější optimalizaci, a tím potencionálně rychlejší program.

Vytvoření programů od základu bez vnější pomoci, by bylo nad rámec této baka- lářské práce. Z toho důvodu jsem použil již existující knihovny, které mi poskytují základní nástroje. Mezi potřebné funkce pro tuto práci patří nástroje pro tvorbu uživatelského rozhraní, nástroje pro zpracování obrazu a nástroje pro lineární alge- bru.

Programy jsem vytvářel ve vývojovém prostředí Microsoft Visual Studio Com- munity 2015 a 2017. Na základě potřebných funkcí a nástrojů jsem vybral tyto tři knihovny:

OpenCv 3.3.1 – Knihovna specializovaná pro strojové vidění poskytující jedno- duché a efektivní prostředky pro práci s digitálním obrazem. Tato knihovna by byla plně dostačující k automatizovanému zpracování formulářů. Posléze jsem zjistil, že by bylo vhodné, kdyby uživatel mohl poskytnout vstupní hodnoty, jako například jména souborů obsahujících naskenované formuláře, kontrast nebo jas. OpenCv ob- sahuje možnost vytvořit jednoduché uživatelské rozhraní. Pro využití v bakalářské práci jsou ale možnosti knihovny příliš omezené a nelze jimi vytvořit takové uživa- telské rozhraní, které jsem potřeboval.

Qt 5.9.2 – Na základě zjištění, že uživatelské rozhraní v OpenCv je nedostačující, jsem se rozhodl přidat druhou knihovnu jménem Qt. Tato knihovna se specializuje na vytváření aplikací s bohatým uživatelským rozhraním. Podobně jako Qt funguje například C#. Výhodou Qt je to, že se jedná o samostatnou knihovnu a ne o ce- lý programovací jazyk jako C#, a proto ji lze integrovat do programu napsaném v C++. Při použití C#, by musela následovat změna veškerého již napsaného kódu.

V případě použití Qt zůstal kód prakticky nezměněn. Došlo pouze k přidání kódu pro vytvoření uživatelského rozhraní pomocí Qt. Mezi další výhody patří, že Qt je multiplatformní. V případě kompilace na jiném operačním systému než Windows, nemusí dojít k významné změně existujícího kódu.

Eigen 3.3.4 – Eigen je poslední použitá knihovna specializovaná na lineární alge- bru. Násobení matic je jádrem neuronových sítí, a proto jsem potřeboval co nejrych- lejší knihovnu na maticové výpočty. Maticové výpočty umí i knihovna OpenCV, ale ta je specializovaná na určité velikosti matic a mimo těchto velikostí je knihovna Eigen rychlejší. Dalším důvodem mého výběru je přehlednější a jednodušší progra- mování výpočtů v této knihovně. Eigen je mimo jiné využívaný v TensorFlow od společnosti Google, což je knihovna velmi často využívaná pro strojové učení.

(21)

1.5 Automatické zpracování formulářů

Pro automatické zpracování formulářů jsem vytvořil samostatný program s uživa- telským rozhraním. Toto uživatelské rozhraní lze vidět na obrázku 3.

Obrázek 3: Uživatelské prostředí programu pro automatické zpracování formulářů

Po spuštění programu je k dispozici výběr formulářů pomocí standardního dia- logového okna pro vybrání souborů. Po načtení formulářů se zobrazí první formulář v náhledu, kde jsou vykreslené dva zelené obdélníky označující oblasti tabulek s pís- meny a v nich následně červené obdélníky označují jednotlivá písmena.

Na levé straně okna je zobrazen počet nalezených písmen. V případě, že je jejich počet menší než 130, pak je pozadí tohoto popisku červené jako indikace nestan- dardní situace. Při nenalezení některých písmen, je možné upravit kontrast a jas formuláře. Po těchto změnách je náhled i počet písmen aktualizován, ke kontrole, zda byla korekce úspěšná či nikoliv.

Může nastat případ, kdy je některé políčko formuláře potřeba vyřadit. V tom případě stačí písmeno přeškrtnout tak, aby došlo k propojení protějších rohů políčka.

Takto označené políčko je ignorováno.

Tlačítky „Next“ a „Previous“ lze listovat v načtených formulářích, a provést tak vizuální kontrolu nalezení všech písmen. Po důkladném zkontrolování několika desí- tek formulářů byla všechna písmena nalezena správně, a proto jsem další formuláře nekontroloval. Po dokončení úprav a kontroly formulářů, tlačítko „Save Letters“

uloží písmena z aktuálně zobrazeného formuláře a tlačítko „Save ALL Letters“ uloží písmena ze všech načtených formulářů.

Principem hledání písmen je hledání kontur, které poskytuje knihovna OpenCv.

Nejprve je formulář upraven pomocí filtrů, které způsobí spojení čar, pokud jsou pře- rušeny. Poté se vyhledají dvě největší kontury na celém formuláři, kterými jsou celé tabulky s písmeny. Následně jsou oblasti tabulek invertovány a proces vyhledávání kontur opakován. Výsledné obrysy obsahují jednotlivá políčka s písmeny.

21

(22)

Pro nalezení samotných písmen je hledání kontur použito potřetí, tentokrát v každém políčku zvlášť. Jelikož je rozlišení nalezených písmen různé, je nutné sjed- notit jejich rozlišení. Aby nedošlo k deformaci písmene, je potřeba, před změnou rozlišení, přidat okraje tak, aby byl poměr stran 1:1. Výsledné rozlišení vzorků je 32x32 pixelů. Nakonec je ke každému písmenu přiřazeno označení, na základě pozice písmene v tabulce.

Zdrojový kód 1: Nalezení písmen ve formuláři

1 Normalize ( currForm ) ;

cv : : Rect r o i = FindROI ( currForm ) ;

3 l e t t e r s = F i n d L e t t e r s ( currForm , r o i [ 0 ] ) ; auto temp = F i n d L e t t e r s ( currForm , r o i [ 1 ] ) ;

Ve zdrojovém kódu jsou použity mé funkce. Celá implementace jednotlivých funkcí je příliš rozsáhlá a je k dispozici na přiloženém CD v adresáři Database_Creator.

Na prvním řádku se normalizuje formulář a upraví se jeho kontrast a jas. Druhý řádek nalezne dva obdélníky, ve kterých se nachází tabulky. Následující dva řádky vyhledají všechna písmena, každý v jedné tabulce. Tento proces se provádí při každé aktualizaci formuláře, aby byly vidět změny po upravení jasu nebo kontrastu.

Finální úpravu obrázku s písmenem provede funkce ExtractSamples({ 32,32 }).

V argumentu této funkce lze upravit výsledné rozlišení obrázku na libovolnou hod- notu, ale v této práci jsou zapotřebí obrázky s rozlišením 32x32 pixelů.

Všechna písmena jsou uložena do jednoho souboru a jejich třídy jsou uloženy do druhého souboru. Formát těchto souborů je téměř totožný s databází MNIST.

Rozdílem je, že data MNIST jsou uloženy ve tvaru big-endian, ale výsledná data z tohoto programu jsou ve formě little-endian. Všechny informace v hlavičce souboru jsou uloženy jako 32 bitové číslo a data jsou uložena jako série 8 bitových čísel. Tento formát tedy dokáže uložit maximálně 256 různých tříd. Písmena jsou ukládána jako černobílý obrázek, jehož pixely mají hodnoty v rozmezí 0 až 255. Hlavička obou souborů se skládá z kontrolního čísla a rozměru uložených dat. Kontrolní číslo je 2051 pro soubor s písmeny a 2049 pro soubor tříd. Rozměr je v případě tříd pouze jedno číslo s počtem vzorků. V případě písmen jsou potřeba tři čísla, první opět vyjadřující počet vzorků a další dvě nesoucí údaj o šířce a výšce každého písmene.

1.6 Rozdělení dat pro účely strojového učení

Při strojovém učení je důležité, aby existovala oddělená data pro trénování a testová- ní. Pokud by data nebyla oddělena, pak výsledná přesnost nevypovídá o schopnosti rozpoznávat nová data.

Databáze písmen z bakalářské práce je rozdělena na trénovací, validační a testo- vací sadu. Validační sada slouží pro vyhledání vhodných hyperparametrů, které jsou součástí učení a proto nemohou být hledány pomocí testovacích dat. Testovací data by měla sloužit pouze ke konečnému vyhodnocení přesnosti klasifikátoru. Testovací sada slouží k simulaci dat, která klasifikátor vidí poprvé. Testovací a validační sada

(23)

obsahuje každá 5200 vzorků, neboli 200 vzorků na jedno písmeno.

Bakalářská práce operuje se třemi sadami trénovacích dat, které se liší počtem vzorků písmene z každého formuláře. Tyto tři verze obsahují jeden, tři a pět vzorků každého písmene z každého formuláře. Tato sada trénovacích dat je použita k prů- zkumu, jak počet vzorků ovlivňuje výslednou přesnost rozpoznávání. Jednotlivé sady jsou uloženy v souborech s příponou .dat a jmenují se:

• Trénovací data s jedním vzorkem písmen z každého formuláře - TrainLetters1.dat a TrainLabels1.dat

• Trénovací data se třemi vzorky písmen z každého formuláře - TrainLetters3.dat a TrainLabels3.dat

• Trénovací data s pěti vzorky písmen z každého formuláře - TrainLetters5.dat a TrainLabels5.dat

• Validační data - ValidationLetters.dat a ValidationLabels.dat

• Testovací data - TestLetters.dat a TestLabels.dat

Pro zjednodušení jsou trénovací data označována jako DataX, kde X je počet vzorků každého písmene z každého formuláře. Počty vzorků v jednotlivých sadách jsou v tabulce 1.

Tabulka 1: Množství vzorků ve vytvořených sadách dat

Sada dat Data1 Data3 Data5 Validační data Testovací data

Počet vzorků 6438 19311 32054 5200 5200

1.7 Hodnocení experimentů

Nejdůležitější informací, u každé metody, je přesnost rozpoznávání vzorků. Přesnost rozpoznávání p určuje poměr počtu správně rozpoznaných vzorků S a celkového množství vzorků N.

p = S

N (1)

Další, již méně důležitou, informací je rychlost rozpoznávání, kde se měří čas, za který se rozpozná jeden vzorek. Rychlost rozpoznávání je důležitá pro aplikace bě- žící v reálném čase. Měření rychlosti rozpoznávání probíhá pouze s jedním vzorkem a jedná se tak o nejhorší případ. Pokud by se zpracovávalo víc prvků najednou, pak lze očekávat kratší čas rozpoznávání jednoho vzorku. Toto zkrácení bude význam- nější u lineárního klasifikátoru a neuronové sítě, z důvodů optimalizace maticového násobení.

23

(24)

Naměřená rychlost je závislá na výpočetním výkonu zařízení, takže rychlosti nejsou pevně dané a jsou pouze orientační. Všechny výpočty, metod implemento- vaných v této bakalářské práci, probíhali na osmijádrovém procesoru AMD FX- 8300. Tento procesor není nijak zvlášť výkonný, takže lze očekávat podobné rych- losti rozpoznávání i na průměrném stolním počítači. Grafická karta, kterou využívá MATLAB, je NVIDIA GeForce GTX 960. Grafická karta je poměrně výkonná a vý- znamně zrychluje proces učení v programu MATLAB.

(25)

2 Použité metody rozpoznávání

Všechny použité metody se učí z databáze trénovacích dat, což z nich dělá univer- zální metody, řešící mnoho úloh, po změně databáze. U každé metody jsou uvedeny důležité údaje o rychlosti a přesnosti rozpoznávání. Dále je uvedena přesnost rozpo- znávání při použití menšího počtu trénovacích vzorků. Každá metoda má na svém vstupu rozpoznávaný vzorek, který má vycentrované hodnoty příznaků. Centrování je provedeno odečtením průměru všech příznaků v sadě a zrychluje tím učení neu- ronových sítí. Lze ho nahradit zařazením Batch-normalizace před vstup do první vrstvy neuronové sítě.

Lineární klasifikátor, neuronová síť a konvoluční neuronová síť jsou také porov- nány s obdobnými metodami v programu MATLAB. Tento program mi posloužil jako inspirace o praktickém fungování neuronových sítí. Existují i další metody roz- poznávání písmen, ale tyto metody jsou složité na implementaci a nedosahují tak dobrých výsledků ani rychlostí jako použité metody v této bakalářské práci.

Pro implementaci a sledování průběhu učení jsem vytvořil samostatný program.

Uživatelské prostředí tohoto programu je zobrazeno na obrázku 4. Tato aplikace ob- sahuje graf, kde lze vykreslovat průběhy užitečných veličin. Dále umožnuje ovládat stav učení. Learning Rate ovládá rychlost učení a Decay rate ovládá míru automa- tického snižování rychlosti učení.

Obrázek 4: Uživatelské rozhraní programu pro implementaci metod rozpoznávání

25

(26)

2.1 Metoda nejbližšího souseda

Tato metoda je jedna z nejjednodušších metod ve strojovém učení. Přistoupil jsem k použití této metody, abych si vyzkoušel, jak fungují maticové výpočty v knihovně Eigen.

Jádrem metody nejbližšího souseda je porovnávání rozpoznávaného vzorku se všemi trénovacími vzorky. Porovnávají se všechny příznaky, v případě této baka- lářské práce se jednalo o porovnávání hodnot pixelů. Výslednou rozdílnost, nebo vzdálenost, lze vyjádřit několika vztahy. Bakalářská práce využívá pouze kvadratic- ké vzdálenosti, také označované jako L2, která sčítá druhé mocniny rozdílů příznaků, jak je vidět v rovnici (2). Výsledkem této metody je třída nejbližšího trénovacího vzorku, která je považována za stejnou, jako třída rozpoznávaného vzorku.

C = (yi− xi)2 (2)

Obrázky, nebo obecně vstupy, na které je aplikována metoda nejbližšího souseda lze interpretovat jako body v prostoru. Aby bylo možné vizualizovat metodu nejbližšího souseda, je nutné, aby vstupem byly pouze dva příznaky. Důvod, proč se tato metoda nazývá nejbližší soused, je nejlépe vidět na obrázku 5. Barevné body jsou trénovací data a jejich barva určuje, do které třídy patří. Barevné plochy určují předpovězenou třídu bodu na daném místě. Příznaky těchto bodů jsou jejich souřadnice.

Obrázek 5: Znázornění metody nejbližšího souseda. Obrázek je vytvořen v interak- tivní aplikaci [3]

Při trénování této metody se pouze uloží všechny trénovací vzorky do operační paměti, což je výpočetně velmi rychlé, ale v případě velké trénovací sady by mohl nastat problém s nedostatkem této paměti.

Rozpoznávání je na rozdíl od trénování velmi pomalé, což je hlavní důvod, proč je tato metoda pro většinu aplikací nepraktická. Důvodem pomalého rozpoznávání je fakt, že pokud trénovací sada obsahuje 30000 vzorků, je nutné provést porovnávání dvou vzorků 30000x což je výpočetně náročné.

(27)

Příkladem dalšího nedostatku, je lineárně se prodlužující doba rozpoznávání, při zvýšení počtu trénovacích dat. Ostatní metody uvedené v této práci mají čas rozpoznávání nezávislý na počtu trénovacích vzorků. Výsledky metody nejbližšího souseda jsou v případě použití databáze MNIST až překvapivě dobré, což je způ- sobeno velkým počtem trénovacích vzorků a menším počtem tříd. Velké přesnosti rozpoznávání čísel z databáze MNIST také napomáhá fakt, že jsou čísla vycentro- vána tak, aby těžiště každého tvaru bylo uprostřed obrázku. Hyperparametr K je nastaven na hodnotu 6, v případě rozpoznávání písmen, a 7 při rozpoznávání čísel.

Učení trvá méně než 1 µs, ale rozpoznávání trvá příliš dlouho pro použití v real-time aplikaci.

Tabulka 2: Výsledky rozpoznávání metodou nejbližšího souseda Sada dat Přesnost Doba rozpoznávání [ms/vzorek]

Data1 65,1 % 5

Data3 71,3 % 15

Data5 74,1 % 26

MNIST 96,7 % 34

2.1.1 K-nejbližších sousedů

Při seřazení nejbližších vzorků podle jejich podobnosti, často nastává situace, kdy nejbližší vzorek není ze správné třídy, ale následující nejbližší vzorky už jsou správ- né. Z tohoto důvodu je vhodné pracovat s K nejbližšími vzorky, kde K je hyper- parametr. Třída, která je nejčastější v těchto nejbližších vzorcích, je prohlášena za správnou. Správným nastavením hyperparametru K lze významně zlepšit přesnost rozpoznávání.

Jak je vidět na obrázku 6 prostory jsou více plynulé a osamocený modrý bod v červené části již nevytváří modrou oblast jako na obrázku 5. Jedná se o užitečnou vlastnost, kdy lze předpokládat, že tento osamocený modrý bod je pouhou náhodnou výjimkou.

Obrázek 6: Příklad metody K nejbližších sousedů z interaktivního dema [3]

27

(28)

2.1.2 Nastavení hyperparametrů

Protože hyperparametry K nelze přesně určit, zbývá pouze experimentální hledání hodnot. Hledání ideální hodnoty hyperparametru je součástí učení, a proto nesmí probíhat na testovací sadě. Existuje několik metod hledání hyperparametrů.

První nejjednodušší metodou je pouhý odhad. Odhadem za pomoci grafu tréno- vacích a validačních přesností, lze poměrně dobře nastavit Dropout nebo regulari- zaci. Z grafu lze vyčíst, zda je Dropout moc silný nebo naopak moc slabý a podle této informace se jeho síla upraví.

Druhou metodou, použitou pro nalezení hyperparametru K, je postupné zvyšo- vání K až do doby, kdy přesnost rozpoznávání validačních dat začne výrazně klesat.

Tato metoda je zobrazena na obrázku 7. Ideální hodnota hyperparametru je zvolena na základě nejlepší přesnosti rozpoznání validačních dat. Tato metoda je dostačující k nalezení celočíselných hyperparametrů v malém rozmezí hodnot.

Obrázek 7: Hledání optimální hodnoty hyperparametru K

Třetí metoda je vhodná pro hledání hyperparametrů ve větším prostoru, na- příklad pro hledání reálných čísel, nebo pro hledání více hyperparametrů najednou.

Hyperparametry jsou nastaveny náhodně v určeném rozmezí. Rozmezí musí uživatel nastavit na základě odhadu. Ve velkém rozmezí bude hledání trvat dlouho, zatím- co malé rozmezí nemusí obsahovat ideální nastavení. Možností je nejprve udělat hrubé hledání ve velkém rozmezí a následně ho zmenšit na okolí nejlepšího nastave- ní z hrubého hledání. Takto se často hledají hyperparametry jako například rychlost učení.

V průběhu učení dochází ke změnám některých hyperparametrů, jako například rychlost učení. Výhodnější možností je měnit tyto parametry podle aktuální situace.

Tento postup je ve většině případů rychlejší než náhodné nastavení, protože učení v případě hlubokých neuronových sítí může trvat i několik hodin.

(29)

2.2 Metoda využívající etalony tříd

I když tato metoda vychází z principu nejbližšího souseda, je uvedena zde jako samostatná metoda z důvodu velmi odlišných vlastností trénování a rozpoznávání.

Hlavní nevýhodou metody nejbližšího souseda je doba rozpoznávání, která line- árně roste s počtem trénovacích vzorků. Tento problém lze vyřešit vytvořením šablon průměrných vzorků z každé třídy. Tyto šablony jsou nazývány etalony. Etalony jsou vytvořeny na základě trénovacích dat, například zprůměrováním hodnot pixelů nebo vypočítáním variance každého pixelu. Následně se rozpoznávaný vzorek porovnává pouze s etalony. V této práci byly etalony vytvořeny pouhým zprůměrováním.

Trénování v této metodě je pomalejší než v případě metody nejbližšího souseda, ale rozdíl doby trénování je zanedbatelný. Zpomalení je způsobeno vytvářením eta- lonů, kdy je potřeba zpracovat všechny trénovací vzorky a vypočítat z nich každý etalon.

V rozpoznávání jsou vidět značné rozdíly a to nejen v době, za kterou je daný vzorek rozpoznán, ale i v přesnosti rozpoznávání. Doba rozpoznávání je nejnižší ze všech použitých metod a není závislá na počtu trénovacích vzorků. Cenou za rychlost je v tomto případě zhoršení přesnosti rozpoznávání. Etalony sice dobře rozpoznají

„průměrné“ vzorky, ale mají problém s unikátními vzorky, které se hodně liší od průměru. Jinak řečeno špatně se učí obecné rysy, které definují každé písmeno.

Tato metoda je opět nepraktická z důvodu nízké přesnosti, ale pokud by záleželo více na rychlosti než na přesnosti, pak by tato metoda mohla být řešením úlohy.

Výsledkem jsou etalony, na kterých jsou patrné rozmazané tvary písmen, což je důsledek toho, že každý člověk píše trochu jinak. Tam kde je písmeno nejtmavší, bylo vedeno nejvíce čar.

Obrázek 8: Příklady etalonů písmen A, E, O, R a Z

Pro malé množství trénovacích dat je tato metoda dokonce úspěšnější než metoda nejbližšího souseda. Pro větší sadu trénovacích dat má tato metoda menší přesnost rozpoznávání, ale výhodou je vysoká rychlost, která se pohybuje okolo 20 µs na jeden vzorek. Trénování je podobně rychlé jako rozpoznávání. Toto však v praxi nebývá výhodou.

29

(30)

Tabulka 3: Výsledy rozpoznávání metodou nejbližšího souseda s etalony Sada dat Přesnost

Data1 65,7 % Data3 66,5 % Data5 66,6 % MNIST 81,9 %

2.3 Lineární klasifikátor

Obě předchozí metody jsou založeny pouze na ukládání trénovacích vzorků v určité podobě, které se následně porovnávají s rozpoznávaným vzorkem. Lineární klasifiká- tor je první metodou, u které lze mluvit o opravdovém učení. Lineární klasifikátor je speciálním případem neuronové sítě, která nemá skryté vrstvy. Vstupem je sloupco- vý vektor příznaků, což znamená, že v případě obrázků je ztracena informace o pozici pixelu v obrázku, protože všechny pixely jsou roztažené do jednoho vektoru.

V případě rozpoznávání písmen, kdy probíhá klasifikace do jedné z 26 tříd, si lze lineární klasifikátor představit jako 26 perceptronů, z nichž je každý připojený ke každému vstupnímu pixelu s určitou vahou. Perceptron je velmi zjednodušený matematický model neuronu, ze kterých je tvořen lidský mozek.

Každý perceptron má N vstupních příznaků xi. Každý vstupní příznak má ur- čitou váhu, se kterou vstupuje do perceptronu. Po vynásobení vstupů a jejich vah se všechny prvky sečtou. Poslední částí perceptronu je aktivační funkce f, která je popsána v kapitole 2.4.1. V lineárním klasifikátoru jsem použil perceptrony bez aktivační funkce. Název perceptronů se nepoužívá velmi často, místo toho se o per- ceptronech mluví jako o neuronech.

Obrázek 9: Schéma perceptronu

Tato metoda si nepamatuje trénovací vzorky, ale pouze sadu parametrů neboli vah W, které se na základě trénovacích dat učí užitečné informace o rozpoznávaných objektech. Po naučení parametrů už nejsou používány trénovací data a klasifikátor pracuje pouze s maticí W.

Každý řádek matice vah lze interpretovat jako samostatný klasifikátor pro jednu třídu. Každý klasifikátor vytvoří skóre pro danou třídu na základě jistoty, že vstupní vektor patří do příslušné třídy. Výstupní vektor z je složen z těchto skóre a nejvyšší skóre označuje výslednou třídu. Klasifikátory jsou takto seřazeny pod sebou, aby se

(31)

mohlo využít maticového násobení. Všechny klasifikátory jsou vyhodnoceny v jedné operaci, jak je vidět v rovnici 3. K výslednému vektoru bývá přidán takzvaný bias vektor b, který obsahuje další parametry, ale přínos je jen velmi malý. V bakalářské práci je podobného efektu docíleno přidáním Batch-normalizace.

z = W × xi + b (3)

Další možnou interpretací metody lineárního klasifikátoru je oddělování bodů nadro- vinami v N dimenzionálním prostoru, kde N je počet vstupních příznaků. Každý řádek matice W definuje jednu nadrovinu. Pokud jsou pouze dva vstupní příznaky, pak se tento problém zjednoduší na oddělování bodů přímkami v 2D prostoru.

Obrázek 10: Interpretace funkce lineárního klasifikátoru z interaktivní aplikace [1]

Obrázek 10 je vytvořen pro vstupní data o dvou příznacích. Na tomto obrázku lze vidět tři přímky, které jsou definovány naučenou maticí vah W. Kombinací těchto tří přímek vznikají tři oblasti, které vypovídají o výsledku klasifikace. Pokud bude nový bod v modré oblasti, pak ho klasifikátor zařadí do třídy modrých bodů. Obrázek 10 je pořízen z interaktivního dema [1], pro vyzkoušení fungování lineárního klasifikátoru.

V tomto demu lze sledovat všechny parametry tohoto klasifikátoru.

I když se jedná o speciální případ neuronové sítě, je tato metoda užitečná, proto- že umožňuje porovnání matice parametrů W s etalony z předchozí metody. Každý řádek matice W lze interpretovat jako samostatný etalon pro jedno písmeno. V ma- tici W by mohly vzniknout podobné písmena, jako ty z předchozí metody, pokud by to byla optimální cesta klasifikace. I když jsou písmena, uložená v matici W, pro člověka nečitelná, jedná se o optimálnější etalony, které vedou k lepší přesnosti rozpoznávání.

31

(32)

Obrázek 11: Příklady klasifikátorů písmen A, E, O, R a Z

Odlišný vzhled obrázků je způsoben tím, že etalony v metodě nejbližšího sou- seda měly pouze kladné hodnoty. Lineární klasifikátor používá i záporné hodnoty, které jsou na obrázku 11 znázorněny bílou barvou. Záporné hodnoty způsobí, že pokud touto pozicí prochází část písmene, je ohodnocení pro danou třídu sníženo.

Výsledkem poklesu ohodnocení, je nižší šance, že písmeno patří do dané třídy. Toto je dobře vidět u písmene ”O”.

K tomu, aby se mohl lineární klasifikátor učit, je zapotřebí, znát gradient vstupu

∂L

∂x, parametrů W ∂W∂L a případně parametrů b ∂L∂b pokud jsou použity.

∂L

∂x = WT × ∂L

∂z (4)

∂L

∂W = ∂L

∂z × xT (5)

∂L

∂b = ∂L

∂z (6)

Výsledky rozpoznávání lineárním klasifikátorem jsou dle očekávání lepší než výsled- ky z metody nejbližšího souseda. Učení této metody trvá přibližně jednu minutu a rozpoznání jednoho vzorku zabere přibližně 90 µs. Regularizace neměla pozitivní vliv na výsledky rozpoznávání a ani nedocházelo k výraznému přetrénování. Velikost dávky byla zvolena 1024, počáteční rychlost učení 0,1 a její exponenciální snižování s faktorem 0,998.

Tabulka 4: Výsledky rozpoznávání lineárním klasifikátorem Sada dat Přesnost Přesnost MATLAB

Data1 77,5 % 75,4 %

Data3 79 % 77,1 %

Data5 79,6 % 78,6 %

MNIST 90,8 % 90,4 %

Jelikož se jedná o speciální případ neuronové sítě, pokusil jsem se vytvořit po- dobnou síť v programu MATLAB, s využitím Neural Network toolboxu. Učení v MATLABu je rychlejší, což lze očekávat, protože MATLAB využívá výpočet- ního výkonu grafické karty. V MATLABu docházelo k většímu přetrénování a ani v MATLABu neměla regularizace pozitivní účinek.

(33)

2.3.1 Chybová funkce

Aby se mohla jakákoliv metoda učit, musí být nejprve určeno ohodnocení, jak dobře či špatně umí rozpoznávat dané vzorky. Ohodnocení je možné, pouze pokud je ke každému vzorku známa třída, do které patří. Mezi dvě nejznámější chybové funkce patří Softmax a Support Vector Machine, neboli SVM. V praxi mají tyto dvě chybové funkce velmi podobné výsledky, proto je v této práci použita pouze funkce SVM.

Funkce SVM vytvoří ohodnocení v podobě číselné hodnoty z výstupního vektoru.

SVM „chce“ aby skóre správné třídy bylo alespoň o ∆ větší než skóre ostatních tříd.

Pokud je největší skóre o ∆ větší než všechny ostatní skóre, poté je ohodnocení rovno 0, neboli výstupní vektor se shoduje se správným výsledkem. V opačném případě ohodnocení vyjadřuje, jak moc je výsledný vektor špatně.

L =

j̸=yi

max (0, sj − syi + ∆) (7)

2.3.2 Učení

Parametry v matici W jsou na začátku náhodně nastaveny, a postupem času se musí měnit tak, aby po vynásobení s vstupním vektorem x klasifikátor správně předpoví- dal třídu vstupního vektoru. K učení je využita chybová funkce, která je definována tak, aby pro správné předpovědi hodnotila klasifikátor nízkými hodnotami. Jelikož je hodnocení závislé na parametrech W, lze problém učení považovat za hledání mi- nima funkce s proměnnými parametry. Pokud by chybová funkce byla závislá pouze na dvou parametrech, pak ji lze zobrazit ve 3D, kde souřadnice x a y jsou proměnné parametry a souřadnice z zobrazuje výsledné ohodnocení z chybové funkce.

Obrázek 12: Příklad chybové funkce s dvěma proměnnými parametry

I když se může zdát, že stačí náhodně zkoušet různá nastavení parametrů W, v praxi by tento postup mohl fungovat jen pro klasifikátory s malým počtem para- metrů. S rostoucím počtem parametrů se zvyšuje i dimenze prostoru, ve kterém je hledáno minimum. V případě lineárního klasifikátoru, který má na vstupu vektor o velikosti 1024 prvků a 26 tříd, je v klasifikátoru 26624 parametrů. V tak velkém

33

(34)

prostoru by náhodné hledání trvalo příliš dlouho. Náhodné hledání, v efektivněj- ší formě, je však v některých případech jediným způsobem, jak najít parametry.

Jedna z efektivnějších forem náhodného hledání parametrů je například genetický algoritmus.

Efektivnější hledání minima lze dosáhnout pomocí gradientu funkce. Gradient vyjadřuje, jakým směrem funkce stoupá. Pokud je od parametrů odečten gradient, pak lze předpokládat, že klasifikátor bude při stejném vstupu ohodnocen nižší hod- notou. Nižší hodnota ohodnocení znamená, že klasifikátor vytvořil lepší předpověď.

Analogií k optimalizační úloze je kulička na okraji misky, která se postupně skutálí na dno misky. Stejně tak se bod, definovaný parametry klasifikátoru, ”skutálí” do lokálního minima chybové funkce.

Tato metoda učení se nazývá Stochastic Gradient Descent, neboli SGD, ve vol- ném překladu stochastický sestup po gradientu. Mnohem častěji se však používá Mini-batch Gradient Descent - MGD, kde se gradient nevytváří pouze z jednoho vstupního vektoru, ale z dávky vstupních vektorů – mini-batch. Zatímco SGD op- timalizuje klasifikátor pouze pro jednu třídu za jednu iteraci, MGD optimalizuje klasifikátor pro všechny třídy zároveň v jedné iteraci. MGD vytváří stabilnější gra- dient a tím umožňuje sestup k minimu po kratší dráze. Čím větší je dávka, tím kvalitnější gradient je vytvořen. Proto se velikost dávky nastavuje v rozmezí 128 až 1024 vzorků, pokud se všechna data vejdou do operační paměti.

Jelikož se jedná o iterativní proces, je potřeba zvolit, jak velký skok ve směru gradientu se provede. Velikost kroku neboli rychlost učení se volí hyperparametrem λ. Pokud je rychlost učení příliš malá, pak hledání minima trvá déle a je možné, že se sestup ustálí v neoptimálním lokálním minimu. Naopak pokud je rychlost učení příliš velká, tak je sestup k minimu rychlý, ale je možné, že se bod neustálí v úplném minimu, ale bude oscilovat okolo tohoto minima. Z toho vyplývá, že je na začátku dobré sestupovat rychle a ke konci sestup zpomalit, aby došlo k sestupu až na minimum. Proto se často hyperparametr λ během učení snižuje. Postupů, jak snižovat rychlost učení, je hned několik. Pro tuto bakalářskou práci jsem zvolil exponenciální snižování rychlosti učení pomocí hyperparametru λdec. λdecmůže mít hodnotu mezi 0 a 1, ale většinou je velmi blízko 1, například 0.999, z čehož vyplývá, že při každé iteraci je rychlost učení snížena.

λ = λdec · λ (8)

Pro vypočítání gradientu je zapotřebí znát lokální derivaci dané funkce. Jelikož jsou v této práci používány vrstvy, výsledná derivace se skládá z lokálních derivací jed- notlivých vrstev, které se složí dohromady podle pravidla o derivaci složené funkce.

Derivace složené funkce znamená, že lokální derivace dané vrstvy se vynásobí s gra- dientem výstupu dané vrstvy ∂L∂z, který je roven gradientu vstupu následující vrstvy

∂fi+1

∂x . Takto se gradient postupně šíří z výstupu poslední vrstvy, který je rovný 1, skrz všechny vrstvy.

(35)

2.3.3 Regularizace

Hlavním cílem učení je, aby klasifikátor správně rozpoznal vzorky, které vidí poprvé.

Ty mohou být unikátní, a proto je potřeba, aby se klasifikátor učil obecné informace.

Pokud se klasifikátor naučí rozpoznávat pouze vzorky, které už viděl, nebo které jsou téměř totožné s trénovacími vzorky, pak se mluví o přetrénování, neboli overfitting.

Jedná se o velký problém v neuronových sítích a regularizace je jednou z možností jak přetrénování omezit.

Regularizace je součástí chybové funkce, kde se přičte regularizační penalizace.

Zatímco chybová funkce hodnotí správnost rozpoznávání, regularizace hodnotí pa- rametry W. Pokud se v matici W nachází malé množství parametrů s vysokými hodnotami, zatímco ostatní parametry mají hodnoty blízké nule, pak pravděpodob- ně dochází k přetrénování, protože nejsou využity všechny příznaky ze vstupního vektoru. To znamená, že se klasifikátor dívá pouze na několik málo příznaků, které byly rozhodující pro trénovací data, ale pravděpodobně se nejedná o pravidla, která by platila obecně.

Nejběžnější regularizační penalizace je L2, neboli kvadratická penalizace. Tato penalizace bude „trestat“ vysoké hodnoty parametrů, a tím budou mít parametry tendenci být více rozprostřené a tím budou lépe využívat všechny dostupné příznaky ze vstupního vektoru.

R (W ) =

k

l

Wk,l2 (9)

Síla regularizace se nastavuje hyperparametrem η. Správné nastavení tohoto hy- perparametru lze nejlépe poznat, pokud je přesnost rozpoznávání trénovacích dat podobná přesnosti rozpoznávání validačních dat. Pokud je přesnost rozpoznávání trénovacích dat výrazně vyšší, pak je regularizace příliš slabá a dochází k přetréno- vání. Úplná forma chybové funkce je zobrazena v rovnici 10.

L = 1 N

i

Li + ηR (W ) (10)

Gradient regularizace ∂W∂R, je nutné přičíst k lokálnímu gradientu parametrů W.

∂R

∂W = 2· η · W (11)

35

(36)

2.4 Dopředná hluboká neuronová síť

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-connected znamená plně propojená, což naznačuje, že všechny neurony sousedních vrstev jsou navzájem propojeny.

(37)

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

(38)

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)

(39)

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

(40)

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.

(41)

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ší.

µ = 1 M

M

i=1

xi (13)

σ2 = 1 M

M

i=1

(xi− µ) (14)

ˆ

xi = xi− µ

σ2 + ϵ (15)

zi = γ· ˆxi+ β (16)

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

∂ ˆxi

= ∂L

∂zi

· γ (17)

∂L

∂σ2 =

M

i=1

∂L

∂ ˆxi · (xi − µ) · −1 2

(

σ2+ ϵ)−3/2 (18)

∂L

∂µ =

(M

i=1

∂L

∂ ˆxi · −1

σ2+ ϵ

)

+ ∂L

∂σ2 ·

M

i=1−2 · (xi − µ)

M (19)

∂L

∂xi = ∂L

∂ ˆxi · 1

σ2 + ϵ + ∂L

∂σ2 · 2 (xi − µ)

M + ∂L

∂µ · 1

M (20)

∂L

∂γ =

M

i=1

∂L

∂zi · ˆxi (21)

∂L

∂β =

M

i=1

∂L

∂zi (22)

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

References

Related documents

Doba zpracování signálu, tedy metoda paCallback byla měřena pomocí volání funkce std::chrono::steady_clock::now() na začátku a na konci této metody, po odečtení těchto

Po formSlni strdnce je prdce vypracovdna na odpovidajici [rovni. V textu se v5ak vyskytuji drobn6 nedostatky, kte16 by se v disertadni prdci nem6ly vyskytovat. WORD

hocnoceni nov6 metody tvorby rastru na folii i hodnoceni zp0sobu piedehievu pomocl obou uvedenych zdiic0 (keramickd deska a lR trubicov! zaiic) Velmi kvalitnijsou i

Praktická část podává velmi přesný obraz, které kon- krétní metody ověřování, hodnocení a klasifikace využívají v hodinách českého jazyka oslo- vení učitelé a

Nad rámec zadání byla řešena fonetická transkripce pro do- sažení lepší kvality syntetizované řeči a dále byl Tacotron 2 model rozšířen o vektory mluvčího (tzv.

Cflem bakaldiskd pr6ce je hodnocenf Szik6lnich a mechanickych vlastnosti polymemfch kompozitu s rostlinnfmi vldkny kokosu v z6vislosti na hmotnostnfm obsahu... V tivodu

Houghova transformace je metoda sloužící k hledání definovaných objektů v obrázku. Protože vyžaduje, aby hledaný objekt byl parametricky popsán, klasická

Teoretickii d6st je logicky dlendnS. Autor popisuje pifrodnf vlSkna rostlinndho pfivodu jejich chemickd sloZenf a mechanickd vlastnosti. Poukazuje na kritickou