Kunstmatige intelligentie — Programmeeropgave 3 2007 — Neurale netwerken

De derde programmeeropgave (in het voorjaar van 2007) 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 van hits op een webserver kan voorspellen hoeveel tijd er is verlopen sinds de vorige hit vanaf hetzelfde ip-adres. Lees eventueel eerst wat meer over de accesslogfile van een webserver, op die van Informatica is dat /var/log/httpd/www.access_log (alleen te benaderen vanuit een CGI-script, een Perl-programma, in je eigen public_html-directory). Voor het gemak staan in /scratch/wwwlog/ een aantal recente voorbeeldfiles. Eén voorbeeldregel uit zo'n accesslogfile:
145.19.1.221 - - [19/Feb/2004:11:40:18 +0100] "GET /home/kosters/AI/robo.html HTTP/1.0" 200 3741 "http://www.google.nl/search?q=handleiding+NQC&ie=UTF-8&oe=UTF-8&hl=nl&btnG=Google+zoeken&lr=lang_nl" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
met ip-adres 145.19.1.221.

Zorg eerst dat per hit een aantal relevante kenmerken worden gefebriceerd. Schrijf een C++- of liever nog Perl-programma (voor Perl, zie ook Arjan's PowerPoint presentatie of acht sheets in PostScript of acht sheets in PDF) dat de kenmerken opslaat (zeg tien stuks, bijvoorbeeld tijd van de dag (teruggebracht tot 0..1), ip-adres (ook weer tussen 0 en 1 gebracht), status (404=Not Found, 200=OK), aantal bytes (weer op 0..1 genormaliseerd), iets met de referrer, vorige status-code vanaf hetzelfde IP-adres, lengte naam opgevraagde pagina, ...) en uiteraard de tijd sinds de vorige hit van hetzelfde ip-adres. Neem deze bijvoorbeeld 1 als het langer dan 15 minuten duurde, of als er geen vorige hit vanaf hetzelfde ip-adres was.

Train vervolgens het netwerk hierop met backpropagation, en geef resultaten van de experimenten. Denk aan het maken van aparte training-set en test-set. Ook simpele statistiekjes over de invoerfile doen het goed. En hoe doet het naieve algoritme (gok de gemiddelde tijd of iets dergelijks) het?

Het netwerk heeft een tiental invoerknopen (evenveel als er kenmerken zijn), evenveel uitvoerknopen als er categorieën "verschiltijden" zijn (één uitvoerknoop mag eventueel ook), 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.
Tip: test het netwerk eerst op een paar eenvoudige functies (XOR, ...).

Gebruik gnuplot (Homepage) om voor het verslag enkele grafieken te plotten, bijvoorbeeld met verschillende aantallen verborgen knopen, leersnelheden en stopcriteria.
Wat oude tips voor het gebruik van gnuplot staan hier onder. Stel dat je een netwerk had om een functie op het interval [0,1], zeg ( x*x + 7*sin (x) + cos (2*x) ) / 9.0 te benaderen. Als je aan het eind van je programma alle duos (x,y) afdrukt in een file (zeg net.uit; één duo per regel), waarbij x met kleine stapjes door het interval [0,1] loopt terwijl y de bijbehorende uitvoer van het getrainde netwerk is, dan kun je in gnuplot eenvoudig een grafiekje van netuitvoer en beoogde functie maken met behulp van:

gnuplot> plot "net.uit", ( x*x + 7*sin (x) + cos (2*x) ) / 9.0
Hierbij kun je eenvoudig PostScript-uitvoer genereren door
gnuplot> set terminal postscript eps
gnuplot> set output "file.ps"
vlak voor het plot-commando te geven. Kijk verder in de LaTeX-handleiding (Hoofdstuk 4.1) hoe je PostScript-files in LaTeX kunt importeren.

In te leveren: geprint verslag (in LaTeX gemaakt; de C++-code als Appendix, zie verder hier voor opmerkingen over het verslag), en per email: de C++-code. Stuur svp geen emails met LaTeX/PS/PDF.

Deadline: maandag 16 april 2007. Vragensessie, gecombineerd met sommen-werkcollege: donderdag 12 april 2007, 15.45 uur.


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

6 maart 2007 — http://www.liacs.nl/home/kosters/AI/nn07.html