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 zon 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 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 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.
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 !!!!!
|