Courses  

Opdracht 4: De Kohonen Map

A. De Kohonen-map en mapvorming in de hersenen

Inleiding

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. Er kunnen op verschillende wijze mappen worden gevonden maar de twee meest voor de hand liggende manieren zijn indeling van de hersenen in structuur en functie. Meest bekende ordening is die van Brodmann, die de gebieden verdeelde op basis van celstructuur en ordening van deze cellen. Later bleek dat deze structuren ook vaak een bepaald soort functie uitvoerde. Een voorbeeld daarvan is ‘area 17’, die nu bekend staat als de primaire visuele cortex. Wetenschappelijk gezien is dit is zeer interessant, want zo kan functie met structuur worden verklaard. Voor sommige neigt dit naar het aloude frenologie, waar bepaalde hersengebieden ook met bepaalde functies werden geassocieerd. Alleen de functies die men de hersengebieden toebedeelde waren wat afwijkend t.o.v. de functies die gebieden nu krijgen toebedeeld. Zo was er bijvoorbeeld een gebied voor hoop. Een ander verschil is dat de indeling van gebieden niet overeen komt met onze moderne indeling. Echter het belangrijkste verschil tussen de functionele indeling van toen en nu is dat functie nu aan structuur is gekoppeld en niet aan een (topologisch aan te wijzen) gebied. Uit bijvoorbeeld rehabilitatie-onderzoek blijkt dat een bepaalde functie niet strikt aan een bepaald gebied is gekoppeld. Als een gebied gedeeltelijk of geheel is beschadigd of niet functionerend, dan is een ander gebied in staat om deze functie geheel of gedeeltelijk over te nemen (Dit wordt wel neurale compensatie genoemd).

In de hersengebieden van Brodmann is er sprake van ordening, zowel naar functie als naar topologie. Een voorbeeld een functionele ordening is de projectie van neuronen met groot receptief veld in het ene gebied naar neuronen met groot receptief veld van ander gebied. Een andere bekende functionele ordening op een veel kleinere schaal is de ordening van neuronen naar hoek in een hyper-kolom in de primaire visuele cortex. De visuele cortex bevat ook goede voorbeelden van topologische ordeningen. Iedereen kent wel het idee dat de projectie van het visuele veld precies is omgedraaid achter in de hersenen (de primaire visuele cortex): boven is onder en rechts wordt links. De primaire visuele cortex bevat ook weer een ander goed voorbeeld van topologische ordening; hyperkolommen die naast elkaar liggen verwerken stimuli die op naast elkaar gelegen retinale gebieden worden verwerkt.

Wat is nu de relevantie van de Kohonen Map voor mapvorming in de hersenen? Het is hopelijk duidelijk geworden dat er zich allerlei mappen in de hersenen bevinden. En al deze mappen zijn op een bepaalde wijze geordend. Inmiddels is bekend dat allerlei mappen zoals de somatotopische, tonotopische en retinotopische kaarten worden gevormd door een combinatie van genetische en ervarings(leer) effecten. De Kohonen Map geeft natuurlijk geen 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. 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.

 

Plasticiteit in mappen

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 .

Een goed voorbeeld is de reorganisatie van de somatosensorische cortex na een lesie van een ledemaat of het doorsnijden van de zenuw naar een bepaald lichaamsdeel: de stukken somatosensorische cortex die de lichaamsdelen representeerden die gelesied 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.

 

B. Inputs, outputs

De opdrachten hier 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 mapmoet 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 ). Helaas zijn datasets van zulke interessante inputs moeilijk te krijgen, dus we moeten ons behelpen met dezelfde simpele inputs als waarmee het principe van de Kohonenmap als eerste illustreerde: locaties op een vierkant op een imaginaire bol met straal 1. Een punt op zo’n bol wordt bepaald door een x-, y-, en z-coordinaat. Die drie zijn de drie input-features. De inputlaag van ons model zal dus bestaan uit drie knopen, voor elke coordinaat eentje. Deze drie-dimensionale input moet worden gemapt op een tweedimensionale Kohonen-laag van 12 bij 12.

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 dhet 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 de ‘wachtprocedure’ (Waitsub), de procedure die zorgt voor een pauze in het genereren van inputs.

De tweede test berekent twee correlaties. De eerset correlatie is de samenhang tussen de gewichten van elk paar buren in het horizontale vlak: hoe hoger deze correlatie, hoe meer buren op elkaar lijken in hun gewichtenvector, hoe meer de map al topologisch georganiseerd is. Voor de tweede 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). 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. Opdrachten

Open het excel-bestand ‘Kohonenscript’. Open de Visual Basic-code. Er zijn drie modules in de code; zorg dat je ‘Kohonen1’ voor je hebt. 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. Kijk naar de hoofdprocedure, en loop de simulatie na. Eerst genereert het script twee lagen, een drieknopige inputlaag, een Kohonenlaag van 16 bij 16 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 heeft geleerd en getest, 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 en het model 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 wordt een ander subprocedure aangeroepen "WaitSub", met twee indexen. De tweede index in de aanroep van deze procedure is het aantal seconden dat wordt gewacht tussen twee inputs in (deze procedure 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. 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 5, 1 en 10. Run de simulaties. Wat is de invloed van de ‘neighbourhood’-grootte?

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. 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 afname. 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.

In deze opdracht kijken we naar twee soorten lesies en het effect daarvan op Kohonen-mappen. Eerst onderzoeken we het effect van een lesie 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 lesiet (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 16). Vervolgens wordt het model getest, en leert het evenveel stimuli als voor de lesie – met ook evenveel testen ertussen. De resultaten van alle testen na de lesie worden tenslotte weggeschreven op een tweede Excel sheet. Run dit 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 ‘LearnSubs’-module is een subprocedure, ‘MakePatternIncompleteSpace’, die willekeurige patronen aanmaakt, maar zorgt dat ze niet uit de ‘rechterbovenhoek’ van de patroonruimte komen. 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.

 

!!!!! DEADLINE: VOOR 9 JUNI MOET HET INGELEVERD ZIJN !!!!!

 

 

 

 


University of AmsterdamUniversity of Amsterdam
Department of Psychology
Page last modified: 2003-05-27. Validate html.
Copyright © 2000-2007 neuroMod Group. Send us Feedback!