Opdracht 2 Het Multilayer Perceptron Doel: - Inzicht verkrijgen in een neuraal netwerk (het multilayer perceptron). - Begrijpen van het backpropagation algoritme. - Een toepassing van een neuraal netwerk zien. - Het begrijpen van generalisatie en overfitting. 1. Beantwoord de volgende vragen: a) Wat is het credit assignment problem? b) Als je de fout van een verborgen neuron wilt bepalen, welke twee factoren hebben hier dan invloed op? c) Geef de sigmoïde functie en de afgeleide ervan. (Gebruik evt. exp(x) voor е x.) d) Waarom mogen de willekeurige beginwaarden van de gewichten eigenlijk niet te dicht rond de extreme uitvoerwaarden (bijv. 0 en 1) zitten? e) Noem drie criteria die bepalen wanneer je kunt stoppen met het backpropagation algoritme. Geef bij elke manier een nadeel aan. f) Hoe kun je, naast het veranderen van de leersnelheid alpha, het leren van het netwerk versnellen? (Leg kort uit hoe dit werkt.) g) Wanneer zeggen we dat een netwerk gegeneraliseerd heeft van de trainings data? h) Wat is het probleem bij overfitting? 2. Maak je eigen netwerk (MLP) a) Teken voor jezelf een 2-laags neuraal netwerk (een verborgen en uitvoer laag) met 2 invoer neuronen, 2 verborgen neuronen en 1 uitvoer neuron. - Waarom wordt dit een 2-laags i.p.v. 3-laags netwerk genoemd? - Hoeveel gewichten heeft de verborgen laag? En de uitvoer laag? b) Voor deze opdracht moet je het Multilayer Perceptron afmaken. Gebruik hiervoor de aangeleverde code: http://www.ai.rug.nl/~jijssel/mlp.zip Lees eerst de toelichting door bij deze opgave (zie pagina 3)! Het is daarna de bedoeling dat je de volgende functies invult: neuron/activate.cc activeer een enkel neuron met de gegeven invoer. neuron/sigmoid.cc de sigmoïde functie (deel van de uitvoer). layer/activate.cc activeer de neuronen in de hele laag. network/activate.cc activeer het netwerk van begin tot eind. trainer/trainnetwork.cc bekijk hier slechts de feedforward pass. c) Als het eenmaal werkt, probeer dan pas om het trainingsalgoritme te implementeren. Kijk hiervoor in de volgende bestanden: network/train.cc (deel van) het backpropagation algoritme. trainer/trainnetwork.cc het begin en eind van het algoritme. d) Train nu het netwerk verschillende keren. Druk vervolgens de errors in een grafiek af! (Zie uitleg hoe.) - Er is altijd (gegarendeerd) een oplossing? - Leg uit waarom dit wel/niet zo is! Opdracht 2 van practicuminleiding Neurale Netwerken (mei 2005) 1/5
3. Een toepassing van een neuraal netwerk Een toepassing van neurale netwerken is function fitting. Hierbij proberen we het netwerk een bepaalde functie te leren. Voor een dergelijke taak maken we gebruik van het volgende netwerk: y is een functie van x, dus 1 invoer (x), n verborgen neuronen en 1 uitvoer neuron (y). Het aantal verborgen neuronen is afhankelijk van de complexiteit van de functie. Voor deze opdracht is een programma geschreven dat de sinus aan de hand van 9 punten probeert te leren (elk punt om ¼ л op het domein van [0, 2 л]). Je kunt zelf het aantal verborgen neuronen meegeven aan het programma. Zie de toelichting voor meer informatie over gnuplot en het aangeleverde programma. a) Voer het gegeven programma een keer uit met 1 verborgen neuron. Bekijk nu met gnuplot in hoeverre deze functie geleerd is. Doe nu ditzelfde experiment met 2 en 3 verborgen neuronen. - Wat valt je op aan de drie grafieken? - Hoeveel verborgen neuronen heb je minimaal nodig om de sinus te benaderen op het domein [0, 2 л]? b) Nu gaan we kijken naar de uitvoer van de verschillende verborgen neuronen (ten opzichte van de uitvoer van het netwerk). Doe dit voor een netwerk met 3 verborgen neuronen. - Verklaar de uitvoer van dit netwerk aan de hand van de uitvoerwaarden van de verborgen neuronen. - Theoretisch gezien, hoeveel verborgen neuronen heb je minimaal nodig om de sinus te benaderen op het domein [0, 3 л]? c) Bekijk een paar keer het verloop van de fout bij een netwerk met 2 verborgen neuronen. Hierbij zal je duidelijk iets opvallen. - Verklaar het verloop van de foutcurve bij 2 verborgen neuronen. d) Voer het programma ook een paar keer uit met 7 verborgen neuronen: Bekijk deze grafiek ten opzichte van de echte sinus en die van het netwerk met 3 verborgen neuronen. - Wat valt je op ten opzichte van het netwerk met 3 neuronen? e) Het leren van de sinus (gegeven een bepaald domein) is natuurlijk een nutteloze toepassing. Bij deze dan de vraag: - Waarvoor zou je function fitting kunnen gebruiken? Inleveren: - Voor deze opdracht krijg je 2 weken de tijd. (Deadline 25 mei om 5 uur.) - Geef antwoord op de vragen bij 1, 2 en 3. - Plaats al je zelfgeschreven code in hetzelfde document. - Stuur het document op naar: m.h.van.woudenberg@student.rug.nl Opdracht 2 van practicuminleiding Neurale Netwerken (mei 2005) 2/5
Toelichting 1. Voor het beantwoorden van de vragen: Zie hoofdstuk 6 van het boek An Introduction to Neural Networks. 2. Maak je eigen netwerk (MLP) (b) Het programma zit als volgt in elkaar. Let er goed op dat dezelfde informatie (en meer!) ook in de zogenaamde header-files staat! (Alle *.h bestanden.) Hieronder dan de belangrijkste variabelen en functies: Neuron d_ninputs // Het aantal invoeren/gewichten. *d_weights // Array van gewichten. d_threshold // De drempelwaarde of bias. ----------- activate(input_vector) -> output &weight(i) -> d_weights[i] &threshold() -> d_threshold Layer d_noutputs // Het aantal uitvoeren/neuronen *d_neurons // Array van neuronen. ---------- *activate(input_vector) -> output_vector ninputs() -> number of inputs &weight(i, j) -> d_neurons[i].weight(j) &threshold(i) -> d_neurons[i].threshold() Network d_hiddenlayer d_outputlayer // De verborgen laag // De uitvoer laag ------------- // Forward pass! *activate(input_vector) -> output_vector // Backward pass! train(input_vector, target, learning_rate) -> error hashiddenlayer() -> true/false Trainer ----- trainnetwork(learning_rate) // Begin en eind van het // backpropagation algoritme. Zoals te zien is bevat activate() in Network de forward pass. Bij de volgende vraag mag je aan de backward pass werken. In Trainer.trainNetwork() wordt het begin en eind van het backpropagation algoritme uitgevoerd. De activatie is helemaal terug te leiden tot een enkel neuron. Begin daarom makkelijk en bovenaan (bij Neuron). Er zijn nog meer handige steunfuncties zoals (last) output() in zowel Neuron als Layer, dus bekijk het rustig voordat je code gaat typen. Nog een handigheid: het commando make werkt intussen, dus gebruik dit voor het compileren van je code. Opdracht 2 van practicuminleiding Neurale Netwerken (mei 2005) 3/5
(c) Nu mag je aan de haal met het backpropagation algoritme. Een groot deel is al geschreven in trainnetwork. Aan jou de taak om de fout van een enkel patroon terug te laten voeren door het netwerk, de backward pass dus. Kijk hiervoor op pagina 67 van het boek. Er staan zes regels in de code (train.cc) die jij in moet vullen. Haal de volgende regel (in trainnetwork.cc) uit het commentaar: double error = network.train(input, &target[i], learning_rate); (d) Een grafiek genereren kan met gnuplot. Voer hiervoor de volgende commando s uit: > make (om te compileren als je code veranderd hebt) > mlp (om data/errors.dat te genereren) > gnuplot gnuplot> plot data/errors.dat with lines gnuplot> exit 3. Function Fitting (a) Haal het programma van http://www.ai.rug.nl/~jijssel/mlp_sinus.zip. De onderstaande regels voor gnuplot staan ook in een bijgeleverd tekstdocumentje, zodat je deze makkelijk kunt kopiëren en plakken. Een aantal gegevens van het programma wordt weggeschreven naar verschillende bestanden (zie onder). Let op dat deze bestanden na elke uitvoering van het programma veranderen! data/sinus#.dat de sinus volgens het netwerk in 64 stappen over het domein van [0, 2 л], waarbij # afhankelijk is van het aantal verborgen neuronen. data/sinus_errors.dat het verloop van de gemiddelde fout (afgedrukt na elke epoch). data/sinus_activations.dat de uitvoer van elke verborgen neuron, ook in 64 stappen. Om precies te zijn wordt de uitvoer nog eens vermenigvuldigd met het teken (+ of -) van het gewicht tussen dit neuron en het uitvoer neuron. Voer het programma uit met 1 verborgen neuron. Teken daarna de sinus en de uitvoer van het programma op het domein van [0, 2 л]. > mlp_sinus 1 > gnuplot gnuplot> plot [0:2*pi] sin(x), data/sinus1.dat Herhaal dit voor 2 en 3 verborgen neuronen. Let goed op of het patroon ook geleerd wordt in het maximaal aantal epochs. Bekijk eventueel de foutcurve. (b) Zoals hierboven al staat, bevat sinus_activations.dat de waarden van de uitvoer van de verborgen neuronen (gespiegeld aan de hand van een positieve of negatieve connectie). Type voor het tekenen van de uitvoerwaarden van de verborgen neuronen de volgende opdrachten in: > mlp_sinus 3 (voor het overschrijven van sinus3.dat) gnuplot> plot [0:2*pi] data/sinus3.dat, data/sinus_activations.dat using 1:2 title hidden output 1, data/sinus_activations.dat using 1:3 title hidden output 2, data/sinus_activations.dat using 1:4 title hidden output 3 Opdracht 2 van practicuminleiding Neurale Netwerken (mei 2005) 4/5
(c) > mlp_sinus 2 gnuplot> plot data/sinus_errors.dat with lines (d) > mlp_sinus 3 > mlp_sinus 7 gnuplot> plot [0:2*pi] sin(x), data/sinus3.dat, data/sinus7.dat Opdracht 2 van practicuminleiding Neurale Netwerken (mei 2005) 5/5