IV. Het Hopfield paradigma
A. Inleiding
Het Hopfield netwerk is bedacht door John 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 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 net 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 enkel 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. 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, een toestand 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.
Knopen in het klassieke Hopfieldparadigma kunnen enkel een
toestand van 1 of -1 hebben. Bovendien 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:
ajwij
waarbij aj 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 van een knoop wordt berekend. Dit
wordt in het klassieke Hopfield paradigma gedaan volgens de volgende
activatieregel:

De toestand van een knoop ai (de
ontvanger) wordt bepaald door netto input van het netwerk. Deze wordt berekend
door de activatiewaarde van alle knopen in het netwerk te vermenigvuldigen met
het gewicht van die knoop naar de ontvangende knoop (de som die in formule 1
staat). Als deze netto 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
wil bereken 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, 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 prakticum, zijn de patronen
auto-associatief. Knopen van een patroon worden geactiveerd. Verbindingen tussen
de knopen zijn worden versterkt via de volgende leer-regel:

Deze regel houdt in dat als twee knopen i en j actief zijn
(d.w.z., in toestand '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 het laat 'cyclen' (door op "Act Cycle" te
drukken). 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
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 macro's 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 !!!!!
|