VIII MacGregor neuronen
A. Biologisch plausibele neuronen
Inleiding
Niemand kan met droge ogen beweren dat knopen in
connectionistische netwerken in het werking lijken op neuronen. Hoe meer bekend
wordt over neuronen, hoe ingewikkelder ze lijken en hoe duidelijker het wordt
dat ze niet functioneren als eenvoudige optellers en doorgevers van inputs.
Knopen hoeven ook niet te lijken op biologische neuronen. Nog afgezien van dat
het niet de ambitie van elke connectionist is om het brein te simuleren, is
realisme op het niveau van het neuron misschien niet nodig om realisme op het
niveau van het hersendeel te bereiken. Er zijn ook kosten verbonden aan het
simuleren van realistische neuronen. Het kost zoveel rekenwerk om neuronen
realistisch te modelleren dat het vaak onmogelijk is grote netwerken te bouwen.
Bovendien wordt het simuleren met zulke neuronen al snel zo ingewikkeld dat
resultaten nauwelijks meer te interpreteren zijn. Als modelleerder heb je hier
een trade-off: hoe meer detail in het neuron hoe realistischer een simulatie
kan worden. Hoe minder detail, hoe makkelijker het is om grote netwerken te
bouwen en hoe uitgebreider je simulatie kan zijn.
Toch wordt steeds vaker getracht om netwerkknopen zo
veel mogelijk te laten lijken op neuronen. Dat heeft veel te maken met de
explosie van de neurowetenschappen: de laatste decennia is er zoveel nieuwe
kennis beschikbaar geworden over het brein, van het biochemische niveau tot aan
het niveau van de twee hemisferen, dat het niet meer onrealistisch is om
bijvoorbeeld een model voor de hippocampus te ontwerpen. Onder de noemer
‘computationele neurowetenschap’ bloeit een heel veld op waarin breindelen
gesimuleerd worden met behulp van neurale netten, of de interactie tussen twee
hersengebieden.
Soms zijn deze modellen klassieke netwerken met
klassieke eenheden, en is enkel in de structuur van het netwerk informatie over
breinanatomie verwerkt. Vaak echter wordt ook getracht te werken met zo
realistisch mogelijke ‘neuronen’. In de model-neuronen worden expliciet
membraanpotentialen, ionenstromen, ‘spike’-eigenschappen en de werking van
verschillende neurotransmitters gesimuleerd op een realistische tijdsschaal van
milliseconden. Meestal wordt het gedrag van zulke model-neuronen bepaald door
een ingewikkeld stelsel van differentiaalvergelijkingen.
Een voorbeeld van zo’n model-neuron is de
MacGregor-eenheid (MacGregor & Oliver, 1974). Oorspronkelijk bedoeld voor het
begijpen van electrofysiologische data (opnames van membraanpotentialen van
individuele neuronen), wordt dit model nu regelmatig gebruikt voor
connectionistische simulaties. In een bijgeleverde tekst (appendix 2) wordt de
werking van het neuron uit de doeken gedaan. MacGregor-neuronen zijn overigens
nog relatief eenvoudig vergeleken met meer recente modellen
(Hasselmo, Wyble, & Wallenstein, 1996; Jensen, Idiart, & Lisman, 1996).
Het MacGregor-paradigma
In Nutshell hebben we het MacGregorparadigma
geïmplementeerd met een paar vereenvoudigingen voorgesteld door Murre en
Raffone (subm.). Een beschrijving van hun modelneuronen is hier
opgenomen als appendix 4 (een korte bespreking volgt later)
-Open Nutshell, en open een “MacGregor”-workspace.
-Klik op Insert Layer om een layer aan te maken van grootte 1 bij 1.
-Kijk naar de laagparameters (zie appendix 1 voor uitleg van
parameterkijken). Als je in oudere nutshellversies op het
vraagtekentje klikt rechtsboven het parameterwindow verandert je cursor in een
vraagteken. Klik je nu op variabelenaam dan krijg je een regeltje uitleg te
zien over de parameter. In nieuwere versies van Nutshell moet je kijken onder het "Help" menu,
dan "Help Topics", dan "Paradigms" (klik op het vierkantje met een kruisje voor deze optie), dan
"Paradigm Specific Methods and Parameters", en dan op "Open Help Files" in het linker menu. Ietsje
omstandiger, maar nu krijg je alle parameters op een hoopje, en kan je door erop te klikken naar de uitleg kijken.
Een aantal parameters hebben te maken met tijd: met
bijvoorbeeld de snelheid waarmee kalium het neuron weer ‘insijpelt’ tijdens de
relatieve refractaire periode. Er is er ook eentje die bepaalt of de laag
inhiberend (vinkje) dan wel exciterend (geen vinkje) is, d.w.z. of alle knopen
in de laag inhiberende connecties leggen of exciterende [6.5].
-Klik op een knoop, en kijk naar de parameters. 'Membrane' is het membraanpotentiaal,
'Potas' (van Potassium) een afgeleide van de kaliumuitstroom. Fires is een binaire
variabele: vinkje betekent dat de knoop in de huidige iteratie vuurt. 'Clamped' en
'deactivated' hebben hun gebruikelijke betekenissen.
-Verander de activatie in de knoop van 0 naar 4. Run
een aantal iteraties zonder leren (klik hiervoor op de knop voor de functie
‘ActCycle’). Kijk na elke iteratie naar de variabelen.
Na 1 iteratie zie je dat de knoop vuurt: de activatie
is immers boven de ‘threshold’ van 1. Verder zie je dat de
kaliumwaarde,‘Potas’, omhoog is geschoten. De activatie is inmiddels gezakt,
omdat in elke iteratie het membraanpotentiaal iets terug gaat naar het
rustpotentiaal (gelijk aan 0). In connectionistische termen heet dit dat
MacGregorneuronen ‘leaky integrators’ zijn: ze integreren input die binnenkomt
door de tijd heen, maar op elke tijdsstap ‘lekt’ er ook een gedeelte van de
activatie weg.
In de tweede en derde iteratie zal de knoop nog steeds vuren en zal de
kaliumwaarde nog verder stijgen. Het membraanpotentiaal ('Membrane') zal
inmiddels onder de 'threshold' zitten. Niet alleen is er weer activatie
'weg gelekt', de kaliumwaarde zorgt voor een verder verlaging van het
membraanpotentiaal. Dit is een belangrijke eigenschap van zowel echte als
MacGregorneuronen. De kaliumuitstroom nadat een neuron gevuurd heeft zorgt
voor een verlaging van het membraanpotentiaal, waardoor het moeilijker wordt
voor het neuron om meteen weer te vuren. Dit zorgt voor de refractionaire periode
die een neuron doormaakt na gevuurd te hebben.
De knoop die we nu onder handen hebben zal hierdoor
in de vierde of vijfde iteratie niet meer kunnen vuren. Veel neuronen vertonen zulk
gedrag: ze vuren een aantal malen achtereen in een ‘burst’, waarna ze een tijd
lang moeilijker te exciteren zijn. Als je de knoop nog verder in de tijd volgt
zal je zien dat zowel het membraanpotentiaal als de kaliumwaarde weer terug
gaan naar hun uitgangswaarde, 0.
-Bekijk in Appendix 4 de formule voor de activatie,
formule 1, uit Murre & Raffone (in prep.). Dit is een zogenaamde
differentiaalvergelijking. Zo’n vergelijking geeft de verandering van een
bepaalde variabele (dU/dt) als functie van o.a. de huidige waarde van de
variabele (U). De U uit de eerste vergelijking is het membraanpotentiaal, de
variabele die bepaalt of het neuron gaat vuren. Gk, uit de tweede
vergelijking, is de bijdrage van de kaliumuitstroom aan het membraanpotentiaal.
Om differentiaalvergelijkingen te kunnen gebruiken
voor een simulator moet je ze integreren (tegengestelde van differentiëren). Je
kunt hun gedrag echter ruw benaderen door ze als discrete stappen te zien. Je
neemt dan de waarden van U en andere variabelen (bijv. Gk) om hun
verandering uit te rekenen (bijv. DU), telt die op of trekt die af van de uitgangswaarden om de waarden in
de volgende tijdsstap te berekenen. Vervolgens bereken je weer de verandering
in die volgende tijdsstap, etc. Zou je dit doen voor een pyramidale neuron met
op t=0: U = 4 (of U=-15 als je de millivoltagewaarden wilt gebruiken), en Gk
= 0, dan zou je hetzelfde gedrag zien als bij de knoop hierboven. De term “(U-U0)/ tu” regelt het ‘weglekken’ van activatie: op
elke tijdsstap wordt er een ‘1/ tu’ gedeelte van het verschil tussen U en het rustpotentiaal van U afgetrokken. De resterende termen in de eerste formule geven het effect van de input, zowel exciterend als inhiberend, en van de kaliumuitstroom weer.
In de tweede formule is geregeld dat, de
kaliumwaarde, Gk, omhoog schiet op het moment dat een cel vuurt(als
S=1). Daarnaast gaat ook de kaliumwaarde terug naar de evenwichtswaarde 0, via
de term ‘-Gk / tGk’. De kaliumwaarde heeft, via de eerste differentiaalvergelijking, een negatief effect op U: het verschil tussen U en het evenwichtspotentiaal voor kalium (-1, oftewel -90 millivolt) wordt voor een 1/ tu gedeelte, van U afgetrokken. Nadat een neuron heeft gevuurd en kalium de cel uit stroomt, daalt dus het membraanpotentiaal, wat het moeilijker maakt nog eens te vuren.
De Hebb regel stelt dat een verbinding wordt gevormd
als de pre- en postsynaptische neuron tegelijk vuren. Zo is het niet in
realiteit en zo is het ook niet bij MacGregorneuronen. In realiteit moet de
presynaptische neuron vuren iets voor dat de postsynaptische vuurt, anders
treedt geen LTP op. In het nutshell-paradigma moet de presynaptische knoop 1
iteratie voor de postsynaptische vuren, tenminste als je de functie gebruikt
die zowel de activatie update als laten leren (de functie ‘Cycle’)
[7].
Als je even snel een patroon wilt leren, kan je ook de functie ‘Learn’
gebruiken: dan wordt er geleerd tussen de op dat moment vurende knopen.
Voorwaarde bij beiden methodes is zoals altijd dat er en verbinding moet zijn
tussen de knopen.
Voorbeeld van een toepassing: Short-term memory
Het korte-termijngeheugen is een concept dat de
meesten van jullie al wel opgepikt zullen hebben in jullie studie. Het gaat
hier om het korte tijd (enkele seconden tot minuten) actief houden van een paar
items in het geheugen. Vaak wordt de beroemde frase van Miller geciteerd: “the
magical number seven, plus or minus five” (bijv. (Jensen et al., 1996), maar als
de omvang van het korte-termijngeheugen op andere manieren wordt onderzocht dan
rijtjes opzeggen, blijkt het meestal om een capaciteit voor iets als vier
‘chunks’ te gaan.
Hoe werkt korte-termijngeheugen in het brein?
Connectionisten namen al in de jaren zeventig aan dat de activatie in hun
netwerk gelijk stond aan korte-termijngeheugen, terwijl de gewichten gelijk
stonden aan lange-termijngeheugen. En ja, zo lijkt het te zijn. Vooral in de
frontale lob –maar ook elders- blijken cellen aanwezig die vuren gedurende een
heel interval waarin een item in het korte-termijngeheugen verbleef
[8].
Een recent idee is dat de neuronen in de frontale
cortex die betrokken zijn bij het korte-termijngeheugen sterke, specifieke,
reciproke verbindingen hebben met neuronen in de thalamus. Met andere woorden:
zo’n neuron in de frontale cortex zou zo sterke connecties hebben met een cel
in de thalamus en vice versa, dat ze elkaars vuren zouden kunnen onderhouden in
een ‘loop’: de frontale neuron vuurt, dat laat de thalamusneuron vuren, die
zorgt dat de frontale neuron weer vuurt, etc.
Gelfand, Gullapalli, Johnson, Raye, & Henderson (1997) hebben deze
gedachte uitgebouwd tot een connectionistisch model waarmee ze het
korte-termijngeheugen simuleren. Dit model, of misschien net een tikje
simpeler, gaan jullie hier, nu, nabouwen.
Open het bestand ‘MacScript’. Open de Visual
Basic-code. Run het script “MacGregor1” (in de module “MacGregor1”). Je zult
zien dat het script een ‘MacGregor’-workspace opent, een model erin tekent, en
dan bij een “breakpoint” stopt (een ‘breakpoint’ is een onderbreker van de
code). Stop de code helemaal (je kunt hiervoor ‘Reset’ in het ‘Run’-menu
aanklikken of het blauwe vierkant in de taakbalk. Klik naar Nutshell en kijk
naar het model.
Het model heeft drie lagen: een ‘frontale’ laag van
6 knopen (“Front.” geheten), een thalamuslaag van 3 knopen (“Thal.”), en een
Globus Palliduslaag van 1 knoop (“Pally”). De Globus Palliduslaag is een ‘resetter’:
de laag is inhibitoir; activiteit ervan zorgt ervoor dat de thalamuslaag
gedeactiveerd wordt, zodat de thalamocorticale ‘loop’ onderbroken wordt.
De eerste twee frontale knopen moeten verbonden
raken (=de connectie moet een groot gewicht krijgen) met thalamusknoop nr. 1,
terwijl de derde en vierde frontale knopen met de tweede thalamusknoop
verbonden moeten raken, knoop 5 en 6 met de derde thalamusknoop. De connecties
van de thalamus terug naar de frontale laag zijn hetzelfde: van Thal. 1 naar
Front 1 & 2, etcetera. Zo kunnen zich drie losse, onafhankelijke
thalamocorticale loops vormen. De Pallidusknoop moet sterke verbindingen
krijgen met de drie Thalamusknopen.
Het model werkt als volgt: in alle frontale knopen
komen zo af en toe sterke ‘random’ inputs binnen van buiten het model binnen
(dit is ingesteld via de parameters…., en stelt de ‘input’ uit de posterieure
neocortex voor). Dit zorgt ervoor dat op een gegeven moment een frontale knoop
zal vuren. Dit laat de verbonden thalamusknoop vuren, waarop de
thalamocorticale loop zichzelf in stand zal houden.
De thalamocorticale knoop kan op twee manieren
onderbroken worden. Ten eerste wordt in elke iteratie waarin een knoop vuurt de
kaliumwaarde hoger. Op een gegeven moment zal deze zo hoog zijn dat knopen niet
meer kunnen vuren, ook al krijgen ze input binnen in hun ‘loop’. Aangezien, als
de ene zijde van de ‘loop’ stopt met vuren de andere geen input meer krijgt,
zal de hele ‘loop’ stoppen met vuren. De tweede mogelijkheid is dat het
organisme zijn aandacht verlegt en zijn interesse in het in STM vastgehoudene
verliest. Op hier niet onderzochte wijze zal dat leiden tot activatie van de
globus pallidus-knoop. Die zal de thalamus-knopen allemaal inhiberen, wat de
actieve thalamocorticale ‘loops’ zal onderbreken.
B. Opdracht 5: MacGregor
5.1 Modelbouw
Schrijf in de module “MacGregor1” een stukje
script-code dat alle verbindingen aanlegt beschreven in het bovenstaande.
Voorbeelden voor de commando’s die je hiervoor nodig hebt staan in appendix 1.
Dit kan je rechtstreeks doen door de gewichten aan een zekere waarde gelijk te
stellen, of je kunt alle knopen die je wilt verbinden laten vuren, de
leerparameter in de te veranderen connecties op de door jou gewenste
gewichtssterkte zetten (en alle andere leerparameters op 0) en 1 keer het
commando ‘learn’ in de code geven, dan alle lagen te resetten en de knopen voor
een andere verbinding aan te zetten. Omdat dit een flinke lap code wordt moet
je dit alles in de speciale subprocedure ‘SetAllWeights’ doen die in de hoofdprocedure
wordt aangeroepen. Tips voor de gewichtssterktes zijn aanwezig in de
subprocedure. Als je alles handig cut ’n paste is het niet veel werk. Test je
werk door het script te runnen en de gewichten te controleren.
Nu dat alle gewichten er zijn kan je testen of het
model werkt. Test de volgende sequentie: bij 1 knoop in de frontale laag stel
jij in zodat hij vuurt. Vervolgens laat je het model een heel stel iteraties de
activatie opdaten (commando ‘ActCycle’). Als het goed is wordt de loop waar de
frontale knoop deel van is actief. Deze blijft actief net zo lang tot het
opgebouwde kalium een knoop ‘velt’. Schrijf een stuk code in het script dat de
frontale knoop actief maakt en het model laat ‘ActCyclen’. Omdat je wel moet
kunnen zien wat je doet zijn het workspace.update en het “wait”-commando uit
opdracht 4 hier ook aanwezig. Je kunt deze commando's (in die volgorde) overal zetten
waar je wat langer wilt kijken wat er gebeurt. "Secs" bepaalt hoeveel seconden het
wachten duurt. Ook is er een commando waarmee je in het outputvenster (zie
Werken met Nutshell) kunt zetten welke iteratie
bezig is.
a) Hoeveel iteraties duurt het voor de ‘loop’
stopt?
b) Welke laag geeft het eerst op? Waarom?
5.2 Het vasthouden van inputs.
a) Open de module “MacGregor2”, en ‘paste’ de code
die je voor 5.1 hebt geschreven op de juiste plaats in het script. Er zijn nu
twee globale constanten bij gekomen, eentje die de hoeveelheid ‘random’ inputs
aan de frontale laag regelt, en eentje die hun sterkte regelt. Verander deze
constante van 0 naar een waarde die een knoop echt kan laten vuren. Schrijf een
stuk code in het script dat het volgende doet: minstens veertig iteraties lang
moet de activatie geupdate worden. Tijdens elke iteratie moet de activatie van
alledrie de thalamusknopen in de resultatenmatrix worden weggeschreven. Stel
dat je de variabele die het aantal iteraties aanwijst “it” noemt. Stel in elke
iteratie results(it,0) gelijk aan de activatie van knoop 1, results(it,1) aan
knoop 2, results(it,2) aan knoop 3.
Hint: dit is
het moment om je aan een ‘For…Next’-loop te wagen.
Run het script; als het goed is wordt er nu een
excel-sheet aangemaakt waarin de activatie van de drie thalamusknopen (en dus
de drie thalamocorticale loops) in de tijd wordt uitgezet. Bespreek de
resultaten.
b) Verzin zelf nog iets dat je met het model
wilt testen. Schrijf er code voor.
Suggestie: doe iets met de Pallidusknoop.
c) Een model probeert iets in de werkelijkheid te modelleren. Meestal wordt dit aangeduid met ‘het systeem’; in het bovenstaande is het korte-termijngeheugen het te modelleren systeem, of misschien het biologische substraat van het korte-termijngeheugen.
Er zijn heel veel maatstaven waaraan je modellen kunt beoordelen. Barbara Webb geeft het, naast een aantal anderen, de volgende criteria [Webb, In press #396].
- Relevantie: is het relevant voor de empirische wetenschap? Zegt het model iets over een bestaand systeem in de werkelijkheid? Genereert het toetsbare hypotheses over dat systeem?
- Algemeenheid: voor hoeveel systemen (diersoorten bijvoorbeeld) is het model relevant?
- Match: reproduceert het model het gedrag van het te modelleren systeem correct?
- Structurele accuraatheid: is het model een correcte afspiegeling van het te modelleren systeem? Heeft het model dezelfde structuur als het systeem? Is de structuur van het model wel plausibel?
Deze criteria overziend, is het model van het kortetermijngeheugen waaraan je gesleuteld hebt een goed model? Motiveer je antwoord (in tussen ¼ en ½ A4).
Dit is een opdracht waar je meer vrijheid hebt als
bij de voorgaanden. Wacht niet te lang met om raad vragen als je vast zit!
Lever met je verslag de file ‘MacScript’ in met je veranderingen aan de
scripts.
!!!!! DENK AAN DE DEADLINE !!!!!
[6.5]
Hier niet relevant maar wel leuk: de Layer parameters "k" en "threshold" maken het mogelijk om het netwerk heel verschillend te laten functioneren. "Threshold" is het (omgerekende) membraanpotentiaal waarboven knopen gaan vuren. "K" is het maximale aantal knopen dat in een gegeven iteratie (tegelijkertijd dus) mag vuren. Uitgangssituatie is een threshold van 1 en een "k" gelijk aan het aantal knopen in de laag, zodat alle knopen in de laag kunnen vuren als hun membraanpotentiaal maar boven de threshold uitkomen. Je kunt "k" ook gelijk zetten aan een lagere waarde. Als er minder dan "k" knopen een membraanpotentiaal boven de threshold hebben, zullen ze nog steeds allemaal vuren. Als er echter meer dan "k" over de threshold komen, zullen enkel de k knopen met de hoogste activatie vuren. Je kan ook de threshold gelijk stellen aan -1, de minimumwaarde van het membraanpotentiaal. Nu zullen alle knopen een membraanpotentiaal boven de threshold hebben, en zullen dus altijd de "k" met het hoogste membraanpotentiaal vuren. Zo is je layer veranderd in een k-Winner-Take-All netwerk.
[7] Een andere voorwaarde is dat het vuren van de postsynaptische knoop
veroorzaakt moet zijn doordat het membraanpotentiaal boven de ‘threshold’ uit
kwam. Als je de knoop laat vuren door alles een vinkje achter ‘Fires’ te zetten
zal er niet geleerd worden als je ‘Cycle’ gebruikt.
[8] Gegevens hierover komen vooral uit apenonderzoek. Apen moesten taken
verrichten waarin het nodig was om items in het korte-termijngeheugen te
houden, zoals de zogenaamde “Delayed Non-Matching To Sample” taak. Ondertussen
werd de activiteit van een aantal neuronen gevolgd met behulp van electroden.
Zo werden neuronen gevonden die actief werden als een item gepresenteerd werd
dat de aap moest onthouden, en actief bleven gedurende het hele
retentie-interval maar niet langer (Fuster, 1989).
|