Site Overlay

Strojové učení je zábava! Část 3: Hluboké učení a konvoluční neuronové sítě

Tento druh neuronové sítě můžeme na moderním notebooku natrénovat během několika minut. Až to bude hotové, budeme mít neuronovou síť, která dokáže rozpoznávat obrázky osmiček s docela vysokou přesností. Vítejte ve světě rozpoznávání obrázků (z konce 80. let)!

Tunelové vidění

Je opravdu skvělé, že prosté vkládání pixelů do neuronové sítě skutečně fungovalo při vytváření rozpoznávání obrázků! Strojové učení je kouzelné! …že?“

No, tak jednoduché to samozřejmě není.

První dobrou zprávou je, že náš rozpoznávač „8“ skutečně funguje dobře na jednoduchých obrázcích, kde je písmeno přímo uprostřed obrázku:

Ale teď ta opravdu špatná zpráva:

Náš rozpoznávač „8“ naprosto nefunguje, když písmeno není v obrázku dokonale vycentrované. Stačí sebemenší změna polohy a vše se pokazí:

To proto, že naše síť se naučila pouze vzor dokonale vystředěné „8“. Nemá absolutně žádnou představu o tom, co je to nevystředěná „8“. Zná přesně jeden a pouze jeden vzor.

To není v reálném světě příliš užitečné. Problémy reálného světa nejsou nikdy tak čisté a jednoduché. Musíme tedy vymyslet, jak zajistit, aby naše neuronová síť fungovala i v případech, kdy „8“ není dokonale vystředěná.

Brutální nápad č. 1: hledání pomocí posuvného okna

Již jsme vytvořili opravdu dobrý program pro hledání „8“ vystředěné v obrázku. Co kdybychom prostě prohledávali celý obrázek a hledali možné „8“ v menších částech, jednu část po druhé, dokud ji nenajdeme?“

Tento přístup se nazývá posuvné okno. Jedná se o řešení hrubou silou. V některých omezených případech funguje dobře, ale je opravdu neefektivní. Musíte stále dokola kontrolovat stejný obrázek a hledat objekty různých velikostí. Umíme to lépe!

Nápad č. 2: více dat a hluboká neuronová síť

Když jsme trénovali naši síť, ukázali jsme jí pouze „osmičky“, které byly dokonale vycentrované. Co kdybychom ji trénovali s více daty, včetně „osmiček“ ve všech různých polohách a velikostech po celém obrázku?

Na to ani nepotřebujeme shromažďovat nová tréninková data. Stačí napsat skript, který vygeneruje nové obrázky s „8“ ve všech možných různých pozicích v obrázku:

Syntetická trénovací data jsme vytvořili vytvořením různých verzí trénovacích obrázků, které jsme již měli. To je velmi užitečná technika!

Pomocí této techniky můžeme snadno vytvořit nekonečnou zásobu trénovacích dat.

Více dat ztěžuje řešení problému pro naši neuronovou síť, ale můžeme to kompenzovat tím, že naše síť bude větší, a tak se bude moci naučit složitější vzory.

Abychom síť zvětšili, prostě budeme vršit vrstvu za vrstvou uzlů:

Tuto síť nazýváme „hluboká neuronová síť“, protože má více vrstev než tradiční neuronová síť.

Tato myšlenka existuje již od konce 60. let 20. století. Ale až donedávna bylo trénování takto velké neuronové sítě příliš pomalé na to, aby bylo užitečné. Jakmile jsme ale přišli na to, jak místo běžných počítačových procesorů používat 3D grafické karty (které byly navrženy pro opravdu rychlé násobení matic), práce s velkými neuronovými sítěmi se najednou stala praktickou. Ve skutečnosti lze přesně tu samou grafickou kartu NVIDIA GeForce GTX 1080, kterou používáte ke hraní hry Overwatch, použít k neuvěřitelně rychlému trénování neuronových sítí.

