12. srpna 2017

Synaptický příběh


TL;DR 
Tento text, jenž vznikl asi před rokem, nebyl určen pro blog a v šuplíku beznadějně zastarává, vzhledem k tomu, jak rychle se proměňuje celá oblast hlubokého učení (GAN, attention, reinforcement...). Protože nemám motivaci k jeho dokončení a aktualizaci a protože se některé jeho predikce mezitím stihly vyplnit, umisťuji ho alespoň sem, bez obrázků a redakčních úprav, aby z něho měl užitek alespoň náhodný kolemjdoucí.

Neuronové sítě


Zajímáte-li se o umělou inteligenci a moderní počítačovou vědu, nemohl vám uniknout pojem hluboké učení (Deep Learning). Tento půl století starý termín vyvolává dnes velkou vlnu zájmu a nerealistická očekávání. Jde o neuvěřitelný příběh – od počátečního nadšení, přes dvakrát téměř zapomenutou větev výzkumu, až k dnešnímu masivně paralelnímu hardwaru a korporátnímu přetahování mozků.
Protože to není poprvé, co se odborná veřejnost a novináři popularizující vědu předhánějí v tvrzeních, že jde o "opravdový průlom v umělé inteligenci", je opatrnost a skepse samozřejmě na místě. Když si ale veškeré zlatokopecké nadšení odmyslíte a seznámíte se "hlouběji s hlubokým učením", zjistíte, že v oblasti umělých neuronových sítí, jichž se hluboké učení týká, došlo skutečně k zásadnímu pokroku.
Proč až dnes, když nejde o nijak nové myšlenky? První teoretické práce o perceptronech – archetypálních umělých neuronových sítích – se objevují již koncem padesátých let. Jak je tedy možné, že tyto systémy, o něž se donedávna zajímali jen doktorandi sbírající materiál pro přehledové kapitoly svých disertací, jsou najednou opět populární?

Zpětné šíření chyby


Web je plný popisů jednoduchých neuronových sítí, takže princip toho, jak funguje samostatný neuron, určitě znáte. Neuron není opravdu nic jiného než součet součinů vstupů a vah vybavený nelinearitou – tzv. aktivační funkcí – na výstupu. Přesně řečeno, v součtu figuruje i práh, což je jen váha speciálního vstupu, na který je trvale připojen signál s hodnotou 1. Nic zázračného. Moderní neuronová síť ale takových prvků obsahuje velké množství a představuje bez nadsázky systém, jenž je mnohem více než jen prostý úhrn svých částí.

Pokud neurony uspořádáte do jediné vrstvy, můžete klasifikovat jen tzv. "lineárně separovatelné" problémy. Co to znamená? Představíme-li si vstupní hodnoty jako jakousi souřadnici v prostoru – což dovedeme jenom, pokud jsou vstupy právě tři – je množina prvků jedné třídy lineárně separovatelná, jestliže můžeme prostorem vytyčit rovinu tvořící hranici oddělující tyto prvky od prvků ostatních tříd. Všechny prakticky zajímavé úlohy do této třídy separovatelnosti ani náhodou nespadají a jsou tedy pro jednoduché perceptronové sítě nepřekonatelnou výzvou. Tato skutečnost mj. stála i za prvním ochlazením zájmu o umělé neurony, které trvalo až do poloviny sedmdesátých let minulého století.
K prvnímu oživení dochází díky nové technice učení pomocí zpětného šíření chyby (backpropagation), dovolující trénovat sítě o několika vrstvách. Články vedoucí k objevu tohoto typu učení publikovalo nezávisle více vědců, nejznámějším z nich je zřejmě Paul Werbos. Ten předchozí teoretické výsledky aplikoval na neuronové sítě a ukázal, že díky této technice je možno zamířit na mnohem ambicióznější cíle. V osmdesátých letech se tak zrodil princip neuronové sítě tak, jak ho známe dnes.

Základním trikem zpětného šíření je tzv. řetízkové pravidlo (chain rule), na které si možná vzpomenete z hodin matematiky. Jde o obecný princip, dovolující derivovat složenou funkci, jíž je v našem případě vyjádření chyby neuronové sítě. Při učení sítě nejprve provedeme tzv. dopředný běh s aktuálními parametry sítě, tedy přiložíme data na vstupní vrstvu, vyhodnotíme hodnoty výstupů neuronů první vrstvy, které použijeme jako vstupy pro další vrstvu, a postup opakujeme, dokud nezískáme hodnoty výstupů neuronů poslední vrstvy. Dopředný běh – tzv. inference – je základní režim sítě, v němž natrénovaná sít se zafixovanými parametry (váhami a prahy) např. umí klasifikovat vstupní vzory do tříd. Poté vypočteme chybu výstupu sítě tak, že výstupy neuronů porovnáme se správným vzorem, který síť měla v tomto případě vyprodukovat.
Chybu můžeme určit různě, přičemž tzv. chybová funkce (často se používá pojem "loss function") poměrně zásadním způsobem ovlivňuje učení sítě. V tehdejší době znamenala kvadratická chyba (MSE – mean squared error) naprosto přirozenou volbu: Čistý rozdíl vzoru a výstupů sítě obsahuje nepříjemné znaménko, ale umocníme-li tento rozdíl, získáme elegantní a jednoduchou metriku.
Díky řetízkovému pravidlu dokážeme tuto chybu přenést na vstupy poslední vrstvy a podobně i do vrstev předchozích. Po provedené fázi zpětného šíření máme uvnitř sítě informace o tom, jak chybovaly jednotlivé neurony. Jakmile víme, jakým dílem se podílel na chybě celku každý parametr sítě, můžeme ho jemně doladit. Tento postup je třeba vícekrát opakovat pro každý vzor tzv. trénovací množiny.

Pro to, aby učení zpětným šířením chyby fungovalo, je zapotřebí vybavit neurony spojitou (snadno derivovatelnou) aktivační funkcí. Původní perceptronovou nelinearitu tedy vystřídala hladká křivka podobného tvaru – nejčastěji sigmoida (známá též jako logistická funkce) nebo hyperbolická tangenta. Dvou- až třívrstvé neuronové sítě se sigmoidou a desítkami, maximálně stovkami neuronů optimalizované minimalizací kvadratické chyby tak tvoří klasickou představu o neuronové síti, jež se usadila v učebnicích na mnoho dalších let.

Přes počáteční optimismus vyvolaný objevem algoritmu zpětného šíření chyby se brzy však ukázalo, že nasazení neuronových sítí má své meze. Omezení bylo hned několik: Chyba sítě definovaná jako MSE trpěla nepříjemnou vlastností způsobující, že učení se zpomalovalo, čím přesnější naučená síť dávala výsledky. Horší skutečností se ale ukázal být efekt tzv. mizejících gradientů (vanishing gradients), jenž omezoval prakticky použitelný počet vrstev sítě. Aktivační funkce měly svůj operační režim pouze v okolí počátku souřadnic. Tento jev se zesiloval ve vrstvách s rostoucí vzdáleností od výstupu sítě, což ve výsledku znamenalo, že pokud měla síť více vrstev, první z nich se nemohly učit. Přesné vysvětlení mizejících gradientů je sice poměrně komplikované, ale v podstatě jde hlavně o násobení velmi malých čísel velmi malými čísly – užitečná hodnota zpětně propagované chyby klesala k nule exponenciálně s počtem vrstev. Jak se ukázalo později, umět natrénovat vícevrstevné sítě ale bylo pro úspěch v praktických úlohách naprosto zásadní.
Zřejmě nejdůležitějším – ale ne tak viditelným – omezením byla vysoká výpočetní náročnost procesu trénování sítí kombinovaná s nedostatkem trénovacích dat. Pro výkonné počítače té doby znamenalo trénování sítě, která nám dnes připadá směšně malá, dny a dny práce. Velké sítě byly pro tehdejší hardware tak nepraktické, že experimentovat s nimi bylo nemožné a jejich reálné aplikace byly jednoduše nemyslitelné. Přestože se ukazovalo, že s rostoucí velikostí sítě – tj. s rostoucím počtem jejich parametrů – většinou roste i její přesnost, byly neuronové sítě brzo odsouzeny do role luxusních hraček a s výjimkou několika úzce vymezených oblastí (např. jednoduchá klasifikace fonémových stavů v rozpoznávání řeči) ustoupily efektivnějším metodám.
Naštěstí i přes další útlum zájmu o umělé neurony, jenž nastal během devadesátých let a trval nejméně deset let, se několik výzkumníků drželo zuby nehty své víry v to, že neuronové sítě zkrátka jen předběhly dobu a že se jednou opět vrátí.

