Ik “weet zeker dat veel mensen zullen reageren met links naar” laat me dat voor je googlen “, dus ik wil zeggen dat ik heb geprobeerd te achterhalen dit uit dus vergeef mijn gebrek aan begrip hier, maar ik kan er niet achter komen hoe de praktische implementatie van een neuraal netwerk werkelijk werkt.
Ik begrijp de invoerlaag en hoe de gegevens te normaliseren, ik begrijp ook de bias-eenheid, maar als het gaat om de verborgen laag, wat de feitelijke berekening in die laag is en hoe deze wordt toegewezen aan de de output is een beetje mistig. Ik heb diagrammen gezien met vraagtekens in de verborgen laag, booleaanse functies zoals EN / OF / XOR, activeringsfuncties en invoerknooppunten die worden toegewezen aan alle verborgen eenheden en invoerknooppunten die worden toegewezen aan slechts een paar verborgen eenheden. Ik heb slechts een paar vragen over het praktische aspect. Natuurlijk zou een eenvoudige uitleg van het hele neurale netwerkproces, zoals je dat aan een kind zou uitleggen, geweldig zijn.
Welke berekeningen worden gedaan in de verborgen laag ?
Hoe worden die berekeningen toegewezen aan de uitvoerlaag?
Hoe werkt de uitvoerlaag? De-normaliseren van de gegevens van de verborgen laag?
Waarom zijn sommige lagen in de invoerlaag verbonden met de verborgen laag en andere niet?
Opmerkingen
- Mensen hier in de buurt zijn aardig, ik heb nog nooit gezien een laat me dat voor je googlen – maar veel verrassend grondige en inzichtelijke antwoorden op wat aanvankelijk basisvragen leken. Helaas kan ik ‘ u niet helpen met het is van jou, maar het lijkt behoorlijk relevant, dus ik stem er graag mee op.
- Bedankt voor de opmerking en de stemming Gael, ik ‘ ben waarschijnlijk een beetje afgestompt door de SO-gemeenschap zoals we allemaal weten hoe die mensen kunnen komen 🙂 Blij om hier meer een geest van samenwerking te zien in plaats van te proberen badges en punten te verdienen door vragen te bewerken / sluiten.
- Dat ben ik niet expert in neurale netwerken in het bijzonder, hoewel ik wel betrokken ben bij hun toepassingen en methoden. Mijn misschien-niet-zo-nuttige antwoord zou zijn dat de specifieke berekeningen in de verborgen afhangen van de ‘ kostenfunctie ‘ die u bent opleggen aan uw output, dwz wat u probeert te bereiken. Als u bijvoorbeeld de invoerelementen in geclusterde sets wilt groeperen, berekent u afstanden tussen elementen in de verborgen laag. Dit kan verschillende iteraties en optimalisatiecycli doorlopen binnen deze laag, totdat u voldoet aan een foutcriterium waardoor het proces ‘ deze laag kan verlaten.
Antwoord
Versie met drie zinnen:
-
Elke laag kan elke gewenste functie toepassen op de vorige laag (meestal een lineaire transformatie gevolgd door een verpletterende niet-lineariteit).
-
De taak van de verborgen lagen is om de invoer om te zetten in iets dat de uitvoerlaag kan gebruiken.
-
De uitvoerlaag transformeert de verborgen laagactiveringen in de schaal waarop u uw uitvoer wilt hebben.
Like you “re 5:
Als u wilt dat een computer u vertelt of er een bus in een afbeelding staat, heeft de computer het misschien gemakkelijker als hij over de juiste tools beschikt.
Dus je busdetector kan gemaakt zijn van een wieldetector (om je te helpen vertellen dat het een voertuig is) en een doosdetector (aangezien de bus de vorm heeft van een grote doos) en een maatdetector (om je te vertellen het is te groot om een auto te zijn). Dit zijn de drie elementen van je verborgen laag: ze maken geen deel uit van de onbewerkte afbeelding, het zijn tools die je hebt ontworpen om je te helpen bussen te identificeren.
Als alle drie deze detectoren worden ingeschakeld (of misschien als ze “bijzonder actief zijn), is de kans groot dat u een bus voor u heeft.
Neurale netten zijn handig l omdat er goede tools zijn (zoals backpropagation) om veel detectoren te bouwen en in elkaar te zetten.
Alsof je een volwassene bent
Een feed-forward neuraal netwerk past een reeks functies toe op de gegevens. De exacte functies zijn afhankelijk van het neurale netwerk dat u gebruikt: meestal berekenen deze functies elk een lineaire transformatie van de vorige laag, gevolgd door een verpletterende niet-lineariteit. Soms doen de functies iets anders (zoals het berekenen van logische functies in uw voorbeelden , of het middelen over aangrenzende pixels in een afbeelding). Dus de rollen van de verschillende lagen kunnen afhangen van welke functies worden berekend, maar ik zal proberen heel algemeen te zijn.
Laten we de invoer noemen vector $ x $, de verborgen laagactiveringen $ h $ en de uitvoeractivering $ y $. Je hebt een functie $ f $ die wordt toegewezen van $ x $ naar $ h $ en een andere functie $ g $ die wordt toegewezen vanaf $ h $ to $ y $.
Dus de activering van de verborgen laag is $ f (x) $ en de output van het netwerk is $ g (f (x)) $.
Waarom hebben twee functies ($ f $ en $ g $) in plaats van slechts één?
Als het niveau van complexiteit per functie beperkt is, kan $ g (f (x)) $ dingen berekenen die $ f $ en $ g $ afzonderlijk niet kunnen.
Een voorbeeld met logische functies:
Als we bijvoorbeeld $ f $ alleen toestaan en $ g $ om eenvoudige logische operatoren te zijn zoals “AND”, “OR” en “NAND”, dan kun je “andere functies zoals” XOR “niet met slechts één ervan berekenen. Aan de andere kant, we zouden “XOR” kunnen berekenen als we bereid waren om deze functies op elkaar te stapelen:
Functies van de eerste laag:
- Zorg ervoor dat ten minste één element “TRUE” is (met OR).
- Zorg ervoor dat ze “niet allemaal” TRUE “zijn (met NAND)
Tweede laag functie:
- Zorg ervoor dat aan beide eerste laag criteria is voldaan (gebruik AND)
De output van het netwerk is alleen de resultaat van deze tweede functie. De eerste laag transformeert de invoer in iets dat de tweede laag kan gebruiken zodat het hele netwerk XOR kan uitvoeren.
Een voorbeeld met afbeeldingen:
Dia 61 van deze lezing –ook beschikbaar hier als een enkele afbeelding – toont (een manier om te visualiseren) waarnaar de verschillende verborgen lagen in een bepaald neuraal netwerk op zoek zijn.
De eerste laag zoekt naar korte stukjes randen in de afbeelding: deze zijn heel gemakkelijk te vinden aan de hand van onbewerkte pixeldata, maar ze zijn op zichzelf niet erg handig om je te vertellen of je naar een gezicht of een bus kijkt of een olifant.
De volgende laag vormt de randen: als de randen van de onderste verborgen laag op een bepaalde manier in elkaar passen, kan een van de oogdetectoren in het midden van de meest linkse kolom worden ingeschakeld . Het zou moeilijk zijn om een enkele laag te maken die zo goed was in het vinden van zoiets specifieks uit de onbewerkte pixels: oogdetectoren zijn veel gemakkelijker op te bouwen uit randdetectoren dan uit onbewerkte pixels.
De volgende laag up stelt de oogdetectoren en de neusdetectoren samen in gezichten. Met andere woorden, deze lichten op als de oogdetectoren en neusdetectoren uit de vorige laag met de juiste patronen aan gaan. Deze zijn erg goed in het zoeken naar bepaalde soorten gezichten: als een of meer ervan oplichten, dan zou je uitvoerlaag moeten rapporteren dat een gezicht aanwezig is.
Dit is handig omdat gezichtsdetectoren zijn eenvoudig op te bouwen met oogdetectoren en neusdetectoren, maar zijn echt moeilijk op te bouwen met pixelintensiteiten.
Dus elke laag brengt u steeds verder van de onbewerkte pixels en dichter bij uw uiteindelijke doel (bijv. gezichtsdetectie of busdetectie).
Antwoorden op diverse andere vragen
“Waarom zijn sommige lagen in de invoerlaag verbonden met de verborgen laag en andere niet?”
De niet-verbonden knooppunten in het netwerk worden “bias” -knooppunten genoemd. Er “is een heel aardige uitleg hier . Het korte antwoord is dat het” termen zijn als onderscheppingstermen bij regressie.
“Waar komen de oogdetector-afbeeldingen in het afbeeldingsvoorbeeld vandaan?
Ik heb de specifieke afbeeldingen waarnaar ik heb gelinkt niet dubbel gecontroleerd, maar over het algemeen tonen deze visualisaties de reeks pixels in de invoerlaag die de activiteit van het corresponderende neuron maximaliseren. Dus als we het neuron beschouwen als een oogdetector, is dit het beeld dat het neuron beschouwt als het meest oogachtig. Mensen vinden deze pixelsets meestal met een optimalisatie (heuvelbeklimmen) procedure.
In dit artikel door enkele Google-mensen met een van s werelds grootste neurale netten, laten ze zien een “gezichtsdetector” -neuron en een “kattendetector” -neuron op deze manier, evenals een tweede manier: ze tonen ook de werkelijke beelden die het neuron het sterkst activeren (figuur 3, figuur 16). De tweede benadering is mooi omdat het laat zien hoe flexibel en niet-lineair het netwerk is – deze “detectoren” op hoog niveau zijn gevoelig voor al deze afbeeldingen, ook al zien ze er op pixelniveau niet bepaald hetzelfde uit.
Laat het me weten als hier iets onduidelijk is of als je nog vragen hebt.
Opmerkingen
- Dus is er maar één gedefinieerd algoritme voor elk afzonderlijk knooppunt op een bepaalde laag en de gewichten die de uitvoer anders maken? Of kun je elk knooppunt op de laag anders programmeren?
- @GeorgeMcDowd dit komt bij het belangrijkste probleem: kijken naar pixels en het identificeren van bussen is moeilijk, zoals je suggereerde. Gelukkig is het gemakkelijk om naar pixels te kijken en randen te vinden – die ‘ s de enige die de eerste verborgen laag probeert te doen. De volgende laag probeert gevolgtrekkingen maken op basis van randen, wat veel eenvoudiger is dan proberen op basis van pixels.
- DUS zou je een andere beloning moeten geven (dan alleen maar punten) voor de tijd en moeite die je in dit antwoord hebt gestoken!
- @JoshuaEnfield Ik denk dat de logica in de ‘ s was een combinatie van vergelijkbaar zijn met hoe mensen dachten dat de hersenen werkten, dat het overal differentieerbaar was en dat de waarden begrensd waren zoals je zei. Sindsdien hebben mensen ontdekt dat
f(x) = max(x, 0)
(de ” gecorrigeerde lineaire eenheid “) vaak werkt beter, ook al heeft het niet ‘ t veel van die eigenschappen. - Het busvoorbeeld en de keten van functies hebben het gewoon goed gedaan. Begrijp ‘ niet waarom tekstboeken ‘ niet zo beschrijvend kunnen zijn.
Antwoord
Ik zal proberen iets toe te voegen aan de intuïtieve operationele beschrijving …
Een goede intuïtieve manier om na te denken over een neuraal netwerk is te denken over wat een lineair regressiemodel probeert te doen. Een lineaire regressie vereist wat invoer en komt met een lineair model dat elke invoerwaarde vermenigvuldigt met een aantal model optimale weegcoëfficiënten en probeert de som van die resultaten in kaart te brengen met een uitvoerrespons die komt overeen met de werkelijke uitvoer. De coëfficiënten worden bepaald door de waarden te vinden die een foutstatistiek minimaliseren tussen de gewenste uitvoerwaarde en de waarde die door het model wordt geleerd. Een andere manier om dit te zeggen is dat het lineaire model zal proberen coëfficiëntvermenigvuldigers te creëren voor elke invoer en som ze allemaal op om te proberen de relatie tussen de (meervoudige) invoer en (meestal enkele) uitvoerwaarde te bepalen ues. Datzelfde model kan bijna worden gezien als de basisbouwsteen van een neuraal netwerk; een enkele eenheid perceptron.
Maar de enkele eenheid perceptron heeft nog een stuk dat de som van de gewogen gegevens op een niet-lineaire manier zal verwerken. Het gebruikt meestal een squashfunctie (sigmoid of tanh) om dit te bereiken. Dus je hebt de basiseenheid van de verborgen laag, wat een blok is dat een reeks gewogen inputs zal optellen – het geeft vervolgens de gesommeerde respons door aan een niet-lineaire functie om een (verborgen laag) outputknooppuntrespons te creëren. De bias-eenheid is net als bij lineaire regressie een constante offset die wordt toegevoegd aan elk te verwerken knooppunt. Vanwege het niet-lineaire verwerkingsblok ben je niet langer beperkt tot alleen lineaire reacties (zoals in het lineaire regressiemodel).
Oké, maar als je veel van de enkele perceptroneenheden hebt die samenwerken, kunnen verschillende gewichtsvermenigvuldigers en verschillende reacties hebben (ook al verwerken ze ALLE dezelfde set ingangen met hetzelfde niet-lineaire blok dat eerder is beschreven). Wat de reacties anders maakt, is dat elk verschillende coëfficiëntgewichten heeft die door het neurale netwerk via training worden geleerd (sommige vormen omvatten gradiëntafdaling). Het resultaat van alle perceptrons wordt vervolgens opnieuw verwerkt en doorgegeven aan een uitvoerlaag, net zoals de individuele blokken werden verwerkt. De vraag is dan: hoe worden de juiste gewichten bepaald voor alle blokken?
Een gebruikelijke manier om de juiste gewichten te leren, is door te beginnen met willekeurige gewichten en de foutrespons te meten tussen de werkelijke werkelijke output en de geleerde model uitvoer. De fout wordt doorgaans achterwaarts door het netwerk doorgegeven en het feedbackalgoritme zal die gewichten individueel in verhouding tot de fout verhogen of verlagen. Het netwerk herhaalt zich herhaaldelijk door voorwaarts te gaan, de outputrespons te meten, vervolgens bij te werken (achterwaartse gewichtsaanpassingen door te geven) en de gewichten te corrigeren totdat een bevredigend foutniveau is bereikt. Op dat moment heb je een regressiemodel dat flexibeler kan zijn dan een lineair regressiemodel, het is wat gewoonlijk een universele functiebenadering wordt genoemd.
Een van de manieren die me echt hebben geholpen om te leren hoe een neuraal netwerk echt werkt, is door de code van een neurale netwerkimplementatie te bestuderen en deze te bouwen. Een van de beste fundamentele codeverklaringen is te vinden in het hoofdstuk over neurale netwerken van (het gratis beschikbare) “De DSP-gids voor wetenschappers en ingenieurs” Ch. 26. Het is meestal in een zeer basale taal geschreven (ik denk dat het fortran was), wat je echt helpt te zien wat er aan de hand is.
Answer
Ik ga mijn mening hierover in twee stappen beschrijven: de stap van invoer naar verborgen en de stap van verborgen naar uitvoer. Ik “zal eerst de verborgen-naar-uitvoer-stap doen omdat het minder interessant lijkt (voor mij).
Hidden-to-Output
De uitvoer van de verborgen laag kan verschillende dingen zijn, maar laten we “nu eens veronderstellen dat ze uit komen sigmoïdale activeringsfuncties. Het zijn dus waarden tussen 0 en 1, en voor veel ingangen kunnen ze gewoon 0 “s en 1” s zijn.
Ik beschouw de transformatie tussen de output van deze verborgen neuronen en de outputlaag als slechts een vertaling (in taalkundige zin, niet in geometrische zin). Dit is zeker waar als de transformatie omkeerbaar , en zo niet, dan ging er iets verloren bij de vertaling. Maar eigenlijk heb je gewoon de output van de verborgen neuronen gezien vanuit een ander perspectief.
Input-to-Hidden
Laten we zeggen dat je 3 input-neuronen hebt (zodat ik gemakkelijk schrijf hier enkele vergelijkingen) en enkele verborgen neuronen. Elk verborgen neuron krijgt als invoer een gewogen som van invoer, dus misschien
hidden_1 = 10 * (input_1) + 0 * (input_2) + 2 * (input_3)
Dit betekent dat de waarde van hidden_1
erg gevoelig is voor de waarde van input_1
, helemaal niet gevoelig voor input_2
en slechts licht gevoelig voor input_3
.
Dus je zou kunnen zeggen dat hidden_1
een bepaald aspect van de invoer vastlegt, wat je de “input_1
is belangrijk “aspect.
De uitvoer van hidden_1
wordt meestal gevormd door de invoer door een functie te leiden, dus stel dat u een sigmoid -functie gebruikt. Deze functie neemt waarden aan tussen 0 en 1; dus beschouw het als een schakelaar die zegt dat ofwel input_1
belangrijk is, of niet “t.
Dus dat is wat de verborgen laag doet! Het extraheert aspecten , of kenmerken van de invoerruimte.
Nu kunnen gewichten ook negatief zijn! Wat betekent dat je aspecten kunt krijgen als “input_1
is belangrijk MAAR OOK input_2
neemt dat belang weg”:
hidden_2 = 10 * (input_1) - 10 * (input_2 ) + 0 * (input_3)
of input_1
en input_3
hebben “gedeeld” belang:
hidden_3 = 5 * (input_1) + 0 * (input_2) + 5 * (input_3)
Meer geometrie
Als je wat weet lineaire algebra, je kunt geometrisch denken in termen van projecteren in bepaalde richtingen. In het bovenstaande voorbeeld projecteerde ik in de input_1
richting.
Laten we nog eens kijken naar hidden_1
, van hierboven. Zodra de waarde op input_1
groot genoeg is, blijft de output van de sigmoid-activeringsfunctie gewoon op 1, het wordt niet groter . Met andere woorden, steeds meer input_1
zal geen verschil maken voor de output. Evenzo, als het in de tegenovergestelde (d.w.z. negatieve) richting beweegt, zal na een punt de uitvoer niet worden beïnvloed.
Oké, prima. Maar stel dat we geen gevoeligheid in de richting van oneindig in een bepaalde richting willen, en we willen dat deze alleen wordt geactiveerd voor een bepaald bereik op een lijn. Dit betekent dat er voor zeer negatieve waarden geen effect is , en voor zeer positieve waarden is er geen effect, maar voor waarden tussen bijvoorbeeld 5 en 16 wil je dat het wakker wordt. Hier zou je een radiale basisfunctie voor uw activeringsfunctie.
Samenvatting
De verborgen laag extraheert kenmerken van de invoerruimte en de uitvoerlaag vertaalt ze naar de gewenste context. Er kan veel meer aan de hand zijn dan dit, wat met meerlaagse netwerken en dergelijke, maar dit is wat ik tot nu toe begrijp.
EDIT: Deze pagina met zijn prachtige interactieve grafieken doet het beter dan mijn lange en omslachtige antwoord hierboven ooit zou kunnen doen : http://neuralnetworksanddeeplearning.com/chap4.html
Opmerkingen
- Net als het OP, ben ik ‘ een beetje in de war over de verborgen laag in neurale netwerken. Hoe vindt het NN-algoritme in uw voorbeeld de gewichten voor de verborgen_1, verborgen_2 en verborgen_3 neuronen? En aangezien hidden_1, hidden_2 en hidden_3 zijn afgeleid van dezelfde invoervariabelen, zouden ‘ t de gewichten convergeren naar dezelfde oplossing?
Answer
Laten we eens kijken naar classificatie. Wat de uitvoerlaag probeert te doen, is de voorwaardelijke kans schatten dat uw steekproef tot een bepaalde klasse behoort, d.w.z. hoe waarschijnlijk het is dat die steekproef tot een bepaalde klasse behoort. In geometrische termen stelt het combineren van lagen op een niet-lineaire manier via de drempelfuncties de neurale netwerken in staat om niet-convexe problemen op te lossen (spraakherkenning, objectherkenning, enzovoort), die de meest interessante zijn. Met andere woorden, de uitvoereenheden zijn in staat om niet-convexe beslissingsfuncties te genereren, zoals die hier worden weergegeven.
Men kan de eenheden in verborgen lagen zien als complexe kenmerken van gegevens die de uitvoerlaag in staat stellen de ene klasse beter van de andere te onderscheiden, om zo nauwkeurigere beslissingsgrenzen te genereren. In het geval van gezichtsherkenning leren eenheden in de eerste lagen bijvoorbeeld randachtige kenmerken (detecteren randen in bepaalde oriëntaties en posities) en leren hogere lagen deze te combineren om detectoren te worden voor gelaatstrekken zoals de neus, mond of ogen. De gewichten van elke verborgen eenheid vertegenwoordigen die kenmerken, en de uitvoer ervan (aangenomen dat het een sigmoïde is) geeft de waarschijnlijkheid weer dat dat kenmerk aanwezig is in uw steekproef.
In het algemeen de betekenis van de uitvoer van uitvoer en verborgen lagen zijn afhankelijk van het probleem dat u probeert op te lossen (regressie, classificatie) en de verliesfunctie die u gebruikt (kruisentropie, kleinste kwadraten, …)