Kunstmatige intelligentie — Programmeeropgave 3 2005 — Neurale netwerken

De derde programmeeropgave (in het voorjaar van 2005) 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 de "status-code" 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 status-code 200 (OK). Veel komt ook 404 (Not Found) voor.

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, beginstuk IP-adres, 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 status-code. Gebruik niet alle status-codes, maar neem bijvoorbeeld alle 50* 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 status-codes 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 11 april 2005.


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

7 maart 2005 — http://www.liacs.nl/home/kosters/AI/nn05.html