Courses  

IV. De Kohonen Map

A. De Kohonen-map en mapvorming in de hersenen

De Self Organizing Feature Map (SOFM) van Kohonen houdt het midden tussen een optimalisatie-algoritme en een neuraal netwerk. Kohonen presenteert verscheidene versies in diverse papers, waarvan een aantal erg neuraal zijn, maar anderen nauwelijks. Het algoritme dat hij het vaakst gebruikt in zijn simulaties (en dat in Nutshell geïmplementeerd is) zoekt de knoop met de kortste Euclidische afstand ten opzichte van de invoervector, en past de gewichtenvector van de knoop zodanig aan dat de Euclidische afstand kleiner wordt. Niet alleen de gewichten van de winnende knoop worden aangepast, maar ook de gewichten van knopen die in de buurt van de winnende knoop liggen.

Om te bepalen of knopen in de buurt van andere knopen liggen is er een assenstelsel (referentiestelsel) nodig. Een Kohonen Map is een tweedimensionale map en elke knoop heeft een x- en een y-coördinaat. Invoer vectoren die op elkaar lijken zullen dicht bij elkaar op de Kohonen Map afgebeeld worden. M.a.w., de Kohonen Map maakt een topologische ordening van de invoer, mits deze een ordening hebben. Samengevat zitten er twee nieuwe aspecten, die nauw samenhangen, aan de Kohonen Map: ten eerste is in de Kohonen Map het aspect van ruimte aangebracht en ten tweede is de Kohonen Map in staat invoer in deze ruimte topologisch te ordenen.

In de hersenen komen we ook allerlei mappen tegen. Een bekende functionele topologische ordening is te vinden in de primaire visuele cortex: hyperkolommen die naast elkaar liggen verwerken stimuli die op naast elkaar gelegen retinale gebieden worden gedetecteerd. Met andere woorden, je beeldveld wordt geprojecteerd op V1 achterin de hersenen (maar dan met het visuele veld precies omgedraaid). Een ander voorbeeld is de ordening van neuronen naar hoek in een hyperkolom in de primaire visuele cortex.

Wat is nu de relevantie van de Kohonen Map voor mapvorming in de hersenen? De Kohonen Map geeft niet ten volle een verklaring voor het ontstaan van deze mappen en ordening. Oorspronkelijk was de Kohonen Map een antwoord op de bewering van von der Malsburg (1973) dat de organisatie van de verbindingen in de cortex niet volledig genetisch kon zijn vastgelegd. Von der Malsburg meende dat lokale synaptische processen zoals laterale inhibitie verantwoordelijk waren voor de 'finetuning' van de welbekende featuremaps van o.a. de primaire sensorische cortices. Inmiddels is bekend dat allerlei mappen zoals de somatotopische, tonotopische en retinotopische kaarten worden gevormd door een combinatie van genetische en ervarings- (leer-) effecten.

Volgens Von der Malsburg was een proces van laterale inhibitie en excitatie verantwoordelijk voor de vaststelling van de uiteindelijke uitvoer. Kohonen heeft dit idee op een simpele manier geïmplementeerd d.m.v. een winner-take-all mechanisme en een 'leeromgeving'. De Kohonen Map is dus een implementatie van de invloed van ervaring op de fine-tuning van een bepaalde map.

B. Inputs, outputs

De opdrachten in dit hoofdstuk draaien om het vormen en vervormen van topografische Kohonen-mappen. In opdracht 4.1 onderzoeken we mapvorming, en in opdracht 4.2 zullen we twee vormen van reorganisatie onderzoeken die een Kohonen-map kan ondergaan.

Bij het vormen van een topologische map moet het netwerk vanuit willekeurige verbindingen gereorganiseerd worden tot een topologische map, een map waarin geordende inputs een geordende output teweeg brengen.

Een voorwaarde voor het vinden van geordende outputs is dat er een orde is in de inputs: inputs moeten kunnen worden gerangschikt, er moet een ruimte zijn waarin de outputs te plaatsen zijn zodat sommigen dicht bij elkaar liggen en anderen ver van elkaar verwijderd zijn. Voorbeelden van zulke inputs zijn tonen (te ordenen op basis van frequentie), visuele inputs en hun lokalisatie op de retina, kleuren (te plaatsen in de bekende drie-dimensionele ruimte), of fonemen (zie Kohonen 1988). Helaas zijn datasets van zulke interessante inputs moeilijk te krijgen, dus we moeten ons behelpen met dezelfde simpele inputs als waarmee Kohonen het principe van de Kohonenmap als eerste illustreerde: locaties op een vierkant op een imaginaire bol met straal 1 (Kohonen, 1982). Een punt op zo’n bol wordt bepaald door een x-, y-, en z-coordinaat3. Die drie zijn de drie input-features. De inputlaag van ons model zal dus bestaan uit drie knopen, voor elke coördinaat eentje. Deze drie-dimensionale input moet worden gemapt op een tweedimensionale Kohonen-laag.

