Jsem si jistý, že mnoho lidí odpoví odkazy na „nechte mě to vygooglit“, takže chci říci, že jsem se pokusil zjistit tohle, tak prosím odpusťte můj nedostatek porozumění zde, ale nemohu přijít na to, jak praktická implementace neuronové sítě vlastně funguje.
Rozumím vstupní vrstvě a jak normalizovat data, rozumím také jednotce zkreslení, ale pokud jde o skrytou vrstvu, jaký je skutečný výpočet v této vrstvě a jak se mapuje na výstup je jen trochu mlhavý. Viděl jsem diagramy s otazníky ve skryté vrstvě, booleovské funkce jako AND / OR / XOR, aktivační funkce a vstupní uzly, které se mapují na všechny skryté jednotky, a vstupní uzly, které se mapují pouze na několik skrytých jednotek, a tak Mám jen několik otázek k praktickému aspektu. Samozřejmě jednoduché vysvětlení celého procesu neuronové sítě, jaké byste vysvětlili dítěti, by bylo úžasné.
Jaké výpočty se provádějí ve skryté vrstvě ?
Jak jsou tyto výpočty mapovány na výstupní vrstvu?
Jak funguje výstupní vrstva? De-normalizace dat ze skryté vrstvy?
Proč jsou některé vrstvy ve vstupní vrstvě připojeny ke skryté vrstvě a některé ne?
Komentáře
- Lidé v okolí jsou milí, nikdy jsem je neviděl odpověď „dovolte mi to pro vás vygooglit“, ale mnoho překvapivě důkladných a bystrých odpovědí na to, co se zpočátku zdálo jako základní otázky. Bohužel vám ‚ nemůžu pomoci Je to vaše, ale zdá se to docela relevantní, takže ho s radostí hlasuji.
- Díky za komentář a hlas Gael, jsem ‚ m asi trochu unavený komunita SO, jak všichni víme, jak se tito lidé mohou dostat 🙂 Rádi vidíme více ducha spolupráce tady na rozdíl od pokusu o získání odznaků a bodů úpravou / uzavřením otázek.
- Nejsem konkrétně expert na neuronové sítě, i když se zapojuji do jejich aplikací a metod. Moje možná ne příliš užitečná odpověď by byla, že konkrétní výpočty ve skrytém prostředí závisí na ‚ nákladové funkci ‚, kterou jste vnucování vašeho výstupu, tj. čeho se snažíte dosáhnout. Například pokud chcete seskupit vstupní prvky do seskupených sad, vypočítáte vzdálenosti mezi prvky ve skryté vrstvě. To může projít různými iteracemi a optimalizačními cykly v této vrstvě, dokud nesplníte chybové kritérium, které umožní procesu „opustit ‚ tuto vrstvu.
Odpověď
Verze se třemi větami:
-
Každá vrstva může na předchozí vrstvu použít libovolnou funkci, kterou chcete (obvykle lineární transformace následovaná nelineární nelineárností).
-
Úkolem skrytých vrstev je transformovat vstupy na něco, co může výstupní vrstva použít.
-
Výstupní vrstva transformuje aktivace skryté vrstvy na jakékoli měřítko, ve kterém chcete, aby byl váš výstup.
Like you „re 5:
Pokud chcete, aby vám počítač řekl, zda je na obrázku sběrnice, mohl by mít počítač jednodušší čas, kdyby měl správné nástroje.
Váš detektor sběrnice tedy může být vyroben z detektoru kol (aby vám řekl, že je to vozidlo) a detektoru krabic (protože autobus má tvar velké krabice) a detektoru velikosti (aby vám řekl to je příliš velké na to, aby to bylo auto). Toto jsou tři prvky vaší skryté vrstvy: nejsou součástí surového obrazu, jsou to nástroje, které jste navrhli, aby vám pomohly identifikovat autobusy.
Pokud se všechny tři z těchto detektorů zapnou (nebo pokud jsou „obzvláště aktivní“), existuje velká šance, že máte před sebou autobus.
Neuronové sítě jsou užitečné Protože existují dobré nástroje (jako backpropagation) pro vytváření mnoha detektorů a jejich sestavování.
Jako vy jste dospělí
Dopředná neuronová síť aplikuje na data řadu funkcí. Přesné funkce budou záviset na neuronové síti, kterou používáte: nejčastěji tyto funkce počítají lineární transformaci předchozí vrstvy, po které následuje squashingová nelinearita. Někdy budou tyto funkce dělat něco jiného (například výpočet logických funkcí ve vašich příkladech nebo průměrování přes sousední pixely v obrázku). Role různých vrstev tedy mohou záviset na tom, jaké funkce se počítají, ale pokusím se být velmi obecný.
Pojďme volat vstup vektor $ x $, aktivace skryté vrstvy $ h $ a aktivace výstupu $ y $. Máte nějakou funkci $ f $, která mapuje od $ x $ do $ h $ a další funkci $ g $, která mapuje z $ h $ až $ y $.
Aktivace skryté vrstvy je tedy $ f (x) $ a výstup sítě je $ g (f (x)) $.
Proč mít dvě funkce ($ f $ a $ g $) namísto jediné?
Pokud je úroveň složitosti na funkci omezená, pak $ g (f (x)) $ může vypočítat věci, které $ f $ a $ g $ nelze provést jednotlivě.
Příklad s logickými funkcemi:
Například pokud povolíme pouze $ f $ a $ g $ jako jednoduché logické operátory jako „AND“, „OR“ a „NAND“, pak nelze „počítat další funkce jako„ XOR “pouze s jedním z nich. Na druhou stranu bychom mohli vypočítat „XOR“, pokud bychom byli ochotni tyto funkce vrstvit na sebe:
Funkce první vrstvy:
- Ujistěte se, že alespoň jeden prvek je „PRAVDA“ (pomocí OR)
- Ujistěte se, že nejsou všechny „PRAVÉ“ (pomocí NAND)
Funkce druhé vrstvy:
- Ujistěte se, že jsou splněna obě kritéria první vrstvy (pomocí AND)
Síťovým výstupem je pouze výsledek této druhé funkce. První vrstva transformuje vstupy na něco, co může druhá vrstva použít, aby celá síť mohla provádět XOR.
Příklad s obrázky:
Snímek 61 z této diskuse – také k dispozici zde jako jediný obrázek – ukazuje (jeden způsob vizualizace), co hledají různé skryté vrstvy v konkrétní neuronové síti.
První vrstva hledá krátké kousky okrajů v obraze: je velmi snadné je najít ze surových dat o pixelech, ale samy o sobě nejsou příliš užitečné pro to, aby vám řekly, zda se díváte na obličej, autobus nebo slon.
Další vrstva tvoří hrany: pokud hrany ze spodní skryté vrstvy do sebe zapadají určitým způsobem, pak by se mohl zapnout jeden z detektorů očí ve středu sloupce nejvíce vlevo . Bylo by těžké vytvořit jednu vrstvu, která by byla tak dobrá při hledání něčeho tak specifického ze surových pixelů: detektory očí se mnohem snáze vytvářejí z hranových detektorů než ze surových pixelů.
Další vrstva nahoru skládá detektory očí a nosu do tváří. Jinými slovy, rozsvítí se, když se detektory očí a nosu z předchozí vrstvy zapnou se správnými vzory. Jsou velmi dobré při hledání konkrétních druhů tváří: pokud se rozsvítí jeden nebo více z nich, měla by vaše výstupní vrstva hlásit přítomnost tváře.
To je užitečné, protože Detektory obličeje lze snadno sestavit z očních a nosních detektorů, ale opravdu těžké je je sestavit z intenzit pixelů.
Takže každá vrstva vás dostane dále a dále od surových pixelů a blíže ke svému konečnému cíli (např. detekce obličeje nebo detekce sběrnice).
Odpovědi na různé další otázky
„Proč jsou některé vrstvy ve vstupní vrstvě propojeny se skrytou vrstvou a některé ne?“
Odpojené uzly v síti se nazývají „zkreslené“ uzly. Zde je opravdu pěkné vysvětlení zde . Krátká odpověď je, že se jim líbí regresní pojmy.
„Kde pocházejí obrázky „detektoru očí“ v příkladu obrázku? “
Nezkontroloval jsem konkrétní obrázky, na které jsem odkazoval, ale obecně tyto vizualizace ukazují sadu pixely ve vstupní vrstvě, které maximalizují aktivitu příslušného neuronu. Takže pokud si myslíme, že neuron je detektorem očí, je to obraz, který neuron považuje za nejvíce podobný oku. Lidé obvykle nacházejí tyto sady pixelů s optimalizací (postup do kopce).
V tomto článku od některých lidí Google s jednou z největších neurálních sítí na světě ukazují „neuron detektoru obličeje“ a neuron „detektoru koček“ tímto způsobem i druhým způsobem: Zobrazují také skutečné obrázky , které aktivují neuron nejsilněji (obrázek 3, obrázek 16). Druhý přístup je pěkný, protože ukazuje, jak flexibilní a nelineární je síť – tyto „detektory“ na vysoké úrovni jsou citlivé na všechny tyto obrázky, i když na úrovni pixelů zvláště nevypadají podobně.
Dejte mi vědět, pokud je zde něco nejasného, nebo pokud máte další dotazy.
Komentáře
- Existuje tedy pouze jeden definovaný algoritmus pro každý jednotlivý uzel v dané vrstvě a váhy jsou tím, čím se výstupy liší? Nebo můžete naprogramovat každý uzel ve vrstvě tak, aby byl odlišný?
- @GeorgeMcDowd to se dostane na klíčový problém: při pohledu pixely a identifikace sběrnic je těžké, jak jste navrhli. Naštěstí je prohlížení pixelů a hledání hran snadné – to je ‚ to, co se snaží udělat první skrytá vrstva. Další vrstva se snaží dělat závěry na základě hran, což je mnohem snazší, než se o to pokoušet na základě pixelů.
- SO by vám mělo dát nějakou další odměnu (nejen body) za čas a úsilí, které jste věnovali této odpovědi!
- @JoshuaEnfield Myslím, že logika z roku 1980 s byla kombinace podobnosti s tím, jak si lidé mysleli, že mozek funguje, že je všude diferencovatelný a že hodnoty byly ohraničené, jak jste zmínil. Od té doby lidé zjistili, že
f(x) = max(x, 0)
(“ opravená lineární jednotka „) často funguje lépe, i když ‚ nemá mnoho z těchto vlastností. - Příklad sběrnice a řetězec funkcí jej právě přibil. Nechápejte ‚, proč učebnice nemohou ‚ být popisné.
Odpověď
Pokusím se přidat k intuitivnímu operačnímu popisu …
Dobrým intuitivním způsobem, jak přemýšlet o neuronové síti, je myslet o tom, co se model lineární regrese pokouší udělat. Lineární regrese bude trvat některé vstupy a přijde s lineárním modelem, který vezme každou vstupní hodnotu krát nějaký model optimálních váhových koeficientů a pokusí se mapovat součet těchto výsledků na výstupní odezvu, která úzce souvisí odpovídá skutečnému výstupu. Koeficienty jsou určeny vyhledáním hodnot, které minimalizují určitou chybovou metriku mezi požadovanou výstupní hodnotou a hodnotou, kterou se model učí. Jiným způsobem je říci, že lineární model se pokusí vytvořit multiplikátory koeficientů pro každý vstup a součet všech z nich se pokuste určit vztah mezi (vícenásobným) vstupem a (obvykle jediným) výstupním val ues. Stejný model lze téměř považovat za základní stavební kámen neuronové sítě; jediná jednotka perceptron.
Ale jediná jednotka perceptron má ještě jeden kus, který bude zpracovávat součet vážených dat nelineárním způsobem. K tomu obvykle používá funkci squashing (sigmoid nebo tanh). Takže máte základní jednotku skryté vrstvy, což je blok, který sečte sadu vážených vstupů – poté předá sečtenou odpověď nelineární funkci a vytvoří odpověď výstupního uzlu (skrytá vrstva). Jednotka zkreslení je stejně jako u lineární regrese, konstantní posun, který se přidává ke každému uzlu, který se má zpracovat. Kvůli nelineárnímu bloku zpracování již nejste omezeni pouze na lineární odpovědi (jako v modelu lineární regrese).
Dobře, ale když máte mnoho jednotlivých perceptronových jednotek spolupracujících, každá může mít různé multiplikátory vstupní hmotnosti a různé odezvy (i když VŠECHNY zpracovávají stejnou sadu vstupů se stejným dříve popsaným nelineárním blokem). Odlišnosti se liší v tom, že každá z nich má různé váhy koeficientů, které se neuronová síť naučí tréninkem (některé formy zahrnují gradientní sestup). Výsledek všech perceptronů je poté znovu zpracován a předán do výstupní vrstvy, stejně jako byly zpracovány jednotlivé bloky. Otázkou tedy je, jak se určují správné váhy pro všechny bloky?
Běžným způsobem, jak se naučit správné váhy, je začít s náhodnými váhami a měřit chybovou odezvu mezi skutečným skutečným výstupem a naučeným modelový výstup. Chyba se obvykle prochází zpětně sítí a algoritmus zpětné vazby jednotlivě zvýší nebo sníží tyto váhy o určitý poměr k chybě. Síť bude opakovaně iterovat předáváním vpřed, měřením výstupní odezvy, poté aktualizací (předávání úprav hmotnosti dozadu) a opravováním vah, dokud nebude dosaženo uspokojivé úrovně chyb. V tomto okamžiku máte regresní model, který může být flexibilnější než lineární regresní model, běžně se tomu říká aproximátor univerzálních funkcí.
Jedním ze způsobů, které mi skutečně pomohly zjistit, jak neurální síť skutečně funguje, je prostudovat si kód implementace neuronové sítě a vybudovat jej. Jedno z nejlepších základních vysvětlení kódu lze najít v kapitole o neuronových sítích (volně dostupné) „Příručka pro vědce a inženýry k DSP“ Ch. 26. Většinou je napsán ve velmi základním jazyce (myslím, že to bylo Fortran), který vám opravdu pomůže zjistit, o co jde.
Odpověď
Budu popisovat svůj pohled na to ve dvou krocích: Krok od vstupu ke skrytí a krok od skrytí k výstupu. Nejprve provedu krok skrytého výstupu, protože mi připadá méně zajímavý.
Skrytý výstup
Výstupem skryté vrstvy mohou být různé věci, ale prozatím předpokládejme, že vycházejí z sigmoidální aktivační funkce. Jsou to tedy hodnoty mezi 0 a 1 a pro mnoho vstupů mohou být jen 0 s a 1 s.
Rád bych přemýšlel o transformaci mezi výstupy těchto skrytých neuronů a výstupní vrstvou pouze jako překlad (v lingvistickém smyslu, nikoli v geometrickém smyslu). To jistě platí, pokud je transformace invertible , a pokud ne, pak se něco ztratilo v překladu. Ale v podstatě máte pouze výstupy skrytých neuronů z jiné perspektivy.
Input-to-Hidden
Řekněme, že máte 3 vstupní neurony (jen abych mohl snadno zde napište několik rovnic) a několik skrytých neuronů. Každý skrytý neuron dostane jako vstup vážený součet vstupů, takže například možná
hidden_1 = 10 * (input_1) + 0 * (input_2) + 2 * (input_3)
To znamená, že hodnota hidden_1
je velmi citlivá na hodnotu input_1
, vůbec není citlivý na input_2
a jen mírně citlivý na input_3
.
Dalo by se tedy říci, že hidden_1
zachycuje konkrétní aspekt vstupu, který můžete nazvat „input_1
je důležitý „aspekt.
Výstup z hidden_1
je obvykle vytvořen předáním vstupu nějakou funkcí, takže řekněme, že používáte sigmoid funkci. Tato funkce nabývá hodnot mezi 0 a 1; Takže o tom přemýšlejte jako o přepínači, který říká, že buď input_1
je důležitý, nebo to není „t.
Takže to je to, co dělá skrytá vrstva! Extrahuje aspekty nebo funkce vstupního prostoru.
Váhy nyní mohou být také záporné! Což znamená, že můžete získat aspekty jako „input_1
je důležité, ALE input_2
tuto důležitost bere“:
hidden_2 = 10 * (input_1) - 10 * (input_2 ) + 0 * (input_3)
nebo input_1
a input_3
mají „sdílenou“ důležitost:
hidden_3 = 5 * (input_1) + 0 * (input_2) + 5 * (input_3)
Více geometrie
Pokud nějaké znáte lineární algebra, můžete uvažovat geometricky, pokud jde o promítání v určitých směrech. Ve výše uvedeném příkladu jsem promítal ve směru input_1
.
Pojďme se znovu podívat na hidden_1
z výše. Jakmile je hodnota input_1
dostatečně velká, výstup funkce aktivace sigmoidu zůstane pouze na 1, nebude větší . Jinými slovy, stále více input_1
nebude mít na výstupu žádný rozdíl. Podobně, pokud se pohybuje v opačném (tj. Záporném) směru, pak po bodě nebude výstup ovlivněn.
Dobře, dobře. Ale předpokládejme, že nechceme citlivost ve směru nekonečna v určitém směru a chceme, aby byla aktivována pouze pro určitý rozsah na řádku. Význam pro velmi záporné hodnoty nemá žádný účinek , a pro velmi kladné hodnoty nemá žádný účinek, ale pro hodnoty mezi řekněme 5 a 16 chcete, aby se probudilo. Zde byste použili radiální základní funkci pro vaši aktivační funkci.
Souhrn
Skrytá vrstva extrahuje funkce vstupního prostoru a výstupní vrstva je převádí do požadovaného kontextu. Může to být mnohem víc než toto, co s vícevrstvými sítěmi atd., ale zatím tomu rozumím.
EDIT: Tato stránka s nádhernými interaktivními grafy odvádí lepší práci, než kdy moje dlouhá a těžkopádná odpověď mohla udělat. : http://neuralnetworksanddeeplearning.com/chap4.html
Komentáře
- Stejně jako OP, i ‚ jsem trochu zmaten o skryté vrstvě v neuronových sítích. Jak ve vašem příkladu zjistí algoritmus NN váhy neuronů skrytý_1, skrytý_2 a skrytý_3? A protože hidden_1, hidden_2 a hidden_3 jsou odvozeny ze stejných vstupních proměnných, ‚ t váhy konvergují ke stejnému řešení?
Odpověď
Vezměme si případ klasifikace. Co se výstupní vrstva snaží udělat, je odhadnout podmíněnou pravděpodobnost, že váš vzorek patří do dané třídy, tj. Jak je pravděpodobné, že daný vzorek bude patřit do dané třídy. Z geometrického hlediska umožňuje kombinace vrstev nelineárním způsobem pomocí prahových funkcí neuronovým sítím řešit nekonvexní problémy (rozpoznávání řeči, rozpoznávání objektů atd.), Které jsou nejzajímavější. Jinými slovy, výstupní jednotky jsou schopné generovat nekonvexní rozhodovací funkce, jako jsou ty zobrazené zde .
Jednotky ve skrytých vrstvách lze zobrazit jako učení komplexních funkcí z dat, které umožňují výstupní vrstvě lépe rozeznat jednu třídu od druhé a generovat přesnější hranice rozhodování. Například v případě rozpoznávání tváře se jednotky v prvních vrstvách učí hranové prvky (detekují hrany v daných orientacích a polohách) a vyšší vrstvy se učí kombinovat ty, aby se staly detektory obličejových prvků, jako je nos, ústa nebo oči. Váhy každé skryté jednotky představují tyto funkce a její výstup (za předpokladu, že se jedná o sigmoid) představuje pravděpodobnost, že se tato funkce ve vašem vzorku nachází.
Obecně platí, že význam výstupů výstupu a skryté vrstvy závisí na problému, který se snažíte vyřešit (regrese, klasifikace) a na ztrátové funkci, kterou používáte (křížová entropie, chyby nejméně čtverců, …)