Učení bez učitele


Jedním z hrstky vytrvalých byl určitě Geoffrey Hinton, jenž se věnuje neuronovým sítím po celou svou vědeckou kariéru. Hinton rád používá při práci fyzikálních analogií a v jeho článcích nacházíme pojmy jako jsou "teplota systému", "energie stavu", "žíhání", apod. Jeden z nejdůležitějších konceptů, jehož je spoluautorem a jenž předznamenal současnou renesanci sítí, se jmenuje Restricted Boltzmann Machine (RBM): Jedinou vrstvu sítě je možno trénovat – velmi zjednodušeně řečeno – pouze pomocí vstupních dat. Jde o typ učení bez učitele, tedy trénování bez předem známých očekávaných výstupních dat. Při učení RBM parametry vrstvy v každém kroku postupně měníme, aby vrstva trénovacím datům co nejlépe vyhovovala. Systém vychází ze stavu "s vysokou teplotou" a postupně chladne, až dojde k "teplotní rovnováze". Díky tomuto postupu je možné obejít omezení dané mizejícími gradienty a konstruovat vícevrstevné sítě postupně, vrstvu po vrstvě.

Nejznámějším užitím neuronové sítě je bezesporu klasifikace. V této úloze se snažíme pomocí sítě vstupní data – většinou popisující objekty reálného světa – roztřídit do jednotlivých kategorií tím, že každému neuronu výstupní vrstvy přidělíme štítek jedné třídy. Neuron, jehož aktivační funkce nabývá pro daný vstup největší hodnoty, jej pak přiřadí do dané třídy. Například chceme-li automaticky třídit fotografie domácích mazlíčků, výstupní vrstva naší sítě bude mít tři výstupy: neuron psů, neuron koček a neuron papoušků. Pokud je síť dobře natrénovaná a ukážeme-li jí fotografii britské modré, měl by kočičí neuron produkovat nejvyšší hodnotu a oba ostatní neurony by měly zůstat neaktivní, tedy vykazovat minimální hodnoty.

Výstupům sítě ale můžeme určit i jiný význam. Například během učení můžeme chtít, aby poslední vrstva věrně reprodukovala vektor vstupních dat.
K čemu by to bylo dobré? Pokud by všechny vrstvy sítě měly shodný počet neuronů, pak snad jen k tomu, abychom si ověřili, že software pro trénování sítě funguje. Nabízí se ale zajímavá možnost – počet neuronů prostřední vrstvy může být výrazně nižší než počet neuronů první a poslední vrstvy. Pokud jsme schopni kvalitně natrénovat takovou síť, znamená to, že vstupní a výstupní data jsou na prostřední vrstvě reprezentována úsporněji, pomocí vektoru o menším počtu prvků. První polovina sítě od vstupu k úzkému místu tak tvoří enkodér, zatímco druhá polovina od úzké vrstvy k výstupu pak dekodér. Takto můžeme komprimovat data – tzv. autoenkodér – případně dokonce získat jejich robustní reprezentaci odstraňující šum z poškozených dat (denoising autoencoder).
Tímto postupem je možné natrénovat i klasifikující síť bez toho, aby trénovací data obsahovala značky výstupní třídy. 

Pomocí RBM se podařilo oživit zájem o autoenkodéry a nejen to – tento generativní postup (bez učitele) brzo poté dovolil vytvářet i vícevrstevné sítě, které se daly dotrénovat pomocí algoritmu zpětného šíření (s učitelem) pro klasifikaci. Pro tyto sítě se objevuje označení Deep Belief Networks (DBN). Vědci si uvědomují, že se jim podařilo odblokovat zásadní omezení, jež doposud bránilo plnému využití potenciálu neuronových sítí. Hintonův kolega Yoshua Bengio publikuje v r. 2013 článek o učení reprezentací – jeho základní myšlenkou je, že modelování velmi složitého chování je možno docílit opakovanou interakcí faktorů, které jsou realizovány ve vrstvách. Jinými slovy: Každá vrstva sítě představuje jistou úroveň abstrakce, posouváme-li se od vstupních vrstev k výstupních, posouváme se od hrubých dat přes užitečné heuristiky abstrahující informaci až ke kvalitním znalostem na výstupech. Každá vrstva tak reprezentuje jistou úroveň zobecnění, nad kterou může následující vrstva stavět efektivní kombinace.

Zkrocení nelineární bestie


Seznam důvodů vyvolávajících opětovný zájem o trénování sítí by nebyl úplný, kdybychom nezmínili SoftMax (normalizovanou exponenciálu) na pozici chybové funkce. Jde o funkci známou i v jiných oborech strojového učení (LDA, naive Bayes). Její podstatnou vlastností je, že výstupy sítě normalizuje: Bez ohledu na to, jak vysoké hodnoty výstupní neurony produkují, díky SoftMaxu jsou jejich hodnoty namapovány do intervalu (0, 1) – a co víc – jejich součet je vždy 1. Jinými slovy, SoftMax vrstva při klasifikaci zohledňuje, že jednotlivé třídy jsou na sobě vzájemně závislé. Díky tomu se mohou neuronovými sítěmi zabývat i statistici, neboť celková pravděpodobnost všech možností je vždy úhrnem 1, tj. statisticky vyjádřená jistota. SoftMax jako slušně vychovaná shora omezená chybová funkce nejenže pomáhá v souboji s explodujícími gradienty, ale má i další výhodu: SoftMax produkuje použitelné gradienty i v oblasti jemného ladění, když je síť skoro natrénovaná (na rozdíl od klasické MSE).

Dalším zásadním zjištěním bylo, že původní shora omezené aktivační funkce (sigm, tanh) je možné nahradit jednoduchou lineární lomenou funkcí, která pro všechny záporné vstupy produkuje nulu, zatímco kladná čísla kopíruje ze vstupu na výstup. V literatuře se pro tuto aktivační funkci používá zkratka ReLU (rectified linear unit). O takto "nepřirozené" nelinearitě neuronoví odborníci nejprve neuvažovali, kvůli tomu, že trpí tzv. problémem "explodujících gradientů". To je dáno tím, že ReLU není nijak shora omezená – s rostoucím argumentem stále roste. Vypadá to, že nic není zadarmo: Ve složitém nelineárním systému, jakým jsou neuronové sítě v režimu učení, dochází ke dvěma principiálním problémům: Signál se buď snadno ztrácí (vanishing gradients) nebo naopak roste nade všechny meze (exploding gradients). Pokud vám to něco připomíná, tak vězte, že články o této problematice často citují teorii dynamických systémů, stabilitu zpětnovazebních systémů, atraktory, chaos, atd.

Zatímco na mizející gradienty neexistují účinné léky bez vedlejších efektů (i když o jednom takovém bude řeč v kapitole o rekurentních sítích), na explodující gradienty lék známe. Je to svým způsobem jakási zpětnovazební brzda zabraňující vahám a prahům neuronové sítě v tom, aby rostly do nekonečna. Tímto lékem je regularizace: Pokud chybovou funkci sítě doplníme o člen závislý na tom, jak rychle rostou nebo jaké jsou momentální hodnoty parametrů sítě, poskytneme tím procesu učení důležitou informaci. Neboli: Doposud během učení s učitelem známkoval náš učitel jen to, jak věrně síť papouškuje předkládané vzory. Nově bude dávat dobré známky i za plynulost recitace.

