Jeg er sikker på, at mange mennesker vil svare med links til “lad mig google det til dig”, så jeg vil sige, at jeg “har prøvet at finde ud af dette ud, så tilgiv venligst min manglende forståelse her, men jeg kan ikke finde ud af, hvordan den praktiske implementering af et neuralt netværk rent faktisk fungerer.
Jeg forstår inputlaget og hvordan man normaliserer dataene, jeg forstår også bias-enheden, men når det kommer til det skjulte lag, hvad den faktiske beregning er i det lag, og hvordan det kortlægges til output er bare lidt tåget. Jeg har set diagrammer med spørgsmålstegn i det skjulte lag, boolske funktioner som AND / OR / XOR, aktiveringsfunktioner og inputknudepunkter, der kortlægges til alle de skjulte enheder og inputknudepunkter, der kortlægges til kun et par skjulte enheder hver og så Jeg har bare et par spørgsmål om det praktiske aspekt. Selvfølgelig ville en simpel forklaring af hele neurale netværksprocessen, som du ville forklare et barn, være fantastisk.
Hvilke beregninger foretages i det skjulte lag ?
Hvordan kortlægges disse beregninger til outputlaget?
Hvordan fungerer ouputlaget? De-normaliserer dataene fra det skjulte lag?
Hvorfor er nogle lag i inputlaget forbundet med det skjulte lag, og andre ikke?
Kommentarer
- Folk her er hyggelige, jeg har aldrig set et ”lad mig google det for dig” svar, men mange overraskende grundige og indsigtsfulde svar på, hvad der i starten syntes at være grundlæggende spørgsmål. Desværre kan jeg ‘ ikke hjælpe dig med med din, men det virker ganske relevant, så jeg stemmer med glæde det op.
- Tak for kommentaren og afstemningen Gael, jeg ‘ Jeg er sandsynligvis lidt trængt af SO-samfundet, som vi alle ved, hvordan disse folk kan få 🙂 Glad for at se mere af en ånd af samarbejde her i modsætning til at forsøge at tjene badges og point ved at redigere / lukke spørgsmål.
- Jeg er ikke ekspert i neurale netværk specifikt, selvom jeg bliver involveret i deres applikationer og metoder. Mit måske ikke-så hjælpsomme svar ville være, at de specifikke beregninger i det skjulte afhænger af ‘ omkostningsfunktionen ‘, som du er pålægge din ouput, dvs. hvad du prøver at opnå. Hvis du f.eks. Vil gruppere inputelementerne i klyngesæt, beregner du afstande mellem elementer i det skjulte lag. Dette kan gennemgå forskellige iterationer og optimeringscyklusser inden for dette lag, indtil du opfylder et fejlkriterium, der gør det muligt for processen at `forlade ‘ dette lag.
Svar
Tre sætningsversion:
-
Hvert lag kan anvende enhver funktion, du ønsker, i det forrige lag (normalt en lineær transformation efterfulgt af en squashing-ikke-linearitet).
-
Opgaven med skjulte lag er at omdanne input til noget, som outputlaget kan bruge.
-
Outputlaget omdanner de skjulte lagaktiveringer til den skala, du vil have, at din output skal være i.
Som dig “re 5:
Hvis du vil have en computer til at fortælle dig, om der er en bus i et billede, kan computeren muligvis have en lettere tid, hvis den havde de rigtige værktøjer.
Så din busdetektor kan muligvis være lavet af en hjuldetektor (for at hjælpe med at fortælle dig, at det er et køretøj) og en kassedetektor (da bussen er formet som en stor kasse) og en størrelsesdetektor (for at fortælle dig det er for stort til at være en bil. Disse er de tre elementer i dit skjulte lag: de er ikke en del af det rå billede, de er værktøjer, du har designet til at hjælpe dig med at identificere busser.
Hvis alle disse tre detektorer tændes (eller måske hvis de “er særligt aktive), så er der en god chance for, at du har en bus foran dig.
Neurale net er nyttigt l fordi der er gode værktøjer (som backpropagation) til at bygge mange detektorer og sætte dem sammen.
Som du er en voksen
Et feed-forward neuralt netværk anvender en række funktioner til dataene. De nøjagtige funktioner afhænger af det neurale netværk, du bruger: oftest beregner disse funktioner hver en lineær transformation af det foregående lag efterfulgt af en squashing-ikke-linearitet. Nogle gange vil funktionerne gøre noget andet (som beregning af logiske funktioner i dine eksempler , eller gennemsnit over tilstødende pixels i et billede). Så rollerne for de forskellige lag kan afhænge af, hvilke funktioner der beregnes, men jeg prøver at være meget generelle.
Lad os kalde input vektor $ x $, de skjulte lagaktiveringer $ h $ og outputaktivering $ y $. Du har en eller anden funktion $ f $, der kortlægger fra $ x $ til $ h $ og en anden funktion $ g $, der kortlægger fra $ h $ til $ y $.
Så det skjulte lag er aktivering $ f (x) $, og output fra netværket er $ g (f (x)) $.
Hvorfor har to funktioner ($ f $ og $ g $) i stedet for kun en?
Hvis kompleksitetsniveauet pr. funktion er begrænset, kan $ g (f (x)) $ beregne ting, som $ f $ og $ g $ ikke kan gøre individuelt.
Et eksempel med logiske funktioner:
For eksempel, hvis vi kun tillader $ f $ og $ g $ for at være enkle logiske operatorer som “AND”, “OR” og “NAND”, så kan du ikke beregne andre funktioner som “XOR” med kun en af dem. På den anden side kunne vi kunne beregne “XOR”, hvis vi var villige til at lægge disse funktioner oven på hinanden:
Første lagfunktioner:
- Sørg for, at mindst et element er “SAND” (ved hjælp af OR)
- Sørg for, at de “ikke alle er” SANDE “(ved hjælp af NAND)
Andet lagfunktion:
- Sørg for, at begge første lagskriterier er opfyldt (ved hjælp af AND)
Netværks output er netop det resultatet af denne anden funktion. Det første lag omdanner input til noget, som det andet lag kan bruge, så hele netværket kan udføre XOR.
Et eksempel med billeder:
Slide 61 fra denne samtale – også tilgængelig her som et enkelt billede – viser (en måde at visualisere), hvad de forskellige skjulte lag i et bestemt neuralt netværk leder efter.
Det første lag ser efter korte kanter i billedet: disse er meget nemme at finde fra rå pixeldata, men de “er ikke særlig nyttige i sig selv til at fortælle dig, om du” ser på et ansigt eller en bus eller en elefant.
Det næste lag sammensætter kanterne: Hvis kanterne fra det nederste skjulte lag passer sammen på en bestemt måde, kan en af øjendetektorerne i midten af den venstre kolonne muligvis tænde . Det ville være svært at fremstille et enkelt lag, der var så god til at finde noget så specifikt fra de rå pixels: øjendetektorer er meget lettere at bygge ud af kantdetektorer end ud af rå pixels.
Det næste lag op komponerer øjendetektorer og næsedetektorer i ansigter. Med andre ord vil disse lyse op, når øjendetektorer og næsedetektorer fra det forrige lag tændes med de rigtige mønstre. Disse er meget gode til at lede efter bestemte slags ansigter: hvis en eller flere af dem lyser op, skal dit outputlag rapportere, at et ansigt er til stede.
Dette er nyttigt, fordi ansigtsdetektorer er nemme at bygge ud af øjendetektorer og næsedetektorer, men virkelig svære at opbygge ud fra pixelintensiteter.
Så hvert lag bringer dig længere og længere væk fra de rå pixels og tættere på dit ultimative mål (f.eks. ansigtsgenkendelse eller busregistrering).
Svar på diverse andre spørgsmål
“Hvorfor er nogle lag i inputlaget forbundet med det skjulte lag, og andre ikke?”
De afbrudte noder i netværket kaldes “bias” noder. Der er en virkelig flot forklaring her . Det korte svar er, at de “kan lide aflytningsudtryk i regression.
” Hvor kommer “øjendetektor” -billederne i billedeksemplet fra? “
Jeg har ikke dobbelttjekket de specifikke billeder, jeg linkede til, men generelt viser disse visualiseringer sæt af pixels i inputlaget, der maksimerer aktiviteten af den tilsvarende neuron. Så hvis vi tænker på neuronen som en øjendetektor, er dette det billede, som neuronen anser for at være mest øjenlignende. Folk finder normalt disse pixelsæt med en optimering (bjergbestigning) procedure.
I dette papir af nogle Google-folk med et af verdens største neurale net viser de en “ansigtsdetektor” -neuron og en “kattedetektor” -neuron på denne måde såvel som en anden måde: De viser også de faktiske billeder der aktiverer neuronen stærkest (figur 3, figur 16). Den anden tilgang er god, fordi den viser, hvor fleksibelt og ikke-lineært netværket er – disse “detektorer” på højt niveau er følsomme over for alle disse billeder, selvom de ikke særlig ligner på pixelniveau.
Giv mig besked, hvis noget her er uklart, eller hvis du har flere spørgsmål.
Kommentarer
- Så er der kun en defineret algoritme for hver enkelt node på et givet lag, og vægten er det, der gør output forskellige? Eller kan du programmere hver node på laget til at være anderledes?
- @GeorgeMcDowd dette får det centrale spørgsmål: ser på pixel og at identificere busser er svært, som du foreslog. Heldigvis er det let at se på pixels og finde kanter – at ‘ er alt det første skjulte lag forsøger at gøre. Det næste lag prøver at lave slutninger baseret på kanter, hvilket er meget lettere end at prøve at gøre det baseret på pixels.
- SO skulle give dig en anden belønning (end blot point) for den tid og kræfter, du lægger på dette svar!
- @JoshuaEnfield Jeg tror, at logikken i 1980 ‘ s var en kombination af at være magen til, hvordan folk troede hjernen fungerede, at den kunne differentieres overalt, og at værdierne var afgrænset som du nævnte. Siden da har folk fundet ud af, at
f(x) = max(x, 0)
(” rettet lineær enhed “) ofte fungerer bedre, selvom det ikke ‘ ikke har mange af disse egenskaber. - Eksemplet på bus og funktionskæden spikede det lige. Forstå ‘ t forstå, hvorfor lærebøger kan ‘ t være dette beskrivende.
Svar
Jeg forsøger at tilføje til den intuitive operationelle beskrivelse …
En god intuitiv måde at tænke på et neuralt netværk er at tænke om, hvad en lineær regressionsmodel forsøger at gøre. En lineær regression vil tage nogle input og komme med en lineær model, der tager hver inputværdi gange nogle modeller med optimale vægtningskoefficienter og forsøger at kortlægge summen af disse resultater til et outputrespons, der tæt matcher den sande output. Koefficienterne bestemmes ved at finde de værdier, der minimerer en vis fejlmåling mellem den ønskede outputværdi og den værdi, der læres af modellen. En anden måde at sige det på er, at den lineære model vil forsøge at skabe koefficientmultiplikatorer for hver input og summer dem alle for at forsøge at bestemme forholdet mellem (multiple) input og (typisk enkelt) output val ues Den samme model kan næsten betragtes som den grundlæggende byggesten i et neuralt netværk; en perceptron med en enkelt enhed.
Men perceptronen med en enkelt enhed har endnu et stykke, der behandler summen af de vægtede data på en ikke-lineær måde. Det bruger typisk en squashing-funktion (sigmoid eller tanh) for at opnå dette. Så du har den grundlæggende enhed for det skjulte lag, som er en blok, der vil opsummere et sæt vægtede input – det sender derefter det summerede svar til en ikke-lineær funktion for at skabe et (skjult lag) outputknuderesvar. Bias-enheden er ligesom ved lineær regression, en konstant forskydning, der føjes til hver node, der skal behandles. På grund af den ikke-lineære behandlingsblok er du ikke længere begrænset til kun lineære svar (som i den lineære regressionsmodel).
Ok, men når du har mange af de enkelte perceptron-enheder, der arbejder sammen, hver kan have forskellige indgangsvægtmultiplikatorer og forskellige svar (selvom ALLE behandler det samme sæt indgange med den samme ikke-lineære blok tidligere beskrevet). Hvad der gør svarene forskellige, er at hver har forskellige koefficientvægte, som læres af det neurale netværk via træning (nogle former inkluderer gradientnedstigning). Resultatet af alle perceptronerne behandles derefter igen og sendes til et outputlag, ligesom de enkelte blokke blev behandlet. Spørgsmålet er så, hvordan bestemmes de korrekte vægte for alle blokke?
En almindelig måde at lære de korrekte vægte på er ved at starte med tilfældige vægte og måle fejlrespons mellem den sande faktiske output og den indlærte model output. Fejlen sendes typisk baglæns gennem netværket, og feedbackalgoritmen øger eller formindsker disse vægte individuelt med en vis andel af fejlen. Netværket gentages gentagne gange ved at passere frem, måle outputresponsen og derefter opdatere (videregive vægttilpasninger) og korrigere vægtene, indtil der opnås et tilfredsstillende fejlniveau. På det tidspunkt har du en regressionsmodel, der kan være mere fleksibel end en lineær regressionsmodel, det er det, der almindeligvis kaldes en universel funktionstilnærmer.
En af de måder, der virkelig hjalp mig med at lære, hvordan et neuralt netværk virkelig fungerer, er at studere koden til en implementering af neurale netværk og opbygge den. En af de bedste grundlæggende kodeforklaringer findes i kapitlet om neurale netværk i (den frit tilgængelige) “The Scientist and Engineer” s guide to DSP “ Ch. 26. Det er for det meste skrevet på et meget grundlæggende sprog (jeg tror det var fortran), der virkelig hjælper dig med at se, hvad der foregår.
Svar
Jeg vil beskrive mit syn på dette i to trin: Input-til-skjult trin og det skjulte til output trin. Jeg udfører det skjulte-til-output-trin først, fordi det virker mindre interessant (for mig).
Skjult-til-output
Outputet fra det skjulte lag kan være forskellige ting, men lad os antage, at de kommer ud af sigmoidal aktiveringsfunktioner. Så de er værdier mellem 0 og 1, og for mange input kan de bare være 0 “s og 1” s.
Jeg kan godt lide at tænke på transformationen mellem disse skjulte neuronudgange og outputlaget som bare en oversættelse (i sproglig forstand ikke den geometriske betydning). Dette er bestemt sandt, hvis transformationen er inverterbar , og hvis ikke, gik der noget tabt i oversættelsen. Men du har stort set bare de skjulte neuroner “output set fra et andet perspektiv.
Input-to-Hidden
Lad os sige, at du har 3 inputneuroner (bare så jeg nemt kan skriv nogle ligninger her) og nogle skjulte neuroner. Hver skjult neuron får som input en vægtet sum af input, så for eksempel måske
hidden_1 = 10 * (input_1) + 0 * (input_2) + 2 * (input_3)
Dette betyder, at værdien af hidden_1
er meget følsom over for værdien af input_1
, slet ikke følsom over for input_2
og kun let følsom over for input_3
.
Så du kan sige, at hidden_1
er ved at fange et bestemt aspekt af input, som du måske kalder “input_1
er vigtigt “aspekt.
Outputtet fra hidden_1
dannes normalt ved at sende input gennem en eller anden funktion, så lad os sige, at du bruger en sigmoid -funktion. Denne funktion påtager sig værdier mellem 0 og 1; så tænk på det som en switch, der siger, at enten input_1
er vigtig, eller at det ikke er t.
Så det er, hvad det skjulte lag gør! Det ekstraherer aspekter eller funktioner af inputområdet.
Nu kan vægte også være negative! Hvilket betyder, at du kan få aspekter som “input_1
er vigtigt, MEN OGSÅ input_2
fjerner den vigtighed”:
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)
Mere geometri
Hvis du kender nogle lineær algebra, kan du tænke geometrisk i form af at projicere i bestemte retninger. I eksemplet ovenfor projicerede jeg langs input_1
retning.
Lad os se på hidden_1
igen, fra Når værdien ved input_1
er stor nok, vil output fra sigmoid-aktiveringsfunktionen bare forblive på 1, den bliver ikke større . Med andre ord betyder mere og mere input_1
ingen forskel for output. Tilsvarende, hvis den bevæger sig i den modsatte (dvs. negative) retning, vil output efter et punkt ikke blive påvirket.
Ok, fint. Men antag, at vi ikke ønsker følsomhed i retning af uendelighed i en bestemt retning, og vi vil have, at den kun skal aktiveres for et bestemt interval på en linje. Betydning for meget negative værdier er der ingen effekt , og for meget positive værdier er der ingen effekt, men for værdier mellem sige 5 og 16 vil du have det til at vågne op. Det er her, du bruger en radial basisfunktion til din aktiveringsfunktion.
Oversigt
Det skjulte lag udtrækker funktioner i inputrummet, og outputlaget oversætter dem til den ønskede kontekst. Der kan være meget mere til det end dette, hvad med flerlagsnetværk og sådan, men det er det, jeg forstår indtil videre.
EDIT: Denne side med sine vidunderlige interaktive grafer gør et bedre job end mit lange og besværlige svar ovenfor nogensinde kunne gøre : http://neuralnetworksanddeeplearning.com/chap4.html
Kommentarer
- Som OP, er jeg ‘ lidt forvirret over det skjulte lag i neurale netværk. I dit eksempel, hvordan finder NN-algoritmen vægten for neuroner Hidden_1, Hidden_2 og Hidden_3? Og da Hidden_1, Hidden_2 og Hidden_3 er afledt af de samme inputvariabler, ville ‘ ikke vægtene konvergere til den samme løsning?
Svar
Lad os tage sagen om klassificering. Hvad outputlaget forsøger at gøre, er at estimere den betingede sandsynlighed for, at din prøve tilhører en given klasse, dvs. hvor sandsynligt det er, at prøven tilhører en given klasse. I geometriske termer giver kombination af lag på en ikke-lineær måde via tærskelfunktionerne de neurale netværk mulighed for at løse ikke-konvekse problemer (talegenkendelse, objektgenkendelse osv.), Som er de mest interessante. Med andre ord er outputenhederne i stand til at generere ikke-konvekse beslutningsfunktioner som dem, der er afbildet her .
Man kan se enhederne i skjulte lag som at lære komplekse funktioner fra data, der gør det muligt for outputlaget bedre at skelne en klasse fra en anden for at generere mere nøjagtige beslutningsgrænser. For eksempel i tilfælde af ansigtsgenkendelse lærer enheder i de første lag kantlignende funktioner (detekterer kanter ved givne retninger og positioner) og højere lag lærer at kombinere dem til at blive detektorer til ansigtsegenskaber som næse, mund eller øjne. Vægtene for hver skjult enhed repræsenterer disse funktioner, og dens output (forudsat at det er en sigmoid) repræsenterer sandsynligheden for, at denne funktion er til stede i din prøve.
Generelt betyder betydningen af output af output og skjulte lag afhænger af det problem, du prøver at løse (regression, klassifikation) og den tabsfunktion, du anvender (krydsentropi, mindste kvadratfejl, …)