Courses  

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


University of AmsterdamUniversity of Amsterdam
Department of Psychology
Page last modified: 2013-10-27. Validate html.
Copyright © 2000-2009 NeuroMod Group. Send us Feedback!