Nelinearita ReLU dovolila opět trénovat zpětným učením hluboké sítě bez předchozí RBM fáze, pouze s regularizací parametrů. Je příznačné, že podobně jednoduché řešení problému mizejících gradientů bylo po celou dobu na dosah ruky a ke vzkříšení neuronové teorie muselo dojít podstatně obtížnějším způsobem.
V letech 2006-2010 se již o neuronových sítích píše opět optimisticky. Praktický pokrok, zejména v počítačovém vidění a porozumění řeči, na sebe nenechá dlouho čekat – brzo jsou publikovány rekordní výsledky a za state of the art je v těchto oblastech považován model hluboké sítě.

Hluboké šílenství


Samotnou myšlenku vícevrstevných sítí publikoval ukrajinský teoretik Alexej Ivaněnko se svými kolegy v roce 1965. Že je hloubka důležitá pro úspěch modelu, se v článcích objevovalo již během sedmdesátých let. Jenže to nikdy pořádně nefungovalo, až nyní.
Rozjíždí se poslední a zatím největší vlna neuronového nadšení, jež trvá dodnes. Nejaktivnějšími propagátory "hlubokého učení", jak se tomuto opět atraktivnímu oboru snažení začalo říkat, jsou právě Yoshua Bengio, Geoffrey Hinton a Yann Le Cun z CIFAR (Kanadský institut pokročilého výzkumu) v Torontu, známí mezi kolegy též jako "kanadská mafie".

Použít pro renesanci neuronových sítí zastřešující název kombinující hluboké sítě (deep nets) a strojové učení (machine learning) je vynikající marketingová strategie. Nejde o nic nového – přejmenování oblasti výzkumu dovoluje odpoutat se od minulých neúspěchů tak, jako se např. "strojové učení" distancovalo od původní "umělé inteligence". Aby to nebylo jednoduché, nálepkou Deep Learning jsou často označovány i sítě, které vlastně hluboké v pravém slova smyslu ani nejsou. Pěkným příkladem jsou rekurentní jazykové modely (RNNLM), hluboké jen během učení, o nichž ještě bude řeč. Hluboké učení se tak stává obecným pojmenováním pro "to vše nové neuronové".
Díky shrnujícímu článku snázvem "Deep Learning" v časopisu Nature 2015 se s myšlenkami hlubokých sítí seznamuje odborná veřejnost a z hlubokého učení se definitivně stává "ta věc".

Teoretický průlom se potkává s dalšími šťastnými okolnostmi: Kvůli fyzikálním důvodům přestává technologie výroby integrovaných obvodů dosahovat stále vyšších hodinových frekvencí CPU a orientuje se spíše na zvyšující se paralelismus. Procesor získává stále více jader, dovolujících vykonávat souběžně více úloh. Navíc se postupně prosazuje nový, široce dostupný masivně paralelní hardware – grafická karta (GPU). Tyto specializované součástky do PC, původně navrhované výhradně se záměrem zvýšit snímkovou frekvenci grafiky počítačových her, je možné programovat pro zpracování paralelních algoritmů, které pak díky tomu běží řádově desetkrát rychleji než jejich sekvenční varianty na CPU. Neuronové sítě, vzhledem ke své povaze, představují velice dobře paralelizovatelnou úlohu, která se ideálně implementuje právě na GPU. Toho využívá dominantní výrobce GPU firma NVIDIA na svých konferencích, kam zve odborníky na hluboké učení a dál popularizuje neuronové sítě.

Dalším faktorem akcelerujícím zájem o hluboké sítě je globálně rostoucí produkce dat. Díky sociálním sítím a vznikajícímu Internetu věcí se korporace vlastnící, generující nebo sbírající tato data začínají rozhlížet po způsobech jejich efektivního využití. Objevuje se zájem data vytěžit (data mining), destilovat obrovské hromady hrubých dat o realitě na modely abstrahující pravidla v této realitě ukrytá, získat člověkem uchopitelné informace o chování utopeném v moři šumu.
Zde se hluboké učení potkává s dalším atraktivním termínem – velkými daty (Big Data).

My máme framework, ó, my se máme


Napsat program simulující dopředný běh jednoduché neuronové sítě je práce maximálně na pár hodin. Její učení je sice o dost složitější, ale zkušený programátor bude mít první verzi zprovozněnou třeba za několik dní. Bez ohledu na zvolený programovací jazyk ale platí, že výsledek bude pouze nepraktickou hračkou, demo ukazující, že "také umíme trénovat neuronové sítě". Hlavní bariérou je především výpočetní čas. Bez zásadních optimalizací není možné trénovat na velké množině dat sítě o velikostech, které dovolují řešit praktické úlohy.
Výhodou neuronových sítí je, jak bylo zmíněno, jejich snadná paralelizovatelnost. Jádro výpočtů představuje obrovské množství násobení a sčítání. Uvažujeme-li vrstvu jako celek, představuje výpočet vrstvy operaci známou z lineární algebry – násobení vektoru maticí. Algoritmy trénování typicky zpracovávají větší počet vzorů naráz, v dávkách (minibatches). Díky tomu je kritickou operací násobení matice vstupních dat maticí parametrů, maticové násobení chyb a transponovaných parametrů, sčítání gradientů, apod. Operace lineární algebry jsou tradičně implementované v knihovnách rodiny BLAS (OpenBLAS, ATLAS, Intel MKL, Nvidia CUBLAS), jejichž rozhraní bylo kdysi navrženo s ohledem na programovací jazyk FORTRAN, případně v knihovnách s jiným rozhraním (Eigen, cuDNN). Společnou vlastností těchto knihoven je, že se snaží v maximální možné míře využít hardware, tedy ve značné míře spoléhají na vícevláknové zpracování nebo na efektivní operace GPU. Tento způsob paralelizace je označován termínem model-parallel.
Další urychlení trénovacího procesu na velkém množství dat spočívá v tom, že trénovací množinu je možno rozdělit na části (shards) a na nich trénovat vedle sebe nezávislé sítě, pokud nalezneme způsob, jak výsledky opět synchronizovat. Tato paralelizace je označována jako data-parallel a algoritmy trénování využívající tento princip se souhrnně označují jako distribuované učení.

Před pěti lety bylo ještě rozumné uvažovat o vlastní implementaci učení sítí, pokud k tomu byl dobrý důvod a žádný z tehdy existujících frameworků nevyhovoval momentálním potřebám. Tím důvodem mohla být specializace – znali jste dobře svou aplikační doménu, vlastnosti dat nebo požadovaná specializovaná funkcionalita nebyla nikde implementovaná. Dnes je díky existujícím univerzálním frameworkům taková snaha velmi pošetilá.
Frameworků je k dispozici celá řada, nejstarší z nich vznikly v akademickém prostředí. Jde především o Caffe z Univerzity v Berkeley orientovaný na úlohy počítačového vidění. Dalším je Theano, obecný framework pro Python z Univerzity v Montrealu, nabízející, navzdory svému uvedení v r. 2008, pokročilou architekturu.
K frameworkům s čistě akademickým původem bylo donedávna možné zařadit i Torch, v němž se skriptuje v jazyce Lua. Začátkem loňského roku ovšem Facebook vydal jako open source vlastní optimalizované deep learning moduly pro Torch a tím odstartoval závody v hlubokém zbrojení. Během velmi krátké doby otevřela svůj software pro hluboké učení ve zdrojovém tvaru snad každá velká společnost s vlastním výzkumným oddělením umělé inteligence. Do dnešního dne tak může kdokoliv použít CNTK (Computational Network Toolkit) – univerzální framework od Microsoftu; Veles – framework od Samsungu se škálováním pomocí knihovny ZeroMQ; CaffeOnSpark od Yahoo – deep learning "na obláčku" propojující Caffe s fremeworky pro velká data (Hadoop, Spark); projekt DSSTNE od Amazonu zaměřený na doporučovací systémy; Warp CTC od Baidu – efektivní knihovna specializovaná na rozpoznávání řeči; a TensorFlow od Google – obecný framework pro algoritmy umělé inteligence.