Controleren of de goede mapping inderdaad bereikt is, is een van de moeilijkere problemen bij deze simulatie. Kohonen, naar zijn papers te beoordelen, lijkt tevreden te zijn met mooie plaatjes: hij toont veel figuren met lijnen die de structuur van de input voorstellen (en een mooi raster vormen als de correcte mapping bereikt is), maar hij vermeldt nergens een samenvattende maat die aangeeft hoe goed of mooi of consistent de mapping is, of hoe snel hij bereikt is. Hier zullen wij twee procedures gebruiken: ten eerste schrijft het programma twee correlatiematen weg, ten tweede is er een visuele modus. In deze visuele modus wordt de input langzaam, in een consistent ritme, gepresenteerd aan het model. Vervolgens wordt gevisualiseerd welke knoop in de Kohonenlaag actief wordt bij de gegeven input. Als de Kohonenlaag een mooie mapping bereikt heeft, moet je een constant verloop van de ‘winners’ zien van linksboven naar rechtsonder (of omgekeerd – er is geen mechanisme in het model aanwezig dat een voorkeur voor richting zou kunnen veroorzaken). Je kunt de snelheid waarmee de input verandert zelf instellen met behulp van een indexje in het ‘wachtcommando’ (application.Wait), het commando die zorgt voor een pauze in het genereren van inputs.

De tweede test berekent een correlatie en een afstand. Voor de eerste en belangrijkste maat wordt een steekproef van knoopparen genomen, en daaruit de correlatie berekend tussen de afstand van de twee knopen in de laag, en de ‘afstand’ van hun gewichtenvectoren (oftewel: hoeveel de inputgewichten van twee knopen op elkaar lijken). Als deze correlatie groot is, dan is er een grote samenhang tussen nabijheid en gelijkenis, en dus betekent een hoge waarde voor deze correlatie (dicht bij 1) dat de map topologisch beter georganiseerd is. De tweede maat is het gemiddelde van de ‘afstand’ tussen de gewichten van elk paar buren in het horizontale vlak: hoe kleiner deze afstand, hoe meer buren op elkaar lijken in hun gewichtenvector, hoe meer de map al topologisch georganiseerd is. De twee correlaties worden opgeslagen in een ‘results’-matrix, en vervolgens uitgezet in een Excel sheet.

Beide testen worden een door jou in te stellen aantal malen gedaan, zodat je de mapvorming kunt volgen door de tijd.

C. Opdracht 4: Kohonen

Open het Excel bestand ‘Kohonenscript’. Open de Visual Basic-code. Er zijn drie modules in de code. De code in dit bestand is, zoals die van eerdere opdrachten, opgebouwd uit een hoofdprocedure waarin de loop van de simulatie wordt bepaald, en een aantal subprocedures met gedetailleerde instructies. Alleen is het nu zo dat alle hulpprocedures in aparte module staan, die “AllTheHelpSubs” heet. Dit heeft het voordeel dat er maar één kopie van is, die door zowel door het script voor opdracht 4.1 als dat voor opdracht 4.2 gebruikt kan worden.

Kijk naar de hoofdprocedure in de module “Kohonen1”, en loop de simulatie na. Eerst genereert het script twee lagen, een drieknopige inputlaag, een Kohonenlaag van 14 bij 14 knopen waarop zich de topografische map moet vormen, en een ‘tract’ met verbindingen tussen deze twee lagen. Ook wordt de leersnelheid ingesteld op de globale constante “learnParam”. Dan komt het echte simuleren. Eerst wordt de matrix aangemaakt waarin de correlaties zullen worden opgeslagen, en worden het aantal testen en de grootte van de ‘neighbourhood’ als constanten gedeclareerd. Vervolgens wordt het netwerk een eerste keer getest om de uitgangssituatie te laten zien. In de hoofdprocedure wordt de subprocedure “testKohonen”, van waaruit weer twee subprocedures doen die het eigenlijke testen uitvoeren: TestVisual voor de visuele test, TestCorrelations voor het berekenen van de correlaties.

