Kunstmatige intelligentie — Programmeeropgave 3 2006 — Neurale netwerken

De derde programmeeropgave (in het voorjaar van 2006) 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 wat het (eerste stuk van het) ip-adres van de (aanvrager van de) hit is. 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), tijd tot eerstvolgende hit van zelfde IP-adres, 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 het ip-adres. Gebruik niet alle ip-adressen, maar neem bijvoorbeeld alle 132.229.* (dat is universiteit Leiden) bij elkaar.

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.

Het netwerk heeft een tiental invoerknopen (evenveel als er kenmerken zijn), evenveel uitvoerknopen als er categorieën ip-adressen zijn (één uitvoerknoop mag eventueel ook), en een tussen 1 en 40 in te stellen aantal verborgen knopen. Verder zijn er twee bias-knopen. 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 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 10 april 2006.


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

10 maart 2006 — http://www.liacs.nl/home/kosters/AI/nn06.html