12.9.2017

foto Petr Bravenec

Petr Bravenec
Twitter: @BravenecPetr
+420 777 566 384
petr.bravenec@hobrasoft.cz

Různými oklikami jsem se dostal k používání neuronových sítí ve svých aplikacích. Prvním nápadem bylo rozeznávání různých objektů ve video proudu. Při studiu knihovny OpenCV jsem narazil na třídy pro rozeznávání obrazu, neuronové sítě a strojové učení. Odtud už vedl jen krok k nápadu, že mám k dispozici letitou úlohu, která by šla elegantně řešit pomocí neuronové sítě.

V grafickém vyjádření balíku dat lze rozeznat některé charakteristické jevy, které i na první pohled snadno rozliší oko vycvičeného odborníka, ale je velmi obtížné takový jev rozeznat například statistickými metodami. Potíž spočívá v množství dat. Pokud chcete prozkoumat a roztřídit milión grafů, je pravděpodobné, že odborník vám po třetím zvýšení platu uteče na klidné místo pokladního v nejbližším supermarketu.

Umělá neuronová síť je schopná se naučit rozeznávat typické závady a jevy a ochotně pracuje i v noci, o sobotách i o nedělích. S velkou pravděpodobností nedosáhne odborné úrovně vašeho odborného pracovníka, který si nyní léčí nervy za kasou v supermarketu, ale vzhledem k velkému objemu dat dokáže i poměrně hloupá neuronová síť vytvořit solidní statistické přehledy, ze kterých bývají jasně patrné případné problémy či trendy. V konečném důsledku tak může neuronová síť ušetřit velké objemy peněz.

Typy neuronových sítí

Neuronových sítí je celá řada různých typů. Neuronové sítě mohou například označovat obličeje v hledáčku fotoaparátu (konvoluční sítě), rozeznávat psané písmo (rekurentní sítě) nebo třeba předpovídat cenu na burze (rekurentní sítě).

Pro kategorizaci – tj. rozeznávání různých typických jevů a jejich roztřídění do několika škatulek – se používají nejčastěji jednoduché neuronové sítě označované v anglické literatuře jako sítě typu "feed-forward". Taková síť má celkem prostou topologii – několik vstupních neuronů, skrytou vrstvu a několik výstupních neuronů. Vstupní neurony jsou napojené přímo na hodnoty v grafu, výstupní neurony pak vyjadřují podle své hodnoty příslušnost k některé z rozeznávaných kategorií.

Při kategorizaci se používají dva základní postupy účení:

Učení s učitelem

Lidský odborník označí ručně dostatečné množství typických situací a předloží je k naučení neuronové síti. Neuronová síť je po natrénování schopná rozeznat charakteristické znaky každého označeného jevu.

Učení neuronové sítě je jednoduchá, ale nesmírně pracná, piplavá a zdlouhavá práce. Výsledná síť však pracuje rychle a efektivně.

Učení bez učitele

Neuronová síť neví, co má v datech nalézt. Po několikerém zpracování vstupních vzorků dat však dokáže neuronová síť rozeznat v datech opakující se vzory a je schopná si vytvořit vlastní kategorie, podle kterých roztřídí vstupní vzorky dat. Po úvodním roztřídění do kategorií se síť natrénuje na jejich rozeznávání a s nově nabytými zkušenostmi znovu roztřídí vstupní vzorek dat. Celý postup se mnohokrát opakuje a výsledkem jsou jak vytvořené kategorie jevů, tak i roztřídění vzorků do těchto kategorií.

Krásný příklad jsem nalezl na internetu: neuronové síti byly předložené různé fotografie tygrů a koček a neuronová síť byla schopná rozeznat, že jde o dva různé druhy zvířat a roztřídit je na dvě různé hromádky.

Nevýhoda je zřejmá: nikdy nevíte, co síť v datech nalezne. A zároveň jde i o zjevnou výhodu: síť může z vašich dat vylovit věci, o jejichž existenci jste dosud neměli sebemenší tušení.

Další nevýhoda není tolik zřejmá: zpracování zabere opravdu velké množství strojového času a to i na velmi výkonných počítačích.

Implementace v Linuxu

S neuronovými sítěmi jsem si hrál poprvé před dvaceti lety. Algoritmus Back Propagation byl již tou dobou známý, ale jeho implementace v mé vlastní aplikaci nefungovala dobře. Navíc jsem měl k dispozici pouze nevýkonný dvoujádrový Sparc a vzhledem k výkonovým problémům jsem nebyl schopný dostatečně rychle získat vlastní zkušenosti s neuronovými sítěmi a své experimenty v této oblasti jsem opustil. Práce s neuronovými dokáže být velmi zdlouhavá.