Het trainen van het netwerk gebeurt in een ‘For…Next’-loop. Elke keer dat je door deze loop gaat (en dat ga je zo vaak als je het zelf met de testNr-constante hebt ingesteld) krijgt het model een aantal inputpatronen aangeboden, en wordt het vervolgens getest. Het aanbieden van de inputpatronen gebeurt in de subprocedure “LearnHundredsOfPatterns”, die in de aparte “LearnSubs”-module staat (je kunt daarheen klikken via het “Windows”-menu in de bovenbalk). Je kunt het aantal patronen dat in één keer “LearnHundredsOfPatterns” wordt geleerd instellen via de constante ‘learnPatsNr’.

Als de “For…Next”-loop het door jou bepaalde aantal keren leren en testen heeft afgewisseld, worden de resultaten weggeschreven met behulp van de subprocedure “WriteSimpleResultsAway”.

Je kunt de simulatie een keer runnen. Als je niets verandert wordt het model gevormd, wordt het dan getest om de uitgangssituatie te testen, wordt er vervolgens 1 keer (de uitgangswaarde van nrTests) honderd inputpatronen geleerd met de volstrekt zinloze ‘neigbourhoodsize’ van 1, en het model nog eens getest. Tenslotte wordt een Excel sheet gegenereerd met als output een serie met voor elke test de twee correlaties.

Voor je aan de opdrachten begint kan je beter de snelheid van de visuele test op een voor jou nog prettige, snellere waarde zetten, anders duurt het simuleren eindeloos. In de subprocedure TestVisual (zie module “AllTheHelpSubs”) staat een commando “workspace.application.Wait”, met als argument het aantal milliseconden dat wordt gewacht tussen twee inputs in. Door dit aantal te veranderen gaat de test sneller of langzamer (de subprocedure geeft ook het commando ‘workspace.update’, wat zoveel betekent als “laat op het scherm zien wat er gebeurt”. Zonder dit update-commando gaat de simulatie gewoon door zonder dat je iets op het scherm ziet).

4.1 ‘Neighbourhood’ en leerparameter

De simulatie heeft twee variabelen: een leerparameter en de parameter die de grootte van de ‘neighbourhood’ bepaalt, oftewel het aantal knopen waarvan de gewichten in een iteratie worden aangepast. (Kohonen, 1982) zelf stelt dat zijn resultaten (mooie mapformatie) redelijk onafhankelijk zijn van de parameterinstellingen, maar dat de grootte van de ‘neighbourhood’ wel belangrijk is (kennelijk was de leerparameter, de enige andere, niet kritiek).

a) Stel de grootte van de ‘neighbourhood’ achtereenvolgens op 1 6 en 12. Run de simulaties. Wat is de invloed van de ‘neighbourhood’-grootte?
(als de correlatie bij alle drie de simulaties onder de 0.8 is gebleven dan doe je iets fout).

b) Check of de leerparameter echt zo weinig uitmaakt (de leerparameter kan variëren tussen 0 en 1).

c) Kohonen stelt dat het paradigma het snelst werkt als de neighbourhood parameter daalt van groot, bij het begin van de simulatie, naar klein op het eind. In de ‘loop’ voor het leren in de hoofdmodule wordt de parameter die de neighbourhood bepaalt steeds gelijk gezet aan een constante. Verander dit zo dat de grootte van de ‘Neighbourhood’ afneemt in de tijd. Zorg eerst voor een lineaire afname, vervolgens voor een exponentiële afname4. Vergelijk deze twee simulaties met afnemende ‘neighbourhood’-grootte met één of meer passende controle-simulaties waarin de grootte van de neighbourhood constant is (bedenk zelf wat een controle ‘passend’ maakt).

Hint: je kunt of een teller maken die het aantal iteraties bijhoudt (te berekenen als het aantal testen maal het aantal leertrials per test) en daar een functie van ontwerpen, of zorgen dat de parameter steeds een stukje kleiner wordt (een constante hoeveelheid of een portie van zichzelf).

4.2 Kohonen en lesies.

Tot vrij recent was de consensus in neurobiologie dat de lagere sensorische en motorische gebieden van de neocortex gevormd werden tijdens de zogenaamde ‘kritische perioden’, en dat er daarna eigenlijk niet meer zoveel veranderde aan de connecties. Als de visuele, auditieve, motorische, somatosensorische mappen eenmaal gebakken zijn, zien de neuronen dat het goed is en houden ze op hun connecties te veranderen.

Zo is het misschien ook wel in de normale volwassene. Maar dat is niet omdat neuronen in die ‘lagere’ gebieden het vermogen verloren hebben om te leren en te veranderen: in vele gebieden, op vele manieren, is inmiddels aangetoond dat de ‘wiring’ van deze gebieden dramatisch kan veranderen, ook jaren na het einde van eventuele kritische perioden (Merzenich & Sameshima, 1993).

