Kunstmatige intelligentie
Programmeeropgave 3 van 2009 — Neurale netwerken

endgame De derde programmeeropgave (in het voorjaar van 2009) behorende bij het vak Kunstmatige intelligentie gaat over Neurale netwerken.
Het is de bedoeling een eenvoudig Neuraal netwerk (NN) te programmeren met één verborgen laag dat schaak-eindspelen kan classificeren. (Als je geen schaak speelt, geen zorg.) We gebruiken files van de UCI Machine Learning Repository, en wel in het bijzonder de Chess (King-Rook vs. King) Data Set. We willen kijken in hoeveel zetten je met witte koning en toren (rook) de zwarte koning mat kunt zetten, gegeven informatie over de drie beginposities.

Het NN heeft een twee- tot tiental invoerknopen (evenveel als er kenmerken zijn), één of meer (?) uitvoerknopen, en een tussen 1 en 40 in te stellen aantal verborgen knopen. Verder zijn er twee bias-knopen, één op invoernivo en één op verborgen nivo. Gebruik BackPropagation als leermethode; redelijke waarden zijn wellicht: leersnelheid 0.1 tot 0.9, aantal verborgen knopen 3 en 100000 voorbeelden in totaal.
Test allereerst het netwerk op een paar "eenvoudige" functies van twee variabelen, bijvoorbeeld XOR(x,y) voor x,y=0,1, respectievelijk f(x,y) = sin(2πx) cos(2πy) voor 0 ⩽ x ⩽ 1 en 0 ⩽ y ⩽ 1. Besteed hier in het verslag kort aandacht aan. Het netwerk heeft hier dus één uitvoerknoop.

Schrijf vervolgens zonodig een klein Perl-programma (voor Perl, zie ook acht sheets in PDF) dat de benodigde kenmerken/attributen uit de schaak-file opslaat in het gewenste formaat, bijvoorbeeld alle attributen, of juist een samenspel van enkele. Kun je bijvoorbeeld twee combinaties van attributen maken, zodat het netwerk toch goed presteert? In principe zijn er 6 invoeren: rij en kolom van de drie stukken; en apart de target. Waarden tussen 0 en 1, graag, wellicht gescheiden door spaties. Zorg er ook voor dat de voorbeelden in een random-volgorde komen — in het origineel staan ze namelijk aardig gesorteerd! De file zal er ook wel meerdere malen, in random-volgorde, doorheen moeten.
Train daarna het netwerk hierop met BackPropagation, en geef resultaten van de experimenten. Denk aan het gebruiken van aparte training-set en test-set, zie de UCI-website. Ook een simpel statistiekje over de invoerfile doet het goed. En hoe doet het naieve algoritme (gok het gemiddelde) het?
Het is goed genoeg om één uitvoerknoop te nemen, die de waardes draw (gelijk spel), zero, one, ..., sixteen locaal codeert; of eventueel in categorieën, als draw, weinig, middelmaat, veel. Het is ook mogelijk — voor liefhebbers — om 18 knopen te nemen: gedistribueerd coderen.

Gebruik gnuplot om voor het verslag enkele grafieken te plotten, bijvoorbeeld met verschillende aantallen verborgen knopen, leersnelheden en stopcriteria.
Maak een file plot.p met daarin bijvoorbeeld
     set xrange [0:1]
     set yrange [0:1]
     set pm3d
     splot sin(2*pi*x)*cos(2*pi*y)

En laad deze file in gnuplot met gnuplot> load "plot.p".
Als je een netwerk hebt om deze functie te benaderen, kun je het beste aan het eind van je programma alle benodigde trio's (x,y,netwerkuitvoer) afdrukken in een file (zeg net.uit; één trio per regel), waarbij x met kleine stapjes door het interval [0,1] loopt, en y idem, terwijl netwerkuitvoer de bijbehorende uitvoer van het getrainde netwerk is. In gnuplot kun je eenvoudig een grafiekje van netuitvoer en beoogde functie maken met behulp van:
     gnuplot> splot "net.uit", sin(2*pi*x)*cos(2*pi*y)
Hierbij kun je zonodig PostScript-uitvoer genereren met behulp van
     gnuplot> set terminal postscript eps enhanced color
     gnuplot> set output "file.ps"
vlak voor het (s)plot-commando te geven (of enhanced monochrome voor grijswaarden-plaatjes). En dat allemaal in een plot-file, dan hoef je het niet steeds over te tikken.
Op internet staat alles en meer over gnuplot, bijvoorbeeld hier of daar.
Kijk verder in de LaTeX-handleiding (Hoofdstuk 4.1) hoe je PostScript-files in LaTeX kunt importeren.

Leg in het verslag ook kort BackPropagation uit, met de formules, en een referentie naar Russell en Norvig.
In te leveren: geprint verslag (in LaTeX gemaakt; de C++-code als Appendix, zie verder hier voor opmerkingen over het verslag), en per email: C++- en Perl-code. Stuur svp geen emails met LaTeX/PS/PDF.

Deadline: dinsdag 7 april 2009.


Vragen en/of opmerkingen kunnen worden gestuurd naar: kosters@liacs.nl.

5 februari 2009 — http://www.liacs.nl/home/kosters/AI/nn09.html