Ačkoliv mají komerční frameworky různé autory z konkurujících si firem, jsou si často v mnoha ohledech podobné. To je dáno nejspíš tím, že vznikaly přibližně ve stejné době, autoři četli stejné vědecké články, účastnili se stejných konferencí a inspirovali se stejným dostupným softwarem. Některé nápady prostě visely ve vzduchu: Skriptování na vyšší úrovní probíhá většinou v jazyce Python, který se díky nedávnému velkému uveřejňování stává de facto jazykem volby neuronové komunity, zatímco výkonné jádro je napsané v C++ nebo C. Základní datovou strukturou je tensor, což je jakési zobecnění matice z lineární algebry. (Zhruba řečeno jde o n-rozměrný hyperkvádr čísel.) Tensory jsou propojeny tzv. grafem výpočtu, jenž dovoluje efektivní paralelismus a distribuované výpočty (Flow-Based Programming). Často je výbavou frameworku také zabudovaná podpora zpětného učení (algorithmic differentiation). Uživatel definuje dopředný běh sítě a framework sám dopočítá zpětný běh, protože u každé dopředné operace má implementovanou odpovídající derivaci potřebnou pro výpočet gradientů. Většina frameworků dovede pracovat s GPU prostřednictvím knihovny cuDNN nebo přímo pomocí CUDA.

Neuronový hardware - nový trh?


Algoritmy neuronových sítí díky uvedeným vlastnostem představují ideální cíl pro specializovaný hardware, což je koncept starý jako umělý neuron sám (viz Mark 1 perceptron z konce padesátých let minulého století). Pro ambiciózní sítě a velká trénovací data je často jedna univerzální GPU karta málo a hledají se způsoby, jak co možná nejlépe distribuovat trénování mezi jejich větší množství. V této situaci nepřekvapuje, že návrháře hardware láká možnost využít specifických rysů trénovacích algoritmů. Pokud by např. existoval levný neuronový čip s nízkou spotřebou, otevřela by se obrovská příležitost pro mobilní neuronové aplikace.

Velké firmy si hardwarový potenciál uvědomují. Není asi náhoda, že v květnu tohoto roku, krátce poté, co NVIDIA představila novou grafickou kartu GTX 1080 s mimořádně výhodným poměrem cena/výkon pro trénování sítí, prozrazuje Google, že už více než rok používá v datovém centru vlastní ASIC hardware pro tenzorové výpočty – Tensor Processing Unit (TPU). Kromě RankBrain a Street View, které dnes TPU využívají, můžeme spekulovat i o tom, že jednou Google oznámí službu "TensorFlow as a Service." Mnoho detailů řečeno nebylo, zjevně šlo o načasovanou strategickou informaci, uvolněnou v souvislosti se zveřejněním TensorFlow. 
NVIDIA vzápětí kontruje uvedením akcelerátoru P100 se špičkovým výkonem 21 TFLOPS ve FP16, tj. podporující aritmetiku s plovoucí čárkou o poloviční 16bitové přesnosti. Ta je pro trénování sítí postačující a přitom výrazně rychlejší než klasická FP32 nebo dvojnásobná přesnost FP64. 

Rýsuje se střet NVIDIA vs. Google? Nejspíš ne. Nic nenaznačuje tomu, že by v dohledné době byla pozice NVIDIA coby bezkonkurenčního dodavatele hardware pro trénování sítí ohrožena. Ze strany Google šlo zřejmě o jiný záměr – upoutat pozornost odborníků na hluboké učení a informované veřejnosti, demonstrovat možnosti svých neuronových týmů, včetně jím zakoupeného startupu Deep Mind, a prosadit TensorFlow. Je jisté, že ostatní velcí hráči s velkými daty (Facebook, Amazon a Microsoft) vidí v neuronových sítích také budoucnost a vynášejí karty podle potřeby.
Ostatně neměli bychom zapomínat ani na to, že v následujících letech možná do hardware specializovaného pro umělou inteligenci výrazněji promluví také Intel. Jeho Xeon Phi s vektorovými instrukcemi AVX-512 dává tušit, že procesorový gigant tento segment trhu nepodceňuje.

Šéfové na poloviční úvazek


Nikde není lépe vidět vliv korporací tak, jako na kariérách výzkumníků z Toronta: Firmu Geoffreyho Hintona DNNresearch Inc. koupil Google, Hinton se ale nepřestává věnovat univerzitnímu výzkumu. Yann LeCun, původně Hintonův asistent, je nyní ředitelem Facebook AI Research v New Yorku. Yoshua Bengio zůstává univerzitním profesorem v Montrealu, zároveň ale radí startupu Nervana Systems s hlubokým učením.
Typické jsou také časté prvoligové přestupy: Alexander Ng, jenž založil tým Google Brain, nyní pracuje jako vedoucí vědec (Chief Scientist) v laboratoři Baidu Research v Silicon Valley (a je mimochodem i spoluzakladatelem úspěšné vzdělávací firmy Coursera). Asi nejznámější Čech v oboru Tomáš Mikolov – autor často citovaného algoritmu word2vec – pracoval po stáži Microsoftu pro Google, v současnosti je výzkumníkem ve Facebooku.

Hlad po mozcích je zřejmý: V současné době je na tom, co se týče nabídek práce, dobře každý, kdo se věnoval neuronovým sítím before it was cool. Větší firmy jsou si už nějakou dobu vědomy ceny svých dat a rozhlížejí se, jak je co nejlépe využít. Hluboké učení – velmi viditelné téma na technologicko-inovativně-marketingových webech poslední dva roky – do této skládačky perfektně zapadá a tak v luxusních zasedačkách po celém světě jistě zaznívá "A neměli bychom mít také vlastní oddělení na Deep Learning? Znám jednoho doktoranda..." v nejrůznějších podobách.
A podobně se v těch samých zasedačkách skeptici ptají naprosto logicky: "A k čemu je to hluboké učení vlastně dobré?"

Aplikace


Královskou doménou neuronových sítí je odjakživa počítačové vidění. Klasifikace objektů na obrázku je dovedena do dokonalosti, počty tříd jdou do tisíců a schopnosti hlubokých sítí se vyrovnávají schopnostem člověka
Aplikace Twiggle například pomáhá ornitologům – stačí nahrát obrázek, systém umí rozpoznávat zhruba z devíti set druhů ptáků.

Slibná je i automatickákolorizace černobílých obrázků. Dočkáme se barevných němých grotesek?

Pomocí sítí můžeme mj. predikovat, jak bude vypadat naše podoba, až zestárneme. 

Zajímavý je i generátor napodobující styl rukopisu pro vložený text.

Perspektivní směr výzkumu obrázkových sítí představuje identifikace a lokalizace víceobjektů na scéně
 
Spojené trénování jazykových a obrázkových modelů posouvá automatické porozumění obsahu na zcela novou úroveň. Pomocí slovního popisu umíme automaticky dohledat obrázek a naopak – pro libovolný obrázek bude možné získat textový popis. Jako vedlejší produkt automaticky vzniká reprezentace společná pro oba modely, kterou se obrázková a jazyková síť spolu dovedou "domluvit".

Moderní rekurentní sítě excelují v modelování přirozeného jazyka, čehož se využívá jak při automatickém překladu, tak v rozpoznávání mluvené řeči, tj. při strojovém přepisu řeči do textu. Během let 2010-14 se hlavní metodou volby v konstrukci rozpoznávačů spojité řeči s velkými slovníky (LVCSR – Large Vocabulary Continuous Speech Recognition) staly hluboké sítě a překonaly tak dlouhodobě úspěšné systémy založené na statistických metodách GMM/HMM (Gaussian Mixture Models, Hidden Markov Models). Všechny hlavní rozpoznávače řeči společností Google (Google Now), Apple (Siri), Amazon (Alexa), Baidu a Nuance jsou nyní založeny na hlubokých sítích.

Na rozpoznávání řeči navazují např. dialogové systémy a digitální asistenti.

Řeč není jediným zvukem, který hluboké sítě dovedou zpracovávat. Již zmíněná aplikace Twiggle umí identifikovat druh ptáků i podle ptačího zpěvu.
Neuronové sítě se ukrývají také v doporučovacích systémech a své místo nalezly i v bioinformatice.