Een goed voorbeeld is de reorganisatie van de somatosensorische cortex na een laesie van een ledemaat of het doorsnijden van de zenuw naar een bepaald lichaamsdeel: de stukken somatosensorische cortex die de lichaamsdelen representeerden die geledeerd werden of waarmee het contact verloren werd, bleken na verloop van tijd andere lichaamsdelen te gaan representeren: een stuk cortex dat gevoelig was voor een duim, werd als die duim afgezet was gevoelig voor een andere vinger, of voor lippen, etc.

In deze opdracht kijken we naar twee soorten laesies en het effect daarvan op Kohonen-mappen. Eerst onderzoeken we het effect van een laesie van een deel van de map – equivalent aan het partieel lederen van een topologisch georganiseerd deel van de cortex. Vervolgens kijken we wat er gebeurt als de Kohonen map vanuit een deel van de input-ruimte geen stimuli meer krijgt. Dit is functioneel wat er gebeurt met de somatosensorische cortex als je een lichaamsdeel ledeert (waarom?).

a) Open de module “LesionCortex”. Hier is het simulatiegedeelte uitgebreid met een tweede ‘loop’, van, weerom, leren en testen. In de eerste loop wordt de map opgebouwd (kies daarvoor het benodigde aantal testen), en de resultaten van de testen weggeschreven. Vervolgens wordt de subprocedure ‘LesionCells’ aangeroepen. Deze procedure ledeert een door jou in te stellen aantal knopen (houdt het maar op 36). Vervolgens wordt het model getest, en leert het evenveel stimuli als voor de laesie – met ook evenveel testen ertussen. De resultaten van alle testen na de laesie worden tenslotte weggeschreven op een tweede Excel sheet. Stel eerst de parameters van de simulatie in zo dat het model een goede ‘map’ leert (gebruik hiervoor de waarden die je in opdracht 4.1 hebt gevonden). Run het script, en kijk wat er gebeurt (kijk goed naar de visuele test om te zien waar de stimuli op de hoek die geledeerd wordt nu projecteren). Bespreek hoe de Kohonen-map op het ‘lederen’ van een deel van de map reageert.

b) Het lederen van een deel van de inputruimte is zelf weer equivalent aan het elimineren van alle patronen die uit dat deel van de inputruimte komen. In de “AllTheHelpSubs”-module is een subprocedure, “MakePatternIncompleteSpace”, die willekeurige patronen aanmaakt, maar zorgt dat ze niet uit de ‘rechterbovenhoek’ van de patroonruimte komen. Als je het op-één-na-laatste argument van de testaanroep (de regel die begint met “TestKohonen”) op “True” zet in plaats van op “False”, dan wordt ook in de visuele test de rechterbovenhoek van de inputruimte niet gebruikt.
Verander “Kohonen1” zo dat er eerst een normale map wordt gevormd. Vervolgens moet het model net zoveel patronen aangeboden krijgen als in de eerste fase, maar in plaats van dat deze patronen uit het hele veld komen gebruik je de methode die zorgt dat ze nooit uit de rechterbovenhoek komen. Run je simulatie en bespreek hoe de Kohonen-map op het ‘lederen’ van een deel van de input reageert. Lever ook je script in!

Hint: De snelste methode om deze opdracht op te lossen is twee keer slim cut ’n pasten. Je kunt het best een tweede procedure voor het leren maken waarin je ‘MakePatternIncompleteSpace’ aanroept i.p.v. ‘MakePattern’. Deze tweede leerprocedure moet je dan aanroepen vanuit een stukje extra code in de hoofdprocedure (tweede cut ’n paste) waarin je, analoog aan hoe het in ‘LesionCortex’ werd gedaan, de simulatie een tweede keer uitvoert en de resultaten op een aparte sheet weg savet.

c) Als je de rechterbovenhoek van de inputruimte ledeert, zie je niet altijd de rechterbovenhoek van de Kohonenmap in onbruik raken (het kan, maar hoeft niet die hoek te zijn). Waarom niet?


!!!!! DENK AAN DE DEADLINE !!!!!


3 Eigenlijk wordt elk punt al bepaald door twee coördinaten, aangezien de punten maar van 1 zijde van de bol zullen komen. De derde coördinaat is bedoeld om te zorgen dat elke inputvector dezelfde lengte heeft (gelijk aan de straal van de bol, 1).

4 Exponentieel verval is verval volgens een formule eat, waarbij t de tijd is en a een constante zo dat a<0. Je benadert exponentieel verval door steeds een constante proportie van een variabele af te trekken: Y(t+1)= Y(t) -bY(t), waarbij 0<b<1.


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