Vítejte v části 3 Applied Deep Learning series. Část 1 byl praktický úvod do umělých neuronových sítí, pokrývající teorii i aplikaci s mnoha příklady kódu a vizualizací. V Části 2 jsme aplikovali hluboké učení do reálného světa datové soubory, zahrnující 3 nejčastěji vyskytují problémy jako případové studie: binární klasifikace, multiclass klasifikace a regrese.
nyní se začneme potápět do konkrétních architektur hlubokého učení, počínaje nejjednoduššími: Autoencodery.
- Úvod
- Architektura
- Realizace
- odstranění Šumu Autoencoders
- Řídké Autoencoders
- Případy Užití
- Závěr
kód pro tento článek je k dispozici zde jako Jupyter notebooku, neváhejte stáhnout a vyzkoušet si to sami.
Úvod
Autoencoders jsou specifický druh dopředných sítí, kde vstup je stejný jako výstupní. Komprimují vstup do nižšího rozměrového kódu a poté rekonstruují výstup z této reprezentace. Kód je kompaktní „shrnutí“ nebo „komprese“ vstupu, nazývané také reprezentace latentního prostoru.
autoencoder se skládá ze 3 komponent: kodér, kód a dekodér. Kodér komprimuje vstup a produkuje kód, dekodér pak rekonstruuje vstup pouze pomocí tohoto kódu.
vybudovat autoencoder potřebujeme 3 věci: způsob kódování, dekódování metoda, a ztráta funkce porovnat výstup s cílem. Prozkoumáme je v další části.
Autoencoders jsou především o snížení počtu rozměrů (nebo komprese) algoritmus s pár důležitých vlastností:
- Data-specifické: Autoencoders jsou schopni smysluplně komprimovat data podobný tomu, co oni byli vyškoleni na. Protože se učí funkce specifické pro daná tréninková data, liší se od standardního algoritmu komprese dat, jako je gzip. Nemůžeme tedy očekávat, že autoencoder vyškolený na ručně psaných číslicích komprimuje fotografie na šířku.
- ztráta: Výstup autoencoderu nebude přesně stejný jako vstup, bude to úzká, ale degradovaná reprezentace. Pokud chcete bezeztrátovou kompresi, nejsou způsob, jak jít.
- bez Dozoru: vlak o autoencoder nemusíme dělat nic vymyšleného, jen hodit syrové vstupní data. Autoencodery jsou považovány za bez dozoru učení techniku, protože nepotřebují explicitní štítky trénovat na. Přesněji řečeno, jsou pod dohledem, protože generují své vlastní štítky z údajů o školení.
Architektura
pojďme prozkoumat podrobnosti kodéru, kódu a dekodéru. Kodér i dekodér jsou plně připojené dopředné neuronové sítě, v podstatě ANNs, které jsme pokryli v části 1. Kód je jedna vrstva ANN s dimenzionalitou podle našeho výběru. Počet uzlů ve vrstvě kódu (velikost kódu) je hyperparametr, který jsme nastavili před tréninkem autoencoderu.
jedná se o podrobnější vizualizaci autoencoderu. Nejprve vstup prochází kodérem, což je plně připojený ANN, pro vytvoření kódu. Dekodér, který má podobnou strukturu ANN, pak produkuje výstup pouze pomocí kódu. Cílem je získat výstup totožný se vstupem. Všimněte si, že architektura dekodéru je zrcadlovým obrazem kodéru. To není požadavek, ale obvykle tomu tak je. Jediným požadavkem je dimenzionalita vstupu a výstupu musí být stejná. S čímkoli uprostřed se dá hrát.
existují 4 hyperparametry, které musíme nastavit před tréninkem autoencoderu:
- velikost kódu: počet uzlů ve střední vrstvě. Menší velikost má za následek větší kompresi.
- počet vrstev: autoencoder může být tak hluboký, jak se nám líbí. Na obrázku výše máme 2 vrstvy v kodéru i dekodéru, bez ohledu na vstup a výstup.
- Počet uzlů na vrstvu: autoencoder architektury pracujeme, se nazývá skládaný autoencoder od vrstvy jsou naskládány jeden po druhém. Obvykle skládané autoencodery vypadají jako „sendvič“. Počet uzlů na vrstvu klesá s každou další vrstvou kodéru a zvyšuje se zpět v dekodéru. Také dekodér je symetrický k kodéru z hlediska struktury vrstvy. Jak bylo uvedeno výše, není to nutné a máme nad těmito parametry úplnou kontrolu.
- ztrátová funkce: buď použijeme střední kvadratickou chybu (mse) nebo binární crossentropii. Pokud jsou vstupní hodnoty v rozsahu, pak obvykle používáme crossentropii, jinak použijeme střední kvadratickou chybu. Pro více informací se podívejte na toto video.
Autoencodery jsou trénovány stejným způsobem jako ANNs prostřednictvím backpropagation. Podívejte se na úvod Části 1 pro více informací o tom, jak neuronové sítě jsou vyškoleni, to se přímo vztahuje na autoencoders.
implementace
nyní implementujeme autoencoder pro následující architekturu, 1 skrytou vrstvu v kodéru a dekodéru.
jako vstup použijeme extrémně populární datovou sadu MNIST. Obsahuje černobílé obrázky ručně psaných číslic.
Jsou na velikost 28×28 a používáme je jako vektor 784 čísla mezi . Podrobnosti najdete v notebooku jupyter.
nyní implementujeme autoencoder pomocí Keras. Hyperparametry jsou: 128 uzlů ve skryté vrstvě, velikost kódu je 32 a binární crossentropie je ztrátová funkce.
to je velmi podobné ANNs, na kterých jsme pracovali, ale nyní používáme funkční API Keras. Podrobnosti naleznete v této příručce, ale zde je rychlé srovnání. Předtím, než jsme použili přidat vrstvy pomocí sekvenčního API takto:
model.add(Dense(16, activation='relu'))
model.add(Dense(8, activation='relu'))
s funkčním API to děláme:
layer_1 = Dense(16, activation='relu')(input)
layer_2 = Dense(8, activation='relu')(layer_1)
je to podrobnější, ale flexibilnější způsob definování složitých modelů. Můžeme snadno uchopit části našeho modelu, například pouze dekodér, a pracovat s tím. Výstupem husté metody je volatelná vrstva, pomocí funkčního API jí poskytneme vstup a výstup uložíme. Výstup vrstvy se stává vstupem další vrstvy. Se sekvenčním API metoda add to implicitně zpracovala za nás.
Všimněte si, že všechny vrstvy používají aktivační funkci relu, protože je to standard s hlubokými neuronovými sítěmi. Poslední vrstva používá sigmoidní aktivaci, protože potřebujeme, aby výstupy byly mezi . Vstup je také ve stejném rozsahu.
také si všimněte funkce call to fit, dříve s ANNs jsme to dělali:
model.fit(x_train, y_train)
ale teď to děláme:
model.fit(x_train, x_train)
nezapomeňte, že cíle autoencoderu jsou stejné jako vstup. Proto dodáváme tréninková data jako cíl.
vizualizace
nyní si představme, jak dobře náš autoencoder rekonstruuje svůj vstup.
autoencoder spustíme na testovací sadě jednoduše pomocí funkce predict of Keras. Pro každý obrázek v testovací sadě získáme výstup autoencoderu. Očekáváme, že výstup bude velmi podobný vstupu.
jsou opravdu docela podobné, ale ne úplně stejné. Můžeme si to všimnout jasněji v poslední číslici „4“. Protože to byl jednoduchý úkol, náš autoencoder fungoval docela dobře.
máme úplnou kontrolu nad architekturou autoencoderu. Můžeme to udělat velmi silným zvýšením počtu vrstev, uzlů na vrstvu a hlavně velikosti kódu. Zvýšení těchto hyperparametrů umožní autoencoderu naučit se složitější kódování. Ale měli bychom být opatrní, aby to nebylo příliš silné. V opačném případě se autoencoder jednoduše naučí kopírovat své vstupy na výstup, aniž by se naučil jakoukoli smysluplnou reprezentaci. Bude to jen napodobovat funkci identity. Autoencoder dokonale rekonstruuje tréninková data, ale bude přeplňován, aniž by byl schopen zobecnit nové instance, což není to, co chceme.
proto preferujeme architekturu“ sandwitch “ a záměrně udržujeme velikost kódu malou. Protože kódovací vrstva má nižší rozměr než vstupní data, říká se, že autoencoder je nedokončený. Nebude moci přímo kopírovat své vstupy na výstup a bude nucen se učit inteligentní funkce. Pokud vstupní data má vzor, například číslice „1“ obsahuje obvykle poněkud přímce a číslice „0“ je kruhové, se dozvíte tuto skutečnost a zakódovat ve více kompaktní formě. Pokud byla vstupní data zcela náhodná bez jakékoli vnitřní korelace nebo závislosti, pak nedokončený autoencoder nebude schopen je dokonale obnovit. Ale naštěstí v reálném světě existuje spousta závislosti.
Denoising Autoencoders
udržování malé vrstvy kódu donutilo náš autoencoder naučit se inteligentní reprezentaci dat. Tam je další způsob, jak přinutit autoencoder naučit užitečné vlastnosti, což je přidání náhodného šumu na jeho vstupy a dělat to obnovit původní hluk-data zdarma. Tímto způsobem autoencoder nemůže jednoduše zkopírovat vstup na jeho výstup, protože vstup také obsahuje náhodný šum. Žádáme ji, aby odečetla hluk a vytvořila podkladová smysluplná data. Tomu se říká denoizující autoencoder.
horní řádek obsahuje původní obrázky. Přidáme k nim náhodný Gaussovský šum a hlučná data se stanou vstupem do autoencoderu. Autoencoder nevidí původní obrázek vůbec. Ale pak očekáváme, že autoencoder regeneruje původní obraz bez šumu.
je Tu jen jeden malý rozdíl mezi prováděním šumu autoencoder a pravidelné. Architektura se vůbec nemění, pouze funkce fit. Cvičili jsme pravidelný autoencoder následovně:
autoencoder.fit(x_train, x_train)
Denoising autoencoder je vyškolen jako:
autoencoder.fit(x_train_noisy, x_train)
jednoduché, všechno ostatní je úplně stejné. Vstup do autoencoderu je hlučný obraz a očekávaný cíl je původní bezšumový.
vizualizace
nyní si představme, zda jsme schopni obnovit snímky bez šumu.
Vypadá to docela dobře. Spodní řádek je výstup autoencoderu. Můžeme to udělat lépe pomocí složitější architektury autoencoderu, jako jsou konvoluční autoencodery. V nadcházejícím článku se budeme zabývat konvolucemi.
řídké Autoencodery
představili jsme dva způsoby, jak donutit autoencoder naučit se užitečné funkce: udržet velikost kódu malou a denoising autoencodery. Třetí metodou je použití regularizace. Můžeme regularizovat autoencoder pomocí omezení řídkosti tak, že pouze zlomek uzlů by měl nenulové hodnoty, nazývané aktivní uzly.
zejména k funkci ztráty přidáme trestný termín tak, že se aktivuje pouze zlomek uzlů. To nutí autoencoder reprezentovat každý vstup jako kombinaci malého počtu uzlů a vyžaduje, aby objevil zajímavou strukturu v datech. Tato metoda funguje, i když je velikost kódu velká, protože kdykoli bude aktivní pouze malá podmnožina uzlů.
v Kerasu je to docela snadné s jediným parametrem. Připomínáme, že dříve jsme vytvořili vrstvu kódu takto:
code = Dense(code_size, activation='relu')(input_img)
nyní přidáme další parametr nazvaný activity_regularizer zadáním síly regularizace. Toto je obvykle hodnota v rozsahu . Zde jsme vybrali 10e-6.
code = Dense(code_size, activation='relu', activity_regularizer=l1(10e-6))(input_img)
konečné ztráty řídké model je 0.01 vyšší než standardní jeden, vzhledem k přidané regularizace termín.
ukažme si, že kódování generované regularizovaným modelem jsou skutečně řídké. Pokud se podíváme na histogram kódových hodnot pro obrázky v testovací sadě, distribuce je následující:
průměr pro standardní model je 6.6, ale pro legalizovány model je 0.8, docela velké omezení. Vidíme, že velká část kódových hodnot v regularizovaném modelu je skutečně 0, což jsme chtěli. Rozptyl regularizovaného modelu je také poměrně nízký.
případy použití
nyní můžeme položit následující otázky. Jak dobré jsou autoencodery při kompresi vstupu? A jsou běžně používanou technikou hlubokého učení?
bohužel autoencodery nejsou široce používány v reálných aplikacích. Jako metoda komprese nevedou lépe než její alternativy, například jpeg dělá kompresi fotografií lépe než autoencoder. A skutečnost, že autoencodery jsou specifické pro data, je činí nepraktickými jako obecná technika. Oni mají 3 běžné případy použití ačkoli:
- data denoising: viděli jsme příklad na obrázcích.
- redukce dimenzionality: vizualizace vysoce dimenzionálních dat je náročná. t-SNE je nejčastěji používaná metoda, ale bojuje s velkým počtem rozměrů (obvykle nad 32). Autoencodery se tedy používají jako krok předzpracování ke snížení dimenzionality a toto komprimované znázornění používá t-SNE k vizualizaci dat ve 2D prostoru. Skvělé články o t-SNE naleznete zde a zde.
- variační Autoencodery (VAE): jedná se o modernější a složitější případ použití autoencoderů a budeme je pokrývat v jiném článku. Ale jako rychlé shrnutí, VAE se učí parametry distribuce pravděpodobnosti modelování vstupních dat, namísto učení libovolné funkce v případě vanilkových autoencoderů. Pomocí vzorkovacích bodů z této distribuce můžeme také použít VAE jako generativní model. Zde je dobrá reference.
závěr
Autoencodery jsou velmi užitečnou technikou redukce dimenzionality. Jsou velmi populární jako učební materiál v úvodních kurzech hlubokého učení, pravděpodobně kvůli jejich jednoduchosti. V tomto článku jsme je podrobně popsali a doufám, že se vám to líbilo.
celý kód pro tento článek je k dispozici zde, pokud chcete hack na něj sami. Pokud máte nějakou zpětnou vazbu, neváhejte mě kontaktovat na Twitteru.