Hluboké učení se prosazuje dnes i do "měkkých disciplín," jako jsou hraní her, výtvarné umění a hudba.
Nejviditelnějším úspěchem v této oblasti je vítězství systému AlphaGO nad lidským hráčem, mistrem v deskové hře GO Lee Se Dolem. Jde ale jen o vrcholek ledovce, Deep Mind umí trénovat umělé hráče videoher pouze za pomoci vstupu z displeje a informace o aktuálním dosaženém skóre ve hře.

Jazykové neuronové modely lze použít i pro automatické generování textu. Krásnou ukázku předvedl Jiří Materna na letošní první české konferenci o strojovém učení. Básně jeho automatického básníka, natrénovaného na české poezii, vznikly jako výstup znakového modelu, na němž Andrej Karpathy demonstruje účinnost rekurence.

Asi nejznámějším generátorem neuronového umění je Deep Dream.

Stranou nezůstává ani hudba, komponovaná v podobném stylu jako hudba reprezentovaná trénovacími daty.


Topologická hra


Popsat činnost neuronu je triviální. Popsat činnost celku propojených neuronů, pokud jsou jich tisíce, je prakticky nemožné. Proč je hluboká síť tou nejčernější černou skříňkou a proč je tak efektivní v tom, co dělá? Abychom se dokázali alespoň přiblížit k povrchu odpovědí na podobné otázky a nalezli pár užitečných metafor, musíme se nejprve zmínit o parametrizacích, reprezentacích a jejich rozměrech.

Objekty reálného světa je možno digitalizovat. Obrázek naskenujeme a pixely ze scaneru – trojice hodnot pro červenou, zelenou a modrou barvu – uložíme na disk tak, abychom o každém z nich věděli, kde bylo na původním obrazu jeho místo. Podobné je to s lidským hlasem: Analogový signál mikrofonu navzorkujeme, pro každý vzorek známe jeho polohu v čase. Pokud je náš objekt digitálně popsán a umíme jej digitálními periferiemi opět zrekonstruovat (vytisknout, přehrát, atd.), máme jeho reprezentaci, která může – po nutném zpracování, tzv. parametrizaci – sloužit jako vstup neuronové sítě.

Na obrázky uložené v pixelech se dají použít filtry odstraňující šum, v podstatě ale máme to, co může neuronová síť přímo konzumovat. V jiných situacích je to složitější, hrubá data je nutno předzpracovat (parametrizovat) do podoby pro neuronovou síť vhodnější. Např. v případě rozpoznávání řeči nepoužíváme přímo vzorky hlasového signálu přímo, ale využijeme toho, že víme, jak funguje lidské ucho, a nejprve komprimujeme signál do frekvenční podoby, do popisu připomínajícího blikající světélka na ekvalizéru reprodukční soustavy. Získáme tak mnohem méně čísel, odstraníme některý šum a převedeme původně jednokanálový signál do sekvence vícerozměrných vektorů.

Mluvit o rozměrech v případě vektorů je pro matematiky nebo programátory něčím přirozeným, jestliže je ale naše představa vybudovaná pouze na základě zkušeností s třírozměrným světem, začínáme mít už zde problémy. Lidská intuice je totiž, co se týče rozměrů, vysoce nespolehlivá a deformovaná, protože 3 je malé číslo.
Kupříkladu geometrie tvarů, povrchů a objemů se ve více rozměrech zdaleka nechová tak, jak bychom očekávali: Poměr obsahu kruhu vepsaného do čtverce k obsahu tohoto čtverce můžeme snadno spočítat. Je to číslo nezávislé na průměru kružnice, tj. na délce hrany čtverce. Podobně jsme schopni vyjádřit poměr objemu koule vepsané do krychle k objemu této krychle, známe-li průměr koule. Porovnáme-li oba poměry, zjistíme, že poměr obsahů je větší než poměr objemů, tedy proporce kruh/čtverec je větší než proporce koule/krychle. Pokračujeme-li takto do vyšších rozměrů, začne být zřejmé, že hyperobjemy vepsaných hypersfér jsou nepodstatné vzhledem k objemům hyperkrychlí. Předchozí nečitelnou větu je možno zjednodušit jako "ve vyššich dimenzích skoro nejsou vniřky" nebo "veškerá hmota je vždy v mnoha rozích poblíž povrchu".

Podobně zjistíme, že ve vyších rozměrech jsou téměř vždy libovolné dva směry na sebe kolmé, atd.

Exkurze do podivností dimenzionality je nutná, abychom pochopili, proč je obtížné chápat neuronové sítě. Každý vstupní vzor odpovídající paremetrizovanému objektu reálného světa je možno si představit (nebo se o to spíše můžeme pokusit) jako jeden bod v hyperprostoru o rozměru daném počtem prvků vektoru parametrizace. Navrhneme-li např. síť rozpoznávající cifry z černobílého obrázku o velikosti 20x20 pixelů (což jsou vlastnosti snad nejznámější databáze ručně psaných cifer MNIST), vytvořili jsme vstupní vrstvu, která má 400-rozměrnou reprezentaci. Podobné je to s každou další skrytou vrstvou – počet dimenzí reprezentace je roven počtu neuronů dané vrstvy.

Každý vrstva sítě má lineární a nelineární část. Ta lineární – váhy a prahy neuronů vrstvy – slouží jako geometrická transformace vstupujících bodů. Umí vstupní objekty posunovat a škálovat. Pokud takto transformujeme např. trojúhelník, na výstupu získáme opět trojúhelník, jen třeba pootočený s jinými délkami stran. Z kružnice se po transformaci stane elipsa, ze čtverce čtyřúhelník, atd. Nelineární část – aktivační funkce vrstvy – objekt deformuje, je jakýmsi křivým zrcadlem: Z trojúhelníku udělá podle potřeby čtverec nebo kružnici, nikdy ale dva trojúhelníky. Důležité je, že vrstva nemůže změnit topologii – souvislost objektu není narušena, jen ho vrstva nějak "pomačká", třeba i zásadním způsobem. Matematik by řekl, že jde o homeomorfní transformaci. http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/

Trik je v tom, že předchozí vrstvy mohou usnadnit práci vrstvám následujícím díky tomu, že převedou původní reprezentaci do jiné reprezentace, přičemž dimenze obou se mohou lišit. Problém lineární separovatelnosti můžeme snadno vyřešit přidáním dalšího rozměru: Mějme kapesník, který má uprostřed kulatou skvrnu. Skvrna není lineárně separovatelná od zbytku kapesníku ve dvou dimenzích – není možné odstřihnout skvrnu rovným střihem nůžek, dokud je kapesník narovnaný (2D). Převedeme-li kapesník do trojrozměrné reprezentace tím, že jej uchopíme uprostřed skvrny a zbytek srovnáme tak, aby se rohy kapesníku dotýkaly, můžeme oddělit skvrnu jedním střihem.
Velmi vágně řečeno: Více vrstev pomáhá měnit topologii reprezentací.

Data a model


Realita má svůj odraz v datech. Objekty reálného světa se řídí různými zákonitostmi, které na první pohled nejsou zřejmé. Cílem strojového učení je extrahovat chování těchto objektů z dostupných trenovacich dat tak, aby se natrenovany model předvídal jejich chování i na datech, ktera během trénování k dispozici neměl. Tento proces můžeme nazvat algoritmickou kompresí.

