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