Jeg er sikker på at mange mennesker vil svare med lenker til «la meg google det for deg», så jeg vil si at jeg har prøvd å finne ut dette, så vær så snill å tilgi min manglende forståelse her, men jeg kan ikke finne ut hvordan den praktiske implementeringen av et nevralt nettverk faktisk fungerer.
Jeg forstår inngangslaget og hvordan jeg normaliserer dataene, jeg forstår også forspenningsenheten, men når det gjelder det skjulte laget, hva den faktiske beregningen er i det laget, og hvordan det tilordnes til produksjonen er bare litt tåkete. Jeg har sett diagrammer med spørsmålstegn i det skjulte laget, boolske funksjoner som AND / OR / XOR, aktiveringsfunksjoner og inngangsnoder som tilordnes til alle de skjulte enhetene og inngangsnoder som tilordnes til bare noen få skjulte enheter hver og så Jeg har bare noen få spørsmål om det praktiske aspektet. Selvfølgelig vil en enkel forklaring på hele nevrale nettverksprosessen som du ville forklare et barn være fantastisk.
Hvilke beregninger gjøres i det skjulte laget ?
Hvordan tilordnes disse beregningene til utgangslaget?
Hvordan fungerer utløpslaget? Avnormaliserer dataene fra det skjulte laget?
Hvorfor er noen lag i inngangslaget koblet til det skjulte laget og noen ikke?
Kommentarer
- Folk her er hyggelige, jeg har aldri sett et «la meg google det for deg» -svar, men mange overraskende grundige og innsiktsfulle svar på det som først syntes å være grunnleggende spørsmål. Dessverre kan jeg ‘ ikke hjelpe deg med med din, men det virker ganske aktuelt, så jeg stemmer gjerne det opp.
- Takk for kommentaren og avstemningen Gael, jeg ‘ Jeg er sannsynligvis litt truet av SO-samfunnet som vi alle vet hvordan disse menneskene kan få 🙂 Glad for å se mer av en ånd av samarbeid her i motsetning til å prøve å tjene merker og poeng ved å redigere / lukke spørsmål.
- Jeg er ikke ekspert på nevrale nettverk spesielt, selv om jeg blir involvert i deres applikasjoner og metoder. Mitt kanskje ikke så nyttige svar vil være at de spesifikke beregningene i det skjulte avhenger av ‘ kostnadsfunksjonen ‘ som du er å pålegge din utgang, dvs. hva du prøver å oppnå. Hvis du for eksempel vil gruppere inngangselementene i grupperte sett, vil du beregne avstander mellom elementene i det skjulte laget. Dette kan gå gjennom forskjellige iterasjoner og optimaliseringssykluser i dette laget, til du oppfyller et feilkriterium som lar prosessen `forlate ‘ dette laget.
Svar
Versjon med tre setninger:
-
Hvert lag kan bruke hvilken som helst funksjon du ønsker på det forrige laget (vanligvis en lineær transformasjon etterfulgt av en squashing-ikke-linearitet).
-
Jobben for skjulte lag er å transformere inngangene til noe som utgangslaget kan bruke.
-
Utgangslaget forvandler de skjulte lagaktiveringene til hvilken skala du vil at produksjonen din skal være på.
Som deg «re 5:
Hvis du vil at en datamaskin skal fortelle deg om det er en buss i et bilde, kan datamaskinen ha lettere tid hvis den hadde de riktige verktøyene.
Så bussdetektoren din kan være laget av en hjuldetektor (for å hjelpe deg med å fortelle deg at det er et kjøretøy) og en kassedetektor (siden bussen er formet som en stor boks) og en størrelsesdetektor (for å fortelle deg det er for stort til å være en bil. Dette er de tre elementene i det skjulte laget ditt: de er ikke en del av det rå bildet, de er verktøy du har designet for å hjelpe deg med å identifisere busser.
Hvis alle disse tre detektorene slås på (eller kanskje hvis de er spesielt aktive), er det stor sjanse for at du har en buss foran deg.
Nevrale nett er nyttige Jeg fordi det er gode verktøy (som backpropagation) for å bygge mange detektorer og sette dem sammen.
Som du er voksen
Et feed-forward neuralt nettverk bruker en rekke funksjoner til dataene. De nøyaktige funksjonene vil avhenge av nevrale nettverk du bruker: ofte beregner disse funksjonene hver sin lineære transformasjon av forrige lag, etterfulgt av en squashing-ikke-linearitet. Noen ganger vil funksjonene gjøre noe annet (som beregning av logiske funksjoner i eksemplene , eller gjennomsnitt over tilstøtende piksler i et bilde). Så rollene til de forskjellige lagene kan avhenge av hvilke funksjoner som blir beregnet, men jeg vil prøve å være veldig generell.
La oss kalle inngangen vektor $ x $, de skjulte lagaktiveringene $ h $, og utgangsaktiveringen $ y $. Du har en eller annen funksjon $ f $ som kartlegges fra $ x $ til $ h $ og en annen funksjon $ g $ som kartlegger fra $ h $ til $ y $.
Så det skjulte lagets aktivering er $ f (x) $ og utgangen fra nettverket er $ g (f (x)) $.
Hvorfor har to funksjoner ($ f $ og $ g $) i stedet for bare en?
Hvis kompleksitetsnivået per funksjon er begrenset, kan $ g (f (x)) $ beregne ting som $ f $ og $ g $ ikke kan gjøre hver for seg.
Et eksempel med logiske funksjoner:
Hvis vi for eksempel bare tillater $ f $ og $ g $ for å være enkle logiske operatorer som «AND», «OR» og «NAND», så kan du ikke beregne andre funksjoner som «XOR» med bare en av dem. På den annen side kunne vi beregne «XOR» hvis vi var villige til å legge disse funksjonene oppå hverandre:
Første lagfunksjoner:
- Forsikre deg om at minst ett element er «SANT» (ved hjelp av OR)
- Forsikre deg om at de ikke er «SANNE» (ved hjelp av NAND)
Funksjon for andre lag:
- Forsikre deg om at begge første lagskriteriene er oppfylt (ved hjelp av AND)
Nettverkets utgang er bare resultatet av denne andre funksjonen. Det første laget forvandler inngangene til noe som det andre laget kan bruke, slik at hele nettverket kan utføre XOR.
Et eksempel med bilder:
Lysbilde 61 fra denne samtalen – også tilgjengelig her som et enkelt bilde – viser (en måte å visualisere) hva de forskjellige skjulte lagene i et bestemt nevralt nettverk leter etter.
Det første laget ser etter korte kanter i bildet: disse er veldig enkle å finne fra rå pikseldata, men de er ikke veldig nyttige av seg selv for å fortelle deg om du ser på et ansikt eller en buss eller en elefant.
Neste lag komponerer kantene: Hvis kantene fra det nederste skjulte laget passer sammen på en bestemt måte, kan en av øyedetektorene i midten av kolonnen til venstre slå seg på . Det ville være vanskelig å lage et enkelt lag som var så flink til å finne noe så spesifikt fra de rå pikslene: øyedetektorer er mye lettere å bygge ut av kantdetektorer enn av rå piksler.
Neste lag opp komponerer øyedetektorene og nesedetektorene i ansikter. Disse vil med andre ord lyse når øyedetektorene og nesedetektorene fra forrige lag slås på med de rette mønstrene. Disse er veldig flinke til å lete etter bestemte typer ansikter: Hvis en eller flere av dem lyser opp, skal utgangslaget rapportere at et ansikt er til stede.
Dette er nyttig fordi ansiktsdetektorer er enkle å bygge ut av øyedetektorer og nesedetektorer, men veldig vanskelig å bygge ut av pikselintensiteter.
Så hvert lag får deg lenger og lenger fra de rå pikslene og nærmere målet ditt (f.eks. ansiktsgjenkjenning eller bussgjenkjenning).
Svar på diverse andre spørsmål
«Hvorfor er noen lag i inngangslaget koblet til det skjulte laget, og noen er det ikke?»
De frakoblede nodene i nettverket kalles «bias» -noder. Det er en veldig fin forklaring her . Det korte svaret er at de «liker avskjæringsuttrykk i regresjon.
» Hvor kommer «øyedetektor» -bildene i bildeeksemplet fra? «
Jeg har ikke dobbeltsjekket de spesifikke bildene jeg koblet til, men generelt viser disse visualiseringene settet med piksler i inngangslaget som maksimerer aktiviteten til det tilsvarende nevronet. Så hvis vi tenker på nevronet som en øyedetektor, er dette bildet som nevronet anser å være mest øye-lignende. Folk finner vanligvis disse piksel-settene med en optimalisering (hill-climbing) -prosedyre.
I denne artikkelen av noen Google-folk med et av verdens største nevrale nett, viser de en «ansiktsdetektor» -neuron og en «kattedetektor» -neuron på denne måten, samt en annen måte: De viser også de faktiske bildene som aktiverer nevronen sterkest (figur 3, figur 16). Den andre tilnærmingen er fin fordi den viser hvor fleksibelt og ikke-lineært nettverket er – disse «detektorene» på høyt nivå er følsomme for alle disse bildene, selv om de ikke ser spesielt like ut på pikselnivå.
Gi meg beskjed hvis noe her er uklart, eller hvis du har flere spørsmål.
Kommentarer
- Så er det bare en definert algoritme for hver enkelt node på et gitt lag og vektene er det som gjør at utgangene er forskjellige? Eller kan du programmere hver node på laget for å være forskjellig?
- @GeorgeMcDowd dette blir nøkkelproblemet: ser på piksler og å identifisere busser er vanskelig, som du foreslo. Heldigvis er det enkelt å se på piksler og finne kanter – det ‘ er alt det første skjulte laget prøver å gjøre. Det neste laget prøver å lage slutninger basert på kanter, noe som er mye enklere enn å prøve å gjøre det basert på piksler.
- SO burde gi deg noen annen belønning (enn bare poeng) for tiden og krefter du legger på dette svaret!
- @ JoshuaEnfield Jeg tror logikken i 1980 ‘ s var en kombinasjon av å være lik hvordan folk trodde hjernen fungerte, at den kunne differensieres overalt, og at verdiene var avgrenset som du nevnte. Siden den gang har folk funnet at
f(x) = max(x, 0)
(» utbedret lineær enhet «) ofte fungerer bedre, selv om den ikke har ‘ t har mange av disse egenskapene. - Busseksemplet og funksjonskjeden spikret den bare. Ikke forstå ‘ t hvorfor lærebøker kan ‘ t være dette beskrivende.
Svar
Jeg vil prøve å legge til den intuitive operasjonsbeskrivelsen …
En god intuitiv måte å tenke på et nevralt nettverk er å tenke om hva en lineær regresjonsmodell prøver å gjøre. En lineær regresjon vil ta noen innganger og komme opp med en lineær modell som tar hver inngangsverdi ganger noen modells optimale vektingskoeffisienter og prøver å kartlegge summen av resultatene til et utgangssvar som tetter samsvarer med den sanne utgangen. Koeffisientene bestemmes ved å finne verdiene som vil minimere noen feilmålinger mellom ønsket utgangsverdi og verdien som læres av modellen. En annen måte å si det er at den lineære modellen vil prøve å skape koeffisientmultiplikatorer for hver inngang og summer dem alle for å prøve å bestemme forholdet mellom (flere) innganger og (typisk enkelt) utgangsverdi ues. Den samme modellen kan nesten betraktes som den grunnleggende byggesteinen i et nevralt nettverk; en enkelt perceptronenhet.
Men perceptronen til den ene enheten har ett stykke til som vil behandle summen av de vektede dataene på en ikke-lineær måte. Den bruker vanligvis en squashing-funksjon (sigmoid eller tanh) for å oppnå dette. Så du har den grunnleggende enheten til det skjulte laget, som er en blokk som vil oppsummere et sett med vektede innganger – den sender deretter det summerte svaret til en ikke-lineær funksjon for å skape et (skjult lag) utgangsnodesvar. Bias-enheten er akkurat som i lineær regresjon, en konstant forskyvning som legges til hver node som skal behandles. På grunn av den ikke-lineære prosesseringsblokken er du ikke lenger begrenset til bare lineære responser (som i den lineære regresjonsmodellen).
Ok, men når du har mange av de enkelte perceptron-enhetene som jobber sammen, hver kan ha forskjellige inngangsvektmultiplikatorer og forskjellige svar (selv om ALLE behandler det samme settet med innganger med den samme ikke-lineære blokken som tidligere beskrevet). Det som gjør responsene forskjellige, er at hver har forskjellige koeffisientvekter som læres av nevrale nettverk via trening (noen former inkluderer gradientnedstigning). Resultatet av alle perseptronene blir deretter behandlet på nytt og overført til et utgangslag, akkurat som de enkelte blokkene ble behandlet. Spørsmålet er da hvordan bestemmes de riktige vektene for alle blokkene?
En vanlig måte å lære de riktige vektene på er å starte med tilfeldige vekter og måle feilrespons mellom den virkelige faktiske utgangen og den innlærte modellutgang. Feilen vil vanligvis sendes bakover gjennom nettverket, og tilbakemeldingsalgoritmen vil individuelt øke eller redusere vektene med noe proporsjon til feilen. Nettverket vil gjentatte ganger gjentas ved å gå fremover, måle utgangssvaret, deretter oppdatere (passere vektjusteringer) og korrigere vektene til noen tilfredsstillende feilnivå er nådd. På det tidspunktet har du en regresjonsmodell som kan være mer fleksibel enn en lineær regresjonsmodell, det er det som ofte kalles en universell funksjons-tilnærmer.
En av måtene som virkelig hjalp meg til å lære hvordan et nevralt nettverk virkelig fungerer, er å studere koden til en implementering av nevrale nettverk og bygge den. En av de beste grunnleggende kodeforklaringene finner du i nevrale nettverkskapittelet i (den fritt tilgjengelige) «The Scientist and Engineer» s guide to DSP « Ch. 26. Det er for det meste skrevet på veldig grunnleggende språk (jeg tror det var fortran) som virkelig hjelper deg å se hva som skjer.
Svar
Jeg skal beskrive mitt syn på dette i to trinn: Inngang-til-skjult trinn og skjult til ut-trinn. Jeg gjør trinnet skjult til utgang først fordi det virker mindre interessant (for meg).
Skjult til utgang
Utdataene fra det skjulte laget kan være forskjellige ting, men for nå antar vi at de kommer ut av sigmoidal aktiveringsfunksjoner. Så de er verdier mellom 0 og 1, og for mange innganger kan de bare være 0 «og 1» s.
Jeg liker å tenke på transformasjonen mellom disse skjulte nevronutgangene og utgangslaget som bare en oversettelse (i språklig forstand, ikke den geometriske betydningen). Dette er absolutt sant hvis transformasjonen er inverterbar , og hvis ikke, gikk noe tapt i oversettelsen. Men du har i utgangspunktet bare de skjulte nevronene «utgangene sett fra et annet perspektiv.
Input-to-Hidden
La oss si at du har 3 inngangs neuroner (bare slik at jeg lett kan skriv noen ligninger her) og noen skjulte nevroner. Hver skjult nevron får som inngang en vektet sum av innganger, så for eksempel kanskje
hidden_1 = 10 * (input_1) + 0 * (input_2) + 2 * (input_3)
Dette betyr at verdien til hidden_1
er veldig følsom for verdien av input_1
, ikke i det hele tatt følsomme for input_2
og bare litt følsomme for input_3
.
Så du kan si at hidden_1
fanger et bestemt aspekt av inngangen, som du kan kalle «input_1
er viktig «aspekt.
Utgangen fra hidden_1
dannes vanligvis ved å føre inngangen gjennom en eller annen funksjon, så la oss si at du bruker en sigmoid -funksjon. Denne funksjonen får verdier mellom 0 og 1; så tenk på det som en bryter som sier at enten input_1
er viktig, eller at det ikke er t.
Så det er det det skjulte laget gjør! Den trekker ut aspekter eller funksjoner av inndataområdet.
Nå kan vekter også være negative! Noe som betyr at du kan få aspekter som «input_1
er viktig MEN OGSÅ input_2
tar bort den viktigheten»:
hidden_2 = 10 * (input_1) - 10 * (input_2 ) + 0 * (input_3)
eller input_1
og input_3
har «delt» betydning:
hidden_3 = 5 * (input_1) + 0 * (input_2) + 5 * (input_3)
Mer geometri
Hvis du kjenner noen lineær algebra, kan du tenke geometrisk når det gjelder å projisere i visse retninger. I eksemplet ovenfor projiserte jeg langs input_1
retning.
La oss se på hidden_1
igjen, fra over. Når verdien på input_1
er stor nok, vil utgangen av sigmoid-aktiveringsfunksjonen bare holde seg på 1, den blir ikke større . Med andre ord vil mer og mer input_1
ikke utgjøre noen forskjell for utdataene. På samme måte, hvis den beveger seg i motsatt (dvs. negativ) retning, vil utgangen ikke påvirkes etter et punkt.
Ok, greit. Men anta at vi ikke vil ha følsomhet i retning uendelig i en bestemt retning, og vi vil at den bare skal aktiveres for et bestemt område på en linje. Betydning for svært negative verdier er det ingen effekt , og for veldig positive verdier er det ingen effekt, men for verdier mellom si 5 og 16 vil du at den skal våkne. Det er her du vil bruke en radial basisfunksjon for aktiveringsfunksjonen din.
Sammendrag
Det skjulte laget trekker ut funksjoner i inngangsrommet, og utgangslaget oversetter dem til ønsket kontekst. Det kan være mye mer enn det, hva med flerlagsnettverk og slikt, men dette er det jeg forstår så langt.
EDIT: Denne siden med sine fantastiske interaktive grafer gjør en bedre jobb enn mitt lange og tungvint svar ovenfor noen gang kunne gjøre : http://neuralnetworksanddeeplearning.com/chap4.html
Kommentarer
- Som OP, er jeg ‘ litt forvirret over det skjulte laget i nevrale nettverk. I ditt eksempel, hvordan finner NN-algoritmen vektene for de skjulte_1, skjulte_2 og skjulte_3 nevronene? Og siden Hidden_1, Hidden_2 og Hidden_3 er avledet fra de samme inngangsvariablene, ville ikke ‘ t vektene konvergerer til samme løsning?
Svar
La oss ta saken om klassifisering. Hva utgangslaget prøver å gjøre, er å estimere den betingede sannsynligheten for at prøven din tilhører en gitt klasse, dvs. hvor sannsynlig det er at prøven tilhører en gitt klasse. I geometriske termer, ved å kombinere lag på en ikke-lineær måte via terskelfunksjonene, kan nevrale nettverk løse ikke-konvekse problemer (talegjenkjenning, objektgjenkjenning og så videre), som er de mest interessante. Med andre ord er utgangsenhetene i stand til å generere ikke-konvekse avgjørelsesfunksjoner som de som er avbildet her .
Man kan se enhetene i skjulte lag som å lære komplekse funksjoner fra data som gjør at utgangslaget bedre kan skille en klasse fra en annen, for å generere mer nøyaktige beslutningsgrenser. For eksempel når det gjelder ansiktsgjenkjenning, lærer enheter i de første lagene kantlignende funksjoner (oppdager kanter ved gitte retninger og posisjoner) og høyere lag lærer å kombinere de for å bli detektorer for ansiktsfunksjoner som nese, munn eller øyne. Vektene til hver skjult enhet representerer disse funksjonene, og dens utgang (forutsatt at den er en sigmoid) representerer sannsynligheten for at den funksjonen er tilstede i prøven din.
Generelt sett betyr betydningen av utgangene til utdata og skjulte lag avhenger av problemet du prøver å løse (regresjon, klassifisering) og tapsfunksjonen du bruker (kryssentropi, minste kvadratfeil, …)