Literatuuronderzoek Voorgaande aan een diepgang in het project hebben we een literatuuronderzoek gepleegd naar lerende componenten en dus naar Artificial Intelligence. Dit was om ons een basis van wetenschap te geven en zo beter een programma rond het concept te kunnen schrijven, en ook een goede keuze kunnen maken welk type en welke soort lerende component te gebruiken. Machine Learning Machine learning is een wetenschapsveld dat onderzoek doet naar het ontwerpen en bouwen van algoritmes die kunnen leren van datasets, en aan de hand daarvan voorspellingen kunnen doen. Daarbij wordt gebruikt gemaakt van een model dat opgebouwd wordt aan de hand van voorbeelden in plaats van dat keuzes direct ingeprogrammeerd worden. Het veld ligt dicht tegen wiskunde aan. En vanwege de grote datasets die gebruikt is een van de grote onderzoeksproblemen optimalisatie. In de volgende tekst zullen we enkele manieren van machine learning bespreken. Daarbij ligt de nadruk op neural networks, de methode die wij bij ons project toe willen passen. Types Machine Learning Machine Learning kan worden onderscheden in drie verschillende aanpakken van input geven, elk met hun eigen voordelen, nadelen en toepassingen. Vaak wordt een combinatie van twee van deze manieren gebruikt in een algoritme om een computer te laten leren. Deze drie types zijn Supervised learning, Unsupervised learning, en Reinforcement learning. Supervised learning We spreken van supervised learning, als de computer een verzameling data gegeven krijgt, en via die data meer voorspellingen moet doen over andere mogelijke waarde in het bereik van de data. Een voorbeeld hiervan is wanneer gegeven een aantal ‘huisoppervlaktes’ en hun respectieve prijs, de computer dan kan voorspellen wat de prijs van een huis is, als deze wordt gevraagd voor een bepaald ‘huisoppervlakte’. Unsupervised learning Gegeven een verzameling data, zonder te weten wat deze data betekent, moet de computer een patroon ontdekken in de data, dit is dus vaak gebruikt voor het vinden van (mogelijk) onzichtbare patronen zonder dat de computer er verder iets mee moet doen, het is dus een tussenstap in een ontdekkingsproces. Dit wordt daardoor vaak gebruikt in bijvoorbeeld het organiseren van computer clusters, ’Social Network’ analyse, astronomische data analyses, en marktonderzoeken. Een voorbeeld is het ‘Cocktail party problem’. Stel je hebt twee mensen in een kamer en je zet ook twee microfoons neer, en laat dan een computer proberen uit de twee opnames de twee personen uit elkaar te halen tot twee aparte opnames. Dit kan de computer doen via een algoritme dat de patronen ontdekt in de twee opnames, en ze dan scheidt tot twee apart pratende mensen. Reinforcement learning Je laat een computer een taak uitvoeren en geeft hem terug of hij het goed doet of niet, zodat deze daarvan kan leren en op die manier verbetert. Hierbij gaat het om taken waar de computer op een omgeving moet reageren. Dat kan een straat zijn waar de auto (computer) op moet rijden of een tegenstander in een spel, die de computer moet verslaan. Het interessante aan dit type, is dat je de computer nooit verteld wat hij moet bereiken, en je maakt ook geen expliciete correcties als de computer fouten maakt. Het enige wat je teruggeeft aan de computer is ‘fitness’, dus (meestal) een getal dat hoger wordt als de computer het goed doet. Dit type is goed te gebruiken in b.v. games, omdat de computer moet reageren op zijn omgeving of een tegenstander zonder dat de programmeur zelf hoeft te weten wat de computer zou moeten doen. Dit is dus perfect voor ‘reinforcement learning’. Om dit te illustreren, denk aan een hond. Elke keer dat de hond iets goed doet, zeg je ‘goede hond’, elke keer dat hij iets fout doet, ‘slechte hond’. Na een bepaalde hoeveelheid tijd zal hopelijk de hond hebben geleerd dat hij alleen de dingen moet doen die een ‘goede hond’ opleveren zonder dat de hond eigenlijk van te voren weet wat hij moet uitvoeren. Een andere manier van categoriseren van verschillende typen is door naar de output te kijken in plaats van naar de input. Dus de onderscheiding zit hem dan in wat je verwacht terug te krijgen van het gebruikte systeem. Deze classificaties zijn Classification, Regression, Clustering, Density Estimation, en Dimensionality Reduction. Classification Een classificatie systeem zet een nieuw gegeven stukje data in een categorie bij al eerder bekende data. Het gaat hier dus om verzamelingen met elk een eigenschap waar het lerende component een nieuw element in één van de verzamelingen moet zetten. Dit gaat dus vaak gepaard met een Supervised Learning type, omdat dat de categorieën al bekend zijn. Een bekend voorbeeld is een Spam-filter, waar nieuwe e-mails in de groep ‘Spam’ of ‘Niet-Spam’ moeten worden gezet. Regression Regression lijkt op vele manieren op Classification. Het gaat ook vaak gepaard met Supervised Learning, en gebruikt vaak een soortgelijke aanpak. Het enige verschil is dat in plaats van dat er twee of meer categorieën om nieuwe informatie in te zetten zijn, er een continu spectrum is. Het gaat hierbij dus om een relatie met verhoudingen. Een goed voorbeeld is het in Supervised Learning genoemde woningprijs systeem, waar een systeem op basis van ‘huisoppervlaktes’ de prijs van het huis bepaald. Clustering Clustering is ook zeer gelijk aan Classification, het doet zelfs hetzelfde als een Classification systeem, het moet informatie in groepen indelen. Het verschil hierbij is dat de groepen waarin de informatie moet worden ingedeeld nog niet bekend zijn, en het dus om een Unsupervised Learning type gaat. Het algoritme moet dus zelf bepalen wat de beste overeenkomsten en verschillen zijn om in te gaat categoriseren. Het wordt vaak gebruikt voor ‘Data Mining’ omdat zo lijkend willekeurige data kan worden onderscheden van onnodige informatie, om daaruit iets nuttigs te kunnen halen. Density Estimation Density Estimation, ofwel dichtheidsschatting (grof vertaald), is proces waarbij het resultaat een grafiek of functie is, waarbij de spreiding van inputs over een bepaald spectrum is bepaald. Het gaat hier dus om een verhouding tussen de gegeven informatie over een bepaalde variabele. Het gaat hierbij dus ook over een proces met Unsupervised Learning. Dimensionality Reduction Dimensionality Reduction, ofwel dimensie reductie, is een proces waarbij de gegeven informatie naar lagere dimensies wordt gezet. Dit klinkt ingewikkeld, maar het komt neer op een proces waarbij de informatie uiteindelijk simpeler is, zonder dat er veel informatie is weggehaald. Vaak wordt deze aanpak gebruikt om daarna Regression of Classification toe te passen op deze nieuw behaalde ruimte, waar dat eerder moeilijk was. ANN’s Na het voorgaande onderzoek zijn we verder gaan kijken naar de verschillende toepassingen van deze technieken. Het gebruik van Artificial Neural Networks sprak ons het meeste aan, en is ook veel gebruikt voor het leren van 2D games. We hebben daardoor besloten om hier meer onderzoek naar te doen. Artificial Neural Networks Binnen de machine learning, is Artificial Neural Networks (ANNs) een categorie geïnspireerd door biologische neurale netwerken, dus bijvoorbeeld het menselijke brein. Deze netwerken worden dan gebruikt om een schatting te maken van een functie met een grote hoeveelheid inputs, waarvan een aantal onbekend kunnen zijn. ANNs worden in het algemeen voorgesteld als door synapsen verbonden neuronen (vaak nodes genoemd). De synapsen hebben een bepaald numeriek gewicht, dat aangepast kan worden op input en gebruik, waardoor het systeem van ANNs de mogelijkheid van leren heeft. Hiernaast is een algemene voorstelling van een ANN te zien. De cirkels zijn hierbij de nodes, voornamelijk input en output, en de pijlen zijn de synapsen met een variabel gewicht. Als er in het programma dus een input volgt, reageert het ANN door via de grootst wegende synaps naar een volgende node te gaan, waarna het via één of meer ‘hidden’ nodes op de juiste output, dus reactie aankomt. Hoe een algoritme deze synapsen en dit stelsel aanpast is per keer weer totaal anders. Over het algemeen is het een stelsel van functies die uiteindelijk tot het meest effectieve gewicht van elk van de synapsen komt. Het is in het algemeen normaal om een ANN eerst te trainen met ‘training examples’, waarbij je hem het antwoord al verteld, dus een vorm van supervised learning, om daarna het programma zelf waardes te laten voorspellen aan de hand van het ANN ontwikkeld door de training examples. Het is ook zeer mogelijk om na de training examples door te gaan met reinforcement learning om het systeem te perfectioneren. Echter kan een ANN ook getraind worden met alleen reinforcement learning. ANNs in Reinforcement Learning Binnen de reinforcement learning, is het doel van het ANN meestal om een ‘policy’ te vinden voor het werken met de omgeving. Deze policy moet dan een zo effectief mogelijke output geven voor een verandering in de omgeving. Wat er werkelijk in de omgeving gebeurt, of wat het lange termijn doel is zijn over het algemeen onbekend, maar kunnen worden geschat. De omgeving kan worden gemodelleerd als een ‘Markov decision process’, waarin staten (de staat waarin het programma zich bevindt) en acties worden gebruikt om een gewichtdistributie, observatiedistributie (na interactie met omgeving), en een transitie van staat A naar staat B via actie C te weergeven, die gecombineerd met de policy (de conditionele distributie over de acties gegeven de observaties) een ‘Markov Chain’ vormen. Het doel is om dus de meest efficiënte Markov Chain te vinden, en dat de policy te maken. Hoe goed het algoritme het doet wordt meestal teruggegeven aan de computer via een ‘fitness’ of een ‘cost’. Voor een fitness moet het zo hoog mogelijk zijn, en een cost zo laag mogelijk om het programma succesvol te laten zijn. Nadelen van ANNs Er zijn uiteraard nadelen aan het gebruiken van ANNs voor een systeem. Het eerste probleem zit hem in het trainen van het netwerk. Er moet veel tijd in zitten om een ANN precies zo te krijgen dat deze een goede output heeft voor elke mogelijke input. Dan kan het ook nog zijn dat je het ANN te veel traint in één specifieke reactie, waardoor het deze altijd gaat prioritizeren terwijl een andere reactie mogelijk een veel betere optie zou zijn geweest als het ANN breder getraind was. Een oplossing hiervoor is de training voorbeelden willekeurig aan de computer voor te leggen, zodat het ANN willekeurig wordt getraind, en niet specifiek op één reactie en dan op één andere reactie. Een ander probleem met ANNs is dat ze drastisch grote processor kracht en opslagruimte vereisen. Hoewel dit probleem voor een groot deel is opgelost door de geweldige vooruitgangen in GPU processing (Graphical Processing Unit), kan het nog steeds veel tijd kosten om tot (mogelijk) suboptimale oplossingen te komen. Meer problemen worden in de volgende sectie besproken, met daarbij ook hun oplossing. NEAT Het volgende stuk is een uitleg van hoe een ‘NEAT’ algoritme in elkaar zit. Dit was nodig voor ons eindproduct om te weten hoe we de implementatie van het SharpNEAT algoritme moesten doen, en daarnaast om wetenschap te hebben over hoe ons programma dan in elkaar zit. Om een neuraal netwerk zichzelf te laten verbeteren, is een algoritme nodig dat bepaalt hoe het netwerk zich ontwikkelt. Een voorbeeld van zo’n algoritme is NeuroEvolution of Augmenting Topologies, ofwel NEAT. Dit algoritme, ontwikkeld door Kenneth O. Stanley in 2002, bootst biologische evolutie na. In elke generatie worden allerlei neurale netwerken uitgevoerd. Dit zijn als het ware de organismen. Na het uitvoeren wordt aan het organisme een bepaalde fitness toegekend, een score die aangeeft hoe goed het ging. De netwerken van de organismen met de hoogste fitness, worden met kleine veranderingen (mutaties) in de volgende generatie geplaatst, waar het proces zich herhaalt. NEAT maakt gebruik van drie hoofdtechnieken. In veel neuro-evolutiealgoritmes staat de topologie, de structuur van het neurale netwerk, van tevoren al vast en verandert alleen het synaptische gewicht van de verbindingen. In NEAT worden de topologieën stapsgewijs ontwikkeld vanuit een simpel netwerk, waardoor de netwerken complexer kunnen worden. Daarnaast verdeelt NEAT de verschillende organismes in soorten, waardoor het ook mogelijk is om afwijkende netwerken, die bijvoorbeeld pas na meer ontwikkeling effectief worden, te behouden. Ten slotte maakt het algoritme gebruik van een soort crossing-over, een biologisch verschijnsel waarbij chromosomen stukken DNA uitwisselen tijdens de meiose. In dit geval kunnen topologieën dus bepaalde delen uitwisselen. Er zijn veel verschillende methoden om zowel topologieën als gewicht te evolueren. Deze heten Topology and Weight Evolving Artificial Neural Networks (TWEANN’s). Hoe de neurale netwerken gecodeerd worden is voor alle TWEANN’s belangrijk. Dit kan worden opgedeeld in twee soorten: direct encoding en indirect encoding. In direct encoding worden alle nodes (knopen) en verbindingen in het genoom die in het fenotype voorkomen gespecificeerd. In indirect encoding worden alleen de regels voor het maken van een fenotype gespecificeerd, waardoor het veel compacter is. De simpelste vorm van direct encoding is binary encoding. Hierin wordt elk genoom in een bit string opgeslagen. Het maximum aantal nodes moet van tevoren vastgesteld worden en het kwadraat hiervan is de lengte van elke bit string. Als het maximum niet groot genoeg is, moet het experiment opnieuw gestart worden. Crossing-over is hierbij vaak niet effectief vanwege de lineaire codering van het netwerk. Een andere vorm van direct encoding is graph encoding. Hierbij wordt het netwerk als een grafiek opgeslagen, waarbij daarnaast voor alle nodes wordt opgeslagen welke verbindingen ze hebben. Ook hierbij is er een maximum aantal nodes, afhankelijk van de grootte van het assenstelsel waarin de grafiek zich bevindt. Graph encoding is effectief voor crossing-over, omdat werkende onderdelen van de grafiek verwisseld kunnen worden. In sommige vormen van direct encoding wordt crossing-over niet gebruikt, omdat het vaak leidt tot verlies van functionaliteit en onnodig is. Een voorbeeld van indirect encoding is Gruau’s Cellular Encoding (CE) uit 1993, waarin het netwerk wordt opgeslagen als een lijst van transformaties. De netwerken ontstaan uit één “cel”, waarbij alle transformaties celdelingen zijn. Deze codering bootst dus de codering in DNA na, die ook vanuit één cel een complex organisme kan bouwen. Er zijn een aantal problemen met TWEANN’s, waarvoor NEAT oplossingen heeft. Een hiervan is het Competing Conventions Problem. Dit houdt in dat er meerdere manieren zijn om een netwerk te maken met dezelfde oplossing. In dit geval is crossing-over vaak schadelijk. Als dit probleem ook zou spelen in de natuur, zou leven het waarschijnlijk niet gehaald hebben. Dit probleem wordt in de natuur opgelost door synapsen. Door dit proces worden homologe genen van verschillende genomen door een speciaal eiwit naast elkaar gezet voordat crossing-over plaatsvindt. Het vinden van homologe genen in artificiële neurale netwerken is moeilijk, maar dit kan benaderd worden door aan te nemen dat functionerende onderdelen van het netwerk homoloog zijn als ze dezelfde afkomst hebben. Dit is dus een vorm van artificiële synapsen. Een ander probleem van TWEANN’s is dat het toevoegen van nieuwe structuur in het netwerk aanvankelijk vaak leidt tot een lagere fitness, hoewel het voortzetten van deze innovatie zou kunnen leiden tot een complexer netwerk met een hogere fitness. In de natuur leiden veranderende structuren vaak tot een nieuwe soort met een andere niche, waardoor het niet hoeft te concurreren met de soort waaruit de nieuwe soort ontstaan is. Dit geeft de innovaties een kans om te ontwikkelen tot ze compleet zijn. Het implementeren van soortvorming in TWEANN’s is moeilijk, omdat het voor het indelen in soorten nodig is te bepalen hoeveel netwerken functioneel op elkaar lijken, ook als de structuur misschien verschilt. Maar met de oplossing voor het Competing Conventions Problem kan ook dit opgelost worden. NEAT bepaalt hoeveel netwerken op elkaar lijken en deelt ze hiermee op in soorten. Door de fitness binnen een soort te delen, wordt een soort niet te groot. De meeste TWEANN’s beginnen met willekeurige topologieën. Dit leidt tot allerlei problemen, bijvoorbeeld dat er in het begin veel netwerken zullen ontstaan die niet functioneel zijn. Een groter probleem is echter dat er op deze manier ook veel onnodige verbindingen ontstaan, die uiteindelijk leiden tot een onnodig groot en traag netwerk. Om toch minimale netwerken te krijgen, wordt vaak de fitness van complexere netwerken verlaagd. Hoeveel het verlaagd moet worden kan echter verschillen per doeleinde van het netwerk. Als het te veel of te weinig verlaagd wordt, kan de evolutie anders verlopen dan bedoeld. NEAT lost dit probleem op door de neuro-evolutiemethode een neiging tot minimaliteit te geven. Netwerken met nodes die niet aan een input en/of output verbonden zijn, blijven bijvoorbeeld niet bestaan. Op deze manier ontstaat structuur stapsgewijs en zo minimaal mogelijk. De minimalisatie vindt zo ook plaats in elke generatie, in plaats van alleen artificieel aan het einde van de evolutie. De evolutie verloopt met NEAT daarom ook veel sneller. De neiging tot minimaliteit wordt in andere TWEANN’s niet gebruikt, omdat deze geen manier hebben om innovatie te beschermen, zoals de soortvorming van NEAT. NEAT is gecodeerd als een lineaire representatie van het netwerk, waarin de connectiegenen, die verwijzen naar de verbinding tussen twee nodes, en de nodegenen, die verwijzen naar een node, gespecificeerd worden. In elk connectiegen worden de twee verbonden nodes, het gewicht en of het gen wordt uitgedrukt, gespecificeerd. In elk nodegen staan alle inputs, outputs en verborgen nodes die verbonden kunnen worden. Mutaties kunnen zowel gewichten als structuur veranderen. Elke structurele mutatie voegt een gen toe aan het genoom. Er zijn twee soorten structurele mutaties. De eerste soort voegt een verbinding toe tussen twee nodes met een willekeurige gewicht. Hierbij ontstaat dus een nieuw connectiegen. De tweede soort voegt een nieuwe node toe. Deze nieuwe node verbreekt de verbinding tussen twee nodes en verbindt zich daarna met beide nodes. Om bij te houden welke genen homoloog aan elkaar zijn, hebben de connectiegenen ook een innovatienummer. Elke keer als er een nieuw connectiegen ontstaat, wordt hieraan een nieuw innovatienummer gegeven, altijd een hoger dan het vorige. In elke generatie worden deze nummers behouden, zodat twee genen van verschillende genomen met hetzelfde innovatienummer ook dezelfde afkomst hebben. Daarnaast zorgt NEAT ervoor dat als twee mutaties in dezelfde generatie dezelfde nieuwe structuur maken, ze ook hetzelfde innovatienummer krijgen. Door deze nummers is bij crossing-over te zien welke genen beide genomen hebben en welke slechts een van de twee. Niet overeenkomstige genen heten disjunct als ze nog wel binnen het bereik van het andere genoom zitten en excessief als ze daarbuiten liggen. Bij het maken van nakomelingen wordt van de gelijke genen willekeurig het gen van een van de ouders gekozen en van de ongelijke genen alleen die van de ouder met de hoogste fitness. Voor de soortvorming wordt ook gebruik gemaakt van deze innovatienummers. De gelijkenis tussen genomen hangt af van het aantal disjuncte en excessieve genen en het gemiddelde gewichtsverschil van de verbindingen. De weging van deze drie factoren kan aangepast worden. Hiermee wordt de afstand tussen twee genomen berekend. Aan de hand van een drempelwaarde kan dan besloten worden of twee genomen tot dezelfde soort behoren. Om te voorkomen dat bepaalde soorten te dominant worden, wordt explicit fitness sharing toegepast. Hierbij wordt de fitness gedeeld door het aantal genomen van dezelfde soort. Bronnen Literatuuronderzoek Machine learning https://www.youtube.com/watch?v=UzxYlbK2c7E - Stanford University Lecture https://en.wikipedia.org/wiki/Machine_learning - Wiki Machine Learning https://en.wikipedia.org/wiki/Reinforcement_learning - Wiki Reinforcement http://people.cs.pitt.edu/~milos/courses/cs2750-Spring2012/Lectures/class3.pdf - Presentatie Machine Learning https://www.reddit.com/r/MachineLearning/ - Machine learning Reddit met ideeën http://www.sas.com/en_us/insights/analytics/machine-learning.html -Machine learning uitleg https://www.tensorflow.org/ - Tensorflow, alternatief voor SharpNEAT NEAT http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf - Paper NEAT https://en.wikipedia.org/wiki/Neuroevolution_of_augmenting_topologies - Wiki NEAT http://www.nashcoding.com/2010/07/17/tutorial-evolving-neural-networks-with-sharpneat-2-part1/ - Tutorial NEAT Artificial neural network https://www.youtube.com/watch?v=qv6UVOQ0F44 - Mari/o Neural Network https://en.wikipedia.org/wiki/Artificial_neural_network - Wiki ANN http://neuralnetworksanddeeplearning.com/chap1.html - Boek NN http://www.computerworld.com/article/2591759/app-development/artificial-neural-networks.html -Uitleg ANN’s https://www.techopedia.com/definition/5967/artificial-neural-network-ann - Uitleg ANN’s