Jag är säker på att många kommer att svara med länkar till ”låt mig google det åt dig”, så jag vill säga att jag ”har försökt räkna det här, så förlåt min brist på förståelse här, men jag kan inte ta reda på hur det praktiska genomförandet av ett neuralt nätverk faktiskt fungerar.
Jag förstår ingångsskiktet och hur man normaliserar data, jag förstår också förspänningsenheten, men när det gäller det dolda lagret, vad den faktiska beräkningen är i det lagret och hur det mappas till produktionen är bara lite dimmig. Jag har sett diagram med frågetecken i det dolda lagret, booleska funktioner som AND / OR / XOR, aktiveringsfunktioner och inmatningsnoder som mappas till alla dolda enheter och inmatningsnoder som mappar till bara några dolda enheter vardera och så Jag har bara några frågor om den praktiska aspekten. Naturligtvis skulle en enkel förklaring av hela det neurala nätverksprocessen som du skulle förklara för ett barn vara fantastisk.
Vilka beräkningar görs i det dolda lagret ?
Hur mappas dessa beräkningar till utlagret?
Hur fungerar ouputlagret? Avnormalisera data från det dolda lagret?
Varför är några lager i inmatningsskiktet anslutna till det dolda lagret och andra inte?
Kommentarer
- Människorna här är trevliga, jag har aldrig sett ett ”låt mig googla det åt dig” svar men många överraskande noggranna och insiktsfulla svar på vad som först tycktes vara grundläggande frågor. Tyvärr kan jag ’ inte hjälpa dig w med din men det verkar ganska relevant så jag röstar gärna upp det.
- Tack för kommentaren och omröstningen Gael, jag ’ Jag är nog lite trasig av SO-communityn eftersom vi alla vet hur dessa människor kan få 🙂 Glad att se mer av en anda av samarbete här i motsats till att försöka tjäna märken och poäng genom att redigera / stänga frågor.
- Jag är inte expert på neurala nätverk specifikt, även om jag engagerar mig i deras applikationer och metoder. Mitt kanske inte så hjälpsamma svar skulle vara att de specifika beräkningarna i det dolda beror på ’ kostnadsfunktionen ’ som du är att påtvinga din utgång, dvs vad du försöker uppnå. Om du till exempel vill gruppera inmatningselementen i grupperade uppsättningar beräknar du avstånd mellan element i det dolda lagret. Detta kan gå igenom olika iterationer och optimeringscykler inom detta lager tills du uppfyller ett felkriterium som gör att processen kan ”lämna ’ detta lager.
Svar
Version med tre meningar:
-
Varje lager kan använda vilken funktion som helst på föregående lager (vanligtvis en linjär transformation följt av en squashing-icke-linjäritet).
-
Dolda lager ”-jobbet är att omvandla ingångarna till något som utgångsskiktet kan använda.
-
Utgångsskiktet förvandlar dolda lageraktiveringar till vilken skala du vill att din produktion ska vara i.
Som du ”re 5:
Om du vill att en dator ska berätta om det finns en buss i en bild, kan det vara lättare för datorn om den hade rätt verktyg.
Så din bussdetektor kan vara gjord av en hjuldetektor (för att hjälpa dig att säga att det är ett fordon) och en låddetektor (eftersom bussen är formad som en stor låda) och en storleksdetektor (för att berätta för dig det är för stort för att vara en bil. Dessa är de tre elementen i ditt dolda lager: de är inte en del av den råa bilden, de är verktyg som du har utformat för att hjälpa dig att identifiera bussar.
Om alla dessa tre detektorer tänds (eller kanske om de ”är särskilt aktiva), så är det stor chans att du har en buss framför dig.
Neurala nät är användbara Jag eftersom det finns bra verktyg (som backpropagation) för att bygga massor av detektorer och sätta ihop dem.
Som om du är vuxen
Ett feed-forward neuralt nätverk tillämpar en serie funktioner på data. De exakta funktionerna beror på det neurala nätverk du använder: oftast beräknar dessa funktioner var och en en linjär transformation av föregående lager, följt av en squashing-olinjäritet. Ibland kommer funktionerna att göra något annat (som att beräkna logiska funktioner i dina exempel , eller medelvärde över intilliggande pixlar i en bild). Så rollerna för de olika lagren kan bero på vilka funktioner som beräknas, men jag försöker vara väldigt allmän.
Låt oss kalla ingången vektor $ x $, dolda lageraktiveringar $ h $ och utmatningsaktivering $ y $. Du har någon funktion $ f $ som kartlägger från $ x $ till $ h $ och en annan funktion $ g $ som kartlägger från $ h $ till $ y $.
Så det dolda skiktets aktivering är $ f (x) $ och utdata från nätverket är $ g (f (x)) $.
Varför har två funktioner ($ f $ och $ g $) istället för bara en?
Om komplexitetsnivån per funktion är begränsad kan $ g (f (x)) $ beräkna saker som $ f $ och $ g $ inte kan göra individuellt.
Ett exempel med logiska funktioner:
Till exempel om vi bara tillåter $ f $ och $ g $ för att vara enkla logiska operatörer som ”AND”, ”OR” och ”NAND”, då kan du inte beräkna andra funktioner som ”XOR” med bara en av dem. Å andra sidan kunde vi beräkna ”XOR” om vi var villiga att lägga dessa funktioner ovanpå varandra:
Första lagerfunktioner:
- Se till att åtminstone ett element är ”SANT” (med OR)
- Se till att de inte är ”SANTA” (med NAND)
Andra lagrets funktion:
- Se till att båda kriterierna i första lagret är uppfyllda (med AND)
Nätverkets utdata är bara resultatet av denna andra funktion. Det första lagret omvandlar ingångarna till något som det andra lagret kan använda så att hela nätverket kan utföra XOR.
Ett exempel med bilder:
Slide 61 från detta samtal – även tillgänglig här som en enskild bild – visar (ett sätt att visualisera) vad de olika dolda lagren i ett visst neuralt nätverk letar efter.
Det första lagret letar efter korta kanter i bilden: dessa är väldigt lätta att hitta från råa pixeldata, men de är inte särskilt användbara för att berätta om du tittar på ett ansikte eller en buss eller en elefant.
Nästa lager komponerar kanterna: om kanterna från det nedre dolda lagret passar ihop på ett visst sätt kan en av ögondetektorerna i mitten av kolumnen till vänster slå på . Det skulle vara svårt att skapa ett enda lager som var så bra på att hitta något så specifikt från de råa pixlarna: ögondetektorer är mycket lättare att bygga ut från kantdetektorer än av råa pixlar.
Nästa lager upp komponerar ögondetektorerna och näsdetektorerna i ansikten. Med andra ord tänds dessa när ögondetektorerna och näsdetektorerna från föregående lager tänds med rätt mönster. Dessa är väldigt bra för att leta efter vissa typer av ansikten: om en eller flera av dem tänds ska ditt utgående lager rapportera att ett ansikte är närvarande.
Detta är användbart eftersom ansiktsdetektorer är lätta att bygga ur ögondetektorer och näsdetektorer, men verkligen svåra att bygga ut ur pixelintensiteter.
Så varje lager får dig längre och längre från de råa pixlarna och närmare ditt slutmål (t.ex. ansiktsavkänning eller bussavkänning).
Svar på diverse andra frågor
”Varför är några lager i inmatningsskiktet anslutna till det dolda lagret och andra inte?”
De frånkopplade noderna i nätverket kallas ”bias” -noder. Det finns en riktigt trevlig förklaring här . Det korta svaret är att de ”gillar avlyssningstermer i regression.
” Var kommer bilderna från ”ögondetektor” i bildexemplet från? ”
Jag har inte dubbelkontrollerat de specifika bilderna jag länkar till, men i allmänhet visar dessa visualiseringar uppsättningen pixlar i ingångsskiktet som maximerar aktiviteten för motsvarande neuron. Så om vi tänker på neuronen som en ögondetektor är detta bilden som neuronen anser vara mest ögonliknande. Folk tycker vanligtvis att dessa pixeluppsättningar är optimerade (bergsklättring) förfarande.
I detta papper av vissa Google-folk med ett av världens största neuralnät, visar de en ”ansiktsdetektor” -neuron och en ”kattdetektor” -neuron på detta sätt, liksom ett andra sätt: De visar också de faktiska bilderna som aktiverar neuronen starkast (figur 3, figur 16). Det andra tillvägagångssättet är trevligt eftersom det visar hur flexibelt och olinjärt nätverket är – dessa ”detektorer” på hög nivå är känsliga för alla dessa bilder, även om de inte ser särskilt lika ut på pixelnivån.
Låt mig veta om något här är oklart eller om du har fler frågor.
Kommentarer
- Så är det bara en definierad algoritm för varje enskild nod i ett visst lager och vikterna är det som gör att utgångarna är olika? Eller kan du programmera varje nod i lagret för att vara annorlunda?
- @GeorgeMcDowd detta kommer till nyckelfrågan: titta på pixlar och att identifiera bussar är svårt, som du föreslog. Lyckligtvis är det enkelt att titta på pixlar och hitta kanter – att ’ är allt det första dolda lagret försöker göra. Nästa lager försöker att göra slutsatser baserat på kanter, vilket är mycket lättare än att försöka göra det baserat på pixlar.
- SO borde ge dig någon annan belöning (än bara poäng) för den tid och ansträngning du lägger på det här svaret!
- @JoshuaEnfield Jag tror att logiken 1980 ’ s var en kombination av att likna hur människor trodde att hjärnan fungerade, att den var differentierbar överallt och att värdena var begränsade som du nämnde. Sedan dess har människor funnit att
f(x) = max(x, 0)
(” rättad linjär enhet ”) ofta fungerar bättre även om den inte ’ inte har många av dessa egenskaper. - Bussexemplet och funktionskedjan spikade det bara. Förstå ’ t varför läroböcker kan ’ inte vara så beskrivande.
Svar
Jag försöker lägga till den intuitiva operativa beskrivningen …
Ett bra intuitivt sätt att tänka på ett neuralt nätverk är att tänka om vad en linjär regressionsmodell försöker göra. En linjär regression kommer att ta några ingångar och komma med en linjär modell som tar varje ingångsvärde gånger någon modell med optimala viktningskoefficienter och försöker kartlägga summan av resultaten till ett utgångssvar som nära matchar den verkliga utgången. Koefficienterna bestäms genom att hitta värdena som minimerar något felmått mellan det önskade utgångsvärdet och det värde som lärs in av modellen. Ett annat sätt att säga det är att den linjära modellen kommer att försöka skapa koefficientmultiplikatorer för varje ingång och summera dem alla för att försöka bestämma förhållandet mellan (multipel) ingång och (typiskt enstaka) utgångsval du Samma modell kan nästan ses som den grundläggande byggstenen i ett neuralt nätverk; en enda perceptronenhet.
Men den enda enhetsperceptronen har ytterligare ett stycke som bearbetar summan av de viktade uppgifterna på ett icke-linjärt sätt. Det använder vanligtvis en squashing-funktion (sigmoid eller tanh) för att uppnå detta. Så du har basenheten för det dolda lagret, vilket är ett block som kommer att summera en uppsättning viktade ingångar – det skickar sedan det summerade svaret till en icke-linjär funktion för att skapa ett (dolt lager) utgångsnodssvar. Förspänningsenheten är precis som i linjär regression, en konstant förskjutning som läggs till varje nod som ska behandlas. På grund av det icke-linjära behandlingsblocket är du inte längre begränsad till endast linjära svar (som i linjär regressionsmodell).
Okej, men när du har många av de enskilda perceptronenheterna som arbetar tillsammans, var och en kan ha olika ingångsviktmultiplikatorer och olika svar (även om ALL bearbetar samma uppsättning ingångar med samma icke-linjära block som tidigare beskrivits). Vad som gör svaren annorlunda är att var och en har olika koefficientvikter som lärs av neuronnätverket via träning (vissa former inkluderar gradientnedstigning). Resultatet av alla perceptroner bearbetas sedan igen och skickas till ett utgående lager, precis som de enskilda blocken bearbetades. Frågan är då hur bestäms de korrekta vikterna för alla block?
Ett vanligt sätt att lära sig de korrekta vikterna är att börja med slumpmässiga vikter och mäta felsvaret mellan den verkliga faktiska utgången och den inlärda modellutgång. Felet kommer vanligtvis att skickas bakåt genom nätverket och återkopplingsalgoritmen kommer att öka eller minska dessa vikter individuellt med någon proportion till felet. Nätverket kommer att upprepa upprepade gånger genom att passera framåt, mäta utgångssvaret, sedan uppdatera (passera viktjusteringar bakåt) och korrigera vikterna tills någon tillfredsställande felnivå uppnås. Vid den tiden har du en regressionsmodell som kan vara mer flexibel än en linjär regressionsmodell, det är det som vanligtvis kallas en universell funktions approximator.
Ett av de sätt som verkligen hjälpte mig att lära mig hur ett neuralt nätverk verkligen fungerar är att studera koden för ett neuralt nätverksimplementering och bygga den. En av de bästa grundläggande kodförklaringarna finns i kapitlet om neurala nätverk i (den fritt tillgängliga) ”The Scientist and Engineers guide to DSP” Ch. 26. Det är mest skrivet på ett mycket grundläggande språk (jag tror att det var fortran) som verkligen hjälper dig att se vad som händer.
Svar
Jag kommer att beskriva min syn på detta i två steg: Inmatnings-till-dolt steg och dold-till-utgångssteget. Jag kommer att göra det dolda-till-utgångssteget först eftersom det verkar mindre intressant (för mig).
Dold-till-utgång
Utdata från det dolda lagret kan vara olika saker, men för tillfället antar vi att de kommer ut från aktiveringsfunktioner för sigmoidal . Så de är värden mellan 0 och 1, och för många ingångar kan de bara vara 0 ”och 1” s.
Jag gillar att tänka på omvandlingen mellan dessa dolda neurons utgångar och utgångsskiktet som bara en översättning (i språklig mening, inte den geometriska betydelsen). Detta är verkligen sant om omvandlingen är inverterbar , och om inte så gick något förlorat i översättningen. Men du har i princip bara de dolda neuronerna ”utdata sett från ett annat perspektiv.
Input-to-Hidden
Låt oss säga att du har 3 inmatade neuroner (bara så att jag lätt kan skriv några ekvationer här) och några dolda neuroner. Varje dold neuron får som ingång en viktad summa av ingångar, så till exempel kanske
hidden_1 = 10 * (input_1) + 0 * (input_2) + 2 * (input_3)
Detta betyder att värdet för hidden_1
är mycket känsligt för värdet av input_1
, inte alls känslig för input_2
och bara lite känslig för input_3
.
Så du kan säga att hidden_1
fångar en viss aspekt av ingången, som du kan kalla ”input_1
är viktigt ”aspekt.
Utdata från hidden_1
bildas vanligtvis genom att mata in ingången genom någon funktion, så låt oss säga att du använder en funktion sigmoid . Denna funktion tar värden mellan 0 och 1; så tänk på det som en omkopplare som säger att antingen input_1
är viktigt eller så är det inte.
Så det är vad det dolda lagret gör! Den extraherar aspekter eller funktioner i inmatningsutrymmet.
Nu kan vikter också vara negativa! Vilket innebär att du kan få aspekter som ”input_1
är viktigt MEN ÄVEN input_2
tar bort den vikten”:
hidden_2 = 10 * (input_1) - 10 * (input_2 ) + 0 * (input_3)
eller input_1
och input_3
har ”delad” betydelse:
hidden_3 = 5 * (input_1) + 0 * (input_2) + 5 * (input_3)
Mer geometri
Om du känner till några linjär algebra, kan du tänka geometriskt i termer av att projicera längs vissa riktningar. I exemplet ovan projicerade jag längs input_1
-riktningen.
Låt oss titta på hidden_1
igen, från ovan. När värdet vid input_1
är tillräckligt stort kommer utsignalen från sigmoid-aktiveringsfunktionen bara att stanna vid 1, den blir inte större . Med andra ord, mer och mer input_1
gör ingen skillnad för utdata. På samma sätt, om den rör sig i motsatt (d.v.s. negativ) riktning, påverkas utgången efter en punkt.
Ok, bra. Men antar att vi inte vill ha känslighet i oändlighetsriktningen i en viss riktning, och vi vill att den bara ska aktiveras för ett visst intervall på en linje. Betydelsen för mycket negativa värden har ingen effekt , och för mycket positiva värden finns ingen effekt, men för värden mellan säg 5 och 16 vill du att den ska vakna. Det är här du skulle använda en radiell basfunktion för din aktiveringsfunktion.
Sammanfattning
Det dolda lagret extraherar funktioner i inmatningsutrymmet och utlagret översätter dem till önskat sammanhang. Det kan finnas mycket mer än det, vad med flerlagernätverk och sådant, men det är det jag förstår hittills.
EDIT: Den här sidan med sina underbara interaktiva grafer gör ett bättre jobb än vad mitt långa och besvärliga svar ovan någonsin skulle kunna göra : http://neuralnetworksanddeeplearning.com/chap4.html
Kommentarer
- Liksom OP, jag ’ lite förvirrad över det dolda lagret i neurala nätverk. I ditt exempel, hur hittar NN-algoritmen vikterna för Hidden_1, Hidden_2 och Hidden_3 neuroner? Och eftersom Hidden_1, Hidden_2 och Hidden_3 härrör från samma ingångsvariabler, skulle inte ’ t vikterna konvergerar till samma lösning?
Svar
Låt oss ta fallet med klassificering. Vad utlagret försöker göra är att uppskatta den villkorliga sannolikheten att ditt prov tillhör en given klass, dvs hur sannolikt det är att provet tillhör en given klass. I geometriska termer, genom att kombinera lager på ett icke-linjärt sätt via tröskelfunktionerna, kan neuronnätverken lösa icke-konvexa problem (taligenkänning, objektigenkänning och så vidare), som är de mest intressanta. Med andra ord kan utdataenheterna generera icke-konvexa beslutsfunktioner som de som visas här .
Man kan se enheterna i dolda lager som att lära sig komplexa funktioner från data som gör att utgångsskiktet bättre kan urskilja en klass från en annan, för att skapa mer exakta beslutsgränser. Till exempel, när det gäller ansiktsigenkänning, lär sig enheter i de första lagren kantliknande egenskaper (upptäcker kanter vid givna riktningar och positioner) och högre lager lär sig att kombinera dem för att bli detektorer för ansiktsdrag som näsa, mun eller ögon. Vikten för varje dold enhet representerar dessa funktioner, och dess utgång (förutsatt att den är en sigmoid) representerar sannolikheten att den funktionen finns i ditt prov.
I allmänhet betyder innebörden av utdata för utdata och dolda lager beror på det problem du försöker lösa (regression, klassificering) och den förlustfunktion du använder (korsentropi, minst kvadratfel, …)