% % $Id: report.tex 557 2008-04-08 22:57:09Z rick $ % \documentclass[12pt,a4paper]{article} \frenchspacing \usepackage[english,dutch]{babel} \selectlanguage{dutch} \usepackage{graphicx} \usepackage{url} \usepackage{multicol} \usepackage{fancybox} \usepackage{amssymb,amsmath} \author{Rick van der Zwet, Universiteit Leiden} \title{Kunstmatige Intelligentie 2008 --- opdracht 3 \\ \large{Neurale netwerken}} \author{Rick van der Zwet\\ \texttt{}\\ \\ LIACS\\ Leiden University\\ Niels Bohrweg 1\\ 2333 CA Leiden\\ The Netherlands} \date{\today} \begin{document} \maketitle \section{Inleiding} Dit verslag gaat over de derde programmeer-opgave van het vak kunstmatige intelligentie~\cite{opdracht}. Welke als opdracht heeft om een neuraal netwerk te bouwen, wat met \'e\'en verborgen laag Poker handen kan classificeren. Dit alle met met als doel de bouw en werking van neurale netwerken (\emph{NN}) uit het college boek~\cite{collegeboek} beter te kunnen begrijpen. \section{Uitleg probleem} Om het probleem een visueel gestalte te geven is gekozen om een pokerhand te bepalen. Als invoer wordt er 5 kaarten uitgegeven, waarvan de waarde en kleur apart gecodeerd zijn in respectievelijk 13 en 4 mogelijke waardes.. Met deze kaarten kan er een van de 10 combinaties van een pokerhand gevormd worden. Als er 5 willekeurige kaarten aangeboden worden is het de taak van het NN daar de juiste combinatie bij te zoeken. Er wordt geen informatie gegeven wat de regels zijn om de combinaties te maken, maar er worden wel voorbeelden gegeven van valide combinaties. Nadat alle voorbeelden gezien zijn worden er willekeurige combinaties kaarten aangeboden, de taak is om deze set zo goed mogelijk te clasifiseren. \begin{figure}[!ht] \begin{center} \includegraphics[scale=0.25]{neuraal-netwerk} \end{center} \caption{ Voorbeeld van een 1-laags neuraal netwerk met 2 invoer nodes, 3 verbonden perceptronen, 2 uitvoer nodes. } \label{fig:feedforward} \end{figure} \section{Theorie} Voor de menselijke beleving is het relatief makkelijk om in \'e\'en opzicht te zien welke pokerhand er in hand is of om dit aan te leren, door voorbeelden aan te bieden, waarbij dan logische regels worden afgeleid. Om in een algoritme hetzelfde \emph{lerende} gedrag te simuleren/cre\"eren zijn NN uitgevonden in verschillende smaken en stijlen. Dit verslag focust zich in feed-forward netwerken welke als voordeel hebben dat ze een van de simpelste neurale netwerken zijn, waarbij de informatie maar een richting op gaat. Bij een NN kan uit 3 of meerdere lagen onderscheiden worden. Als eerste is er de \emph{invoer} laag met zijn invoer nodes, waar de gecodeerde invoer op komt te staa. Bij gecodeerd wordt een waarde tussen 0 en 1 bedoeld de reden hiervan komt later aan de orde. De \emph{verborgen} laag kan uit meerdere lagen bestaan, maar tijdens dit verslag zal focust worden op \'e\'en laag. In deze verborgen laag zitten de \emph{perceptronen}, welke de intelligentie zijn van het NN. In de \emph{uitvoer} laag zitten de uitvoer nodes, welke hun waarde weer tussen 0 en 1 bevinden. Tussen alle nodes in de invoer laag en de uitvoer laag zitten takken, zo ook tussen de verborgen laag en de uitvoer laag. Zie ook figuur~\ref{fig:feedforward}. Een perceptronen heeft de eigenschap dat het een \emph{activatie} functie bezit en een drempel waarde. Stel dit voor als een persoon die je slaat, als iemand dit zachtjes doet zal je niets zeggen, als dit een stuk harder is zal je 'auwch' roepen. De kracht die het nodig om je auwch te laten roepen is de drempelwaarde. Van binnen voelde dat dit pijn deed naar mate je harder werd geslagen ging je meer pijn voelen. Dit kan je het beste vatten in een lineaire functie. Vanwege het feit dat een NN een continue functie is ligt het voor de hand om een logaritmische functie te krijgen, waarbij de activatie functie de vorm krijgt van formule~\ref{eq:perceptron}. Dit verklaart tevens waarom de invoer en uitvoer tussen 0 en 1 moeten liggen, gezien dit ook het uitvoer bereik is. \begin{equation} uit = \frac{1}{1 + e^{in}} \label{eq:perceptron} \end{equation} De $in$ in formule~\ref{eq:perceptron} is een gewogen invoer van alle $inkomende takken * het gewicht van een tak$. De drempel waarde is echter een vervelend feit, welke makkelijker op te lossen is met een zogenoemde \emph{bias} knoop, de waarde op deze knoop is altijd $-1$, waardoor deze samen met het gewicht was tussen deze bias knoop en de knoop hangt zorgt voor de drempelwaarde die origineel gebruikt was nu de drempelwaarde $0$ gebruikt kan worden. De gewichten zijn het `magische' van het NN, deze gewichten kunnen namelijk getraind worden waardoor de uitvoer van het neurale netwerk kan veranderen. Deze training word \emph{backpropagation} genoemd en heeft een correlatie met de fout in de uitvoer, het huidige gewicht en de leer-snelheid en de invoer. Om deze fout in een koop te bepalen moet er gekeken worden naar de fout in de uitvoer en het gewicht naar tak van die knoop, zie formule~\ref{eq:gewicht}. Waarbij $\triangle_{uit}$ gelijk is aan $\triangle_{j} = g'(in_j)\sum_i W_{j,i}\triangle{i}$ Waarbij $i$ all opvolgende knopen van $j$ zijn. \begin{equation} W_{in,uit} = \alpha * a_{in} * \triangle_{uit} \label{eq:gewicht} \end{equation} De fouten worden dus omgekeerd berekend, eerst de fouten van de uitvoer laag, dan de verborgen lagen ervoor en als die zijn die van de invoer laag. \section{Aanpak} Er is gekozen gebruik te maken voorbeeld implementatie raamwerk gegeven in de sheet \cite{web-sheet} tijdens het college kunstmatige intelligentie welke een pseudo beschrijving geeft voor het programmeren van een neuraal netwerk. \begin{verbatim} herhaal voor elke E in trainings set doe voorzie de invoer knopen bereken de waardes in de perceptronen en uitvoer-knopen bereken de delta fouten van de knopen en perceptronen pas de takken aan totdat netwerk "geconvergeerd" \end{verbatim} Als eerste stap is simpele Perl code gebruikt om van de training en validatie sets een in- en uitvoer data voor het NN te schrijven waarbij alle waarden tussen 0 en 1 liggen. Perl code is een stuk flexibeler als het gaat om tekst verwerking dan C code. Om ook eens met een kritische noot naar de invoer te kijken en de daadwerkelijke intelligentie van een NN, zal er extra knopen toegevoegd worden om te kijken hoe deze presteren. Voor de poker set zijn dit een paar specifieke combinaties namelijk de setjes -doubles, triples, four- en de aantallen kaarten van elke soort kleur. Nadat het netwerk geschreven is kan deze getest worden met een het leren van de zogenoemde XOR functie. Deze functie is niet lineair te scheiden, maar is met een NN van 2 invoer, 3 verborgen, 1 uitvoer perfect te berekenen/leren. \section{Implementatie} Het NN is geschreven in C, hevig hangend op globale array waar de data in zit en losse functies om de programma flow duidelijker te maken. De pre-parse is geschreven in Perl en Bourne shell code. \section{Experimenten} Alle testen zijn uitgevoerd met een computer, waarbij gcc 4.01 als compiler aanwezig was en Perl 5.8.8 als parser . Bij wijziging van de input knopen of uitvoer knopen, is de pre-parse aangeroepen en de code opnieuw gecompileerd met de nieuwe waardes. Tijdens alle simulaties het de trainingsset een grootte van 25000. De eind validatie set -welke de eind kwaliteit van het NN bepaald- 1 miljoen. En de tussentijdse kwaliteit set heeft een grootte van 1000, welke na elke 100 training invoeren draaien. Tijdens de leersnelheid experiment is gebruik gemaakt van het de standaard poker set, met 10 invoeren, 10 uitvoeren en 10 verborgen perceptronen. De resultaten zijn te zien in figuur~\ref{fig:leersnelheid}. De verborgen perceptronen test is gedaan om dezelfde data set, hierbij is de leer-snelheid 0.5 gekozen, deze resultaten staan in figuur~\ref{fig:verborgen}. \begin{center} \begin{figure} \includegraphics[width=0.75\textwidth]{test-learn} \caption{NN training verloop bij variabele leersnelheden} \label{fig:leersnelheid} \end{figure} \end{center} \begin{center} \begin{figure} \includegraphics[width=0.75\textwidth]{test-perceptrons} \caption{NN training verloop bij variabele verborgen invoer laag grootte} \label{fig:verborgen} \end{figure} \end{center} Tijdens de invoer variatie is gekozen voor vijf verschillende combinaties, de randvoorwaarden zijn 10 uitvoer knopen, aantal verborgen knopen 20, leersnelheid 0.5 De standaard set hierna afgekort met \emph{STD} (1). STD met kleur tellingen (2), STD met paar tellingen (3), STD met kleur en paar tellingen (4), de paar tellingen + kleur tellingen (5) . Resultaten staan in tabel~\ref{tab:invoer-variatie}. \begin{center} \begin{table} \caption{Prestaties NN bij verschillende invoer data types} \begin{tabular}{l|r|r} Invoer variatie & Maximale kwaliteit in \% & Voorbeelden nodig \\ \hline 1 & 49.92 & 400 \\ 2 & 49.82 & 600 \\ 3 & 92.26 & 1800 \\ 4 & 92.26 & 6800 \\ 5 & 92.26 & 600 \\ \end{tabular} \label{tab:invoer-variatie} \end{table} \end{center} %%Resultaten \section{Conclusie} Er is gekeken naar verschillende aspecten van het neurale netwerk. Heeft toevoegen van nieuwe knopen met extra informatie invloed op de uitvoer? Heeft de leer-snelheid een positief effect op het NN? Heeft het aantal verborgen perceptronen invloed op het netwerk? Dit alle gecombineerd tot het originele probleem: Is het mogelijk goed poker-handen te voorspellen aan te hand van een 1-laags NN. Het vari\"eren van leer-snelheid levert geen beter kwaliteit NN op, als de leer-snelheid echter tussen 0 en 1 ligt zal het verloop minder grillig zijn en zal het NN niet `te ver' doorschieten in een bepaalde richting. Het vari\"eren van het aantal verborgen knopen levert een maximum op als het aantal verborgen knopen groter of gelijk is aan het aantal invoer knopen. In het kader van de efficient is het aan te raden, deze rond de waarde van de invoer knopen te houden om zo het aantal berekeningen dat uitgevoerd moet worden zo minimaal mogelijk te houden. Het grillige verloop van de grafiek in figuur~\ref{fig:leersnelheid} als ook in figuur~\ref{fig:verborgen} is een gedag wat niet verklaard kan worden. Verder onderzoek met bijvoorbeeld een andere data-set of de data in een andere volgorde aan te bieden zou hier misschien uitsluitsel voor kunnen bieden. Het vari\"eren van de invoer heeft groot effect op te effectiviteit van het netwerk. Bij het kiezen van de juiste data verdubbeld het netwerk zijn effectiviteit. Dit kan verklaard worden doordat op het moment de paren van te voren bepaald worden deze intelligentie niet meer door het systeem ontdekt hoeft te worden. Het probleem wordt dus eigenlijk versimpeld. Wel is het noodzakelijk relevante versimpelingen te maken. Het tellen van het aantal kaarten van een bepaalde kleur heeft duidelijk geen enkel effect in het netwerk, wat logisch is als we dichter naar de poker kaarten gaan kijken. Hiervoor is het enkel interessant om te weten of er 5 dezelfde kleuren in zitten of niet. Elke andere tussenvorm levert geen extra informatie op. Voor een vervolg verslag zou gekeken kunnen worden of een meer laags NN een beter resultaat boekt bij het ontdekken van de poker kaarten. Verder zouden er ook 'debug' sets ontwikkeld kunnen worden waarbij een willekeurig NN netwerk getest kan worden op juiste werking, gegeven alle randvoorwaarden. Deze optie wordt momenteel enkel voor een XOR voorbeeld gegeven welke enkel maar een validatie set is van een zeer beperkt probleem. Het is namelijk niet aan te tonen of het netwerk fout geimplementeerd is. \begin{thebibliography}{10} \bibitem{opdracht} W.A.~Kosters, Kunstmatige intelligentie Programmeer-opgave 3 van 2008 -- Neurale netwerken, \url{http://www.liacs.nl/~kosters/AI/nn08.html} \bibitem{web-sheet} W.A.~Kosters, Kunstmatige intelligentie College neurale netwerken 2008, \url{http://www.liacs.nl/~kosters/AI/neuraal.pdf} \bibitem{collegeboek} S.J. Russell en P. Norvig, Artificial Intelligence, A Modern Approach, Second ediion, Prentice Hall, 2003. \bibitem{website} Asuncion, A. \& Newman, D.J. (2007). UCI Machine Learning Repository \url{http://www.ics.uci.edu/~mlearn/MLRepository.html}. Irvine, CA: University of California, School of Information and Computer Science. \bibitem{website-poker} Robert Cattral (cattral@gmail.com) and Franz Oppacher (oppacher@scs.carleton.ca) Carleton University, Department of Computer Science, Intelligent Systems Research Unit \url{http://archive.ics.uci.edu/ml/datasets/Poker+Hand} \end{thebibliography} \newpage \advance\textwidth by 8cm \advance\oddsidemargin by -3cm \advance\evensidemargin by -3cm \advance\topmargin by -2cm \advance\textheight by 4cm \advance\footskip by -4cm \marginparwidth 0cm \twocolumn \section*{Appendix} De NN code en pre-parse.pl code zagen er als volgt uit: \newline \tiny %preformatted with `source-highlight -n -f latex bridge.cc` \input{nn.c} \input{data/pre-parse.pl} \onecolumn \end{document}