Skoro to vypadá, že pro praktické aplikace neuronových sítí platí, že čím větší síť, tím lépe funguje. Neuronová magie se začíná projevovat teprve při zapojení stovek až tisíců neuronů do mnoha vrstev. Řekněme, že máme dostatečný výpočetní výkon a odstranili jsme teoretické překážky, co nám brání naučit extrémně velkou síť? Kde jsou meze současného hlubokého učení?
Než se pokusíme zamyslet nad odpovědí, vraťme se na okamžik k postupu tréhování pomocí zpětného šířění chyby. Nejpopulárnějším algoritmem pro trénování sítí je Stochastic Gradient Descent (SGD), jenž v základní nedistribuované podobě vypadá takto:
1. Parametry sítě náhodně inicializujeme. Nejčastěji se používá normální distribuce pravděpodobnosti, ale není náhoda jako náhoda a správná inicializace (volba střední hodnoty a směrodatné odchylky) závisí na typu nelinearity a zvolené normalizaci vstupů (tedy zhruba řečeno na tom, jak velké hodnoty jsou k dispozici na vstupu sítě). Obecně platí, že každý typ vrstvy může vyžadovat odlišnou inicializaci.
Z celé trénovací množiny jsou pak náhodně vybírány dávky vzorů (jednu dávku tvoří např. dvě stovky dvojic vstup-výstup), 
2. pro které je najednou spočítán gradient chyby a upraveny váhy v jeho směru. Velikost úpravy vah je řízena důležitými hyperparametry – zejména tzv. rychlostí učení (learning rate). Náhodný výběr dávek a úpravy se opakují, dokud jsou k dispozici dvojice vzorů.
3. Po vyčerpání dat se celý postup opakuje v další tzv. epoše (iteraci). Sledujeme-li průběžně během učení, jak se mění chyba sítě na trénovací množině, měli bychom vidět křivku, která zpravidla klesá nejprve rychle, později její pokles zpomaluje, v ideálních podmínkách po dostatečném počtu epoch klesne k nule.

Pro reálné potřeby musíme vyhodnocovat i to, jak síť umí zobecňovat, tj. jak se chová po naučení pro neznámé vstupy. V praxi se určité menší množství dat vyčlení z trénovacích dat a prohlásí za testovací množinu. Musí jít o reprezentativní vzorek, protože pokud je nějak vychýlený, nedostáváme přesná měření. Na tomto vzorku je pak měřena chyba – jestliže síť dobře zobecňuje, je chyba po natrénování na testovací množině také malá.

V praxi ale nastává jeden ze scénářů:
1. Chyba na trénovací množině vůbec neklesá nebo dokonce roste: Něco je špatně, učení vůbec neprobíhá.
2. Chyba na trénovací množině klesá a roste, divoce osciluje: Pravděpodobně je vysoká rychlost učení nebo je třeba doladit jiný hyperparametr (např. zvětšit velikost dávky).
3. Chyba na trénovací množině sice klesá, ale ani zdaleka se neblíží k nule, bez ohledu na to, kolik epoch proběhlo: Může jít o nevhodnou parametrizaci objektů nebo normalizaci vstupů. Nejspíš je ale nedostatečně velká síť, má málo vrstev, málo neuronů ve vrstvách nebo jinak nevhodnou konfiguraci Došlo k jevu označovanému jako podtrénování (underfitting).
4. Chyba na trénovací množině utěšeně klesá stále k nule, chyba na testovací množině nejprve také klesá, po nějaké době ale začne vytrvale stoupat.

Poslední případ je nejzajímavější. Znamená to, že síť je schopna se dobře učit, ale špatně zobecňuje. Dochází k přetrénování (overfitting), kdy se síť příliš specializuje na trénovací množinu. Pokud vnímáme celou trénovací množinu jako pouhé přiblížení reálného jevu (jeho vzorkování), je přetrénování důsledkem toho, že naše přiblížení není dostatečné. Tuto disproporci právě odhalí testovací množina, která je sama o sobě jiným vzorkem reálného jevu.

S přetrénováním se neuronáři naučili bojovat mnoha způsoby: Nejjednodušším z nich je tzv. časné zastavení (early stopping). Spočívá v jednoduché detekci stavu, v němž síť nejlépe zobecňuje, a ukončení dalšího učení. Za tímto účelem je vyčleněna mimo trénovací a testovací množinu třetí množina, tzv. validační. Ta se používá pro průběžnou validaci – nárůst chyby znamená, že pravděpodobně začíná fáze přetrénování. Testovací množina pak vědecky poctivě testuje až naučenou síť, na jejím základě nesmí být během trénování učiněna žádná rozhodnutí.
K dalším způsobům zajištění obecnosti patří tzv. dropout: Během učení se určitému počtu náhodně vybraných neuronů ve skrytých vrstvách "vypíná" aktivační funkce. Tyto neurony pak nepřispějí v konkrétním dopředném běhu svým výstupem a do trénování se tak vnese náhodný šum. Původní jednoduchý dropout má řadu modifikací a teorie za tím, proč poškozování neuronů funguje, je poměrně komplikovaná. Jejím argumentem je zjednodušeně řečeno to, že díky neustálým náhodným kvazi-rekonfiguracím probíhá trénování nad mnoha různými příbuznými sítěmi současně.
Ve většině tutoriálů hlubokého učení naleznete jako základní lék na overfitting výše zmíněnou regularizaci. Pokud je chybová funkce doplněna o regularizační člen, jsou parametry sítě "tlačeny" směrem k počátku souřadnic. Na příkladu polynomu a přetrénování klasické regrese je pak dokládáno, že pokud jsou koeficienty polynomu malé, je polynomiální křivka vyhlazenější a lépe zobecňuje. Je ovšem otázka, do jaké míry je možné použít analogii z regrese na neuronovou síť.
Nejspíš nejsprávnějším způsobem, jak se vyrovnat s efektem přetrénování, je zvětšení trénovací množiny. Vzhledem k tomu, že trénovacích dat není nikdy dostatek, je alternativou i zmenšení konfigurace sítě (dokud nedojde k podtrénování). Najít ovšem správnou velikost sítě je velmi výpočetně náročné.

Natrénovaná síť je modelem reality vytvořeným na základě trénovacích dat reflektujících reálné jevy. Jsou-li tato data dostatečnou aproximací reality, což je obtížné zjistit kvůli jejich vícerozměrné povaze, je tento natrénovaný model věrný.
Přihlédneme-li k problémům s přetrénováním, objeví se přirozená otázka: Existuje nějaká exaktní závislost mezi optimální velikostí modelu a velikostí dostupných trénovacích dat?
Již v roce 1984 tento problém mnohem obecněji prozkoumal britský počítačový vědec Leslie Valiant v článku "Teorie naučitelného". O co jde? U každého modelu strojového učení nám jde během trénování o to, abychom nastavili správně jeho parametry, tj. konečný počet čísel, která jsou později ve fázi inference konstatntní. V případě neuronové sítě jsou těmito parametry váhy a prahy, inferencí je pak dopředný běh sítě, například klasifikace do tříd. Konečný počet čísel s konečnou přesností dává konečný počet kombinací, tj. konečný počet unikátních modelů. Jde o obrovský počet možných konfigurací – pokud má síť N vah a prahů a pracuje s 16bitovou přesností, existuje 216N jedinečných sítí.
Důležitým Valiantovým závěrem je, že pro M možných konfigurací modelu postačí log(M) trénovacích vzorů k tomu, aby se chyby na trénovací a testovací množině k sobě blížily. Pro konkrétní příklad sítě, kde M=16N, tak postačí více než 16N jedinečných trénovacích vzorů, aby nedocházelo k přetrénování. Nenechme se mýlit, M je v případě moderních hlubokých sítí stále poměrně velké číslo a navíc nemáme žádný exaktní způsob, jak určit jeho správnou velikost, aby nedošlo k podtrénování.

Velikost dostupných trénovacích dat tak zásadně určuje kvalitu modelu. Nemáme-li dat dostatek a modelovaná doména je komplikovaná, měli bychom místo hlubokých sítí zvolit nějakou jinou metodu strojového učení s menším počtem trénovatelných parametrů. Jakou, to záleží na povaze problému.

Honba za efektivní architekturou


