Courses  

Appendix 3. Script van de eindopdracht

(Noot: bij het aanroepen van de meeste subroutines moet je het argument 'workspace' doorgeven. Dit is nodig om de subroutine met de workspace te kunnen laten werken; je hoeft niets met dit argument te doen).

De constantes van de simulatie

  • nrOfPatterns : aantal patronen dat je het model in de simulatie laat leren.
  • nrOfReplications : aantal keer dat de simulatie gerund wordt
  • nrOfTestreplis : aantal keer dat tijdens een test een patroon aangeboden wordt (hoe meer keer je dat doet, hoe kleiner de variantie is in de scores).
  • temperatuur : temperatuur in alle lagen. Stel deze in op een heel lage waarde, zodat je niet teveel last hebt van willekeurig actief wordende knopen.
  • layerSize : hoogte en breedte (worden aan elkaar gelijk gesteld) van de associatielaag
  • numNodes = layerSize ^ 2 : aantal knopen van de associatielaag; wordt afgeleid van de hoogte/breedte van de laag

De initieel-leren / patroonaanmaakroutine

Bij het initieel leren wordt tegelijk het patroon aangemaakt. Een patroon bestaat uit een inputknoop (met het nummer van de knoop gelijk aan het nummer van het patroon), een outputknoop (met idem nummer), en dan een 'patternSize' aantal knopen in de associatielaag. De aanroep van de subprocedure is als volgt:

LearnOnePattern workspace, nrOfPat, patternSize, beginNode, endNode

nrOfPat is het nummer van het patroon (begint bij 0, eindigt bij aantal patronen-1). patternSize is, als gezegd, het aantal knopen in de associatielaag dat bij het patroon hoort. 'beginNode' en 'endNode' geven het gebied in de laag aan waarin de associatieknopen zich mogen bevinden. Als je voor 'beginNode' 0 opgeeft en voor 'endNode' 69 (denk aan de -1 omdat 0 steeds meedoet), dan zullen alle associatieknopen in het patroon zich bevinden tussen de eerste 70 knopen in de associatielaag. Als je een laag met 100 knopen hebt, betekent dit dat de knopen zich in de bovenste 70% van de laag zullen bevinden. Geef je 30 en 99 op, dan zullen ze zich in de onderste 70% van de laag bevinden.

Bovenaan de routine staan twee variabelen die de leerconstanten bepalen, eentje voor alle tracts met als beginpunt de inputlaag, en eentje voor alle tracts met als beginpunt de associatielaag (dit verschil is omdat er in de inputlaag steeds maar 1 knoop actief is, en in de associatielaag meerdere; als ze allebei dezelfde leerparameter hadden zouden associatieknopen door hun aantal het altijd winnen van de input). Stel deze in op zinnige waardes.

De trainroutine

De trainroutine zorgt ervoor dat een patroon herleerd wordt. Eerst worden de goede input- en outputknopen geactiveerd. Vervolgens wordt er een goed associatie-patroon bij gezocht. Dit gebeurt door het model een aantal iteraties te laten cyclen, net zolang tot de inhibitie goed afgesteld staat en er een aantal knopen ongeveer gelijk aan k actief is (dit wordt niet nagegaan; wat er eigenlijk gebeurt is dat het model 100 iteraties lang cyclet in de subprocedure CycleAndLearn, waarna er hopelijk een goed patroon actief is). Tenslotte wordt het nu ontstane patroon geleerd. Hierbij worden de verbindingen tussen de actieve input- associatie- en outputknopen, en de verbindingen tussen de associatieknopen versterkt. De aanroep is als volgt:

TrainOnePattern workspace, patNr

Het enige argument dat je bij trainen in moet voeren is het patroonnummer. Bovenaan de routine staan twee variabelen die de leerconstanten bepalen, eentje voor alle tracts met als beginpunt de inputlaag, en eentje voor alle tracts met als beginpunt. Stel deze in op zinnige waardes.

De consolideerroutine

De consolideerroutine zorgt ervoor dat 1 patroon geconsolideerd wordt. Het model begint vanuit een willekeurige begintoestand. Vervolgens mag het model gedurende 100 iteraties cyclen in de subprocedure CycleAndLearn. De hoop is dat er inmiddels een stabiel patroon actief is geworden. Dit patroon wordt vervolgens geleerd (er is geen controle op of er inderdaad een patroon actief is)

ConsolidateOnce workspace

Bovenaan de routine staan twee variabelen die de leerconstanten bepalen, eentje voor alle tracts met als beginpunt de inputlaag, en eentje voor alle tracts met als beginpunt. Stel deze in op zinnige waardes.