Ale i když můžeme naši neuronovou síť udělat opravdu velkou a rychle ji trénovat pomocí 3d grafické karty, stále nás to nedostane až k řešení. Musíme být chytřejší v tom, jak zpracováváme obrázky do naší neuronové sítě.

Přemýšlejte o tom. Nedává smysl trénovat síť na rozpoznání „8“ v horní části obrázku odděleně od trénování na rozpoznání „8“ v dolní části obrázku, jako by to byly dva zcela odlišné objekty.

Měl by existovat nějaký způsob, jak zajistit, aby neuronová síť byla dostatečně chytrá na to, aby poznala, že „8“ kdekoli na obrázku je totéž, bez všeho toho dalšího trénování. Naštěstí… existuje!

Řešením je konvoluce

Jako člověk intuitivně víte, že obrázky mají hierarchii nebo pojmovou strukturu. Vezměte si tento obrázek:

Bezdůvodný obrázek mého syna

Jako člověk okamžitě rozpoznáte hierarchii v tomto obrázku:

  • Země je pokryta trávou a betonem
  • Je tam dítě
  • Dítě sedí na skákacím koni
  • Skákací kůň je na trávě

Nejdůležitější je, že rozpoznáme představu dítěte bez ohledu na to, na jakém povrchu se dítě nachází. Nemusíme se znovu učit představu dítěte pro každý možný povrch, na kterém by se mohlo objevit.

Ale právě teď to naše neuronová síť neumí. Myslí si, že „8“ v jiné části obrázku je úplně jiná věc. Nechápe, že přesunutí objektu v obrázku z něj neudělá něco jiného. To znamená, že se musí znovu učit identifikaci každého objektu v každé možné poloze. To je na nic.

Potřebujeme, aby naše neuronová síť chápala translační invarianci – „8“ je „8“ bez ohledu na to, kde na obrázku se objeví.

Uděláme to pomocí procesu zvaného konvoluce. Myšlenka konvoluce je částečně inspirována informatikou a částečně biologií (tj. šílenými vědci, kteří doslova šťouchali do kočičích mozků podivnými sondami, aby zjistili, jak kočky zpracovávají obrázky).

Jak funguje konvoluce

Místo toho, abychom do naší neuronové sítě vkládali celé obrázky jako jednu mřížku čísel, uděláme něco mnohem chytřejšího, co využije myšlenku, že objekt je stejný bez ohledu na to, kde se na obrázku objeví.

Podívejte se, jak to bude krok za krokem fungovat –

Krok 1: Rozdělte obrázek na překrývající se dlaždice obrázku

Podobně jako při našem vyhledávání v posuvném okně výše projdeme posuvným oknem celý původní obrázek a každý výsledek uložíme jako samostatnou malou dlaždici obrázku:

Tímto postupem jsme náš původní obrázek změnili na 77 stejně velkých malých dlaždic obrázku.

Krok 2: Vložení každé dlaždice obrázku do malé neuronové sítě

Předtím jsme do neuronové sítě vložili jeden obrázek, abychom zjistili, zda se jedná o „osmičku“. Zde provedeme přesně totéž, ale budeme to dělat pro každou jednotlivou dlaždici obrázku:

Tento postup opakujte 77krát, jednou pro každou dlaždici.

Je tu však jeden velký zvrat: Zachováme stejné váhy neuronové sítě pro každou jednotlivou dlaždici ve stejném původním obrázku. Jinými slovy, ke každé dlaždici obrázku přistupujeme stejně. Pokud se v některé dlaždici objeví něco zajímavého, označíme tuto dlaždici jako zajímavou.

Krok 3: Uložení výsledků z každé dlaždice do nového pole

Nechceme ztratit přehled o uspořádání původních dlaždic. Proto uložíme výsledek ze zpracování každé dlaždice do mřížky ve stejném uspořádání jako původní obrázek. Vypadá to takto:

Jinými slovy, začali jsme s velkým obrázkem a skončili jsme s o něco menším polem, které zaznamenává, které části našeho původního obrázku byly nejzajímavější.

Krok 4: Zmenšení vzorku

Výsledkem kroku 3 bylo pole, které mapuje, které části původního obrázku jsou nejzajímavější. Toto pole je však stále dost velké:

Abychom zmenšili velikost pole, zmenšíme ho pomocí algoritmu zvaného max pooling. Zní to efektně, ale vůbec to tak není!

Prostě se podíváme na každý čtverec 2×2 pole a ponecháme si největší číslo:

Jde o to, že pokud jsme našli něco zajímavého v některém ze čtyř vstupních políček, která tvoří každý čtverec 2×2 sítě, ponecháme si jen ten nejzajímavější kousek. Tím zmenšíme velikost našeho pole a zároveň zachováme nejdůležitější bity.

Závěrečný krok: Proveďte předpověď

Dosud jsme zmenšili obří obraz na poměrně malé pole.

Hádejte co? To pole je jen hromada čísel, takže toto malé pole můžeme použít jako vstup do další neuronové sítě. Tato konečná neuronová síť rozhodne, zda obrázek odpovídá, nebo neodpovídá. Abychom ji odlišili od kroku konvoluce, nazýváme ji „plně propojená“ síť.

Od začátku do konce tedy celá naše pětistupňová pipeline vypadá takto:

Přidáváme ještě další kroky

Naše pipeline pro zpracování obrazu tvoří řada kroků: konvoluce, max-pooling a nakonec plně propojená síť.

Při řešení problémů v reálném světě lze tyto kroky libovolně kombinovat a skládat na sebe! Můžete mít dvě, tři nebo dokonce deset konvolučních vrstev. Kdekoli chcete zmenšit objem dat, můžete přihodit max pooling.

Základní myšlenka spočívá v tom, že začnete s velkým obrazem a neustále ho krok za krokem zmenšujete, až nakonec získáte jediný výsledek. Čím více konvolučních kroků budete mít, tím složitější rysy se bude vaše síť schopna naučit rozpoznávat.

Například první konvoluční krok se může naučit rozpoznávat ostré hrany, druhý konvoluční krok může rozpoznávat zobáky pomocí znalosti ostrých hran, třetí krok může rozpoznávat celé ptáky pomocí znalosti zobáků atd.

Takto vypadá realističtější hluboká konvoluční síť (jakou byste našli ve výzkumné práci):

V tomto případě začnou s obrázkem o velikosti 224 x 224 pixelů, dvakrát použijí konvoluci a max pooling, ještě třikrát použijí konvoluci, použijí max pooling a pak mají dvě plně propojené vrstvy. Konečným výsledkem je zařazení obrázku do jedné z 1000 kategorií!

Konstrukce správné sítě

Jak tedy zjistíte, které kroky musíte zkombinovat, aby váš klasifikátor obrázků fungoval?

Pravdu řečeno, na to musíte odpovědět tak, že budete hodně experimentovat a testovat. Možná budete muset natrénovat 100 sítí, než najdete optimální strukturu a parametry pro řešený problém. Strojové učení zahrnuje spoustu pokusů a omylů!“

Stavba našeho klasifikátoru ptáků

Teď už konečně víme dost na to, abychom mohli napsat program, který dokáže rozhodnout, zda je obrázek pták, nebo ne.

Jako vždy potřebujeme pro začátek nějaká data. Volně dostupný soubor dat CIFAR10 obsahuje 6 000 obrázků ptáků a 52 000 obrázků věcí, které ptáky nejsou. Abychom však získali ještě více dat, přidáme také datovou sadu Caltech-UCSD Birds-200-2011, která obsahuje dalších 12 000 obrázků ptáků.

Tady je několik ptáků z naší kombinované datové sady:

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.