Nadšení z hlubokých sítí doprovází do jisté míry povrchní, skoro až zlatokopecký, přístup. Známé "pravdy" o neuronových sítích jsou papouškovány ve všemožných tutoriálech a jen málokdy se objeví odvážný autor, jenž si dovolí kritizovat zavedené a všemi dodržované postupy (best practices). Příkladem je právě přehlížení Valiantovy práce – zřejmě jen proto, že s neurony přímo nesouvisí a všichni na ni dávno zapomněli: Neuronáři po celém světě raději budou navrhovat a trénovat zbytečně velké modely se zbytečně velkým počtem zbytečně velkých vrstev, aby se spolehlivě trefili do režimu, v němž je síť přetrénovaná, a aby pak mohli uplatňovat dobře známé léky proti overfittingu. Nalezení rovnováhy mezi velikostí dat a modelu je jistě drahé, ale není nakonec opakované používání nadbytečně velké sítě ve fázi inference ještě dražší?

Toto téma rozebírá Alexander Ng ve skvělém vystoupení na loňské konferenci NVIDIA (GPU Technology Conference 2015). Jedna z částí přednášky je věnovaná právě konfiguracím sítí. Základní recept pro strojové učení lze jednoduše shrnout do dvou pravidel:
1. Pokud není model dobrý na trénovacích datech, použij větší model.
2. Pokud je dobrý na trénovacích datech, ale není dobrý na testovacích datech, použij víc dat.

Ng ale tímto receptem zdaleka nekončí a zdůrazňuje také zásadní vliv dobré architektury modelu. Výše zmíněné poučky platí v jednom směru a tím je zvětšování modelu. Není ale možné často model naopak zmenšit, aniž bychom bojovali z podtrénováním? Odpovědí je jasné ano, navíc je snadné ukázat proč: Jestliže například do libovolné skryté vrstvy přidáme jeden neuron a jeho výstup nezapojíme (této situaci odpovídá nastavení všech odpovídajících vah následující vrstvy na nulu), činnost sítě jako celku neovlivníme, ale počet parametrů se zvětšil. V přetrénované síti je zřejmě přítomná informace v redundantní formě a pokud bychom ji dovedli odstranit, třeba vhodným návrhem topologie před procesem učení, získali bychom efektivnější model s menším počtěm parametrů.

Této možnosti jsou si neuronáři vědomi už dávno. V počítačovém vidění se používají tzv. konvoluční neuronové sítě, jejich nejznámějším propagátorem je Yann Le Cun. V principu jde o vrstvy neuronů (konvoluční vrstvy), jejichž vstup zpracovává pouze malou oblast obrazu (tzv. receptive field), tyto vrstvy jsou opakovaně aplikovány s posunutím tak, aby zpracovaly celý obraz. Díky posouvání vrstvy může vstupní obraz obsahovat objekty také v různém geometrickém posunutí, což usnadňuje práci dalším vrstvám sítě. Zásadním důvodem, proč konvoluční vrstvy fungují dobře, je sdílení vah – konvoluční vrstva uplatňuje stejné parametry bez ohledu na konkrétní posunutí. Teoretici přirovnávají funkci konvolučních vrstvech k filtrům používaným v předzpracovávání obrazu. Konvoluční neurony se naučí nízkoúrovňovou operaci – např. hranovou detekci – při učení v rámci celé sítě.

Úsporná konvoluční architektura má své využití i v rozpoznávání řeči. Jak bylo zmíněno, pro parametrizaci řeči se s výhodou využívají tzv. banky filtrů. Výstupem parametrizace může být spektogram – vizuální reprezentace vývoje energie signálu ve frekvenčních pásmech. Jednu osu obrázku tvoří frekvenční složky signálu, druhou aktuální čas promluvy, barvy pak hodnoty energie. Spektogram si můžeme představit jako obrázek a tak připodobnit úlohu rozpoznávání řeči úloze počítačového vidění. Konvoluční vrstvy pak můžeme uplatnit v obou směrech, frekvenčním i časovém. Samotná myšlenka je stará, článek o klasifikaci fonémů pomocí konvoluce v čase publikoval v r. 1989 Alexander Waibel se spoluautory (jedním z nich je G. Hinton).

Konvoluce není jediným způsobem, jak sdílet parametry. Mnoho úloh, kde dnes neuronové sítě excelují, souvisí se zpracováním sekvencí. Kromě zmíněného akustického modelování jde o prakticky všechny prediktory. Např. jazykové modely odhadují, jaké slovo bude pravděpodobně následovat při znalosti předchozí historie promluvy (textu), tj. pokud byla vyřčena (napsána) nějaká konkrétní předchozí slova.
Kritickým prvkem při učení sekvenčních modelů je paměť. Konvoluci v čase můžeme chápat právě jako takový typ paměti – síť se může rozhodovat na základě nějakého časového okna, které se po sekvenci posouvá, kapacita takové paměti pak odpovídá délce okna. Pro náročnější aplikace však konvoluce nedostačuje a je nutno použít mnohem náročnější prvek – zpětnou vazbu.

Chaos rekurence


Nejjednodušší rekurentní vrstva vznikne zapojením výstupů některých neuronů zpět, vzniknou tím další vstupy vrstvy. V dnešní době existuje více typů rekurentních sítí (RNN), jejichž společnou vlastností je, že se vzruch (signál) nešíří sítí pouze v dopředném směru, ale vrací se do vstupů a uzavírá tak jakýsi obvod. Signál ze vstupů může v modelu setrvávat po delší dobu, mluvíme tak o vnitřním stavu sítě – o její rekurentní paměti.

Na první pohled tedy rekurence není nic složitého. Pokud se ale nad tím zamyslíte, dojde vám, že obtížné na rekurentních architekturách bude jejich učení: Jak zpětně šířit chybu ve zpětnovazební smyčce? Algoritmus zpětného šíření chyby vyžaduje, aby výstup byl jednoznačnou funkcí vstupů. Jestliže je navíc závislý na vnitřím stavu, máme problém. Naštěstí je k dispozici jednoduchý trik, jenž předpokládá, že paměť je časově omezená, tj. že vliv libovolného vstupu na vnitřní stav modelu s časem odeznívá. Jinými slovy: Model zapomíná. Uplatněním tohoto předpokladu můžeme smyčku pro režim učení opět rozpojit. Režim inference použijeme stejně jako u čistě dopředných sítí k získání odezvy sítě v jednotlivých časových krocích. Navíc ale získáme pro každý krok hodnoty vnitřních stavů, tedy hodnoty signálu na zpětnovazebním propojení, které v režimu zpětného šíření chyby považujeme za další vstupy sítě. Tento typ rozvinutí zpětné vazby je v literatuře znám jako "zpětné šíření napříč časem" (BPTT, BackPropagation Through Time) a věnovali se mu už Rumelhart a Werbos koncem osmdesátých let.

Na rozvinutou rekurenci v BPTT můžeme nahlížet jako na speciální hlubokou síť. Hyperparametrem učení určujícím počet vrstev je zde počet časových kroků, které bereme do úvahy, tedy maximální hloubku paměti. Důležité je, že vrsvy v backpropagation rozvinutí jsou v podstatě kopiemi těchže parametrů – uplatňuje se zde opět efektnivní sdílení vah a prahů jako v případě konvoluce.
Rekurentní sítě jsou tedy speciálním typem hlubokých sítí, se všemi přednostmi i nedostatky. Pokud se o nich chcete dozvědět víc, naleznete především velké množství článků rozebírajících to, jak je obtížné jejich učení. Problém mizejících a explodujících gradientů nebo předčasný konce učení v lokálním maximu jsou důvody, proč se výzkumníci snažili najít jiné typy rekurencí vhodnější z pohledu učení.

Koncem devadesátých let přišli Sepp Hochreiter a Jürgen Schmidhuber s poměrně komplikovanou architekturou LSTM (Long Short Term Memory), která dovoluje dobře modelovat i vzdálené časové závislosti. Na rozdíl od klasické RNN je LSTM navržena tak, aby bylo možno naučit síť odděleně strategie zapamatování, vybavení a zapomenutí vnitřní paměti. Je to, jakoby měl proces učení k dispozici samostatná tlačítka na klasické kalkulačce, dovolující uložit nějaké číslo do paměti, pak ho vyvolat a nakonec vymazat. V architektuře LSTM se těmto funkcím říká brány (input, output, forget gates). Díky branám je učení LSTM bloku efektivnější a dovoluje vytvořit dlouhodobou paměť. LSTM sítě jsou dnes velice populární i navzdory své implementační složitosti a výpočetní náročnosti a neobejde se bez nich žádný neuronový framework. 

