Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Volgorde van berekenen in een Neural Network

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met Neural Networks in combinatie met genetische algoritmes (NEAT / HyperNEAT)

Momenteel heb ik een simpele neural network implementatie die alle neurons in stricte lagen bijhoudt (input laag, meerdere hidden lagen, output laag) waarbij ook alle neurons in laag X verbonden zijn met alle neurons in laag X+1 (fully connected).

Deze implementatie werkt prima maar wil nu een wat geavanceerde implementie maken waarbij niet de hidden neurons niet in losse lagen gestructureerd zijn en er ook 'shortcut' connecties tussen neurons kunnen liggen die bijvoorbeeld direct van de input naar de output laag gaan. Ook is het mogelijk om recurrent connecties te leggen.

hierbij stuit ik dus op het probleem van de volgorde van berekenen. In de simpele (lineaire) implementatie zijn de stappen duidelijk.

voor iedere laag L in hidden layers
voor iedere neuron N in laag L
1) zoek alle input connecties voor N
2) maak de som van (input connectie weight * waarde input neuron) voor iedere connectie
3) bereken de activatie van de neuron via activatie functie (tanh of sigmoid) en geen N deze activatie

Bij de de nieuwe implementatie zijn er in feite geen lagen maar enkel een aantal hidden neurons die met elkaar of met neurons in de input en output laag verbonden zijn.

Ik heb hier al een werkende implementatie van maar deze is erg afhankelijk van de volgorde waarin de neurons toegevoegd worden en de connecties gelegd worden, en gezien bij NEAT er extra connecties / neorons aangemaakt kunnen worden door het genetisch algoritme is deze volgorde niet meer te garanderen na een aantal evoluties.

Misschien denk ik te moeilijk (zal niet de eerste keer zijn) ... maar heeft iemand een simpele oplossing om de correcte volgorde van berekenen te handhaven ?

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Kun je niet een breadth-first graph search doen hiervoor? Waarbij je begint in een fictieve root node die connecties heeft naar alle input nodes.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Topicstarter
@Grijze Vos

die fictieve root node snap ik niet helemaal ... wat zou daar het doel van zijn ?

Misschien is iets in die geest eigenlijk wel de simpelste oplossing, vanuit de input neurons de 'volgende' neurons bepalen (exclusief de output neurons)... alles berekenen ... weer de volgende set bepalen vanuit de eerste set ... etc etc ... en daarna pas de output neurons afhandelen.

ik ga weer eens knutselen ;)
ik denk dat ik wederom te moeilijk aan het denken was

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:57
Wat Grijze Vos beschrijft heet topological ordering maar dat werkt alleen als het netwerk acyclisch is.

(Acyclisch met alleen loops van een vertex naar zichzelf kun je er ook nog wel mee oplossen; dan negeer je de loops.)

Als dat niet het geval is, dan is het het makkelijkst om een tweede array te pakken en daarin de nieuwe waarden voor de neuronen te berekenen. De nieuwe waarden worden berekend op basis van de oude waarden van de inputs. De volgorde waarin je nieuwe waarden berekent maakt dan niet uit, en aan het eind van een iteratie verwissel je de arrays met oude en nieuwe waarden.

[ Voor 9% gewijzigd door Soultaker op 08-10-2014 14:12 ]


Verwijderd

Topicstarter
@Soultaken

Wat bedoel je als je zegt dat de volgorde van berekenen niet uitmaakt ? Je moet toch altijd de som hebben van alle input waarden * de weight van de connectie om de waarde van een neuron te bepalen ?

edit : Ik ben voorlopig niet van plan om cyclische connecties te gaan gebruiken, misschien alleen een Elman achtige oplossing met context neurons maar hier is wel een uitzondering voor te bedenken.

[ Voor 32% gewijzigd door Verwijderd op 08-10-2014 14:26 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:57
Ik begreep dat je vraag was in welke volgorde je neuronen kunt updaten in je netwerk. Het is daarbij alleen van belang dat je neuronen die als input dienen update ná die neuronen die van hun (oude) waarde afhankelijk zijn. Vandaar dat je in het lagen-model van achter naar voren kunt werken.

Als je de nieuwe waarden los berekend van de oude waarden heb je die beperking helemaal niet.

Verwijderd

Topicstarter
Het was de vraag hoe ik het beste de volgorde kon bepalen inderdaad.

Maar stel je hebt neuron X die als input neuronen A en B heeft ... dan moeten A en B toch eerst geactiveerd zijn om X te kunnen voorzien van een waarde ? of denk ik nu te 'feed forward' ?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:57
Het is lang geleden dat ik iets met neurale netwerken deed -- het kan zijn dat de uitvoer van een neuron in iteratie x afhangt van de uitvoer van z'n inputs op iteratie x, in plaats van x-1 (zoals ik veronderstelde). In dat geval mag je inderdaad geen cykels hebben; dan kun je net zo goed de topologische ordening gebruiken maar dan van voor naar achter.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Ik heb net vorige week er 1 geïmplementeerd dus ik zit er nog vers in. Grijze Vos had het goede idee in de eerste reactie. Een breadth-first search is de correcte oplossing. Je begint met een BFS van alle input nodes. Dit vindt alle nodes die direct aan de inputs verbonden zijn ("layer 1").

De essentiele stap is dat je nu een subselectie neemt van nodes hieruit die alleen aan de input verbonden zijn. Hier reken je de activatie van uit.

Iteratief ga je nu alle nodes af die uitsluitend aan nodes verbonden zijn met een bekende activatie. Dit werkt zolang er geen cycles in zitten.

De nette methode om cycles te hebben is door een delay in de cycle te hebben. De output van een neuron in laag N kan dan een input zijn voor laag N-1, maar wel in tijdsstap T+1.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1