Literatuuronderzoek

advertisement
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
Download