Před dvaceti lety nebyla jiná možnost, než se pokusit o naprogramování vlastní sítě – dnes je vhodnější sáhnout po hotové knihovně s vhodnou licencí.

Při výběru knihovny jsem hleděl především na jednoduchost používání a na podporu grafických karet. Dalším kritériem byla vhodná licence.

Různých knihoven pro implementaci neuronových sítí jsem prozkoumal jistě tucet. Postupně jsem však vyzkoušel především tyto tři:

Fann

http://leenissen.dk/fann/wp/

Jednoduchá neuronová síť typu feed-forward.

Klady
  • Síť se používá skutečně velmi jednoduše.
  • Výborná dokumentace.
  • Interface k množství různých jazyků (C, C++, PHP a další)
  • K nalezení množství různých příkladů na internetu.
  • Licence LGPL.
Zápory
  • Jednovláknová (vývojové verze se dají spustit i vícevláknově). Zpracování v jednom vláknu je omezující především ve fázi učení, při samotném (paralelním) zpracování dat jednovláknovost nevadí.
  • Nelze spustit na grafické kartě. To je pro síť typu feed-forward opět nevýhoda především ve fázi učení (existuje port pro OpenCL, je však obtížné jej rozchodit a vyžaduje základní znalostí principů práce s grafickými kartami).

Apache Singa

http://www.comp.nus.edu.sg/~dbsystem/singa/

Velmi univerzální a výkonný projekt Singapurské národní univerzity. Z příkladů a dostupné dokumentace je patrné, že projekt se orientuje především na zpracování obrazu (konvoluční sítě, 2D vstupní data).

Klady
  • Implementuje různé architektury neuronových sítí.
  • Lze spustit na grafické kartě, podporuje CUDA i OpenCL.
  • Licence Apache.
Zápory
  • Mnohem složitější použití ve srovnání s FANN.
  • Nulová dokumentace k C++ – vše pouze pro Python, ačkoliv vlastní knihovna je napsaná v C++. Pro C++ je k dispozici pouze automaticky generovaný popis vlastních zdrojových souborů knihovny.
  • Citelně nižší počet příkladů na Internetu.
  • OpenCL část knihovny běžící v grafické kartě se mi nikdy nepodařilo rozběhat.

CNTK

https://github.com/Microsoft/CNTK

Ačkoliv se jedná o knihovnu společnosti Microsoft, jde o opensource a je možné ji provozovat i v operačním systému Linux. S knihovnou jsem experimentoval jen chvíli – chybějící podpora OpenCL mi nedovoluje ji používat na mé grafické kartě. Knihovně jsem se proto věnoval jen velmi okrajově. Přesto považuji za vhodné ji zde uvést.

Klady
  • Implementuje různé architektury neuronových sítí.
  • Pravděpodobně dost rozšířená.
  • Pravděpodobně velmi výkonná - dokáže pracovat na několika grafických kartách současně
Zápory
  • Nejasná licence.
  • Nepodporuje OpenCL.

Zkušenosti

Pokud se někdo pustí do aplikace neuronové sítě zcela bez zkušeností či bez nastudování teoretického pozadí, může být práce s neuronovou sítí velice frustrující.

První pokusy s neuronovou sítí tak obvykle nikam nevedou. Po měsíci práce je síť stále hloupá a člověk lituje času, který věnoval experimentům s něčím tak pitomým.

Po nějaké době normalizací a transformací začne síť vykazovat občasné záblesky nějakých schopností. Data pro neuronovou síť je nutné transformovat do podoby, která vyhovuje neuronové síti, pro lidi je však taková reprezentace dat nezvyklá či nečitelná. Vývojář se tak dostává do mírně schizofrenního stavu, kdy učitel vidí jiná vstupní data, než zpracovává neuronová síť.

S postupem doby bývají jisté známky inteligence stále častější, až se celý proces nečekaně přehoupne do stavu "Funguje to! Ta síť je geniální!"

Jenomže takový stav trvá jen do dalšího cyklu učení, kdy se síť začne chovat těžce retardovaně a v tomto stavu mentální retardace setrvá několik dalších týdnů. Nálada se pohybuje na stejné houpačce – od nemístného optimismu až k naprostému zoufalství. Jak přibývají tréninková data a jejich kvalita se zlepšuje, cykly mezi genialitou a debilitou se naštěstí postupně zkracují.

Přesto může práce s neuronovou sítí přivést slabší povahy do blázince, protože z hlavy nelze vypudit myšlenku, že kdyby stejný čas věnoval vyšívání webů na zakázku, mohl vydělat stovky tisíc navíc.

Proces učení

