Kunstmatig Leven - KNAW Onderwijsprijs

advertisement
Kunstmatig Leven
& Kunstmatige Neurale Netwerken !
Tim Trussner
!
Inhoudsopgave!
!
Inhoudsopgave!
1!
Voorwoord!
4!
Introductie!
5!
Onderzoeksvragen !
Brein!
6!
8!
Neuronen!
8!
Actiepotentialen!
9!
Hebbian learning!
10!
Kunstmatige Neurale Netwerken!
11!
McCulloch en Pitts neuronen!
11!
De Perceptron!
12!
Feedforward Neurale Netwerken !
14!
Werking van een multilayer perceptron!
14!
Backpropagation!
15!
Trainen van het netwerk!
16!
Gradient descent!
18!
Verklaren backpropagation en feedforward neural networks de werking van
biologische breinen?!
19!
Zijn onderdelen van feedforward neural networks en backpropagation te
gebruiken om kunstmatig leven te maken?!
20!
Conclusie!
21!
Kunstmatige Evolutie!
22!
Natuurlijke evolutie!
22!
Evolutionaire algoritmes!
23!
Het genotype!
23!
De uitvoering!
25!
Nadelen!
25!
Toepassingen!
26!
Bestaande simulaties van kunstmatig leven!
27!
Karl Sims, Evolving Virtual Creatures (1994)!
27!
Larry Yaeger, Polyworld (1994)!
28!
Experiment : Evolutie Feedforward netwerk!
29!
Omschrijving simulatie!
29!
Verwachtingen!
31!
Experiment!
31!
Waarnemingen!
31!
Hopfield Netwerken!
33!
Hopfield netwerken!
33!
Leerregel!
34!
Natuurkundig model!
38!
Verklaart het Hopfield netwerk de werking van het brein?!
38!
Zijn onderdelen van Hopfield netwerken te gebruiken om kunstmatig leven te
maken? !
39!
Experiment: Kunstmatig Leven!
40!
De wereld!
40!
zintuigen!
41!
Lichamen!
41!
Hersenen!
42!
lichaam genotype!
42!
Brein genotype!
43!
Inputs!
43!
Metabolisme !
43!
Voortplanting!
44!
Verwachtingen!
44!
Parameters!
44!
Waarnemingen!
45!
Verdere uitbreidingen!
47!
Waarnemingen!
48!
Verdere toevoegingen!
49!
Is dit leven?!
49!
Conclusie!
Hoe maak je kunstmatig leven met kunstmatige neurale netwerken?!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
51!
51!
Appendix A!
53!
Appendix B !
59!
Bronvermelding!
61!
!
!
!
Voorwoord!
!
Het onderwerp van dit PWS, Kunstmatige Neurale Netwerken en Kunstmatig Leven, is
geen direct voor de hand liggend onderwerp. Het is ook niet het eerste onderwerp waar ik
aan dacht. Het onderwerp zou eerst Kunstmatige Intelligentie in het algemeen zijn. Ik was
al langer bezig met programmeren en vond het altijd leuk als een programma iets deed dat
ik niet expliciet geprogrammeerd had. Het maken van een machine die net zoals een
mens echt bewustzijn heeft leek me fantastisch. Ik begon daarom steeds meer te
experimenteren met kunstmatige intelligentie. Rond deze tijd moest ik ook het onderwerp
voor het PWS weten dus die keuze was snel gemaakt. Ik begon met traditionele methoden
die vooral te maken hadden met zoekmachines, het vinden van het snelste pad van A naar
B en taal analyseren met logica. Dit was wel interessant, maar ik had gehoopt dat
Kunstmatige Intelligentie meer over het namaken van menselijke intelligentie ging. Het
ging tot nu toe meer over het oplossen van een specifiek probleem met computers. Het
werd een stuk interessanter toen ik begon met Neurale Netwerken. Deze aanpak
probeerde problemen op te lossen met netwerken die op biologische breinen leken. Het
eerste programma gebruikte een combinatie van evolutie en deze netwerken om robots te
simuleren die naar bolletjes moesten bewegen om ze te verzamelen. Dit was precies wat
me in het begin tot kunstmatige intelligentie aantrok. Dit was nog veel leuker om naar te
kijken omdat ze zichzelf probeerde aan te leren hoe ze naar de bolletjes toe moesten
bewegen, zonder dat iemand ze had verteld hoe dit moest. De principes van evolutie
gebruiken om programma’s te laten evolueren vond ik ook een erg interessant idee.
Evolutie vindt plaats over miljoenen jaren, het was daarom heel apart om evolutie voor
mijn ogen te zien gebeuren. Andere takken van Kunstmatige Intelligentie zoals machinaal
leren worden in de praktijk vaker gebruikt dan neurale netwerken, maar deze technieken
hebben zeer weinig te maken met biologische breinen of de achterliggende principes van
intelligentie, terwijl dat juist het meest interessante aspect van kunstmatige intelligentie is.
Ik vond neurale netwerken vele malen leuker dan de andere takken van kunstmatige
intelligentie, dus besloot ik om het PWS vooral over kunstmatig leven, neurale netwerken
en evolutie te houden.
!
!
!
!
4
Introductie!
!
In dit PWS zullen een aantal soorten kunstmatige neurale netwerken besproken worden.
Er wordt bij ieder netwerk gekeken of dit netwerk een bepaalde breinfunctie verklaard, dus
of het biologisch gezien realistisch is. Ook wordt er gekeken of het te gebruiken is om
kunstmatig leven te maken. Dat is het voornaamste doel.
!
Als eerste wordt er een introductie gegeven over hoe het brein er in de natuur uit ziet. Het
is een hele korte samenvatting van een aantal belangrijke onderdelen waar de meeste
modellen op gebaseerd zijn. Hier hoort geen deelvraag bij. Hierna volgt een introductie en
een kort stuk geschiedenis van kunstmatige neurale netwerken.
!
Het eerste onderzoek gaat over de meestgebruikte soort van neurale netwerken. Een
netwerk met zogenaamde sum and squash neuronen en een feedforward architectuur. Het
bijbehorende leeralgoritme hiervoor is backpropagation. Om de werking van
backpropagation te illustreren heb ik een programma voor handschriftherkenning
geschreven. Er wordt gekeken of de feedforward architectuur of backpropagation terug te
vinden is in de natuur.
!
Het tweede onderzoek zal over een netwerk met een andere structuur en leeralgoritme
gaan. Het Hopfield netwerk. Ik heb voor dit netwerk gekozen omdat het volgens totaal
verschillende principes werkt dan de feedforward neural networks, terwijl beide op het
brein gebaseerd zijn. Zowel de leeralgoritmes, de neuronen en de opbouw verschillen.
Ook voor deze soort wordt er gekeken of er gelijkenissen zijn met biologische hersenen en
of sommige aspecten hiervan te gebruiken zijn om kunstmatig leven te maken.
!
Het hoofdstuk hierna gaat over kunstmatige evolutie, een belangrijk gereedschap om
kunstmatig leven te maken. Hierbij wordt niet de vraag gesteld of het terug te vinden is in
de natuur aangezien het hier volledig op gebaseerd is. Er komen ook een aantal
computersimulaties van kunstmatig leven aan bod, waarop het uiteindelijke programma is
gebaseerd. Op basis van de algoritmes die in dit hoofdstuk worden omschreven, wordt het
tweede experiment uitgevoerd. Er wordt een computersimulatie geschreven dat gebruik
maakt van de principes besproken in de hoofdstukken over evolutie en feedforward neural
networks. Dit is een simpele simulatie om te kijken of evolutionaire algoritmes gebruikt
kunnen worden om een neuraal netwerk te vinden die het kunstmatige leven kan
besturen.
!
Het laatste experiment combineert alles dat in vorige onderzoeken is geleerd en probeert
een simulatie te maken waarbij robotlichamen en breinen tegelijk evolueren. Van elk tot nu
toe besproken neurale netwerk wordt gekeken welke architectuur (opbouw), leerregel
(backpropagation, hebbian learning of evolutionaire algoritmes), en neuronsoort (sum and
squash of Hopfield) het meest geschikt is om dit doel te bereiken. Hierbij wordt dan ook de
hoofdvraag beantwoord: Hoe kunnen neurale netwerken gebruikt worden om kunstmatig
5
leven te maken. Er wordt ook verder onderzoek gedaan naar evolutionaire algoritmes. In
plaats van een evolutionair algoritme wordt ook vrije evolutie gebruikt. Tot slot wordt er
gekeken of het programma daadwerkelijk leeft volgens verschillende definities van leven.
!
In de conclusie wordt gekeken of de hoofdvraag hiermee is beantwoord. Ook een aantal
ideeën over hoe al deze bevindingen gebruikt kunnen worden in computerprogramma’s en
robotica worden voorgesteld.
!
Het uiteindelijke doel is kunstmatig leven maken met kunstmatige neurale netwerken. Om
het juiste netwerk te vinden worden de eigenschappen van twee bekende netwerken en
de bijbehorende leeralgoritmes onderzocht. Voor de simulatie zelf probeer ik, met de
kennis opgedaan uit het onderzoek naar deze twee netwerken, zelf een netwerk met
eventueel leerregels te ontwerpen. Voor de twee netwerken waar onderzoek naar gedaan
wordt, wordt dus twee keer dezelfde vraag gesteld. De eerste vraag, of het netwerk
biologisch gezien realistisch is, wordt gesteld omdat ik kunstmatig leven probeer te maken
dat enigszins op leven op aarde lijkt. Ik probeer hierbij, voor zover dat mogelijk is met de
beschikbare computerkracht, natuurlijke principes aan te houden. De reden voor de
tweede vraag, zijn onderdelen van dit netwerk te gebruiken voor kunstmatig leven te
gebruiken?, spreekt voor zich. Met een onderdeel wordt bijvoorbeeld de structuur van het
netwerk of het bijbehorende algoritme bedoeld. Om te bepalen of een onderdeel te
gebruiken is, wordt onder andere het volgende in beschouwing genomen :
!
- Hoeveel rekenkracht kost dit onderdeel? Als een onderdeel van een netwerk te veel
rekenkracht vereist, zal de simulatie te langzaam worden en zal het niet gebruikt worden.
- Kan dit onderdeel ontstaan door evolutie? Zoniet, dan is het mogelijk om gedeeltelijk
vals te spelen en het van tevoren met de hand te implementeren. Maar een leerregel die
niet zonder een supervisor werkt komt niet in aanmerking.
- Is de vorm van input/output geschikt? Het neurale netwerk moet de gegevens die een
organisme binnenkrijgt verwerken en de organismen besturen. Het netwerk moet dus
geschikt zijn om alle soorten informatie te verwerken en te transformeren in een output.
!
Onderzoeksvragen !
!
De vragen zijn nu :
Hoe kunnen kunstmatige neurale netwerken gebruikt worden om kunstmatig leven te
maken?
!
-Verklaren backpropagation en feedforward neural networks de werking van biologische
breinen?
-Zijn onderdelen van feedforward neural networks en backpropagation te gebruiken om
kunstmatig leven te maken?
-Hoe kunnen evolutionaire algoritmes gebruikt worden om feedforward neural networks te
trainen?
-Verklaart het Hopfield netwerk de werking van het brein?
6
-Zijn onderdelen van Hopfield netwerken te gebruiken om kunstmatig leven te maken?
!
-Is kunstmatig leven ook echt levend?
In het laatste hoofdstuk worden er aan de hand van observaties in de simulatie ook nog
een aantal vragen gesteld.
!
Alle simulaties zijn geschreven in Java. De gebruikte methoden worden besproken, maar
niet de code zelf, aangezien dat niet de focus van dit PWS is. Voor het renderen wordt in
elk programma, behalve het laatste experiment, de ingebouwde renderfunctionaliteit van
java gebruikt (Java2D en Swing). Het laatste experiment maakt gebruikt van OpenGL en
Libgdx voor het renderen. De gecombineerde code van alle programma’s telt bij elkaar
meer dan 6000 lijnen, wat ongeveer overeenkomt met 200 pagina’s. Vandaar dat het niet
bij dit PWS is inbegrepen. De programma’s zijn te downloaden op de volgende links:
!
Getalherkenning : https://dl.dropboxusercontent.com/u/95585100/getalHerkenning.jar
Feedforward evolutie : https://dl.dropboxusercontent.com/u/95585100/PWSFFEvolutie.jar
Eindsimulatie : https://dl.dropboxusercontent.com/u/95585100/PWSEindSimulatie.jar
!
!
!
!
!
!
!
!
!
!
!
!
!
!
7
!
!
Brein!
!
De neurale netwerken die in dit PWS worden besproken zijn allemaal gebaseerd op de
natuur. Het brein is een waanzinnig complex geheel dat uit duizenden verschillende
soorten onderdelen bestaat, vandaar dat in deze modellen niet elk onderdeel gebruikt
wordt. Alles wat niet (of minder) van invloed is op het eindresultaat wordt weggelaten. Zo
blijft er een model over dat eenvoudiger is om mee te rekenen en te begrijpen. Door een
vereenvoudigd model van een bepaalde hersenfunctie te maken, wordt het ook
makkelijker om de werking van biologische breinen te begrijpen.
!
Neuronen!
!
Al het levend weefsel is opgebouwd uit cellen. De cellen in je lichaam zijn georganiseerd,
cellen in je lever zijn opgebouwd uit gespecialiseerde levercellen, cellen in je brein uit
breincellen. De twee meest voorkomende cellen in het brein zijn de neuronen en de
gliacellen1. Neuronen zijn vooral verantwoordelijk voor het verwerken van informatie. Voor
zover bekend is de communicatie tussen neuronen hetgeen wij ervaren als denken. De
gliacellen zijn meer voor het onderhoud van het brein. Ze functioneren als een soort lijm
tussen de neuronen om ze op hun plaats te houden en van elkaar te isoleren. Ook zorgen
ze er voor dat neuronen voorzien worden van zuurstof en voedingsstoffen en dat dode
hersencellen afgebroken worden. Er werd tot voor kort gedacht dat deze cellen geen
invloed hadden op het denkproces. Ze spelen echter wel een rol in het vormen en
onderhouden van verbindingen tussen neuronen. Omdat de gliacellen eigenlijk meer een
verzorgende functie hebben, zal de focus op de eigenschappen van neuronen liggen.
Overige cellen die minder invloed op het verwerken van informatie hebben worden buiten
beschouwing gelaten.
!
!
!
!
!
!
!
!
Figuur 1. Twee neuronen. Links is
presynaptisch, rechts is
postsynaptisch.
!
!
1
8
Neuroglia : http://en.wikipedia.org/wiki/Neuroglia
Er zijn meerdere soorten neuronen, de meest voorkomende is de piramidecel2 (Figuur 1).
Deze cellen zijn het grootst en komen het meeste voor in het zenuwstelsel, vandaar dat ze
als de belangrijkste cellen van het zenuwstelsel worden gezien. Het centrale punt van
deze cel (1) is de soma. Dit is het cellichaam van een neuron. Aan het cellichaam zitten
dendrieten in alle richtingen (2). Dendrieten zijn de ontvangers voor signalen van andere
neuronen. Een neuron stuurt zijn signalen over de axon (3). Om de axon zit een laagje
Myeline, afkomstig van de gliacellen. Dit is een vettige stof die de axon beschermt en er
voor zorgt dat de axon beter geleidt, waardoor de impulsen sneller door worden gegeven.
De axon is vele malen langer dan de soma, soms wel tot een meter lang. Axonen komen
vaak in bundels voor als zenuwen. Verbindingen tussen de axonen en dendrieten van een
andere neuron zijn synapsen (4). Synapsen zijn de doorgevers voor neurale signalen. De
mate waarin ze een signaal doorgeven kan variëren, ze hebben een bepaalde sterkte. Het
brein kan leren door nieuwe synapsen te vormen of verwijderen, of door de sterkte van
synapsen te veranderen.
!
Actiepotentialen!
!
Actiepotentialen zijn de impulsen die tussen neuronen verzonden worden. Neuronen
bevinden zich in een vloeistof met ionen. Deze ionen hebben een lading. Door poriën in
het celmembraan van een neuron kunnen positieve en negatieve ionen doorgelaten
worden, waardoor er een verschil in lading tussen de binnenkant en de buitenkant van de
cel ontstaat. De lading van een neuron in rust is ongeveer -70 millivolt, het rustpotentiaal.
Een neuron lekt via zijn celmembraan ionen en zal na een tijd altijd het rustpotentiaal
aannemen. Als de lading van het celmembraan boven een bepaalde waarde komt zal er
een actiepotentiaal gegenereerd worden. Deze waarde, de drempelwaarde of
grenswaarde, ligt rond de -50 millivolt. Als dit potentiaal wordt bereikt, komt er een stof vrij
bij het begin van de axon. Dit is de neurotransmitter, een stof die er voor zorgt dat
impulsen worden overgedragen tussen neuronen. De impuls wordt doorgegeven door de
axon en zal bij andere neuronen binnenkomen die hierdoor zelf ook weer een
actiepotentiaal kunnen genereren. De patronen van vurende neuronen die hierdoor
ontstaan zijn gedachten. De termen presynaptisch en postsynaptisch worden vaak
gebruikt om de richting van een impuls aan te geven. De presynaptische neuron vuurt en
de impuls die het stuurt komt aan bij de postsynaptische neuron. Een impuls die bij een
andere neuron aankomt zorgt voor een verandering van het potentiaal. Als deze positief is
spreken we over een EPSP (Excitatory Post Synaptic Potential), maar het kan ook
negatief zijn. Een gedeelte van de neuronen geeft een negatief signaal (Inhibitory). Dan is
het een IPSP (Inhibitory Post Synaptic Potential). De negatieve (Inhibitory) signalen
verlagen het potentiaal van het celmembraan. De Inhibitory neuronen zorgen ervoor dat
de signalen in het brein elkaar niet eindeloos versterken. Het brein berust juist op het feit
dat er niet teveel neuronen tegelijkertijd actief zijn.
!
!
2
9
Neuron http://en.wikipedia.org/wiki/Neuron
Hebbian learning!
!
Het brein kan leren door de sterkte van de synapsen aan te passen. Als een synaps
sterker wordt, zal de presynaptische neuron meer invloed uitoefenen op het
membraanpotentiaal van de postsynaptische neuron. De presynaptische neuron zal de
postsynaptische neuron dus eerder laten vuren. De manier waarop synapsen hun sterkte
aanpassen, werkt waarschijnlijk volgens een theorie genaamd Hebbian learning,
vernoemd naar de psycholoog Donald Hebb. Hebbian learning wordt vaak samengevat als
: Neurons that fire together, wire together3. Dit betekent dat bij twee neuronen die vaak
tegelijk vuren, de synaps die deze twee neuronen verbindt versterkt zal worden. Door
deze regel zullen neuronen die vaak tegelijk actief zijn elkaar activeren. Hierdoor kunnen
groepen van neuronen gevormd worden. Tegenover de versterking, staat de afzwakking
als neuronen afzonderlijk vuren. Neurons that fire apart, wire apart. Neuronen die
afzonderlijk vuren zullen uiteindelijk geen invloed op elkaar meer hebben. Deze regels
zorgen ervoor dat het brein associaties kan maken. Een voorbeeld hiervan is het leren van
een woord. Als je iets ziet of hoort, worden via je gehoor en zicht bepaalde neuronen in
het brein geactiveerd. Als je nu het woord banaan hoort terwijl je een banaan ziet, zullen
deze neuronen tegelijk actief zijn. Volgens Hebb’s regel zullen de verbindingen tussen
deze neuronen versterkt worden. De neuronen die normaal gesproken alleen door het
zien van een banaan geactiveerd werden, zullen nu ook actief worden wanneer je het
woord banaan hoort en omgekeerd. Het brein heeft het horen en het zien van een banaan
met elkaar geassocieerd, waardoor je een banaan voor je ziet als het woord banaan
gezegd wordt. Hetzelfde geldt voor smaak, reuk en gevoel.
!
!
!
!
!
!
3
Hebbian Learning : http://en.wikipedia.org/wiki/Hebbian_theory
10
!
Kunstmatige Neurale Netwerken!
!
!
!
!
McCulloch en Pitts neuronen!
!
Een van de eerst voorgestelde modellen van neuronen was het model van Warren S.
McCulloch en Walter H. Pitts in 1943. Ze probeerden in een artikel genaamd A logical
calculus of the ideas immanent in nervous activity te verklaren hoe het brein ingewikkelde
patronen kon produceren door simpele aan elkaar verbonden cellen. McCulloch en Pitts
waren niet de eerste die de werking van neuronen probeerde te verklaren, maar wel de
eerste om eigenschappen van aan elkaar verbonden neuronen te analyseren. De
McCulloch Pitts Neuron (MCP neuron) is een zeer versimpeld model van hoe echte
neuronen werken. De MCP neuronen zijn aan elkaar verbonden in een netwerk, dat een
neuraal netwerk wordt genoemd. McCulloch en Pitts lieten zien dat deze netwerken elke
logische stelling konden implementeren. Er werd gedacht dat het brein volgens deze
principes zou werken. De MCP netwerken zijn echter zo ver vereenvoudigd ten opzichte
van biologische breinen dat je hierover geen conclusies kan trekken. Het model was ook
niet bedoeld om de natuur na te maken. De MCP neuron is een abstract model van een
echte neuron. Alle irrelevante details zijn weggelaten, zodat alleen de elementen die nodig
zijn om berekeningen te doen overblijven. Een MCP neuron is daarom ook erg handig om
de principes van de werking van het brein te begrijpen. Als biologisch model zat de MCP
neuron er op de meeste vlakken naast. Als model om berekeningen mee te doen was het
wel geslaagd. De meeste moderne kunstmatige neuronmodellen werken nog steeds
volgens de principes van MCP neuronen, op een paar aanpassingen na.
!
Het artikel van McCulloch en Pitts was gebaseerd op een paar bekende eigenschappen
van neuronen, maar was meer wiskundig dan biologisch. Het was bekend dat neuronen
met elkaar communiceerden door middel van korte signalen, ook wel spikes genoemd. De
MCP neuron kan een output van twee waarden hebben. De neuron kan een spike geven,
weergegeven door een 1, of geen spike : 0. De neuronen rekenen dus, net als computers,
met binaire waarden. Verder hebben de neuronen onderlinge verbindingen, die signalen
doorgeven tussen de neuronen. Deze verbindingen hebben elk een positief (ook wel
excitatory genoemd) of negatief (inhibitory) gewicht. Om te bepalen of een neuron een 1
of een 0 zal geven kijkt hij naar de staat van alle neuronen waarmee hij is verbonden via
verbindingen met positieve gewichten. Hij telt alle binnenkomende spikes bij elkaar op en
als deze waarde boven een drempelwaarde komt, is zijn output 1 (spike). Als een gewicht
negatief is en de neuron vòòr de verbinding heeft als output 1, dan zal een neuron nooit
een spike geven, ongeacht van alle positieve binnenkomende signalen. Dit wordt veto
inhibition genoemd.
!
11
!
!
!
!
!
!
!
!
!
!
Figuur 1.
MCP neuronen kunnen aan elkaar geschakeld worden om een soort van logisch circuit te
maken. We kunnen bijvoorbeeld de gedachten van een vogel die een bes ziet in MCP
neuronen weergeven. Er is een sensor die aangeeft of wat de vogel ziet rond is en een
sensor die aangeeft of hij iets paars ziet. Daarnaast een bes-neuron met twee
binnenkomende verbindingen met een positief gewicht. Als de waarde van deze neuron
gelijk is aan 2, geeft hij een output van 1 en besluit de vogel om wat hij ziet op te eten. De
waarde 2 is hierbij dus de drempelwaarde.
!
Dit is een voorbeeld van een netwerk met alleen maar positieve gewichten en maar één
taak. Negatieve gewichten kunnen bijvoorbeeld gebruikt worden om een actie te
voorkomen. Je zou bijvoorbeeld een sensor toe kunnen voegen die aangeeft of de vogel
vol is of niet (Figuur 1). Het gewicht van deze sensor naar de eet op neuron heeft een
waarde van -1 (of inhibitory) zodat de waarde van de neuron, door veto inhibition, niet
meer groter is dan 1 zodra hij een bes ziet. Deze bes zal dus gespaard worden voor de
eetlust van de vogel.
De Perceptron!
!
De McCulloch en Pitts netwerken hadden een aantal beperkingen. Eén van die
beperkingen is het feit dat de gewichten en de outputs maar twee waarden aan kunnen
nemen. Dit beperkt het aantal mogelijke oplossingen. Toen Donald Hebb in 1941 met het
idee kwam dat synapsen van sterkte kunnen veranderen, werd het concept van gewichten
met reële waarden geïntroduceerd. Het gewicht komt overeen met de sterkte van de
synaps. Het eerste netwerk dat deze gewichten wist te gebruiken, was de perceptron van
Frank Rosenblatt. In plaats van een binaire input, kan de input nu alle waarden
aannemen. Daarnaast beschikt elke input over een gewicht dat ook alle waarden aan kan
nemen. Het gewicht is ook te zien als een mate waarin de perceptron afhankelijk is van
deze input. De gewichten worden meestal tussen de 0 en 1 gehouden. Net als bij de MCP
neuron is de activatie van een neuron gelijk aan de som van alle gewichten
vermenigvuldigd met de bijbehorende inputs. Hier wordt alleen nog een bias bij opgeteld.
De bias is een waarde die de drempelwaarde vervangt. Er wordt nu niet gekeken of de
12
gesommeerde input groter is dan de drempelwaarde, maar of de gesommeerde input min
de drempelwaarde groter is dan nul. Dit is dus eigenlijk hetzelfde. De output van een
perceptron kan op dezelfde manier als bij de MCP neuron bepaald worden, door te kijken
of de activatie van de perceptron groter is dan nul. Maar het is ook mogelijk om de
gesommeerde input te nemen en door een activatiefunctie te laten gaan. Deze functie
zorgt er onder andere voor dat de output van de perceptron binnen bepaalde grenzen
blijft. De MCP neuron heeft een zogenaamde threshold step functie (3), die een hoge
waarde geeft bij een drempelwaarde. Veel gebruikte activatiefuncties zijn4 :
!
!
!
!
!
!
1.
2.
!
!
3.
!
4
!
Figuur 2
Sigmoid : σ(x) = 1/(1+e-x)!
Piecewise Linear : σ(x) = { -1 x ≤ 1,!
!
!
!
x
-1 < x < 1,!
!
!
!
1
x≥1
}!
Threshold step : σ(x) = {-1
x ≤ 0,!
!
!
!
1
x > 0 }!
Gaussian : σ(x) = e-x2!
Een perceptron kan leren door supervised learning. Er is een supervisor nodig die een
aantal voorbeelden van correcte input-output paren geeft. Dit wordt gedaan door de
outputs te vergelijken met de verwachte waarden en de gewichten zo aan te passen dat
deze meer met de verwachtte waarden overeenkomen. De perceptron is niet echt een
netwerk, maar meer een enkele neuron, bestaande uit één laag. De input van een neuron
is niet de output van een andere neuron, vandaar dat dit model ook wel de single layer
perceptron wordt genoemd.
!
Ondanks al deze veranderingen ten opzichte van de McCulloch-Pitts neuron, kon de
perceptron maar een paar problemen oplossen. Rosenblatt was erg enthousiast over de
perceptron en dacht dat alle classificatieproblemen met de perceptron en zijn leeralgoritme
in een bepaalde tijd op te lossen waren. In 1969 schreven Marvin Minsky en Seymour
Papert een artikel genaamd “Perceptrons: An Introduction to Computational Geometry”.
Hierin werd de nadruk op de gebreken van de perceptron gelegd. Ze lieten zien dat de
perceptron alleen een bepaald soort problemen op kon lossen. De perceptron werd ook
nauwelijks in de praktijk gebruikt. Hierdoor werd tot en met 1980 zeer weinig onderzoek
naar kunstmatige neuronen gedaan.
4
Performance Analysis of Various Activation Functions in Generalized MLP Architectures of Neural Networks
13
!
Feedforward Neurale Netwerken !
Een feedforward neuraal netwerk, ook wel multilayer perceptron genoemd, is een
neuronmodel dat gebruik maakt van meerdere lagen om berekeningen te doen. Omdat er
meerdere lagen tussen de input en output zitten, kan de multilayer perceptron veel meer
soorten berekeningen doen dan bijvoorbeeld een McCulloch-Pitts neuron of een enkele
perceptron. Onderzoek naar neurale netwerken lag voor een lange tijd stil nadat Marvin
Minsky en Seymour Papert een aantal problemen met de neurale netwerken van toen aan
het licht brachten. De multilayer perceptron lost veel van deze problemen op, maar het is
een stuk lastiger om handmatig de juiste gewichten te kiezen. De meerdere lagen maken
het al snel een stuk complexer omdat voor elk gewicht in een laag rekening gehouden
moet worden met alle gewichten in de vorige lagen.
Werking van een multilayer perceptron!
!
!
De neuron van een multilayer perceptron wijkt niet veel af van de normale perceptron. De
input, die afkomstig kan zijn van sensoren of een vorige laag, wordt vermenigvuldigd met
de gewichten en bij elkaar opgeteld5. Deze waarde noemen we de activatie. Een
belangrijke eigenschap van de perceptron is de activatie functie, die ook in het vorige
hoofdstuk was besproken. De activatie gaat door deze functie en het resultaat hiervan is
de output van een neuron. Door deze functie kan een netwerk niet-lineaire berekeningen
uitvoeren. Als deze functie niet wordt gebruikt kan een heel netwerk van neuronen door
enkele neuronen worden vervangen. Deze activatiefunctie is vaak continu, wat wil zeggen
dat de output van een neuron alle waardes op een bepaald interval aan kunnen nemen. Er
is nu ook geen drempelwaarde maar een zogenaamde bias. De bias is gewoon een
waarde die bij alle inputs van de neuron op wordt geteld, net zoals bij de perceptron. Dit
wordt vaak gezien als een verbinding met een neuron die altijd een 1 als output geeft. Als
je het op deze manier bekijkt, is dit gewicht op dezelfde manier als andere gewichten te
trainen. De bias is ook te zien als horizontale translatie van de activatiefunctie.
Het belangrijkste verschil tussen een mutilayer
perceptron en een enkele (single-layer) perceptron
is dat het uit meerdere lagen bestaat. Elke neuron
is verbonden met elke neuron in de vorige laag en
een bias. De informatie die via de input binnenkomt
wordt doorgevoerd naar de volgende lagen, totdat
de outputlaag bereikt is. Deze kan dan afgelezen
worden. Neuronen in de inputlaag zijn meer enkele
getallen dan neuronen. Ze maken geen gebruik van de activatiefunctie en hebben ook
geen bias. Toch worden ze voor het gemak vaak gezien als neuronen.
!
5
Multilayer Perceptrons!
14
De multilayer perceptron heeft een input laag, een aantal verborgen lagen en een output
laag. De verborgen lagen doen het meeste rekenwerk, hoe ingewikkelder het patroon dat
ontdekt of voorspeld moet worden hoe meer lagen nodig zijn. Meerdere neuronen in de
verborgen lagen zorgen er voor dat een netwerk meerdere patronen kan ontdekken en
onthouden voordat zijn geheugen vol raakt. Meerdere lagen maken het helaas ook veel
moeilijker om de juiste gewichten te vinden. Gelukkig is er voor de multilayer perceptron
een manier om een juiste verdeling van gewichten te vinden zonder al te veel handwerk.
!
Backpropagation!
!
In 1985 werd een algoritme (her)ontdekt om neurale netwerken met meerdere lagen te
trainen zonder zelf de gewichten te zetten6. Omdat er meerdere schakels zitten tussen de
input en de output is het moeilijker om te bepalen hoeveel je een gewicht moet veranderen
om de juiste output te krijgen. Backpropagation werkt de afwijking in de output als het
ware terug door het netwerk, vandaar de naam. Backpropagation valt onder de supervised
learning algoritmes. Het heeft een aantal voorbeelden met juiste antwoorden nodig om
patronen te leren. Een multilayer perceptron kan op deze manier leren zoals een mens
ook leert: je hoeft het alleen maar een paar keer voor te doen. Er werd voor een tijd ook
gedacht dat backpropagation een goed model was voor de werking van hersenen. Rond
dezelfde tijd dat backpropagation ontwikkeld werd, bleek uit onderzoek dat een grote
portie van de signalen in hersenen tegen de richting van het breinnetwerk in lopen7. Dit
zou een signaal kunnen zijn om de gewichten terug in het netwerk aan te passen volgens
eenzelfde soort principe als backpropagation.
Figuur 1
Handschriftherkenning met de Multilayer Perceptron
Eén van de toepassingen van de multilayer perceptron (en veel andere soorten
netwerken) is beeldherkenning. Open het programma handschriftherkenning om hiermee
6
7
The Backpropagation Algorithm
From Computer to Brain
15
te experimenteren. Het doel is om het programma je eigen handschrift te leren herkennen
voor de getallen 0 tot en met 9. Teken in het witte vlak een getal en druk op ok. Het
programma verandert dit plaatje nu in een array van nullen en enen die rechts van het
tekenveld te zien is. Deze input kan nu gelezen worden door de multilayer perceptron die
een output genereert. De outputlaag bestaat uit het aantal patronen dat het netwerk
uiteindelijk moet leren. Deze neuronen hebben een doelwaarde voor elk teken. Door de
output te vergelijken met alle doelwaarden kan worden bepaald om welke letter het gaat
volgens het netwerk.
Na het tekenen wordt de tekening omgezet in een plaatje van nullen en enen met een
lagere resolutie dan het tekenveld. Dit wordt gedaan omdat het netwerk anders veel te
groot en ingewikkeld wordt. Het tekenveld is 300x400 pixels, een netwerk met een
inputlaag van 120000 neuronen is voor het herkennen van enkele tekens overbodig, dus
wordt een verkleind plaatje van 9 bij 12 gebruikt. Het totale netwerk in dit voorbeeld
bestaat dus uit 108 inputneuronen, een nog onbepaald aantal verborgen lagen met een
onbepaald aantal neuronen en een outputlaag van 10 neuronen (het aantal tekens).
!
Als het programma een waarde geeft die niet overeenkomt met het getekende getal
corrigeer je hem door in het veld onderin de juiste waarde in te typen en op enter te
drukken. Het programma slaat alle patronen met de juiste waarde op om te gebruiken
tijdens het trainen. Het duurt te lang om steeds nieuwe tekens te tekenen, daarom kan je
het netwerk met de knop train automatisch trainen op de gegeven patronen. Iteraties geeft
aan voor hoe veel voorbeelden het netwerk getraind wordt en learning rate is een waarde
die bepaald hoe snel het netwerk leert. Het lijkt logisch om deze waarde groot te maken
zodat het netwerk snel leert, maar grote waarden leiden niet tot betere resultaten zoals je
kan merken door het te proberen. De beste waarde voor de learning rate ligt rond de 0.01
maar dit verschilt per netwerk en is eigenlijk alleen te bepalen door proberen. Als laatste is
onder de learning rate het percentage van juist geraden getallen te zien na de laatste keer
trainen.
!
Trainen van het netwerk!
!
De gewichten van het netwerk worden bepaald door middel van het al eerder besproken
backpropagation. Backpropagation werkt door eerst de error (of afwijking) van de output
uit te rekenen. Vervolgens wordt uitgerekend hoe veel de gewichten aangepast moeten
worden om deze error zo klein mogelijk te maken.
Bij een netwerk van 2 neuronen, één inputneuron en één outputneuron, zonder verborgen
lagen is dit heel makkelijk. Je kijkt naar de output, vergelijkt dit met de verwachte output
die hoort bij deze input en past het gewicht aan zodat de verwachtte output overeenkomt
met de output die bij deze input hoort. Ofwel : Error = t-O. Waarbij t de doelwaarde is (t
16
voor target) en O de output. Als bij een input van 0.5 de waarde 0.7 hoort ziet dat er als
volgt uit:
!
!
!
!
!
Figuur 2
De waarde van het gewicht is hier 0.3. De mate waarin de verwachte output verschilt met
de werkelijke output noemen we de error. Voor dit simpele netwerk is de error het verschil
tussen de verwachte output en de output op dit moment. In dit voorbeeld 0.7-0.15 = 0.55.
Het gewicht moet aangepast worden zodat 0.5*w=0.7. Hieruit volgt dat het nieuwe gewicht
een waarde van 1.4 heeft.
!
Bij dit netwerk bestaande uit twee elementen is dit makkelijk te zien. Het wordt lastiger bij
een netwerk van meer elementen Zoals hieronder:
!
!
!
!
!
!
!
!
!
!
figuur 3
Dit is een voorbeeld van een perceptron. Dit netwerk heeft twee inputs en 1 output neuron
met een squashing functie. Je kan niet op dezelfde manier als hierboven de gewichten
aanpassen. Er is maar 1 output dus de berekening voor de error blijft gewoon hetzelfde
als in het voorbeeld met twee elementen. Deze keer worden de gewichten niet in één keer
berekend, maar in kleine stappen. Op deze manier kan het netwerk ook op meerdere
voorbeelden getraind worden. Stel dat de output 0.5 is en de verwachte waarde hiervoor is
0.7. Dan is de error 0.2. Nu kunnen we elk gewicht verhogen met een bepaalde factor
proportioneel aan de error. Als we voor deze factor 0.1 nemen, dan wordt elk gewicht
verhoogt met 0.015. De leerregel wordt nu wnieuw = woud + η*Error. Waar bij η de factor 0.1
is. Het probleem met deze regel is dat elk gewicht altijd met dezelfde hoeveelheid
verandert wordt. Ongeacht van de mate waarin hij voor de error verantwoordelijk is. Een
input die een lage waarde geeft zal minder voor deze error verantwoordelijk zijn dan één
17
met een hoge waarde. We kunnen daarom de Error ook nog eens met de bijbehorende
input voor dit gewicht vermenigvuldigen om dit probleem op te lossen. De volledige regel
is nu : wnieuw = woud + η*Error*s. Waarbij s gelijk is aan de input die bij het gewicht hoort. Dit
is de leerregel die toe werd gepast voor de single-layer perceptron. Door deze regel een
aantal keer op verschillende patronen te trainen, kunnen veel inputs naar de verwachte
outputs vertaald worden.
!
Het wordt al iets lastiger als je in plaats van een directe verbinding een verborgen laag
toevoegt. Dit is het geval bij het feedforward netwerk dat het handschriftherkenning
programma gebruikt, maar dan voor honderden neuronen en 3 verborgen lagen.
Uitrekenen hoe veel elk gewicht verantwoordelijk is voor de error en hoe veel dit gewicht
veranderd moet worden om de error te minimaliseren is het probleem dat backpropagation
oplost.
!
Gradient descent! !
!
!
!
!
Om de error te minimaliseren wordt een methode genaamd gradient descent gebruikt. Als
de error wordt geplot met de gewichten als assen krijg je een soort landschap. Gradient
descent gebruikt de helling op elk punt om te bepalen in welke richting het minimum ligt.
Een manier om je dit voor te stellen is een wandelaar in de bergen die het dal moet vinden
op een mistige dag. Hij wilt naar het laagste punt maar kan niet meer dan een meter voor
zich uit kijken. Hij kan nu bepalen waar hij naartoe moet door de helling op het punt waar
hij staat te bepalen en in de tegengestelde richting te bewegen. Als hij dit blijft doen voor
elk punt waar hij terecht komt, zal hij uiteindelijk een dal bereiken zoals in het plaatje
hieronder te zien is. Dit zou een grafiek zijn van een netwerk met 2 gewichten, W1,1
(gewicht van neuron 1 in laag 1 naar neuron 1 in laag 2) en W1,2 zoals op de assen te
zien is. De error op elk punt is de hoogte.
Figuur 5. Gradient descent met twee
gewichten en een error. De rode pijl is de
helling op het punt waar de wandelaar staat
en de blauwe stippellijn is het pad dat hij zal
volgen om het dal te bereiken.
!
!
!
!
!
!
!
!
!
18
Dit voorbeeld van een netwerk met twee gewichten vormt een 3-dimensionaal errorlandschap. Dit landschap krijgt meer dimensies naarmate je meer gewichten toevoegt. Het
netwerk in het programma heeft standaard 3 verborgen lagen met elk 108 neuronen (even
veel als de inputlaag) en een outputlaag van 10 neuronen. Dat zijn 36072 gewichten en
dus vormt de error-functie een 36072-dimensionaal landschap. Dit valt niet goed te
tekenen. Een volledige afleiding van het backpropagation algoritme is te vinden in
Appendix A.
!
!
!
!
!
Verklaren backpropagation en feedforward neural networks de werking van
biologische breinen?!
!
Neuronen
De individuele neuronen zijn gedeeltelijk op de natuur gebaseerd. De output van
biologische neuronen bestaat uit een spike die geen bepaalde waarde heeft. Een neuron
kan hierbij een spike geven, of geen spike geven. Het kan geen tussenwaarden
aannemen. De in dit hoofdstuk besproken sum and squash neuronen gebruiken waarde
tussen de nul en één als output. Dat aspect lijkt dus niet realistisch. Er zijn echter mensen
die denken dat de specifieke tijd dat een neuron vuurt niet uitmaakt, maar dat de
gemiddelde hoeveelheid spikes over een bepaalde tijd belangrijk is. Als je de output van
een neuron interpreteert als een maat waarin deze neuron vuurt, is de output wel
realistisch. Je kan zelfs zo ver gaan om de output te interpreteren als de gemiddelde
activiteit in een heel gebied in het brein. De output van de neuron is dus niet direct
realistisch, maar kan als gedeeltelijk realistisch geïnterpreteerd worden. Het is een soort
versimpeld model. Ook zijn er organismen waarbij de neuronen geen gebruik maken van
korte impulsen, zoals de caenorhabditis elegans8, het eenvoudigste organisme dat een
zenuwstelsel heeft.
!
Structuur
De synapsen (gewichten) zijn redelijk realistisch. Ze hebben een variabel gewicht en zijn
asymmetrisch. De verbindingen tussen neuronen in het brein hebben vaak nog een
vertraging en hebben terugkoppelingen. Er zijn wel voorbeelden in de natuur te vinden van
breingebieden die voornamelijk een feedforward structuur hebben. Ook impulsen, zoals
het wegtrekken van je hand als je iets heets aanraakt maakt hier gebruik van. De
algemene structuur van het hele netwerk is dus niet helemaal realistisch.
!
!
!
8
http://www.artificialbrains.com/openworm#nervous-system
19
Backpropagation
Zoals aan het begin van dit hoofdstuk opgemerkt, was het backpropagation algoritme ooit
genoemd als verklaring voor het grote aantal koppelingen dat tegen de richting van het
breinnetwerk in liep. Backpropagation is hier echter niet de verklaring voor9. Aangezien
neuronen spikes geven, en geen directe waarde, is het niet aannemelijk dat het brein
backpropagation gebruikt.
!
Zijn onderdelen van feedforward neural networks en backpropagation te gebruiken
om kunstmatig leven te maken?!
!
Neuronen
Als de output van de neuronen als vuurgemiddelde van een enkele of een aantal
neuronen wordt geïnterpreteerd, zullen de neuronen zeer geschikt zijn voor gebruik in
kunstmatig leven. Het berekenen van de lading van een enkele realistische neuron kost
een groot aantal berekeningen, de output van een sum and squash neuron is in twee
bewerkingen te berekenen. De sum and squash neuron is een stuk simpeler. Hierdoor
wordt de simulatie sneller, of kan er gekozen worden om de breinen groter te maken.
!
Structuur
De structuur van dit netwerk is geschikt voor sommige taken. Er zijn geen
terugkoppelingen en geen tijdsvertragingen. Hierdoor kan het netwerk alleen maar op de
input reageren die hij op dat moment binnenkrijgt. Alle inputs van vorige tijdstappen zullen
vergeten worden. Een organisme dat een feedforward netwerk gebruikt als brein zal dus
niet over een geheugen beschikken en kan geen acties vooruit in de tijd plannen. Deze
structuur is wel geschikt voor simpele organismen die niet vooruit hoeven te plannen en
geen ingewikkelde taken uit hoeven te voeren.
!
Backpropagation
Backpropagation is een supervised learning algorithm. Het zal een aantal voorbeelden
nodig hebben om te kunnen functioneren. Ik heb geen goede manier gevonden om dit te
gebruiken in de simulatie. Als dit gebruikt zou worden, zou dit inhouden dat de vereiste
output van een netwerk al bekend is. Aangezien het de bedoeling is dat de organismen
autonoom zijn, zal backpropagation niet gebruikt worden.
!
Input/Output
De input en output van een feedforward neural network zijn zeer handig voor de simulatie.
Beiden bestaan uit reële waarden tussen de 0 en 1. Dit is handig omdat er goed valt te
rekenen met begrensde waarden. Een voorbeeld hiervan is de snelheid waarmee een
organisme vooruit beweegt. De output ligt ergens tussen de 0 en 1, dus kan de output van
het netwerk vermenigvuldigt worden met een snelheidsfactor om de uiteindelijke snelheid
te verkrijgen. Deze zal tussen de 0 en de snelheidsfactor liggen. Dit is ook beter dan een
9
From Computer to Brain
20
model met spikes (0 of 1) omdat het organisme dan alleen maar één snelheid kan hebben,
of het gemiddelde aantal éénen over de laatste paar tijdstappen moet berekend worden.
!
Conclusie!
!
De feedforward architectuur met backpropagation blijkt biologisch gezien dus geen
realistisch model te zijn. Het is een goed voorbeeld van een netwerk dat heel losjes op de
biologie gebaseerd is. Het heeft qua vorm een aantal overeenkomsten, maar de werking is
totaal verschillend. Toch zullen de sum and squash neuronen wel gebruikt worden in de
uiteindelijke simulatie, aangezien het weinig berekeningen kost en redelijk eenvoudig is.
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
21
Kunstmatige Evolutie!
!
Het netwerk van het vorige programma was een standaard feedforward neural network.
Dit netwerk reageert direct op de input die wordt gegeven en houdt daarbij geen rekening
met de inputs van vorige tijdstappen. Het netwerk heeft, tenzij de gewichten veranderen,
geen veranderende interne staat. De regels van dit netwerk zijn redelijk simpel, de enige
parameters die veranderen zijn de gewichten en met tijd hoeft geen rekening gehouden te
worden. In recurrent neural networks, waarbij een signaal bijvoorbeeld in loops in het
netwerk rond kan cirkelen, moet daar wel rekening mee worden gehouden. Het is dan ook
een stuk lastiger om deze netwerken te trainen. Er bestaan leerregels voor de meeste
recurrente netwerken, maar ze zijn nog een stuk ingewikkelder dan voor een feedforward
netwerk. Voor netwerken met veel variabelen, of andere problemen die geen exacte
oplossing hebben of waarbij het vinden van een oplossing lastig is, kunnen de principes
van evolutie gebruikt worden om een oplossing te vinden. Deze aanpak wordt een
evolutionair algoritme genoemd.
!
Natuurlijke evolutie!
!
Evolutie is het proces waarmee alle levende organismen op aarde van hun voorouders
afstammen. Het idee is dat een organisme zich voortplant met een aantal fouten bij elke
voortplanting. Deze fouten, ook wel mutaties genoemd, zorgen er voor dat dit organisme
afwijkt van zijn soortgenoten. Als deze afwijking een positievector invloed heeft op zijn
overlevingskansen, zal dit organisme zich meer voort kunnen planten en zal deze
positieve eigenschap doorgegeven worden aan zijn nakomelingen. Hierdoor wordt deze
eigenschap prominenter in de populatie van de hele soort. Een bekend voorbeeld hiervan
waarbij natuurlijke selectie in een korte periode waar werd genomen, is de evolutie van de
berkenspanner. De berkenspanner is een mottensoort die in Groot-Brittanie voorkomt10.
De mot had een lichte kleur en was daarmee goed gecamoufleerd op witte
berkenstammen. Toen de omgeving in een korte periode industrialiseerde, kleurde de
berkenstam zwart door de vervuiling en viel de lichte mot ineens een stuk meer op.
Ongeveer 1% van de mottenpopulatie was zwart door een genetische afwijking en werd
normaal gesproken opgegeten door vijanden. Nu in de nieuwe omgeving werden de lichte
motten opgegeten en konden de zwarte motten hun eigenschap doorgeven. In een korte
tijd was bijna de gehele populatie zwart. Dit is een voorbeeld van natuurlijke selectie over
een korte tijdsperiode binnen een soort. Evolutie van een soort naar een andere soort, het
proces waarmee bacteriën uiteindelijk in mensen en alle andere wezens die nu leven zijn
verandert, is natuurlijke selectie over miljoenen jaren en is zeer geleidelijk.
!
Informatie over de bouw van een organisme wordt doorgegeven door genen. Dit wordt het
genotype genoemd. Het is als het ware de blauwdruk voor het organisme en bevat alle
erfelijke informatie. De drager van deze informatie is DNA. In het DNA komen vier soorten
10
Evidence for Evolution : The Evolution of the Peppered Moth
22
moleculen voor in paren, vaak aangegeven met de letters A, T en G, C11. De volgorde van
deze vier letters wordt de sequentie genoemd. Hiermee wordt de volledige erfelijke
informatie van een organisme gerepresenteerd. De mutaties in een organisme zijn fouten
in het kopiëren van deze informatie. Deze fouten, in combinatie met natuurlijke selectie,
zijn de drijfveer van evolutie.
!
Bij ongeslachtelijke voortplanting is er maar één ouder. Dit gebeurt bijvoorbeeld bij
bacteriën. Een bacterie splitst zichzelf in tweeën, waarbij er twee, op mutaties na,
identieke bacteriën ontstaan. Evolutie vind bij dit soort organismen vooral plaats door
mutaties. Een andere manier om genmateriaal te mengen is geslachtelijke voortplanting.
Bij geslachtelijke voortplanting zijn er twee ouders nodig. Delen van het DNA van beide
ouders worden gemengd, waardoor het kind eigenschappen van beide ouders zal erven.
Het precieze nut van geslachtelijke voortplanting is nog steeds niet bekend. Het
voortplanten en het kiezen van een partner kost veel energie en is zeer inefficiënt, maar is
toch de meest gekozen strategie voor bijna alle meercellige organismen.
!
Evolutionaire algoritmes!
!
Een evolutionair algoritme is eigenlijk een abstracte vorm van natuurlijke evolutie. De
principes, zoals natuurlijke selectie, reproductie en het muteren en mengen van genen,
worden allemaal gebruikt. Alleen de implementatie is anders. De eerste stap in een
genetisch algoritme is beginnen met een willekeurige populatie oplossingen voor het
probleem, of individuen zoals ze ook wel worden genoemd. Deze populatie is over het
algemeen volstrekt willekeurig en zal dus niet heel succesvol zijn in het oplossen van het
probleem. Elk individu krijgt een waarde die aangeeft hoe goed hij het probleem oplost.
Deze waarde is de fitness en de functie die deze waarde berekend wordt de fitness functie
genoemd. De fitness functie is voor elk probleem anders. Vervolgens worden de genen
van de populatie gemuteerd en gecombineerd tot een nieuw individu in de volgende
generatie. Om natuurlijke selectie te simuleren, hebben succesvolle oplossingen hierbij
een grotere kans om geselecteerd te worden dan onsuccesvolle. Dit proces wordt herhaalt
voor een bepaalde tijd, of totdat er een oplossing gevonden is die goed genoeg is.
!
Het genotype!
!
Een belangrijk onderdeel van het algoritme zijn de genen. De kandidaten voor een
oplossing moeten op één of andere manier gerepresenteerd worden zodat de genen
gemengd en gemuteerd kunnen worden. Dit noemt men, net zoals in de biologie, de
genen of het genotype van het individu. Net zoals bij de fitness functie, is de
implementatie voor elk probleem anders. Een veelgebruikte manier is een rij van enen en
nullen, een zogenaamde bit string. Een bit string is dan het DNA van de oplossing en de
volgorde van nullen en enen vervangen zijn een sequentie.Voor bijvoorbeeld een
feedforward neural network kan het genotype ook een rij van reele getallen zijn, waarbij
11
DNA http://en.wikipedia.org/wiki/DNA
23
elk getal voor een gewicht staat. Er kan ook gekozen worden om geen genotype te
implementeren, maar het volledige fenotype te kopieeren met mutaties. Net zoals bij alle
andere onderdelen van het algoritme is het belangrijk dat de principes van evolutie
aangehouden worden. De genen hoeven dus niet op echt DNA te lijken.
!
Een evolutionair algoritme maakt gebruik van twee genetische operatoren: mutatie en
crossover. Crossover is het mengen van de genen, wat in de natuur overeenkomt met
geslachtelijke voortplanting12. In een bit string komt mutatie overeen met het veranderen
van een 1 in een nul en omgekeerd, een bit flip. De mate waarin deze mutaties voorkomen
is de mutatiesnelheid. Dit is een laag getal om te voorkomen dat er nooit een oplossing
wordt gevonden, maar de precieze waarde verschilt per probleem. Het vinden van de
juiste parameters van de fitness functie en de mutatiesnelheid is een kwestie van proberen
en goed inschatten. Je moet er voor zorgen dat de veranderingen, net zoals met evolutie,
zeer geleidelijk zijn. Crossover zorgt er voor dat nuttige delen van het genoom van twee
ouders over worden gedragen. In een bit string wordt er voor crossover op een
willekeurige plaats in het genoom een crossoverpoint gekozen. Vanaf de linker kant van dit
punt worden de nullen en enen van de ene ouder gekopieerd en rechts die van de andere
ouder. Dit staat bekend als single point crossover. Er bestaan talloze manieren om
crossover uit te voeren. Je kan ook meerdere crossover punten kiezen, bijvoorbeeld two
point crossover zodat het middelste gedeelte van het genoom van een andere ouder
afkomstig is. Ook kan je er voor zorgen dat het grootste gedeelte in het nieuwe genoom
van de meest succesvolle ouder afkomstig is. Sommige algoritmes mengen de twee
genen volstrekt willekeurig, ze kiezen dus voor elke bit of ze de genen van de ene of de
andere ouder kiezen. Dit is meestal niet zo effectief omdat de succesvolle delen in het
DNA dan ook door elkaar gehusseld worden. Dit heeft wel zin als de volgorde van het
genoom niet uitmaakt en delen die naast elkaar staan niets met elkaar te maken hebben.
Ook de mate waarin crossover voorkomt is een parameter die per situatie zal verschillen.
Meestal ligt het rond de 70%, dit betekent dat 70% van de volgende generatie een product
is van crossover. De rest is alleen gemuteerd of een identieke kopie van een individu uit
de vorige generatie. Als de meest succesvolle individuen onveranderd naar de volgende
generatie gaat heet dit elitisme of eliteselectie. Dit zorgt er voor dat de kwaliteit niet daalt.
Figuur 1 : Links mutatie, Rechts crossover
12
Genetic Algorithm : http://www.ai-junkie.com/ga/intro/gat2.html
24
De uitvoering!
!
Het precieze algoritme gaat dus als volgt :
!
1.
2.
3.
4.
!
Genereer een willekeurige populatie van individuen.
Laat elk individu zijn taak uitvoeren.
Bereken de fitness van elk individu. Is de fitness binnen een bepaalde marge van
het doel? Stop de simulatie.
Selecteer 2 individuen van de populatie waarbij de kans om gekozen te worden
proportioneel is aan de fitness en combineer de genen met crossover of pas alleen
mutatie toe. Voeg de resulterende individuen toe aan de nieuwe generatie. Herhaal
deze stap totdat deze de populatiegrootte bereikt. Ga terug naar stap 2.
Een van de lastigste aspecten van een evolutionair algoritme is het kiezen van de juiste
fitness functie. Evolutie doet nooit wat je wilt, een onzorgvuldig gekozen fitness functie kan
er voor zorgen dat het algoritme een loophole zal vinden. Neem een programma waarin je
een robot ontwerp probeert te laten springen. Als fitness functie om te bepalen hoe
succesvol een robot is wordt de maximale hoogte van zijn massamiddelpunt genomen. Nu
zou een robot kunnen evolueren die op een stok staat en een hele grote massa aan de
bovenkant heeft13. Deze robot komt niet van de grond, maar valt direct om. Zijn
massamiddelpunt ligt hoog van de grond dus volgens deze fitness functie is hij wel
succesvol, maar het komt niet overeen met de wensen van de programmeur. Een beter
functie zou zijn: de maximale hoogte van de grond van het laagste punt op de robot. Dan
weet je zeker dat de robot in ieder geval van de grond komt. Ook subtiele bugs in de code
zullen door een evolutionair algoritme geëxploiteerd worden.
!
Nadelen!
!
Alhoewel ze altijd een oplossing geven, zijn evolutionaire algoritmes geen zilveren kogel.
Evolutionaire algoritmes geven nooit een optimale oplossing. Ze zullen steeds meer een
bepaalde oplossing blijven benaderen. Ook de tijd die het kost om een genetisch algoritme
te draaien levert problemen op. Evolutie is een zeer geleidelijk proces dat vele generaties
nodig heeft om zich aan te passen. Daarom zijn andere oplossingen voor een probleem
eigenlijk altijd handiger dan evolutionaire algoritmes. Dit betekent niet dat ze volledig
nutteloos zijn. In situaties waar geen andere oplossing voor het probleem is, zal een
genetisch algoritme betere resultaten opleveren dan willekeurige oplossingen proberen.
Net zoals bij backpropagation beweegt een genetisch algoritme zich over een landschap,
een fitnesslandschap in plaats van een error landschap. Hij probeert de fitness te
maximaliseren door geleidelijke stappen te nemen en te kijken of hij zich nu op een hoger
punt op dit landschap bevindt dan eerst. Voor handschriftherkenning is gradient descent
dus een betere oplossing omdat deze altijd meteen in de goede richting beweegt. Een
genetisch algoritme toegepast op deze situatie zou eerst een heleboel combinaties
13
Darwin's Algorithm: Building Creatures in Simulation
25
moeten proberen om te kijken wat een verbetering oplevert. Dit zou uiteindelijk ook wel
een goede oplossing geven, maar in veel meer stappen dan bij gradient descent. Het
voordeel van evolutionaire algoritmes is wel dat het door crossover en willekeurige nieuwe
individuen in de populatie soms grote sprongen over het fitness landschap maakt. Het
komt daardoor minder snel vast te zitten in een lokaal maximum. Een laatste nadeel is dat
de resultaten niet altijd begrijpelijk zijn. Een evolutionair algoritme legt niet aan het einde
uit waarom het voor deze oplossing heeft gekozen. Dit zullen mensen zelf weer uit moeten
zoeken.
!
Toepassingen!
!
Deze abstracte vorm van evolutie wordt natuurlijk ook gebruikt om onderzoek te doen naar
evolutie zelf. Er zijn veel fenomenen in de evolutie die nog steeds niet verklaart zijn, zoals
het succes van geslachtelijke voortplanting. Ook onderzoek naar het onstaan van
zenuwstelsels is erg lastig omdat het zachte weefsel van zenuwstelsels geen fossielen
achterlaat. Er zijn theorieën over, maar paleontologen kunnen verder geen experimenten
doen14. Computermodellen kunnen gebruikt worden om deze hypotheses te testen. Ook
op het gebied van het maken van breinmodellen kunnen evolutionaire algoritmes gebruikt
worden.
!
Recurrente netwerken zijn al genoemd als een vlak waar evolutionaire algoritmes
toegepast kunnen worden. Het menselijke brein heeft niet alleen recurrente verbindingen,
maar ook nog een vertraging tussen elke verbinding, spike patronen in tijd en een enorm
complexe structuur. Het kan zijn dat de structuur van het brein te ingewikkeld is om door
mensen ontworpen te worden. Mensen kunnen systemen ontwerpen door het in stukjes
op te delen die begrijpelijk zijn en die stukjes vervolgens aan elkaar te koppelen, maar het
zou zo kunnen zijn dat het brein één groot complex geheel is. Als dit het geval is zal
evolutie beter zijn in het ontwerpen van een kunstbrein dan mensen.
!
Ook in robotica hebben evolutionaire algoritmes tal van toepassingen. Neurale netwerken
kunnen in een computer simulatie geëvolueerd worden om later een robot in de echte
wereld te besturen. Het ontwerp van de robot kan ondertussen ook mee geëvolueerd
worden door bijvoorbeeld alle mogelijke combinaties om een robot met de beschikbare
onderdelen in elkaar te zetten uit te laten proberen. Op deze manier zal het
besturingsprogramma beter aangepast zijn op het ontwerp van de robot. Nasa heeft in
2006 een antenne ontworpen met behulp van evolutionaire algoritmes. Het resultaat, de
ST5, was een ingewikkelde asymmetrische antenne, die niet beter gemaakt had kunnen
worden door menselijk ontwerp15.
!
!
14
Artificial Evolution: A New Path for Artificial Intelligence? http://www.sussex.ac.uk/Users/inmanh/
brain_cog.pdf
15
Evolved Antenna : http://ti.arc.nasa.gov/m/pub-archive/1244h/1244%20(Hornby).pdf
26
!
Bestaande simulaties van kunstmatig leven!
!
Evolutionaire algoritmes worden gebruikt in bijna alle simulaties met kunstmatig leven. Het
laatste experiment zal voornamelijk gebaseerd zijn op twee van deze simulaties :
Polyworld en Evolving Virtual Creatures.
!
Karl Sims, Evolving Virtual Creatures (1994)!
Figuur 2
In deze simulatie werden in een 3D wereld een aantal wezens geëvolueerd met lichamen
en bijbehorende neurale netwerken om ze te besturen. Er werd gebruik gemaakt van een
standaard evolutionair algoritme zoals in dit hoofdstuk besproken is. De fitness functie
werd zo gekozen dat er een bepaald gedrag ontstond. Door bijvoorbeeld als fitness functie
de afgelegde weg te nemen ontstonden er wezens die zich over land voort konden
bewegen. Veel ontwerpen die ontstonden zagen er zeer ingewikkeld uit, maar konden zich
toch door een reeks bewegingen voortbewegen. Dit soort ontwerpen zouden nooit
ontstaan als een mens het had moeten ontwerpen. Eén van de simulaties liet twee
wezens met elkaar concurreren door zo dicht mogelijk bij een groene kubus te komen
(figuur 2). Meestal vond er alleen evolutie van enkele wezens
die maar één taak uit moesten voeren plaats. De
hersenen van de wezens zat grotendeels in de
Figuur 3
lichaamsdelen zelf. Elk lichaamsdeel had een aantal
neuronen en elk wezen had een centraal brein. De
neuronen waren sum and squash neuronen, maar elk
met een verschillende squashing functie, waaronder
sinus, sigmod, tanges, log, exponentieel en nog een
aantal andere. Het genotype voor het lichaam was een
aantal aan elkaar verbonden elementen (Figuur 3). Elk
element hierin moet een lichaamsdeel voorstellen. Een
element kan een aantal verbindingen aangaan,
lichaamsdelen kunnen op deze manier aan elkaar
vastgemaakt worden. Een verbinding geeft ook de
grootte relatief aan het vorige lichaamsdeel aan en de
plaats waar het vast zit. Er zijn geen beperkingen in de
manier waarop deze elementen met elkaar kunnen
verbinden, een element kan bijvoorbeeld aan zichzelf
27
verbinden waardoor er een soort fractalen ontstaan. Het genotype voor het brein van een
wezen ziet er ongeveer hetzelfde uit. Dit genotype voor het lichaam van de organismen zal
gebruikt worden in de eindsimulatie.
!
!
!
Larry Yaeger, Polyworld (1994)!
!
In de simulatie van Karl Sims was er sprake van gecontroleerde evolutie en er was
meestal geen interactie tussen de wezens. Polyworld legt de nadruk juist op de interactie
die tussen de wezens (agents, zoals ze in Polyworld genoemd worden) ontstaan. In plaats
van een geforceerd evolutionair algoritme, gebruikt het iets dat meer op natuurlijke
evolutie lijkt. Agents kunnen bijvoorbeeld zelf bepalen wanneer ze zich voortplanten. De
agents worden dan ook niet geëvolueerd op een bepaalde taak, maar moeten gewoon
genoeg voedsel verzamelen om te overleven. Het brein bestaat uit een recurrent neuraal
netwerk met standaard sum and squash neuronen zoals in het vorige hoofdstuk
besproken werden. De lichamen van agents bestaan uit vierhoekige polygonen, waarvan
de vorm volledig vast staat. Het genotype van het brein bestaat uit een aantaal brein
gebieden en informatie over hoe deze breingebieden met elkaar verbinden. Dit is geen
nauwkeurige informatie, het genotype is gebaseerd op het idee dat het brein veel te
ingewikkeld is om in het DNA op te slaan. In Polyworld wordt bijvoorbeeld alleen de kans
dat een willekeurig neuron in een breingebied een verbinding zal hebben met een neuron
in een ander breingebied opgeslagen. Elk breingebied bevat 20 neuronen met 20
breingebieden per agent. Polyworld slaat ook niet de sterkte van synapsen op. Het maakt
gebruik van een algoritme gebaseerd op Hebbian Learning. De eindsimulatie zal gebruik
maken van dezelfde soort vrije evolutie en doelen voor de agents.
!
!
!
!
!
!
!
!
!
28
Experiment : Evolutie Feedforward netwerk!
!
Een manier om de juiste gewichten voor een neuraal netwerk te vinden is om gebruik
maken van kunstmatige evolutie. Om dit te demonstreren heb ik een programma gemaakt
waarbij software robots (agents), voedsel moeten verzamelen. De neuronen zijn sum and
squash neuronen en het netwerk heeft, net zoals het netwerk in het vorige programma
over handschriftherkenning, een feedforward architectuur.
!
Omschrijving simulatie!
!
Figuur 1
Bij het openen van het programma, zie je een aantal rode en groene bolletjes. Dit zijn de
agents en voedselbolletjes. Links zijn een aantal opties te zien. fast mode Houdt in dat de
renderstap in de simulatie overgeslagen wordt en dat er niet gepauzeerd wordt tussen de
tijdstappen in. Dit versnelt de simulatie zodat je niet eindeloos hoeft te wachten totdat er
evolutie plaats vindt.
!
De agents en het voedsel bestaan uit cirkels. Er is gekozen voor cirkels omdat er elke
tijdstap gekeken moet worden of de agent overlapt met één van de voedselbolletjes. Een
check of twee cirkels elkaar overlappen kost weinig berekeningen. Je neemt de afstand
tussen de twee middens en kijkt of deze kleiner is dan de som van de twee stralen.
!
Om evolutie mogelijk te maken wordt gebruik gemaakt van een genotype. Dit genotype is
een lijst van getallen tussen -1 en 1. Elk van deze getallen moet de waarde van een
gewicht voorstellen. Er wordt gebruik gemaakt van een input laag met 4 elementen, 2
verborgen lagen met elk 6 neuronen en een outputlaag met 2 elementen. In deze lijst
worden alle verbindingen van een laag met de vorige laag opgeslagen en de bias voor elk
neuron behalve de inputneuronen. Hoewel het niet gebruikelijk is, heb ik er voor gekozen
29
om de outputneuronen wel sum and squash neuronen te maken. Zo blijft de output tussen
de 0 en 1.
!
Doordat alle gewichten in een lijst staan, is het makkelijk om mutaties en crossover toe te
passen. Voor een mutatie wordt gewoon een willekeurig getal in deze lijst verhoogd of
verlaagd. De kans dat een getal veranderd is 1 op 30 en de verandering ligt tussen de 0
en 0.1. Voor crossover wordt er gebruik gemaakt van meerdere crossover points. Om een
nieuw genoom te maken met crossover, worden de getallen in de lijst getal voor getal van
één van beide ouders in een nieuwe lijst gekopieerd. Bij elk getal is de kans dat er van
ouder wordt gewisseld 1 op 30. Wanneer dit gebeurd worden de getallen van de andere
ouder gekopieerd in de nieuwe lijst. Zo wordt er dus steeds tussen beide ouders
gewisseld.
!
De simulatie werkt met tijdstappen. Elke tijdstap wordt de nieuwe staat van elk object
berekend. Voor de agents gaat dit als volgt :
- Eerst wordt de input verzameld. Hiervoor wordt ten eerste het dichtstbijzijnde
voedselbolletje gezocht. Vervolgens wordt de vector van het verschil tussen de agent en
dit bolletje berekend en deze wordt genormaliseerd zodat hij een lengte van 1 heeft.
Deze verschilvector is relatief aan de oriëntatie van de agent. Dit wordt gedaan zodat de
input tussen de 0 en 1 ligt. Hetzelfde wordt gedaan voor de dichtstbijzijnde agent. Dit zijn
twee tweedimensionale vectoren, dus de input bestaat uit vier elementen.
- De tweede stap is de output van het netwerk berekenen voor de input van deze tijdstap.
- Tot slot wordt de output gebruikt om de nieuwe positie van de agents te berekenen. De 2
outputneuronen worden bij elkaar opgeteld en gedeeld door twee om te berekenen hoe
veel de agent naar voren beweegt. Vervolgens wordt het verschil van beide outputs
genomen als rotatie. De twee outputs moeten de beweging van twee wielen voorstellen.
Als beide outputs dezelfde waarde geven, zullen beide wielen even hard aangestuurd
worden en zal de agent recht naar voren bewegen. Als het linker wiel minder hard
aangestuurd wordt als het rechterwiel, zal hij naar links bewegen. Zo kan de agent dus
sturen.
!
De overige objecten in de simulatie worden op een soortgelijke manier behandeld. Nadat
alle agents geüpdatet zijn, wordt er gekeken of er overlappingen met planten plaatsvinden.
Als een agent Een plant aanraakt, wordt zijn fitness verhoogt met 1. Deze plant wordt nu
verwijderd en ergens anders in de wereld geplaatst zodat het aantal planten altijd constant
blijft. Elke 4000 tijdstappen worden alle agents verwijderd en vervangen door een nieuwe
generatie. Deze nieuwe generatie bestaat uit gemuteerde agents uit de vorige generatie
(mutation) en agents gecombineerd uit twee andere agents in de vorige generatie
(crossover).
!
Bij de selectie hebben agents met een hogere fitness een grotere kans om nageslacht in
de volgende generatie te hebben. Er wordt gebruik gemaakt van zogenaamde roulette
selectie. De kans dat een agent gekozen wordt om gecombineerd te worden of om naar
30
de volgende generatie te gaan met mutaties is proportioneel aan zijn fitness. Het is te zien
als een roulette wiel waarbij elke agent een portie op het wiel krijgt. Agents met een
hogere fitness krijgen een grotere portie als de agents met een lagere fitness, waardoor
de kans dat ze gekozen worden groter wordt. De portie die elke agent op het wiel krijgt is
gewoon de fitness van deze agent gedeeld door de totale fitness van deze generatie. 17
van de agents in de nieuwe generatie worden gemaakt volgens crossover, de overige 8
zijn kopieën uit de vorige generatie met alleen mutaties. Er wordt geen gebruik gemaakt
van elite selectie.
!
Verwachtingen!
!
De populatie is niet heel groot en er wordt geen gebruik gemaakt van elite selectie. Dit
vergroot de kans dat onsuccesvolle agents geselecteerd worden, waardoor de gemiddelde
fitness afneemt. Ik verwacht dat de trend van de gemiddelde fitness dus wel zal toenemen,
maar dat hij hierdoor ook af en toe flink zal dalen. Het is lastig om in te schatten wat de
fitness is bij een succesvolle strategie. Gebaseerd op eerdere soortgelijke simulaties
verwacht ik dat het ongeveer 50 generaties zal duren voordat ze duidelijk richting het
voedsel weten te bewegen.
!
In het begin is het verschil tussen alle agents nog het grootst, daarna wordt het genotype
steeds meer gelijk door de crossover en zijn de veranderingen geleidelijker. Dus zal de
gemiddelde fitness van een generatie in het begin waarschijnlijk zeer snel stijgen en
daarna steeds vlakker worden.
!
Experiment!
!
Het experiment werd uitgevoerd door de simulatie een aantal keer te laten draaien. Hierbij
werd gekeken naar de hoogste en gemiddelde fitness na 1000 generaties. Een grafiek van
de gemiddelde fitness en de verdeling van de laatste 2000 agents is te zien onder het
paneel data.
!
Waarnemingen!
!
Ondanks het feit dat er geen elite selectie is, lijkt de trend van de fitness altijd te stijgen.
De verwachting dat de stijging afneemt klopt in veel van de gevallen. Soms ontstaat er
echter een spontane stijging in de gemiddelde fitness. Dit komt waarschijnlijk doordat het
genotype daarvoor vast zat in een lokaal minimum. De gemiddelde fitness lijkt elke keer
naar 300 te gaan. Bij deze gemiddelde fitness bewegen de agents direct richting het
dichtstbijzijnde bolletje.
!
De stijging in het begin is een stuk groter dan gedacht. In sommige van de simulaties
wisten de agents in de tweede tijdstap al richting het voedsel te bewegen. Deze
beginstijging is sterk afhankelijk van de eerste generatie. In een aantal gevallen was ook
te zien dat de fitness vast zat in een lokaal maximum. Hij bleef veel generaties vlak,
waarna hij uit het lokale maximum bewoog en ineens begon met stijgen (Figuur 2).
31
Figuur 2
Ondanks het feit dat de agents informatie hebben over de dichtstbijzijnde andere agent,
lijken ze deze niet te gebruiken bij de maximale fitness. Ze bewegen uiteindelijk altijd
richting het dichtstbijzijnde voedselbolletje. Dit komt doordat de fitness functie geen
rekening houd met de gemiddelde fitness van een populatie. Het gaat puur om het succes
van een individu. Voor elk individu is het dus beter om zelf zo veel mogelijk bolletjes te
verzamelen. Deze gevonden hoogste waarde zal dus niet de hoogst mogelijke gemiddelde
fitness zijn.
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
32
Hopfield Netwerken!
!
Alle tot nu toe besproken netwerken hebben verbindingen in één richting, er kunnen geen
cirkels gevormd worden. Dit noemen we feedforward. Als de verbindingen in een netwerk
ook terugkoppelen naar neuronen in het netwerk of met zichzelf, dan is het een recurrent
neuraal netwerk. Het menselijk brein is een recurrent neural network. Zoals eerder
besproken, werkt het brein waarschijnlijk volgens de principes die Donald Hebb had
voorgesteld. Neuronen die gesynchroniseerd vuren vormen sterkere verbindingen
waardoor ze vaker tegelijk zullen vuren. Er zijn een aantal algoritmes op dit principe
gebaseerd. Het meest gebruikte op dit gebied is het Hopfield algoritme.
!
Hopfield netwerken!
!
Een hopfield netwerk bestaat net zoals een feedforward neural network uit een aantal aan
elkaar verbonden elementen. De elementen sommeren alle verbonden elementen door
ieder element te vermenigvuldigen met een gewicht en dat bij elkaar op te tellen. Als deze
waarde groter is dan een drempelwaarde, zal de output van dit element 1 zijn. Zoniet dan
is de output -1. Wat dit betreft lijken de elementen dus meer op de McCulloch en pitts
neuronen. Dit is ook biologisch gezien realistischer aangezien spikes van echte neuronen
ook geen waarde hebben. De -1 is als een gebrek aan een spike te zien en 1 als een
spike. Het grootste verschil tussen dit netwerk en een feedforward network is dat een
element in Hopfield network verbonden is met elk ander element in het netwerk, maar niet
met zichzelf. De leerregels voor hopfield netwerken zijn gebaseerd op het principe dat
verbindingen tussen tegelijk vurende neuronen sterker worden en verbindingen tussen
ongelijk vurende neuronen afzwakken. In een Hopfield netwerk ziet dit er als volgt uit :
!
vuurt
vuurt niet
vuurt
↑
↓
vuurt niet
↓
↑
!
Als een neuron vòòr een synaps (presynaptische neuron) tegelijk met de neuron na de
synaps (postsynaptische neuron) een 1 als output heeft, wordt de verbinding versterkt. Als
één van beide een signaal geeft wordt de verbinding verzwakt en als geen van beide een
1 geeft wordt de verbinding ook versterkt. Op deze manier zal het netwerk associaties
maken tussen neuronen die vaak tegelijk actief zijn. Nu wordt het ook duidelijk waarom de
neuronen als output een waarde van -1 en 1 aan kunnen nemen in plaats van 1 en 0. Om
de verandering van het gewicht te krijgen, vermenigvuldig je gewoon de output van de
pre- en postsynaptische neuron met elkaar. Bij deze leerregel is het dus ook belangrijk dat
een neuron geen verbindingen met zichzelf heeft. Als dit wel kon, zou deze verbinding
alleen maar versterkt worden. Nog een reden voor het gebruik van -1 en 1 is dat het leidt
33
tot betere resultaten. Door het grotere verschil tussen een negatieve en een positieve
output relatief aan 0 en 1 zal het netwerk minder snel geheugens door elkaar gaan halen,
zogenaamde crosstalk16. Netwerken die de waarden 0 en 1 gebruiken hebben een veel
lagere geheugencapaciteit. Er wordt gedacht dat dit juist realistisch is. Het zou
overeenkomen met hoe mensen associaties tussen gedachten maken. Dit kan inderdaad
het geval zijn, maar in de praktijk is zo’n netwerk niet echt nuttig.
!
Deze leerregel heeft niet hetzelfde resultaat als backpropagation. Een Hopfield netwerk
heeft als het ware geheugens. Het kan patronen van nullen en enen (of -1 en 1en)
onthouden en terugroepen. Het is een zogenaamd autoassociatief netwerk, het maakt
associaties. Dit volgt direct uit de principes van Hebb’s leerregels. Een Hopfield netwerk
kan een input nemen en zal het associeren met een patroon waar je het op getraind hebt.
Het is dus bijvoorbeeld nuttig om de juiste patronen te krijgen uit input met veel ruis.
!
De update regel voor een Hopfield neuron is ongeveer hetzelfde als voor een neuron in
een feedforward network. Ook in deze neuron wordt een activatie functie gebruikt. Omdat
de output een -1 of 1 moet zijn, wordt een functie gebruikt die -1 geeft als de activatie
kleiner dan de drempelwaarde is en 1 als deze groter is. De drempelwaarde in dit netwerk
is meestal nul, dus dit komt er op neer dat positieve waarden een 1 geven en negatieve
een -1. De volgorde waarin de neuronen geüpdatet worden is willekeurig. Er is geen
duidelijke volgorde zoals bij feedforward netwerken omdat er recurrente verbindingen zijn.
Als een netwerk op een aantal patronen getraind is, zal het netwerk na een bepaalde tijd
convergeren naar één van de geleerde patronen, tenzij er te veel patronen geleerd zijn en
het geheugen vol is. Hieronder is een netwerk te zien dat getraind is met een A, een B en
een C. Als er een misvormde B ingevoerd wordt, zal het netwerk na een aantal neuronen
geüpdatet te hebben, uiteindelijk convergeren naar de B waarop getraind was.
!
!
!
!
!
!
Figuur 2
!
Leerregel!
!
De leerregel voor een hopfield netwerk is een stuk eenvoudiger dan backpropagation. In
een Hopfield netwerk zijn het aantal input elementen even groot als het aantal neuronen.
De waarde van de gewichten wordt bepaald aan de hand van de input sets. Elementen in
de input sets kunnen de waarden -1 en 1 aannemen en kunnen op die manier bijvoorbeeld
de c uit het plaatje hierboven voorstellen. Een -1 kan voor een leeg vlakje staan en en 1
voor een gekleurd vlakje. Om het netwerk te trainen op één zo’n input set kan je elk
16
From computer to Brain
34
element als een neuron zien. Als je bijvoorbeeld de set {-1,1,1,-1} hebt, dan zullen de
gewichten tussen het 1e en het 4e element en de gewichten tussen elementen 2 en 3
versterkt worden. De overige verbindingen worden verzwakt. Als je het netwerk op
meerdere inputs wilt trainen, herhaal je dit gewoon een aantal keer en deel je door het
aantal input sets waarop je getraind hebt zodat de gewichten niet onbegrensd groot
worden. Dit is goed te zien in de vorm van een matrix. De input kan hierbij voorgesteld
worden als vector. Bij de input {-1,1,1,-1} hoort dan bijvoorbeeld de vector p :
!
"
!
De matrix met gewichten die hierbij hoort is de outer product van deze input vector met
zichzelf. De outer product geeft elke alle mogelijkheden om de getallen in deze vectoren te
vermenigvuldigen. Dit is dus hetzelfde als de output van elke neuron met elke andere
neuron vermenigvuldigen om de verandering van het gewicht te krijgen. De matrix die je
nu krijgt geeft alle gewichten in het hele netwerk weer. Het element in kolom 2 in rij 1 geeft
bijvoorbeeld het gewicht van neuron 2 naar neuron 1 weer. Omdat een gewicht van
neuron A naar neuron B gelijk is aan het gewicht van B naar A zal de matrix ook
symmetrisch zijn. De diagonaal in deze matrix zijn de gewichten van neuronen naar
zichzelf. Dit netwerk heeft geen verbindingen met zichzelf dus alle elementen op deze
diagonaal zouden nul moeten zijn. Daarom wordt de eenheidsmatrix van deze
gewichtenmatrix afgetrokken zodat deze diagonaal nul wordt. De gewichtenmatrix voor
deze enkele input komt er nu dus als volgt uit te zien :
!
"
!
Om het netwerk nu voor meerdere inputvectoren te trainen tel je de resulterende matrixen
gewoon bij elkaar op en deel je het resultaat door het aantal patronen waarvoor getrained
is, zodat de waarden niet te groot worden. Als je bij het patroon hierboven de matrixen
voor {1,1,-1,-1} en {1,1,1,1} optelt krijg je dus :
!
35
"
!
In formule vorm is een gewicht van neuron i naar neuron j te berekenen als :
!
"
!
Waarbij i een bit in patroon µ is en n is het aantal patronen. Met een bitpatroon wordt
bijvoorbeeld de set {-1, 1, 1, -1} bedoeld of de letter C. Dit geeft precies hetzelfde resultaat
als de berekeningen met de matrixen hierboven. Om een gewicht van i naar j te
berekenen kijk je naar de staat van neuron i en j in elk bitpatroon. Als je deze staten met
elkaar vermenigvuldigt krijg je de verandering van het gewicht. Om het totale gewicht Wij
te krijgen tel je al deze veranderingen bij elkaar op en deel je door n. Gewichten van
neuronen naar zichzelf moeten hierbij nog op nul gezet worden. Een voorwaarde is dus
dat i niet gelijk is aan j. Als je weer de vorige twee input sets als voorbeeld neemt :
{-1,1,1,-1} en {1,1,-1,-1} en je wilt het gewicht van neuron 1 naar neuron 2 weten, doe je
W12 = (1/2) * (-1*1 + 1*1) = 0.
!
Nu heb je dus een matrix die alle gewichten voor dit netwerk bevat, getraind voor drie
input patronen. Deze matrix is als het ware het geheugen van dit netwerk. Als je nu een
willekeurig patroon neemt zoals {-1, 1, -1, 1} dan zal het netwerk convergeren naar het
patroon dat hier het meest op lijkt. Het is gebruikelijk dat elke neuron in het netwerk apart
wordt geüpdatet in willekeurige volgorde. Deze methode is asynchroon. Een andere
manier is om de volledige staat van het hele netwerk in één keer te updaten, synchroon.
Dit kan door de staat van een netwerk als vector te vermenigvuldigen met de
gewichtenmatrix. Met bovenstaand voorbeeld wordt dit dus :
!
36
"
Deze vermenigvuldiging heeft als resultaat een nieuwe vector, deze vector gaat door de
activatie functie (in dit geval -1 als < 0 en 1 als ≥ 0). Eigenlijk moet hier ook nog de
drempelwaarde vanaf getrokken worden. Dit kan door nog een vector met de
drempelwaarde voor elke neuron van de vector in de activatie functie af te trekken. Voor
nu is de drempelwaarde altijd nul en wordt hij voor het gemak niet opgeschreven. Met
deze methode heb je geen garantie dat de staat altijd naar een aantrekker zal bewegen.
Dit is bijvoorbeeld te zien in het gebruikte voorbeeld. Als je de output {1, -1, 1, -1} nu weer
met de gewichtenmatrix vermenigvuldigd, krijg je weer de oorspronkelijke input {-1, 1, -1,
1}. Op deze manier zal er dus altijd tussen deze twee staten gewisseld worden. Vanaf nu
zal ik het dan ook over de de asynchrone methode hebben waarbij elke neuron apart
geupdate wordt.
!
De update regel voor een neuron is :
!
"
!
Hierbij is θj de drempelwaarde voor een neuron j. De staat van een netwerk is als een punt
te zien in n-dimensionale ruimte, waar n het aantal neuronen in het netwerk is. Bij elke
update stap die je neemt zal de staat van het netwerk veranderen en verandert dus ook de
positie van dit punt. Het tot nu toe gebruikte voorbeeld heeft 4 dimensies (4 neuronen).
John Hopfield heeft bewezen dat de geheugens een aantrekker zijn voor deze staat. De
staat van het netwerk zal altijd richting de dichtstbijzijnde aantrekker bewegen. Dit lijkt op
het principe van gradient descent, waarbij de punten de staat van de gewichten waren en
er over het error landschap werd bewogen. Deze geleerde patronen zijn echter niet de
enige aantrekkers. De negatieve van deze patronen zijn dat ook. Voor het patroon
{1,-1,-1,-1} zal {-1,1,1,1} ook een aantrekker zijn, zogenaamde spiegelaantrekkers. Als het
geheugen te vol raakt, zullen er ook aantrekkers ontstaan van patronen waar niet op
getraind is. Dit zijn lokale minima waar het netwerk in vast kan komen te zitten. Een bewijs
dat de energie van een hopfield netwerk altijd een minimum zal vinden staat in Appendix
B.
!
!
!
!
37
Natuurkundig model!
!
John Hopfield was een natuurkundige. Hij kwam op het idee voor dit netwerk door een
natuurkundig fenomeen. Het Ising model is een natuurkundig model van magnetische
deeltjes bij het absolute nulpunt17. Deze deeltjes hebben een eigenschap genaamd spin.
Deze spin heeft een bepaalde richting. Magnetische materialen, zoals gewone
koelkastmagneten, zijn magnetisch omdat bij deze materialen de spin val elk deeltje
dezelfde kant op staat. Dit wordt ferromagnetisme genoemd. In dit model komen atomen
voor die in twee staten kunnen verkeren, spin 1/2 (up) en spin -1/2 (down). Dit komt
overeen met de waarde van -1 en 1 voor een neuron in een Hopfield netwerk. De spin van
elk deeltje staat in de richting van het magnetisch veld. Elk deeltje is een magneet en
heeft invloed op het magnetisch veld, alle deeltjes hebben dus invloed op elkaar. De
atomen zullen hun spin van up naar down blijven veranderen totdat er een evenwicht is
gevonden. De functie die de totale potentiële energie voor zo’n materiaal geeft is qua vorm
identiek aan de energiefunctie voor het Hopfield netwerk. De staat xi van een neuron is
hierbij de spin van een atoom en het gewicht is de invloed die twee deeltjes op elkaar
hebben. Deze invloed is afhankelijk van de afstand tussen de twee deeltjes en de
magnetische permeabiliteit van de omgeving. De drempelwaarde komt overeen met de
kracht van het externe magnetische veld. Net zoals een Hopfield netwerk zal dit materiaal
altijd een evenwicht vinden. Deze analogie met de energie van een magnetisch materiaal
is ook de reden dat deze functie de energie functie wordt genoemd.
!
Verklaart het Hopfield netwerk de werking van het brein?!
!
Vanwege zijn eigenschappen, wordt het Hopfield netwerk vaak als uitleg van de werking
van geheugen gebruikt. De leerregel lijkt inderdaad erg veel op Hebb’s leerregels.
Geheugen in het brein wordt gevormd door een aanpassing van de gewichten. Synapsen
die verantwoordelijk zijn voor het vuren van een neuron worden hierbij versterkt (long term
potentiation) en synapsen die niet aan het vuren bijdragen worden afgezwakt (long term
depression). Een verlaging van het gewicht komt overeen met long term depression en
een verhoging met long term potentiation. Een Hopfield network is inderdaad nuttig om de
werking van het geheugen beter te begrijpen, in tegenstelling tot backpropagation. Door
een heel abstract en simpel model van een breinfunctie te maken kan het brein zelf een
stuk beter begrepen worden. Toch is het geen goed model om het brein na te maken. Het
hopfield netwerk is op de meeste vlakken nauwelijks met zijn biologische tegenhanger te
vergelijken. Neuronen hebben geen negatieve staat, alleen een spike of geen spike. Toch
is er voor de waarden -1 en 1 gekozen om het model effectiever te maken. Er zijn
realistischere varianten van Hopfield netwerken die wel 0 en 1 gebruiken en toch cross
talk weten te vermijden. Deze modellen hebben hierdoor wel een stuk meer voorwaarden
en zijn hierdoor wiskundig gezien veel ingewikkelder. Bij het ontwerpen van het Hopfield
model was het vooral belangrijk dat het simpel bleef. Hopfield netwerken verklaren dus
gedeeltelijk de werking van het brein.
17
R. Rojas: Neural Networks
38
!
Zijn onderdelen van Hopfield netwerken te gebruiken om kunstmatig leven te
maken? !
!
Neuronen
De neuronen van een hopfield netwerk geven een 1 of een -1 als output. Dit is minder
handig dan de output van reële waarden van de sum and squash neuronen. De output van
deze neuronen kunnen alleen waarden tussen de 0 en de 1 geven als de gemiddelde
output over een bepaalde tijd wordt genomen.
!
Structuur
De belangrijkste eigenschap van een Hopfield netwerk is dat het een recurrent netwerk is.
Elke neuron kan een verbinding vormen met elke andere neuron. Het aantal vormen die
het brein aan kan nemen neemt hierdoor drastisch toe, deze ingewikkeldere netwerken
zullen daardoor complexere problemen op kunnen lossen. Als dit wordt gebruikt in
combinatie met vertragingen in de verbindingen tussen neuronen, zal dit een soort
kortetermijngeheugen geven. Signalen kunnen bijvoorbeeld in het brein rond blijven
cirkelen, waardoor de interne staat tijdelijk verandert. Elke input heeft invloed op latere
tijdstappen.
!
Verbindingen
De leerregel voor de verbindingen is wel te gebruiken voor kunstmatig leven. Door
associaties tussen neuronen die tegelijk vuren te maken kunnen de organismen
langetermijngeheugens krijgen, bovenop de simpele kortetermijngeheugens die ontstaan
door vertragingen in de synapsen.
!
39
!
Experiment: Kunstmatig Leven!
!
!
Het is de bedoeling dat met het maken van deze simulatie de hoofdvraag is beantwoord :
Hoe maak je kunstmatig leven met kunstmatige neurale netwerken? De simulatie moet wel
aan een aantal eisen voldoen:
!
-Snelheid Evolutie is, zoals ondertussen wel bekend is, een zeer langzaam process. Ik
heb geen supercomputer tot mijn beschikking, het moet daarom redelijk snel zijn op een
normale desktop computer. Het moet mogelijk zijn de simulatie te versnellen zodat er
binnen een aantal uur resultaten te zien zijn. Deze simulatie is nog een stuk ingewikkelder
dan de evolutie simulatie hiervoor dus zal het nog langer duren voordat er succesvolle
strategieën ontwikkeld worden.
-Evolutie van lichamen Ten tweede is het de bedoeling dat de lichamen van de agents
tegelijk met de hersenen kunnen evolueren.
-Obstakels Ook moet de omgeving kunnen variëren door obstakels toe te voegen.
-Vrije evolutie In plaats van een evolutionair algoritme moet er ook de mogelijkheid
komen voor vrije evolutie. Dit houdt in dat de agents zelf kunnen bepalen wanneer ze zich
splitsen/voortplanten.
-Grote populatie Om hieraan te voldoen moet de simulatie een redelijk grote populatie
aankunnen. Een te kleine populatie maakt de kans groter dat een soort uitsterft. Als de
agents zichzelf voort kunnen planten kan er ook in het midden van de wereld een
scheidingswand geplaatst worden zodat de agents aan beide kanten verschillende
eigenschappen zullen ontwikkelen.
!
De wereld!
!
Een belangrijke vereiste is dat de simulatie snel is. Dit is lastig aangezien de populaties
ook groter zijn en omdat het aantal objecten in de wereld veel groter is dan in de vorige
simulatie. Om te kijken of objecten elkaar overlappen werd er in de vorige simulatie voor
elk object gekeken of er overlap was met een ander object in de wereld. Het aantal
berekeningen om dit te doen nam dus kwadratisch toe, omdat voor elk object de afstand
naar elk ander object berekend moest worden. Om het aantal berekeningen te beperken
wordt er voor deze simulatie gebruik gemaakt van een grid. De wereld is opgedeeld in een
aantal rechthoekige cellen. Elke tijdstap wordt er voor elk beweegbaar object in de wereld
gekeken in welke cel hij hoort, deze cellen houden een lijst bij van alle objecten die ze
bevatten. Als er nu gekeken moet worden of een object met andere objecten overlapt
wordt alleen de afstand tot de objecten die in dezelfde cellen als dit object zit gekeken. Dit
zorgt er voor dat het aantal berekeningen voor overlappingen niet kwadratisch toeneemt
als het aantal objecten toeneemt. Om barrières te bouwen heb ik ook een optie gemaakt
voor een cel om gevuld te zijn. Een gevulde cel is te zien als een blauw vierkantje. De
kleur blauw is gekozen zodat de agents beter onderscheid kunnen maken tussen muren
en de overige objecten.
40
!
Alle dynamische objecten in de wereld bestaan uit cirkels. De cirkels bewegen volgens de
natuurkundige wetten. Ze hebben een snelheidsvector en een positievector. En als er een
dynamisch object met een ander object (statisch of dynamisch) in contact komt, zal er een
botsing plaatsvinden. De botsing is inelastisch, dat wil zeggen dat ze niet terugstuitten.
Dit zorgt er voor dat dynamische objecten niet door de obstakels heen kunnen. De planten
kunnen aan elkaar groeien door middel van veren. Dit is bedoeld om realistische
plantengroei mogelijk te maken.
!
Linksboven is ook de tijd te zien. T staat voor ticks, een tick is één zestigste van een
seconde. Daarna seconden, minuten, uren en dagen. De simulatie kan versneld worden
zodat je niet daadwerkelijk een dag hoeft te wachten voordat er een dag aan simulatietijd
verstreken is.
!
zintuigen!
!
In plaats van een vector richting het dichtstbijzijnde voedsel en andere agent, krijgt elke
agent nu beschikking over onder andere ogen. Om objecten zichtbaar te maken voor de
agents beschikt elk object nu over een materiaal. Het materiaal bepaalt de fysieke
eigenschappen van een materiaal. Eén van die eigenschappen is de kleur. De kleur
bestaat uit een rood, groen en blauw kanaal. Ogen bepalen wat ze zien door lichtstraal te
trekken en te kijken of er een object, zoals een andere agent, plant of gevulde cel, overlapt
met deze lichtstraal. Verder hebben ze ook nog tastzintuigen in elk lichaamsdeel. Deze
geven een 1 als ze iets aanraken.
!
Lichamen!
!
De lichamen van de agents bestaan uit een centraal lichaamsdeel dat verantwoordelijk is
voor de beweging, met daaraan een aantal andere lichaamsdelen verbonden. De
besturing is bijna hetzelfde als in de vorige evolutie simulatie. De agent kan ronddraaien
en vooruit bewegen. Alleen het centrale lichaamsdeel is een dynamisch object. De overige
lichaamsdelen bewegen met dit lichaamsdeel mee. Ik heb er voor gekozen om niet het
hele lichaam dynamisch te maken omdat de natuurkunde dan meteen een stuk
ingewikkelder wordt. Niet alleen om te begrijpen, maar ook voor de computer. Dit kost veel
meer berekeningen waardoor de simulatie trager zal worden. Er wordt wel gekeken of de
verbonden lichaamsdelen overlappen met andere objecten in de wereld, aangezien in elk
lichaamsdeel een tastzintuig zit.
!
Er zijn op dit moment vier soorten lichaamsdelen :
1. Gewone lichaamsdelen Het centrale lichaamsdeel is altijd deze soort. Aan dit
lichaamsdeel kunnen meer lichaamsdelen verbonden worden.
2. Monden De mond wordt bestuurt door het brein. Een agent kan zelf bepalen hoe veel
hij eet. De snelheid waarmee een agent eet is in de simulatie te zien als het heen en
41
weer bewegen van de mond. Sneller heen en weer bewegen betekent dat er veel in
een korte tijd gegeten wordt. Sneller eten kost wel meer energie.
3. Ogen De ogen van de agents sturen 3 richtstralen af met een hoek van
11 graden tussen elke lichtstraal. Elke lichtstraal heeft een beperkte lengte (40
eenheden)
4. Angels Een angel kan schade bij andere agents aanrichten. Dit zal ten kosten gaan
van de gezondheid van de aangevallen agent waardoor hij sneller dood gaat. Deze
functie zal gebruikt worden zodra carnivoren geïmplementeerd zijn.
!
Hersenen!
!
Voor dit experiment wordt een recurrent neural network gebruikt. De overeenkomst van dit
netwerk met het hopfield netwerk is dat het recurrente verbindingen heeft. De
verbindingen in het gebruikte netwerk zijn echter niet symmetrisch. De neuronen zelf zijn
gewone sum and squash neuronen, met de sigmoid functie als activatie functie. De
synapsen in dit model hebben ook een extra eigenschap. Naast een gewicht hebben ze
ook een vertraging. Deze vertraging ligt tussen de 1 en 12 tijdstappen. Op deze manier
kan een signaal in het netwerk nog een tijd blijven rondcirkelen als een soort geheugen en
kunnen acties over een bepaalde tijd plaatsvinden. De agents kunnen nu op input van een
paar tijdstappen terug reageren. Het netwerk heeft een input laag, een verborgen laag en
een output laag. Neuronen in de verborgen laag kunnen verbindingen aangaan met
andere neuronen in de verborgen laag en neuronen in de input laag en neuronen in de
outputlaag met de verborgen laag. Verder kunnen neuronen niet aan zichzelf verbinden.
Door op een agent te klikken is linksboven in het scherm het volledige brein met de
verbindingen te zien. Met van onder naar boven : inputlaag, verborgen laag en outputlaag.
De lichtheid van een neuron is zijn huidige output. De synapsen zijn groen voor positief
(excitatory) en rood voor negatief (inhibitory). De dikte geeft de sterkte aan.
!
lichaam genotype!
!
Het genotype van een agent bestaat deze keer uit het lichaam en de opbouw van de
hersenen. Deze hebben beide hun eigen representatie. Het genotype van de lichamen ziet
er ongeveer hetzelfde uit als het gebruikte genotype in de simulatie van Karl Sims. Er zijn
een aantal recursief aan elkaar verbonden nodes. Een node moet een lichaamsdeel
voorstellen. Dit kan een rood bolletje zijn, of een onderdeel met een speciale functie. Elke
node bevat onder andere een getal dat aangeeft wat het type. Zo kan het een gewoon
lichaamsdeel zijn (rood bolletje), een mond, een oog of een angel. Een node kan
verbindingen maken met andere nodes. Er kan geen lichaamsdeel vastgemaakt worden
aan ogen, angels of monden. Alleen aan gewone lichaamsdelen. Elke verbinding heeft
een variabele die aangeeft onder welke hoek hij vast zit aan het vorige lichaamsdeel, hoe
groot het is, wat de afstand is tot het vorige lichaamsdeel en of het gespiegeld is. Als een
verbinding gespiegeld is, zal alles na die verbinding gespiegeld zijn. Dit moet het ontstaan
van symmetrische lichaamsdelen bevorderen.
!
42
!
Brein genotype!
!
Het genotype van het brein was één van de lastigste onderdelen om te ontwerpen. De
grootte van het brein moet kunnen veranderen en dezelfde gedeeltes in het genotype
moeten bij elke agent overeenkomen, zodat de genen met crossover gemengd kunnen
worden. Hierom heb ik gekozen om het grootst mogelijke brein op te slaan waarbij
gedeeltes uit kunnen staan. De verborgen laag bestaat uit een vector (lijst) van nullen en
éénen waarbij een nul uit betekent en een één aan. Of de neuronen voor de input en
output laag uit of aan staan wordt niet expliciet in het genotype opgeslagen, aangezien dit
van de sensoren en monden en angels afhangt. De verbindingen tussen al deze neuronen
worden opgeslagen in 4 matrixen. Twee matrixen geven verbindingen tussen de
verborgen en inputlaag weer en de andere twee tussen de output en verborgen laag. De
ene matrix slaat alleen nullen en éénen op en bepaalt zo op dezelfde manier als voor de
neuronen of deze verbinding bestaat. De andere matrix slaat een waarde tussen de -12 en
12 op voor de sterktes van deze gewichten. Voor alle sensoren zijn er speciale gebieden
in het genotype aangegeven die de verbindingen voor deze input- of outputneuronen
opslaan. Het genotype begint dus met het grootst mogelijke brein, en zet voor het bouwen
van het brein alle gedeeltes uit die niet van toepassing zijn voor deze agent.
!
Inputs!
!
De agents hebben op dit moment twee vaste inputs en twee die in grootte variëren :
-Gezondheid Eén waarde die de gezondheid van de agent weergeeft. Dit is een getal
tussen de 0 en 1. Een 1 staat voor de maximale gezondheid, een 0 voor dood.
-Willekeurig Eén neuron die willekeurige waarden geeft. Deze zorgt er voor dat het
gedrag niet volledig van de huidige input afhangt.
-Tastsensor Voor elk lichaamsdeel één input die aangeeft of dit onderdeel iets aanraakt,
een tastzintuig. Dit is een 1, als dit lichaamsdeel iets aanraakt en anders een 0. Er wordt
geen onderscheid tussen muren, planten, of andere agents gemaakt.
-Visuele input Met 3 lichtstralen per oog. Voor elke lichtstraal zijn dit 3 waarden. De
intensiteit van rood, groen en blauw. Dit is voor elke intensiteit een waarde tussen de nul
en de één. Dit is ook de reden dat de 3 belangrijkste objecten, de muren, de agents en de
planten, blauw, rood en groen zijn. Zo is het makkelijk door de agent te onderscheiden.
!
Metabolisme !
!
De agents moeten voedsel blijven eten om te overleven. Agents die meer eten zullen
langer overleven en meer nageslacht krijgen. Eten verhoogt de energie van de agents, als
deze op is zullen ze sterven. De snelheid waarmee een agent energie verbruikt is
gebaseerd op hoe ingewikkeld het is. Met ingewikkeld wordt bedoelt: grote breinen en veel
lichaamsdelen. Een agent moet zo efficiënt mogelijk zijn om langer te leven en meer
nageslacht te krijgen. Overbodige synapsen, neuronen en lichaamsdelen zullen daarom
door evolutie verdwijnen. Dit is niet alleen gedaan omdat het ook in de natuur voorkomt.
43
Het vermindert ook het aantal berekeningen dat gedaan moet worden, waardoor de
simulatie sneller wordt.
!
Voortplanting!
!
Als een agent een bepaalde hoeveelheid energie heeft verzameld, bijvoorbeeld door het
verzamelen van planten, kan hij zich voortplanten. Op dit moment kan dit alleen nog
geslachtsloos. Hierbij genereert hij een kopie van zichzelf met een aantal mutaties.
!
Verwachtingen!
!
-Symmetrie Vanwege de structuur van de genen voor het lichaam verwacht ik dat er veel
symmetrie zal ontstaan. Het komt veel voor in de natuur, dus als het goed is heeft het
organismen evolutionair een voordeel gegeven en zal het ook in deze simulatie moeten
ontstaan.
-Meerdere soorten Omdat de wereld bij deze simulatie een stuk groter is, bestaat de
mogelijkheid dat er meerdere soorten tegelijkertijd leven.
-Convergente evolutie Dit is een fenomeen in de biologie waarbij verschillende soorten
dezelfde oplossing vinden voor een probleem. Het zou kunnen dat steeds dezelfde
vormen lichamen in elke simulatie ontstaan of dat de strategie om voedsel te vinden voor
elke soort hetzelfde is.
-Groter brein Voor een ingewikkeldere omgeving. Wanneer de omgeving of de agent zelf
ingewikkelder wordt, zal hij waarschijnlijk een groter brein krijgen zodat hij passend op
deze omgeving kan reageren. Een agent met ogen heeft veel meer inputneuronen en zal
dus een grotere verborgen laag nodig hebben om deze inputs te verwerken.
!
Het is erg lastig om het gedrag van evolutie te voorspellen. Verdere experimenten zullen
gebaseerd worden op waarnemingen als de simulatie werkt.
!
Parameters!
!
De eerste opgave om evolutie te laten werken is het vinden van de juiste parameters.
Vooral in deze simulatie was dit erg lastig, aangezien het een vrij ingewikkelde wereld is.
Het programma bevat honderden parameters die allemaal de juiste waarden moeten
hebben. Gelukkig bleek het dat de meeste parameters niet veel invloed hebben op het
eindresultaat. Zolang ze ongeveer de juiste waarden hebben zal de simulatie goed
verlopen. De parameters die de meeste invloed uitoefenen zijn :
!
-Breedte en Hoogte van de wereld
-Aantal planten
-Snelheid waarmee planten groeien
-Mutatiesnelheid en kans op mutatie van lichamen
-Mutatiesnelheid en kans op mutatie van breinen
-Minimale aantal agents
44
-Levensduur van agents
-Invloed van hersen- en lichaamsgrootte op metabolisme
-Voortplantingssnelheid
-Maximale levensduur
-Grootte van het brein
-Gemiddeld aantal synapsen per neuron bij een nieuw genotype
-Het bereik van synaptische sterktes
-De verdeling van deze synapsen bij een nieuw genotype
-De formule voor het energieverbruik van een agent
!
Het kan verschrikkelijk frustrerend werk zijn om de juiste waarden voor deze paramaters te
vinden. Hier komt nog eens bovenop dat voor elke nieuwe toegevoegde functie vaak
nieuwe waarden gezocht moeten worden. Ik heb een poging gedaan om een aantal van
deze parameters met de organismen mee te laten evolueren, maar dit creëerde alleen
maar meer parameters.
!
Om er voor te zorgen dat de beste soort niet uitsterft, wordt een lijst van de beste 10
agents bijgehouden. Hierbij wordt gebruik gemaakt van een fitness functie. De fitness van
is het totale aantal voedsel dat de agent in zijn leven heeft verzameld. Als de populatie
onder het minimum aantal komt, bestaat er een kans dat één van de beste agents
toegevoegd zal worden. De selectie uit de lijst verloopt volgens roulette selectie, net zoals
in het experiment met de feedforward netwerken.
!
Waarnemingen!
!
Met de tot nu toe besproken implementatie heb ik 3 simulaties laten draaien met elk 3
dagen simulatietijd. Dit is niet de tijd in de echte wereld, maar de tijd die in de simulatie
verstreken is. De gebruikte parameters aren als volgt :
!
Wereld!
Cel grootte : 6x6
wereld grootte in cellen : (60,40)
Kans nieuwe plant : 0.03
Kans plant groeit : 0.005
!
Mutaties
kans lichaamsdeel verandering : 0.01
kans synapse toevoegen/verwijderen : 0.003
synapse mutatiesnelheid : 0.1
kans neuron toevoegen/verwijderen : 0.00024
!
Agents
recursie limiet van lichamen : 3
maximaal aantal nodes lichamen : 8
45
maximaal aantal verbindingen per lichaamsdeel : 3
minimale populatie : 20
energie per voedsel eenheid : 15
begin energie : 4000
energie voor voortplanting : 400
energieverbruik bij eten : 0.25
formule energieverbruik : 0.7 + (# ogen) * 0.04 + (# lichaamsdelen) * 0.02
+ (# neuronen) * 0.003 + aantal synapsen *0.001
maximale levensduur : 4000 ticks
kans dat een nieuwe agent uit de lijst van beste agents komt : 0.1
!
1e simulatie
De meest succesvolle agents in deze simulatie wisten voedsel te verzamelen zonder ogen
te gebruiken. Ze waren vooral in de breedte gegroeid zodat ze zo veel mogelijk planten
konden voelen. Als een agent een plant voelden, bewogen ze er in cirkels omheen met
één van hun monden als middelpunt. Zodra ze de rand van de wereld aanraakten, keerde
ze direct om. Na 1 dag hadden ze geleerd om alleen te eten zodra ze een stuk plant
aanraakten om energie te besparen. Na 1 dag was het gemiddelde aantal neuronen in de
verborgen laag 20, na 2 dagen 19 en na 3 dagen 18. Ik vermoed dat deze soort geen
groot brein nodig heeft omdat het geen ogen heeft en dat het aantal neuronen nog verder
zou dalen als de simulatietijd langer was. De soort was ontstaan na 4 uur en 42 minuten.
De bestudeerde agent was de 7000e generatie.
!
!
!
!
!
!
!
De evolutie van de agents na 1 dag, 2 dagen en 3 dagen
2e simulatie
Deze agent vond na ongeveer 5 uur dezelfde strategie als de agent in
simulatie 1. Dit was de 700ste generatie. In deze simulatie kwam het
vaak voor dat de generatie terug liep. Na de drie dagen zat hij nog
steeds in generatie 700. Dit komt doordat de simulatie steeds oude
agents in de populatie terug laat komen als de soort uit dreigt te
sterven. Deze soort was dus blijkbaar niet zo succesvol en stierf
steeds uit, waardoor de meest succesvolle soort (generatie 700) steeds terug kwam. Dit is
iets dat in volgende versies van de simulatie opgelost moet worden. Iets dat ook steeds
voorkomt is dat de hoeveelheid planten en de hoeveelheid agents in tegenfase
46
schommelt. Als er veel planten zijn en weinig agents, zullen ze veel planten eten waardoor
er minder planten en veel agents komen. Hierna is er een voedseltekort en sterft een groot
deel van de populatie weer uit. Dit proces herhaalt zich totdat er een evenwicht tot stand
komt. Het voedsel wordt dan even snel opgegeten als dat het toegevoerd wordt. Bij dit
evenwicht zijn geen agents die heel veel voedsel eten, maar toch zijn ze beter in het
opsporen van voedsel dan agents in het begin van de simulatie, die misschien wel veel
voedsel wisten te vinden aangezien er veel meer aanwezig was. De hoeveelheid voedsel
die een agent verzameld is dus geen goede fitness functie. Dit kan in de volgende versie
van de simulatie misschien opgelost worden door de lijst van beste agents te wissen om
een bepaalde tijd.
!
3e simulatie
Deze keer ontstonden er eindelijk agents die ogen gebruikten. De agents wisten na
ongeveer 7 uur richting het voedsel te bewegen en alleen hun mond te gebruiken wanneer
er voedsel in de buurt was. Ze hadden op dit moment 3 monden, 1 oog en één angel (die
nog niets doet in deze versie). Ik heb deze simulatie nog een aantal dagen aan laten
staan, neuronen wisselden steeds tussen 16 en 17 door terugplaatsing oude agents tot ±
generatie 29000 en daarna 25000. Ook vermeden deze agents elkaar zodat ze een groot
oppervlak bestreken. Verder leek het er op dat na een lange tijd alleen nog de meest
essentiële lichaamsdelen overbleven.
!
!
!
!
!
!
!
Van links naar rechts : na één dag , na 3 dagen en na 19 dagen.
!
Ook in een aantal simulaties hierna naderde het aantal neuronen altijd naar 16 of 17. Ook
wanneer obstakels toe worden gevoegd. Zelfs agents die geen ogen gebruiken zullen na
een lange tijd 16 of 17 neuronen in de verborgen laag hebben. Dit klopt niet met het
vermoeden dat een complexere omgeving tot een groter brein zou leiden. Ook het aantal
synapsen nadert uiteindelijk voor elke agent naar ±300. Convergente evolutie komt wel
vaak voor. Agents die ogen gebruiken komen er na een lange tijd bijna altijd hetzelfde uit
te zien. Een oog in de richting waar ze naartoe bewegen en een mond op het centrale
lichaamsdeel, loodrecht op de richting van het oog.
!
Verdere uitbreidingen!
!
Om de omgeving nog ingewikkelder te maken heb ik de angels functioneel gemaakt zodat
de agents energie van een andere agent af kunnen halen (elkaar vermoorden). Deze
angel wordt door het brein bestuurd. Een agent kan op deze manier zelf besluiten hoe
veel energie hij van de andere agent afhaalt. Verder heb ik de mogelijkheid om kleur te
47
evolueren toegevoegd zodat ze hun eigen soort kunnen herkennen. Als een agent nu
sterft, laat hij een rood rondje achter, dat als het karkas te zien is. Dit karkas kan nu
opgegeten worden, zodat er carnivoren kunnen ontstaan. In het genotype heb ik een
variabele gemaakt die aangeeft hoe goed de agent vlees kan eten. Hoe hoger dit getal is,
hoe sneller hij vlees kan eten. Dit is een getal tussen de 0 en de 1, zodat carnivoren
geleidelijk kunnen ontstaan. Als een agent beter wordt in vlees verteren, zal hij minder
goed worden in planten verteren en omgekeerd. Aangezien vlees minder voorkomt en het
meer werk kost om vlees te krijgen, staat er een grotere beloning op vleeseten dan
planten eten. In de volgende simulatie is de eetsnelheid voor planten (1-vleeseetfactor)*17
en de eetsnelheid voor vlees : vleeseetfactor*120.
!
Naast de toevoeging van carnivoren, zijn ook een aantal van de vorige functies
aangepast. De lijst met 10 beste agents wordt nu elke 25000 ticks gewist om het probleem
op te lossen dat minder ontwikkelde agents steeds terug in de wereld kwamen. Ook
worden planten nu direct vervangen zodra ze zijn opgegeten, zodat de hoeveelheid
planten constant blijft.
!
Waarnemingen!
!
In deze simulatie ontstonden er al snel agents die richting de planten wisten te sturen. Na
ongeveer 4 uur leerden ze om snelheid te verminderen of zelfs helemaal te stoppen zodra
ze eten zagen. Ook ontstonden de eerste gedeeltelijke carnivoren. Op dezelfde manier
waarop ze planten aten, aten ze ook de lichamen van hun overleden soortgenoten. Na 3
dagen, begonnen ze elkaar te volgen in ringen, zodat ze de dode agents direct op konden
eten en ondertussen ook planten konden blijven eten. Ze waren rond de 30% carnivoor.
Na 5 dagen leek het alsof ze dit weer verleerd waren. Nu aten ze vlees en planten op
dezelfde manier, de meeste agents waren ongeveer 15% carnivoor. Ook werd het brein
steeds kleiner, de grootte van de verborgen laag varieerde nu zelfs tussen de 10 en 14
neuronen. Terwijl het gedrag ingewikkelder was. Opvallend is ook dat er in de hele
simulatie geen één keer gebruik is gemaakt van de angels. De carnivoren zijn tot nu toe
meer aaseters dan predatoren. Na 6 dagen en 13 uur werden muren toegevoegd. 6 Uur
later werden de agents dezelfde kleur als de muren en dit bleef zo. Deze keer nam het
aantal neuronen in de verborgen laag wel toe naar 17, maar het kan zo zijn dat dit aantal
in de loop van tijd weer naar beneden gaat. De strategie om voedsel te verzamelen bleef
ongeveer hetzelfde. De agents hadden een oog dat naar de zijkant stond en bewogen in
cirkels om het voedsel heen. Ze waren rond de 30% carnivoor. Hierna heb ik nog een
simulatie gedraaid en precies dezelfde patronen ontstonden. Zelfs de opbouw van de
lichamen was hetzelfde. Dit is dus een geval van convergente evolutie.
!
Het is nu wel duidelijk dat het vermoeden dat ingewikkeldere agents en omgevingen tot
grotere breinen zou leiden onjuist was. In het begin werd voorgesteld dat dit zou kunnen
komen doordat er eigenlijk maar een heel klein brein nodig is. Omdat grotere breinen meer
energie kosten, zullen alle onnodige delen verdwijnen door evolutie. Dit verklaart echter
48
niet waarom de breinen in deze versie dan nog kleiner zijn dan bij de vorige simpelere
versie. Terwijl het gedrag ingewikkelder wordt. Ik ben er nog steeds niet zeker van
waardoor dit komt.
!
Verdere toevoegingen!
!
Ik heb nog lang niet alles aan de simulatie toe kunnen voegen wat ik zou willen. Zo heb ik
nog steeds geen geslachtelijke voortplanting of een leerregel geïmplementeerd. Het
probleem met geslachtelijke voortplanting is dat agents daarmee zelf een partner moeten
zoeken, wat erg lastig is om te laten evolueren. Interacties tussen agents laten evolueren
bleek erg lastig te zijn, zo zijn er niet echt predatoren in de simulatie ontstaan. Ze bleven
meer soortgenoten volgen totdat er één stierf zodat deze kon worden opgegeten. De
angels worden nauwelijks gebruikt. Dit zal dus wel een betere strategie zijn.
!
Het was eigenlijk de bedoeling dat de simulatie spiking neural networks zou gebruiken.
Een biologisch realistischer model van neuronen die met impulsen werkt in plaats van een
getal. Hierbij hoorde ook nog een leerregel : Spike Time Dependend platicity. Ik heb hier
lang mee geëxperimenteerd, maar de netwerken werkten alleen maar als ik de parameters
precies goed had voor een brein van een bepaalde grootte. Dit ontstond eigenlijk nooit
door evolutie. Dit netwerk had ook nog eens veel meer neuronen nodig en kostte daardoor
veel meer berekeningen. Ik heb daarom besloten om uiteindelijk toch sum and squash
neuronen te gebruiken. Toch zou het wel mogelijk moeten zijn om een leerregel gebaseerd
op hebbian learning te maken voor deze simulatie, zodat agents ook tijdens hun leven nog
kunnen leren.
!
Is dit leven?!
!
Om te kijken of er ook daadwerkelijk leven gecreëerd is worden de eigenschappen van de
agents vergeleken met de biologische definitie van leven18.
!
1. Homeostase Het vermogen om het interne milieu constant te houden
De agents in deze simulatie vertonen geen homeostase omdat er niets is om constant te
houden. Een intern milieu is één van de dingen die geen direct invloed op het gedrag van
de agent hebben en is daarom weggelaten in dit versimpelde model. De binaire
representatie van het organisme in de computer is misschien wel als intern milieu te zien.
!
2. Leven vertoont organisatie en structuur
De agents zijn zeker gestructureerd opgebouwd uit bepaalde onderdelen. Zo is de
simulatie ontworpen.
!
3. Metabolisme of stofwisseling
18
Leven : http://nl.wikipedia.org/wiki/Leven
49
Er wordt gebruik gemaakt van een metabolisme, maar niet op dezelfde manier als in de
natuur. In de natuur wordt energie opgenomen en in een ander soort energie omgezet. In
deze simulatie wordt het energieverbruik gebruikt om de gebruikte computerkracht weer te
geven. Ondanks het feit dat de functie anders is, is dit zeker wel te zien als metabolisme
!
4. Groei: het proces van toename van grootte en complexiteit
Agents groeien niet tijdens hun leven. Het brein, de vorm en grootte van het lichaam
blijven constant. Groei komt echter wel voor over meerdere generaties. Maar de grootte en
complexiteit kan hierbij ook afnemen.
!
5. Er vinden aanpassingen plaats in structuren en gedrag.
Dit komt ook voor. De evolutie zou niet werken als dit niet het geval zou zijn.
!
6. Prikkelbaarheid, het kunnen reageren op stimuli.
De hersenen van de agents zorgen er voor dat ze op de omgeving kunnen reageren. Dit
komt bij dus wel voor bij de agents.
!
7. Voortplanting
Agents maken gemuteerde kopieën van zichzelf zodra ze genoeg energie hebben
verzameld. Ook dit komt dus voor.
!
Volgens deze definitie van leven is een agent uit deze simulatie dus niet volledig levend.
Het voldoet zeker niet aan punt 4 en alleen gedeeltelijk aan punt 1. Toch zouden de
meeste mensen een agent meer levend vinden dan een steen. Ik denk niet dat het zo
eenvoudig is om te zeggen of iets leeft of niet. Iets kan overduidelijk levend zijn zonder
aan een boel van deze vereisten te voldoen: een muilezel bijvoorbeeld. Deze kan zich niet
voortplanten. Maar ook zijn er objecten die veel van deze punten hebben, maar waarover
de meeste mensen het eens zijn dat ze niet leven, zoals vuur. Het is ook niet duidelijk of
het zin heeft om leven te definiëren. Leven is meer een concept dat door mensen is
bedacht. Het is mogelijk om de simulatie zo aan te passen dat de agents wel aan al deze
eisen in de lijst voldoen. Het is niet moeilijk om de grootte toe te laten nemen tijdens een
leven. Het probleem is dat dit geen doel zou hebben in de simulatie. Op dezelfde manier
zou er een bloedsomloop gesimuleerd kunnen worden zodat er homeostase plaats kan
vinden. Dit maakt de simulatie alleen maar onnodig ingewikkelder.
!
!
!
!
!
!
!
!
!
50
Conclusie!
!
Hoe maak je kunstmatig leven met kunstmatige neurale netwerken?!
!
In dit PWS is één manier besproken om kunstmatig leven te maken met neurale
netwerken. Er zijn veel verschillende manieren om dit te bereiken, maar in dit PWS heb ik
besloten om een recurrent neuraal netwerk te gebruiken met sum and squash neuronen.
!
Eigenschappen van de feedforward netwerken (multilayer perceptron) die gebruikt werden
zijn de neuronen. De multilayer perceptron gebruikt de sum and squash neuronen die in
alle evolutie simulaties zijn gebruikt. Het zijn lang niet de meest realistische neuronen,
maar omdat ze zo simpel zijn en wel als realistisch zijn te interpreteren, is er wel voor deze
soort neuronen gekozen. De structuur komt in de natuur alleen maar op bepaalde
plaatsen voor, zoals bij reflexen. Ook hebben de recurrente netwerken veel voordelen
boven de feedforward netwerken, daarom is er niet voor de feedforward architectuur
gekozen. De eerste evolutie simulatie gebruikte een feedforward neuraal netwerk om de
principes van kunstmatige evolutie te testen met simpelere omstandigheden. Toch is er
uiteindelijk voor gekozen om geen evolutionair algoritme te gebruiken, maar vrije evolutie
met geslachtsloze voortplanting. Zo kunnen er twee verschillende soorten in de simulatie
ontstaan door een scheidingswand in het midden van de wereld te plaatsen.
!
Er is gekozen voor een recurrent neuraal netwerk, vooral omdat dit in de natuur veel
voorkomt. Na het hoofdstuk over Hopfield netwerken werd het duidelijk dat recurrente
neurale netwerken een aantal voordelen hebben boven een feedforward architectuur.
Signalen kunnen in zo’n netwerk ook nog een tijd rond blijven cirkelen, al helemaal als
elke verbinding ook nog een vertraging heeft. Helaas is het nog niet gelukt om gebruik te
maken van de leerregel van het Hopfield Netwerk. De leerregel voor hopfield netwerken
kan nog gebruikt worden om agents met behulp van Hebbian learning tijdens hun leven te
laten leren. Dit is iets voor verder onderzoek.
!
De hoofdvraag Hoe kunnen kunstmatige neurale netwerken gebruikt worden om
kunstmatig leven te maken? is beantwoord, namelijk met behulp van evolutie. Neurale
netwerken zijn zeker een goede kandidaat om kunstmatig leven te maken. In combinatie
met evolutionaire algoritmes zijn ze zeer effectief. Dit kunstmatige leven kan gebruikt
worden om onderzoek te doen naar bijvoorbeeld evolutie. Hypothesen over evolutie,
kunnen op deze manier getest worden. Zoals besproken in het hoofdstuk over
kunstmatige evolutie is het tegelijk evolueren van lichamen en de bijbehorende breinen
een goede manier om robots te ontwerpen. Dit is wat de eindsimulatie deed. Ook zijn
evolutionaire algoritmes nog voor veel andere onderwerpen te gebruiken. De agents
zouden bijvoorbeeld ook de taak kunnen krijgen om de beurskoers te voorspellen.
!
51
Er is geconcludeerd dat wat er gemaakt is, volgens de biologische definitie van leven, niet
levend is. Toch zouden veel mensen zeggen dat het meer levend is dan bijvoorbeeld een
steen, dus is het doel om kunstmatig leven te maken wel gelukt.
!
!
52
Appendix A!
!
Afleiding van Backpropagation Algoritme
!
Een belangrijk detail om rekening mee te houden, is dat de output van een neuron in de
multilayer perceptron eerst door een activatie functie gaat zodat het netwerk niet-lineaire
functies kan benaderen, zoals eerder besproken is. Deze functie moet aan een aantal
eisen voldoen. Ten eerste moet hij niet-lineair zijn. Dit is het hoofddoel van de activatiefunctie. Ten tweede moet hij continu en overal differentieerbaar zijn. Dit is nodig voor de
gradient descent, het gaat hierbij om hellingen berekenen. Aangezien het geen model van
iets uit de natuur is, kan je elke functie kiezen die aan deze eisen voldoet, maar het is
natuurlijk beter als de functie ook nog eenvoudig is en een paar eigenschappen heeft die
het rekenwerk makkelijker maken.
Er is daarom gekozen voor de zogenaamde sigmoidfunctie :
!
!
!
!
!
Deze functie heet de sigmoidfunctie omdat hij de vorm van een omgevallen S heeft. Een
van de redenen dat er voor deze functie is gekozen is dat deze vorm lijkt op een continue
versie van de stap functie die werd gebruikt in andere neuronmodellen. Een andere
eigenschap is dat de helling op elk punt bepaald wordt door :
!
!
!
!
Dat de helling is te omschrijven door de functie zelf maakt het rekenwerk later een stuk
eenvoudiger. Ook voor de computer is deze eigenschap handig. Eén keer aftrekken en
vermenigvuldigen kost veel minder berekeningen dan opnieuw een exponent uitrekenen.
!
!
!
!
!
!
!
!
!
!
!
!
53
Een standaard feedforward netwerk ziet er bijvoorbeeld als volgt uit :
"
Figuur 1
De inputs ξ worden vermenigvuldigd met de bijbehorende gewichten ω en bij elkaar
opgeteld. Deze gaan door de activatiefunctie σ(x) en vormen de output (Ο). De kleine
letter theta (θ) is de bias. De bias is de vervanger van de drempelwaarde. Het is een
gewone neuron die net zoals alle andere neuronen verbonden is met een variabel
gewicht. De bias geeft altijd als output een 1. De bias kan daarom weergegeven worden
als een enkel getal, de waarde van dit gewicht. De zorgt er op deze manier ook voor dat
een netwerk ook een signaal geeft als alle inputs nul zijn.
!
De totale formule voor de output van het netwerk in figuur 1 is dus :
!
!
!
!
Om het backpropagation-algoritme af te leiden zijn de volgende gegevens nodig :
!
Xjl
Input naar j uit laag l (outputs van neuronen uit vorige laag
vermenigvuldigt met de gewichten).
ωij
Gewicht van laag l-1 neuron i naar laag l neuron j
σ(x)
Sigmoid functie
l
θj
Bias van neuron j in laag l
l
Oj
Output van neuron j in laag l
tj
Verwachte waarde voor neuron j in de output laag
!
!
!
!
!
!
!
!
!
54
!
De error wordt als volgt berekend:
!
!
!
!
!
!
Ook deze vergelijking is gekozen om zijn eigenschappen. Het verschil tussen de output en
de verwachte waarde kan negatief of positief zijn, daarom wordt deze term gekwadrateerd.
Nu tellen grote verschillen zwaarder en is de uitkomst nooit negatief zodat positieve
verschillen de negatieve verschillen niet opheffen. Ook van de error moet de helling
bepaald worden, de 1/2 zal dus wegvallen bij het differentiëren. Het doel is nu om gradient
descent te gebruiken om de helling te berekenen ten opzichte van een gewicht ωjk. De
eerste stap is ∂E/∂ωjk vinden voor de outputlaag.
!
!
!
!
!
Het gaat hier om het gewicht van neuron j in de vorige laag J naar de neuron k in
outputlaag K. De k in de som varieert voor elke k in de outputlaag. Aangezien de output
van een neuron k niet verandert als deze neuron niet aan weight ωjk verbonden is, is de
afgeleide hiervan 0. De som kan dus vervangen worden door (Ok - tk)2. tk is een constante,
de afgeleide van de vergelijking hierboven wordt dus : (Ok - tk)2 ∂/∂ωjk(Ok) .
De output van k kan volgens de definitie geschreven worden als σ(Xk) en de afgeleide van
dit hele stuk is :
!
!
!
!
!
Omdat Xk gelijk is aan de output van neuron j ( Oj ) keer het gewicht van j naar k kan de
afgeleide van Xk ten opzichte van ωjk geschreven worden als Oj, de output van neuron j.
Verder kan σ(Xk) volgens de definitie weer geschreven worden als Ok. ∂/∂ωjk wordt nu
dus :
!
!
!
!
!
!
55
Nu defineren we δk als (Ok - tk)Ok(1-Ok) en wordt de formule hierboven Oj δk
Dit is de afgeleide van de error voor een output laag.
!
Voor de verborgen lagen geldt dezelfde som voor de error, maar nu voor het gewicht van
een neuron i in een verborgen laag naar j.
!
Door te differentiëren wordt dit :
!
!
!
!
!
!
De output van k vervangen we nu door σ(Xk) en volgens dezelfde methode als bij de
output wordt dit :
!
!
!
!
!
wordt volgens de kettingregel :
!
is gelijk aan ωjk en omdat
niet afhankelijk is van de waarde van k
is het een constante en kan hij buiten de som gehaald worden :
!
!
!
!
!
Nu hoeft alleen
!
nog berekend te worden.
Oj = σ(Xj) dus dit wordt
!
!
!
!
!
En aangezien de afgeleide van de input van neuron j Xj , ten opzichte van het gewicht van
neuron i naar neuron j ( ωij ), gelijk is aan de output van neuron i ( Oi ), wordt dit Oj(1-Oj)Oi.
De volledige vergelijking is nu :
56
!
!
!
!
!
(Ok - tk)Ok(1-Ok) is gelijk aan de δk die we eerder gedefineerd hadden, dus dit wordt :
!
!
!
!
!
En op dezelfde manier als bij de outputlaag defineren we
!
!
!
!
!
zodat
!
Nu hebben we dus :
!
!
!
!
!
!
(1)
!
!
Voor k in een output laag K.
!
!
!
(2)
!
voor j in verborgen laag J
!
Nu hoeft alleen de afgeleide voor het gewicht dat aan de bias is verbonden nog berekend
te worden. Omdat de bias als het ware een neuron is die altijd als output 1 geeft, is dit met
deze vergelijkingen heel makkelijk te bereken. Door dit in te vullen in (1) of (2) krijg je :
!
57
!
!
!
voor een laag J
!
Het volledige algoritme gaat nu als volg :
!
1.
2.
3.
4.
en
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
58
Geef het netwerk input en genereer een output volgens de regels van een
feedforward network
voor elke output neuron bereken δk
voor elke verborgen neuron in een verborgen laag J bereken δj
Voor elke neuron in een laag l, pas de gewichten aan volgens :
!
,
!
!
!
,
!
Appendix B !
!
Om te bewijzen dat een Hopfield netwerk altijd richting een aantrekker beweegt maakt
John Hopfield gebruik van een energie functie. Deze functie geeft een enkele waarde die
de ‘energie’ weergeeft voor het hele netwerk. Dit lijkt op de Error functie in
backpropagation. Je kan laten zien dat de energie van een netwerk met elke verandering
van de staat van een neuron lager wordt. Ofwel, met elke update wordt de energie van het
netwerk lager. De energie stopt uiteindelijk met lager worden zodra een minimum is
bereikt.
"
De energie is gelijk aan de som van alle gewichten vermenigvuldigt met de output van de
neuronen waar ze aan zijn verbonden en de som van alle drempelwaarden
vermenigvuldigt met de staat van de bijbehorende neuron19. De factor -(1/2) staat er
omdat de term Wijxixj dubbel wordt geteld aangezien er geldt Wjk = Wkj omdat de
gewichten symmetrisch zijn. Om te bewijzen dat de energie altijd daalt bij elke update van
een neuron, schrijf je de energie functie bij een neuron Xk waarvan de staat verandert als
volgt:
"
"
"
De dubbele som valt weg omdat alle verbindingen die niet met neuron k verbonden zijn
gelijk blijven. Deze zullen tegen elkaar wegvallen. De laatste term hierin is gelijk aan de
output van een neuron, alle gewichten vermenigvuldigt met de bijbehorende output min de
drempelwaarde. Als we dit vervangen door ek wordt dit:
!
"
!
19
R. Rojas: Neural Networks
59
Als de output van deze neuron niet verandert was na deze stap, dan is (xk - x’k) gelijk aan
nul en blijft de energie hetzelfde. Als de output van de neuron eerst -1 was en nu 1 is, dan
is de uitkomst van (xk - x’k) negatief en zal ek positief zijn. Het resultaat zal dan positief zijn,
wat betekend dat het verschil in energie negatief is. Als de output van de neuron eerst 1
was en nu -1 is, zal (xk - x’k) positief zijn en ek negatief. Het verschil in energie is nu dus
weer negatief. Wat de verandering van de staat van de neuron na updaten ook is, de
energie van het netwerk zal altijd afnemen of gelijk blijven. Aangezien het aantal mogelijke
staten van het netwerk beperkt is, zal de staat dus altijd naar een aantrekker bewegen.
!
!
!
!
!
!
!
!
!
60
!
Bronvermelding!
!
!
Warren S. McCulloch and Walter H. Pitts, A Logical Calculus of Ideas Immanent in
Nervous Activity
URL : http://www.cse.chalmers.se/~coquand/AUTOMATA/mcp.pdf
!
Analysis of Evolved Sensory-Motor Controllers
URL : http://alife.org/sites/default/files/collections/ECAL93-0192-0204-Cliff.pdf
!
P. Husbands, I. Harvey, D. Cliff, and G. Miller. Artificial Evolution: A New Path for Artificial
Intelligence?
URL : http://www.sussex.ac.uk/Users/inmanh/brain_cog.pdf
!
artificial intelligence history (4 maart 2015) :
URL : http://web.csulb.edu/~cwallis/artificialn/History.htm
!
Automated Antenna Design with Evolutionary Algorithms
URL : http://ti.arc.nasa.gov/m/pub-archive/1244h/1244%20(Hornby).pdf
!
The Backpropagation Algorithm (4 maart 2015)
URL : http://page.mi.fu-berlin.de/rojas/neural/chapter/K7.pdf
!
Yves Chauvin, David E Rumelhart, Backpropagation: theory, architectures, and
applications
!
Lee Graham Purdue Skeptics Society Presentation Part 5 (4 maart 2015)
Darwin's Algorithm: Building Creatures in Simulation
URL : https://www.youtube.com/watch?v=U5GqpH6EZvo
!
Dendrite (4 maart 2015)
URL : http://en.wikipedia.org/wiki/Dendrite
!
DNA
URL : http://en.wikipedia.org/wiki/DNA
!
Evidence for Evolution : the Peppered Moth
URL : http://www.truthinscience.org.uk/tis2/index.php/evidence-for-evolutionmainmenu-65/127-the-peppered-moth.html
!
William W. Lytton, From Computer to Brain (Springer Verlag 2002)
Genetic Algorithms (4 maart 2015)
61
URL : http://www.ai-junkie.com/ga/intro/gat2.html
!
Genetic and Evolutionary Algorithms Gareth Jones
URL : http://www.wiley.com/legacy/wileychi/ecc/samples/sample10.pdf
!
Hebbian Theory (4 maart 2015)
URL : http://en.wikipedia.org/wiki/Hebbian_theory
!
Hopfield Networks (4 maart 2015)
URL : https://www.youtube.com/watch?v=gfPUWwBkXZY
!
Inhibitory Neurons Keeping the Brains Traffic in Check (4 maart 2015)
URL : http://knowingneurons.com/2014/11/05/inhibitory-neurons-keeping-the-brains-trafficin-check/
!
Leven
http://nl.wikipedia.org/wiki/Leven
!
McCulloch-Pitts Neurons (4 maart 2015)
URL : http://www.mind.ilstu.edu/curriculum/modOverview.php?modGUI=212
!
Mechanisms : the processes of evolution (4 maart 2015)
URL : http://evolution.berkeley.edu/evolibrary/article/evo_14
!
Multilayer Perceptrons (4 maart 2015)
URL : https://www.hiit.fi/u/ahonkela/dippa/node41.html
!
Myeline (4 maart 2015)
URL : http://nl.wikipedia.org/wiki/Myeline
!
Neural Networks (4 maart 2015)
URL : http://natureofcode.com/book/chapter-10-neural-networks/
!
R. Rojas: Neural Networks, Springer-Verlag, Berlin, 1996:
URL : http://page.mi.fu-berlin.de/rojas/neural/chapter/K13.pdf
!
Neuroglia (4 maart 2015)
URL : http://en.wikipedia.org/wiki/Neuroglia
!
Neuron (4 maart 2015)
URL : http://en.wikipedia.org/wiki/Neuron
!
Neurotransmitter
62
URL : http://nl.wikipedia.org/wiki/Neurotransmitter
!
!
Open worm project
http://www.artificialbrains.com/openworm#nervous-system
!
Bekir Karlik, Performance Analysis of Various Activation Functions in Generalized MLP
Architectures of Neural Networks
URL : http://www.cscjournals.org/manuscript/Journals/IJAE/volume1/Issue4/IJAE-26.pdf
!
Eric R. Kandel, The principles of Neural Science Fourth Edition (2012)
!
Red Queen Hypothesis (4 maart 2015)
URL : http://en.wikipedia.org/wiki/Red_Queen_hypothesis
!
Gordon M. Shepherd, The Synaptic Organisation of the Brain Fifth Edition (Oxford
university press 2004)
!
What is an evolutionary algorithm :
URL : http://www.cs.vu.nl/~gusz/ecbook/Eiben-Smith-Intro2EC-Ch2.pdf
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
63
Download