De laesieroutine

Deze routine is enigszins vergelijkbaar met de routine die in het script van opdracht 4 knopen ledeerde. Hier wordt echter geen vierkant geledeerd, maar een gedeelte van eerst de bovenste helft van de associatielaag, daarna van de onderste helft van de associatielaag. Als argument geef je het aantal knopen mee dat geledeerd moet worden. Dat wordt eerst afgerond, vervolgens gaat hij kijken hoeveel van de bovenste helft geledeerd moet worden. Als een aantal knopen groter dan de helft van de laag geledeerd moet worden, ledeert hij eerst de gehele bovenste helft, en vervolgens een deel van de onderste helft. Check een aantal waardes voor het aantal te lederen knopen om te zien hoe dit werkt. De aanroep van de subroutine is als volgt:

LesionNodes associateLayer, layerSize, patternSize, nrNodesLesioned

Het eerste argument is de laag waarin je knopen wilt lederen, het tweede argument is de lengte van de laag (er wordt uitgegaan van een vierkante laag, dus dat is meteen ook de hoogte), het derde het aantal knopen dat normaal actief is in de laag (k, hier gelijk aan de grootte van een patroon), en tenslotte het vierde argument het aantal knopen dat je geledeerd wilt hebben.

De testroutine

De testroutine kan je op verschillende momenten aanroepen in je simulatie (je moet wel zorgen dat de constante nrOfTestreplis gelijk is aan het aantal testen dat je doet).

Test workspace, results, testCounter, replication

'Results' is de matrix waarin de resultaten worden opgeslagen. Deze matrix heeft 5 dimensies, die worden uitgelegd daar waar 'results' wordt gedeclareerd. Bij 'testCounter' moet je invullen hoeveelste test het wordt, en bij 'replication' de hoeveelste replicatie het is.

Elke test van elk patroon wordt altijd automatisch 6 keer herhaald voor een beetje stabiliteit in de scores.

Het wegschrijven van de resultaten

Het wegschrijven gebeurt in de subprocedure WriteComplexResultsAway. Elke keer dat je de simulatie runt produceert het script een nieuw naamloos Excel-workbook waarin deze subprocedure de resultaten in schrijft. Elk testmoment (zie hierboven) krijgt zijn eigen sheet, waarop twee maten worden weggeschreven. De lijnen onder elkaar bij elke maat zijn de replicaties van de hele simulatie. De twee maten zijn:

"Input to pattern output node as fraction of total input to output layer"

Als je de inputknoop behorende bij een patroon aan zet, dan activeert deze inputknoop knopen in de associatielaag, die vervolgens weer output naar de outputlaag zenden. Hoeveel van deze output terecht komt bij de correcte outputknoop (d.w.z. degene die hoort bij het patroon) is de gebruikte maat voor hoe goed het patroon opgehaald kan worden. Stel dat je twee patronen hebt, patroon 0 en patroon 1, en dat je patroon 1 wilt testen. Dan wordt de 1e (dus eigenlijk de 2e doordat tellen begint bij 0) inputknoop geactiveerd, die zorgt voor activatie in de associatielaag. Stel dat de 0e knoop in de outputlaag nu een input heeft van 0.2, en de 1e van 0.3. De totale output van de associatielaag naar de inputlaag is: 0.2 + 0.3 = 0.5. Hiervan komt 0.3 / 0.5 = 0.6 bij de correcte outputknoop (nummer 1) aan. Als maat voor hoe goed patroon 1 nog is gerepresenteerd krijg je dus: 0.6. Hoe dichter deze maat bij 1 komt, hoe beter, en hoe dichter bij 0, hoe slechter.

Naast deze maat wordt er nog iets weggeschreven:

"Number of associate nodes active at test"

Dit geeft het aantal knopen in de associatielaag dat actief is tijdens de test. Als er bijna geen knopen actief zijn, kan het goede patroon niet geactiveerd zijn. Het aantal actieve associatieknopen kan je daarom helpen om rare resultaten te verklaren. Als het dicht bij 0 ligt weet je dat er weinig of geen knopen actief worden tijdens de test, en dat er daarom geen patronen opgehaald kunnen worden.

De resultaten worden voor elk patroon apart weggeschren, en zijn gemiddelden van de 6 testherhalingen per patroon.

 


University of AmsterdamUniversity of Amsterdam
Department of Psychology
Page last modified: 2013-10-27. Validate html.
Copyright © 2000-2009 NeuroMod Group. Send us Feedback!