Pro neuronovou síť je potřeba připravit dostatečné množství reprezentativních vzorků. V literatuře je možné se dočíst, že neuronová síť umí zpracovat i zašuměná data. Naopak, v praxi je potřeba vybírat trénovací data velmi pečlivě. Pokud se v trénovacích datech vyskytnou nějaké anomálie, mohou velmi negativně ovlivnit výsledné schopnosti neuronové sítě.

S přibývajícími tréninkovými daty roste i čas potřebný pro celý cyklus. I na výkonné grafické kartě trvá proces učení několik hodin a to i přes to, že do výpočtu se intenzivně zapojí také procesor a všechny ventilátory v počítači. Proces tréninku sítě je tak nejlepší pouštět přes noc. Každý experiment, každá drobná rekonfigurace neuronové sítě tak zabere obvykle celý den.

Vhodným zaměstnáním pro nenapravitelné zločince a vrahy je výběr dat pro trénování neuronové sítě. Pro uspokojivé výsledky je nutné pečlivě posoudit a označit alespoň několik stovek tisíc balíků dat. Protože se v každém výběru dat vyskytují chyby, je nutné projít trénovací množinu dat nejlépe hned několikrát.

Ve výsledku tak trénování neuronové sítě spočívá v neustálém bičování zločinců, vrahů a neuronových sítí.

Vyhodnocení výsledků

Neuronová síť se snaží v průběhu procesu učení minimalizovat chybu mezi požadovaným a skutečným výstupem. Chybová funkce je však jednorozměrná. V průběhu práce je tak potřeba vypracovat vlastní metodiku pro vyhodnocení práce neuronové sítě, aby bylo možné odhalit slabá místa a koncentrovat úsilí na jejich odstranění.

Praktické výsledky

Natrénovaná neuronová síť nedosahuje úrovně zkušeného lidského odborníka. Síla lidského experta spočívá v tom, že dokáže rychle vybrat vhodná data, ve kterých lze najít hledané jevy a nemusí se zabývat zašuměnými, těžko rozeznatelnými případy. Odborník může navíc stavět na znalosti kontextu a interpretovat i jevy, které by bez dodatečných informací byly obtížně vysvětlitelné.

Síla umělé neuronové sítě leží v její mimořádné výkonnosti. Neuronová síť musí umět posoudit všechna předložená data, ať už jsou pro vyhledávání závad vhodná či ne. Často nalezne neuronová síť závadu i v zašuměných či nekompletních datech, kterými by se člověk vůbec nezabýval, protože by je vyhodnotil jako obtížně čitelná.

Ale stejně jako lidský oborník dokáže i neuronová síť určit, jestli je konkrétní balík dat vhodný pro hledání určité závady. Výsledkem práce neuronové sítě tak může být statistika čítající statisíce či milióny vzorků dat – zpracovat takové množství dat je zcela mimo lidské možnosti. A pokud je možné z této statistiky vyloučit nekvalitní data a lze se soustředit pouze na dobře rozeznatelné případy, může neuronová síť v úspěšnosti směle konkurovat i tomu nejlepšímu odborníkovi.

U každého hledaného jevu se výsledky liší. Jde-li o velmi časté jevy, se kterými má neuronová síť bohaté zkušenosti, je v kontrolním vzorku nalezeno i přes 99 % všech výskytů. U méně často se vyskytujících jevů je úspěšnost přes 80 %, často jsou však závady mezi sebou snadno zaměnitelné. Neuronová síť tak sice někdy určí závadu špatně, ale i přesto je schopná v drtivé většině případů na závadu upozornit.

Jevy které se vyskytují nejméně často, dokáže síť rozeznat s mírnými obtížemi. Úspěšnost nalezení takového jevu se pohybuje od 60 do 80 %. Může se zdát, že 60 % nalezených závad není mnoho, ale je třeba si uvědomit, že ve stovce tisíc kontrolních vzorků označí síť jen několik desítek či stovek případů (úspěšnost správného určení kategorie je přes 99 %), což ve výsledku vede alespoň k podezření na závadu. Pokud je od jednoho zařízení k dispozici několik tisíc datových balíků, statistické vyhodnocení výsledků neuronové sítě dokáže vadné zařízení identifikovat celkem úspěšně. A zde se projevuje výkonnost neuronové sítě naplno – lidský odborník by takovou závadu sice rozeznal zcela spolehlivě, je však mizivá šance, že by na ni v záplavě dat vůbec někdy narazil.

Pokud se do vyhodnocení zahrnou pouze jasně čitelná vstupní data, úspěšnost nalezení závady prudce vzrůstá. S trochou nadsázky se dá říci, že ve slušných datech nalezne neuronová síť dvojnásobek, tj. třeba i 180 % závadných zařízení (korektorka mě donutila napsat poznámku, že jde o vtip – není možné označit jako závadné 180 zařízení ze sta).

Hobrasoft s.r.o. | Kontakt