IV. Het Hopfield paradigma
A. Inleiding
Het
Hopfield netwerk is bedacht door John Hopfield (Hopfield 1982) en
geïnspireerd/gebaseerd op het zogenaamde Spin Glass Model uit de
deeltjesfysica. Dit model beschrijft hoe deeltjes van een toestand
waarin ze allemaal een verschillende 'spin' hebben (een
quantummechanische eigenschap), zich naar elkaar richten en overgaan
naar een toestand van gelijke spin.
De
meest relevante eigenschap die Hopfield van het Spin Glass Model
heeft overgenomen is de energiefunctie. Hiermee kan je op
macro-niveau het gedrag van individuele netwerkknopen beschrijven, of
in het geval van het Spin Glass Model, van de deeltjes en hun spin.
De energiefunctie geeft voor mogelijke toestanden van de knopen aan
wat de energie van het gehele netwerk is. Als knopen allemaal in een
coherente toestand zijn is de energie van het gehele systeem laag,
zoals in het Spin Glass Model de energie laag is als de deeltjes
allemaal dezelfde spin hebben. Als knopen in incoherente toestanden
zijn is de energie van het netwerk hoog. Alle mogelijke combinaties
van knooptoestanden vormen een energielandschap: sommige combinaties
van knooptoestanden (knoop 1 in toestand x, knoop 2 in toestand y,
etc.) hebben een hogere energie dan anderen, en als je dat in een
grafiek uit zou zetten zou het een landschap worden.
Knopen
veranderen hun toestand enkel als dit de energie van het netwerk
verlaagt. In de metafoor van het energielandschap: een knoop
verandert zijn toestand alleen van x naar y als het netwerk met de
knoop in toestand y een lagere energie heeft dan met de knoop in
toestand x. Doordat de energie met elke verandering alleen maar lager
kan worden, rolt het netwerk als een knikker in het energielandschap
steeds maar naar beneden (zie fig. 1). Tot het niet verder kan,
bijvoorbeeld omdat het in een 'kuil' van het energielandschap raakt,
waar het aan alle kanten alleen maar naar boven gaat. Deze kuilen, de
minima in het energielandschap, zijn attractoren, toestanden waarin
neuronen van het netwerk stabiel zijn. Het Hopfieldparadigma is dus
een attractor-netwerk, een netwerk dat attractoren opzoekt. In
het geval van een puntattractor zal geen enkele knoop meer haar
toestand veranderen. In het geval van een limit cycle zullen
knopen wel hun toestand veranderen, maar altijd na eenzelfde tijd
weer in deze toestand terecht komen. In dit geval onstaan er
oscillaties in het netwerk.
Fig.
1: energielandschap met het model dat als een knikker het minimum
opzoekt
Knopen
in het klassieke Hopfieldparadigma kunnen alleen een
activatietoestand van 1 of -1 hebben. Verder zijn er
verbindingen tussen alle knopen, die positief of negatief kunnen
zijn. Als twee knopen met een positief gewicht verbonden zijn,
'willen' ze graag in dezelfde toestand zijn. Als ze negatief
verbonden zijn willen ze graag in een tegenovergestelde toestand zijn
(hier is de maat voor energie ook op gebaseerd). De input die een
knoop naar een andere kan sturen is gelijk aan:
aj
wij
waarbij
aj de activatie van de zendende knoop is en wij
het gewicht van zender j naar ontvanger i. Deze input is positief als
de zender in toestand 1 is en hun connectie een positief gewicht
heeft, of als de zender in toestand -1 verkeert maar het gewicht
negatief is. In beide gevallen 'wil' de zender graag dat de ontvanger
in toestand 1 komt; ofwel omdat de zender in die toestand verkeert en
het positieve gewicht aangeeft dat ze in dezelfde toestand zouden
moeten zijn, of omdat de zender in toestand -1 verkeert, en het
negatieve gewicht aangeeft dat ze in tegenovergestelde toestand
zouden moeten zijn. In de andere twee gevallen, zender in toestand 1
en gewicht negatief, of zender in toestand -1 en gewicht positief, is
de input negatief.
De
toestand van knopen kan worden veranderd doordat er per iteratie of
tijdstap de activatie van één knoop wordt berekend. Dit
wordt in het klassieke Hopfield paradigma gedaan volgens de volgende
activatieregel:
De
activatietoestand ai van een knoop i (de ontvanger)
wordt bepaald door de input die deze knoop krijgt van de andere
knopen in het netwerk. Deze input wordt berekend door voor elke
zendende knoop de activatiewaarde van van deze knoop te
vermenigvuldigen met het gewicht van die knoop naar de ontvangende
knoop (de som in formule 1 is de som van al die activaties aj
* gewichten wij). Als de
input groter dan 0 is (en het merendeel van de knopen in het netwerk
dus 'wil' dat de knoop in toestand 1 gaat), wordt de activatie van de
knoop een 1, anders wordt de activatie 1. De knoop waarvan je
de activatie wilt berekenen (de ontvangen) wordt ook de
post-synaptische knoop genoemd. De knopen die verbonden zijn met deze
knoop, in het Hopfield geval alle andere knopen in het netwerk (de
zenders), worden pre-synaptische knopen genoemd.
In
Hopfield netwerken wordt asynchrone updating gebruikt. Bij
asynchrone updating wordt van maar één knoop de nieuwe
activatie berekend. Als per iteratie de activatie van alle knopen
tegelijk wordt berekend spreekt men van synchrone updating. In
het geval van asynchrone updating houdt een iteratie dus veel minder
in dan in het geval van synchrone updating.
Attractoren
komen niet zomaar in een netwerk (denk aan wat je hebt gedaan in het
"Werken met Nutshell"-hoofdstuk). Ze worden gecreërd
door het netwerk patronen te leren;de patronen, of combinaties van de
geleerde patronen, worden vervolgens attractoren van het netwerk. Een
patroon in Hopfield network wordt geleerd door associatie;
hetero-associatie als het aangeboden patroon anders is dan het te
leren patroon, auto-associatie als het aangeboden patroon hetzelfde
is als het te leren patroon. In een eenlagig netwerk, zoals gebruikt
wordt in dit practicum, zijn de patronen auto-associatief.
Voor
het leren van een patroon worden de knopen van dat patroon
geactiveerd. Verbindingen tussen de knopen worden vervolgens
versterkt via de volgende leer-regel:
Deze
regel houdt in dat als twee knopen i en j actief zijn
(d.w.z., in activatietoestand 1) de verbinding wij
tussen deze twee knopen met 1 toeneemt. Ook als beide knopen 1
zijn zal het gewicht met 1 toenemen. Is één van de twee
knopen actief 1 en de andere 1, dan zal het gewicht tussen de
twee knopen afnemen.
Nutshell
laat ook toe om een variant van de klassieke Hopfieldnetwerken te
gebruiken. In deze variant wordt in plaats van de representatie 1
en 1 voor activatie, de toestanden 0 en 1 gebruikt. De leer-regel
wordt in deze variant:
Als
de onvangende knoop (de postsynaptische) aan is (in toestand 1), dan
levert deze regel hetzelfde op als de normale (formule 2): het
gewicht neemt toe als de zender (de presynaptische knoop) actief is,
en wordt kleiner als die niet actief is. Als de postsynaptische knoop
echter uit is (in toestand 0), dan gebeurt er niets. In opdracht 2.2
wordt gebruikt gemaakt van deze 0-1 variant.
B. Opdracht 2: Hopfield
De
eerste opdracht kun je gewoon uitvoeren in de Nutshell omgeving. De
opdracht gaat er wel van uit dat je het vorige hoofdstuk hebt gelezen
en dus bekend bent met Nutshell. In opdracht 2.2 leer je met scripts
werken en zal je wat aan de daar beschreven scripts moeten
veranderen.
2.1 Interferentie
a)
Attractor netwerken hebben vaak last van zogenaamde spurious states.
Dit zijn stabiele patronen die nooit zijn aangeleerd. Open een
Hopfield-workspace, en maak een netwerk aan van één met
zichzelf verbonden laag (zie vorig hoofdstuk). Leer het netwerk een
patroon aan door knopen in het patroon actief te maken en vervolgens
1 keer (en niet meer) op Learn te drukken. Wat is de
belangrijkste spurious state in een hopfield netwerk dat maar één
patroon heeft geleerd?
Hint:
reset de layer een paar keer met een willekeurig patroon,
kijk naar welk patroon het netwerk convergeert als je hem laat
cyclen. Als je het niet meteen ziet, varieer de grootte
van je patroon (=het aantal actieve knopen in je patroon).
b)
Leer je een netwerk teveel patronen, dan gaan ze elkaar storen. Dit
wordt wel interferentie genoemd. Het aantal patronen dat
een netwerk kan leren is afhankelijk van het aantal neuronen in het
netwerk.
Maak
een netwerk aan van 5 bij 5 knopen. Probeer uit te vinden met dit
netwerk hoe veel patronen je het kunt leren voordat er sprake is van
teveel interferentie. Met andere woorden, voor het netwerk patronen
gaat verliezen bij het leren van een nieuw patroon. Maak de patronen
hierbij zelf door ze te tekenen en vervolgens 1 keer op Learn
te drukken. Test, na elk nieuw patroon alle patronen door ong. 90%
van de knopen binnen het patroon actief te maken. Geef aan hoeveel
patronen je kan leren, en welk percentage dit is van het aantal
knopen in het netwerk. Teken (of screendump) ook de
zelfgemaakte patronen.
2.2 Graceful degradation
Let op: Als je in de Instelling van Windows de taal op Nederlands hebt staan,
dan werken de scripts niet goed omdat er dan staat 'Werkblad' ipv 'Sheet'. In de scripts wordt uitgegaan van
'Sheet'. Dit is makkelijk te verhelpen door in het Control Panel de taal tijdelijk op Engels te zetten.
Je
gaat in deze opdracht werken aan een script waarin graceful
degradation wordt getest. Connectionistische netwerken zijn
verrassend resistent tegen beschadigingen: ook bij flinke laesies in
hun gewichtenmatrix zijn ze nog steeds in staat heel behoorlijk de
geleerde patronen op te halen. In het script waarmee je gaat werken
worden drie patronen geleerd (zie Figuur 1). Vervolgens worden
laesies aangebracht in de gewichtenmatrix, en wordt gecontroleerd in
hoeverre de patronen nog door het model opgehaald kunnen worden. We
hebben het script opgedeeld in delen, beginnend bij de romp van de
simulatie en daar steeds verder op voortbouwend.
Open
het bestand HopfieldVraag2a.xls. Voordat het bestand wordt geopend
moet je eerst kiezen of macros ingelezen kunnen worden of niet.
Klik op Enable Macros. Nu moet de Visual Basic (VB)
editor worden opgestart om de code van het script te bekijken en
eventueel te veranderen. Ga naar Tools in de menubalk,
hierin naar Macro, en kies onder Macro de optie Visual
Basic Editor. Je kunt ook de Alt en F11-toetsen
samen indrukken.
a)
Kijk naar het script, probeer het door te lopen van begin tot eind.
Breidt nu het script zo uit dat er twee extra patronen van hetzelfde
type worden geleerd als de drie die al geleerd worden. Let op: deze
twee extra patronen moeten niet alleen worden aangemaakt, er moet ook
nog opdracht worden gegeven dat twee extra patronen moeten worden
geleerd. Dit doe je door onder Global parameters de
parameter NrOfPatterns met 2 te verhogen.
Je
kunt het programma runnen door in je VB editor op het blauwe play
knopje te drukken (dit staat op het tweede balkje).
b)
Open nu het HopfieldVraag2b to 2d.xls-bestand. Deze file heeft in
zich twee Visual Basic "modules", oftewel twee
verschillende scripts. Zorg dat je de module "vr2b2c" voor
je neus hebt (kijk bijvoorbeeld onder het "Window" of
"Venster" menu). Dit is een script dat bijna identiek is
aan HopfieldVraag2a.xls, met als toevoegingen een extra globale
parameter, code die een laesie maakt na leren (deze code is echter
nog niet functioneel), en code die het model test.
Verander
het programma zodanig dat er laesies worden gemaakt. Zorg dat het
aantal gewichten dat geledeerd wordt toeneemt met telkens 500
dus dat er eerst 500 connecties worden geledeerd, vervolgens 1000
etc. Doe dit tot het maximaal aantal laesies wat je kunt maken (je
kunt natuurlijk niet meer laesies maken dan er connecties zijn).
Om
dit te bewerkstelligen moet je twee variabelen veranderen in de
procedure HopfieldVraag 2b. Beschrijf deze en geef de
waarde die je ze gegeven hebt.
c)
Het zou handig zijn om te kijken wat de effecten zijn van de
verschillende laesies. Om de effecten van de laesie te testen is een
Testprogramma gemaakt, die als subprocedure in het script in "
vr2b2c" zit. Als maat voor hoe goed een patroon nog opgehaald
kan worden wordt de Hamming-distance gebruikt. Zoek uit wat deze
Hamming-distance is.
(Hint:
Dit kun je uit de code halen. Kijk naar waar in het programma de
Hamming-distance berekend wordt, en probeer te begrijpen wat er
opgeteld wordt).
d)
Open nu in hetzelfde bestand de module "vr2d". Maak in dit
script de veranderingen die je in vraag 2a en 2b hebt gemaakt. Om de
testresultaten naar Excel weg te laten schrijven is er een procedure
WriteHammingdistance geschreven. Als je het programma nu runt worden
de resultaten naar een Excel sheet met de naam
UitdraaiHopfieldVraag2d.xls weg geschreven. Wil je meerdere keren het
programma runnen voor meer resultaten dan moet je de naam van deze
file in het script veranderen (in bijvoorbeeld
Uitdraai2HopfieldVraag2d.xls).
Run
het script minstens twee maal, zodat je twee of meer verschillende
sets resultaten hebt. Vergelijk ze; is er veel variantie in de
resultaten? Bij hoeveel laesies beginnen de patronen werkelijk te
verdwijnen? Hoe verloopt het verval? Als werkelijke bolleboos fit je
verschillende functies om de beste beschrijving te vinden (kan binnen
Excel als je een grafiek aanmaakt).
e)
Als je opdracht 2d uitvoert met het klassieke Hopfieldparadigma gaat
het meteen mis (probeer maar; dan moet je de constante
isItClassicalHopf bovenaan het script van 2bc of 2d
=true laten zijn). Beredeneer waarom dat het geval is
(hint: het heeft te maken met wat er gebeurt in Hopfield als twee
knopen allebei buiten het patroon vallen).
Lever
de file HopfieldVraag2b tot 2d.xls in met je
veranderingen, de resultaten, en je antwoorden op de vragen.
Veel
succes!
!!!!!
DENK AAN DE DEADLINE !!!!!
|