Přestože LSTM pro mnohé neuronáře představuje vrchol rekurentních sítí, ukazuje se, že podobně dobrých výsledků je možno dosáhnout s pomocí odlišných architektur. Roste popularita nejrůznějších modifikací, např. přidáním dalších cest, tzv. špehýrek (LSTM with peephole connections) nebo sloučením vstupní a zapomínací brány (GRU - Gated Recurrent Unit), atd. Dobrý přehled současných rekurentních sítí nabízejí autoři MGU (Minimal Gated Unit), kteří ve své práci poukazují na to, že srovnatelných výsledků je možno dosáhnout jednoduššími cestami. https://arxiv.org/abs/1603.09420

Pokročilá neuronová alchymie


V předchozích částech bylo naznačeno, že oblast výzkumu neuronových sítí je poměrně rozsáhlá. Na závěr je třeba ještě zmínit další směry, kterými se ubírá moderní neuronový výzkum.

Vraťme se na okamžik k algoritmu učení sítě: Samotný algoritmus SGD výzkumníci neustále rozvíjejí s cílem vylepšit dynamiku učení, tj. dosáhnout stejných výsledků v menším výpočetním čase. Zaměřují se na různé způsoby hledání optima v hyperprostoru parametrů modelu a přicházejí s novými nápady opírajícími se o prastarou Newtonovu metodu (využití vyšších řádů derivací chybové funkce, tzv. bez-hessiánové metody) nebo např. o fyzikální analogie – Nestěrovův moment pohybu, adaptivní momenty využívající meta-učení samotného procesu učení (ADAGRAD, ADADELTA...). Popis dalších vylepšení SGD týkajících se např. dynamiky distribuovaného učení by byl velice vyčerpávající.

Inovace má ale řadu jiných podob: V letmém popisu SGD bylo zmíněno, že inicializace parametrů je náhodná. Dalším stochastickým prvkem SGD je náhodný výběr dávek trénovacích vzorů. Toto dvojí použití náhody vede k tomu, že žádné dvě natrénované sítě nejsou stejné, díky vlastnostem vícerozměrných prostorů dostáváme po skončení tréninku modely dosahujících podobných výsledků, avšak se zcela odlišnými parametry. Sledujeme-li charakter zbytkové chyby, tj. to, jak odpovídají konkrétní naučené modely na jeden vstupní vzor, pozorujeme určité odlišnosti. Konkrétní síť se dopouští konkrétních chyb, jiná zase jiných. Máme-li k dispozici více sítí, můžeme dokonce jejich výstupy vzájemně kombinovat (průměrovat výstupy, vybírat maximum, atd.). Zmíněná technika se nazývá sbor modelů (model ensemble) a dovoluje dosáhnout zvýšení testovací úspěšnosti sboru až o několik procent oproti úspěšnostem jednotlivých sítí.

Sbor modelů představuje řešení hrubou silou – v inferenční fázi je jediná síť samozřejmě rychlejší než sítí několik, zpřesnění tak není zadarmo. Naštěstí ale existuje postup dovolující dosáhnout s jednoduchou sítí úspěšnosti srovnatelné se sborem sítí. G. Hinton tomuto procesu říká destilace znalosti a někdy mluví i o temné znalosti (dark knowledge). 
V zásadě jde o to, že pečlivě vybraný sbor modelů natrénovaný na původních datech použijeme jako generátor nových trénovacích dat pro novou trénovací fázi, v níž ale učíme model s nižším počtem parametrů, přip. vrstev. Důležitým detailem je, že narozdíl od výstupních vzorů daných učitelem-člověkem, která poskytují "ostrá černobílá rozhodnutí" (one-hot target vectors), data generovaná učitelem-sborem obsahují výstupní vzory vyjádřené ve stupních šedi (soft targets). Pokud tedy sbor modelů váhá s rozpoznáním konkrétního vstupního vzoru, projeví se tato váhavost na výstupu nejasnou odpovědí. Jednoduchý model žák-učedník pak tuto nejednoznačnost snáze vstřebá z trénovacích dat, k čemuž mu postačí méně vah a prahů.

Další oblastí výzkumu je modelování sekvencí a dynamických procesů. Jakmile je součástí trénovacích dat časová dimenze, je trénování klasifikátoru pomocí učení s učitelem nákladné, protože vyžaduje přítomnost časových značek ve výstupních vzorech. Tento problém se snaží překonat technika zvaná CTC (Connectionist Temporal Classification).  
Tento algoritmus Alexe Gravese mj. dovolil vytvořit společnosti Baidu rozpoznávač spojité řeči s rekordní úspěšností a je důležitou metodou konstrukce moderních kompletně neuronových rozpoznávačů (end-to-end speech recognition).
Podobný cíl mají tzv. mechanismy pozornosti (attention mechanisms) umožňující "soustředit pozornost" neuronové sítě na zajímavé oblasti dat, v nichž je ukryt význam – přičemž síť sama umí tato místa hledat – a omezit tak zbytečné zpracování dat bez informační hodnoty.
Perspektivní je i strategie zvaná Deep Reinforcement Learning založená na myšlence posilujícího učení (reinforcement learning) používané již dlouho v robotice. Jde o metodu na pomezí učení s učitelem a bez učitele, dovolující zhruba řečeno "odložit spotřebu" coby signál zpětné vazby, tedy odměnu danou učitelem. Nejznámější důkazy užitečnosti tohoto postupu nabídl zmiňovaný Google DeepMind.

Posledním směrem, který stojí za zmínku, je neuroevoluce. Tímto souhrnným názvem je označovaná řada metod, snažících se propojit umělé neuronové sítě s evolučními algoritmy, přičemž umělá evoluce je sama o sobě rozsáhlou oblastí výzkumu. Příkladem je NEAT (NeuroEvolution of Augmenting Topolgies), snaha o automatický návrh topologie sítě. Zdá se, že pro vhodné nastavení hyperparametrů modelu (počtu vrstev, počtu neuronů ve vrstvách, rychlosti učení, atd.) je umělá evoluce jak stvořená. Bohužel, evoluční strategie, jako jsou genetické algoritmy nebo genetické programování, obecně předpokládají, že vyhodnocení evoluční úspěšnosti jedince v populaci je levná operace, což v případě klasického trénování sítí pomocí zpětného šíření chyby zcela jistě splněno není.
Zajímavým příspěvkem z letošního roku je práce porovnávající klasický algoritmus SGD s vlastním evolučním postupem zvaným LEEA (Limited Evaluation EA). Ten vyhodnocuje jedince-sítě pouze na malé podmnožině trénovacích dat s tím, že je pro konkrétní model je do celkové úspěšnosti započítaná i úspěšnosti na předchozích vzorech. Autoři dokládají, že díky levné operaci vyhodnocení je jejich postup konkurenceschopný ve srovnání se standardním SGD. Nutno ovšem podotknout, že konference GECCO (Genetic and Evolutionary Computation Conference), na níž byl příspěvek prezentován, je zaměřená na výzkumníky evolučních strategiií a ti, jak známo, nahlížejí na hluboké učení s velkou nedůvěrou: Částečně možná proto, že evoluční strategie byly "in" v době největšího útlumu neuronových sítí, zatímco dnes se zdá, že se naopak nacházíme v období "evoluční zimy" – hranice evolučních strategií jsou určující pro současné aplikace, ty ale nevybočují z kategorie hraček (toy problems).

Možná se ale díky propojení hlubokých sítí a umělé evoluce, což je obor nabízející už dnes mnoho velmi pozoruhodných nástrojů a metod, dočkáme naprosto zásadních překvapení. Stačí jen, aby došlo k několika málo teoretickým průlomům, např. pokud se objeví opravdu funkční evoluční alternativa k algoritmu zpětného šíření chyby. A pak, až hardware dozraje…

Ostatně, nebylo by to poprvé.
Okomentovat