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:
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