Ben's prikbord. (Over Backpropagation)

Introductie

Toen ik na enkele jaren weer in de gelegenheid was om met robot Madeleine te stoeien, bleek de AI wereld op zijn kop te staan. "Deep learning" had definitief zijn intrede gedaan. Tientallen jaren sluimerde het gebruik van kunstmatige neurale netwerken door tekort aan rekenkracht en het ontbreken van nieuwe inzichten. Maar nu werd er volop gebruik van gemaakt.

Bij mij rees de vraag of het mogelijk was om Madeleine gebruik te laten maken van een kunstmatig neuraal netwerk. Nu had ik 25 jaar geleden (!) een kunstmatig neuraal netwerk gebouwd en door alle Visual Prolog versies heen geüpdatet. Was dit oude programma in staat om Madeleine bij het rijden te besturen?

Maar eerst enkele woorden over wat een kunstmatig neuraal netwerk is. Een kunstmatig neuraal netwerk is een nabootsing van het brein. Het brein bestaat uit zenuwcellen (neurons) die onderling verbonden zijn via uitlopers. Dit systeem wordt nagebouwd in software en hardware. Hieronder een afbeelding van het ontwerp dat hier is gebruikt.

Maar er zijn er veel meer ontwerpen. Om daarvan een idee te krijgen kunnen we even kijken naar een overzicht gemaakt door het Asimovinstituut. Een mooi overzicht, maar daarmee weten we nog niets over wat een neuraal netwerk kan en ook niet hoe het werkt. (Ik laat hierna het woord kunstmatig weg). De vraag hoe het werkt laat ik hier even rusten. Ik breng verslag uit van mijn poging om de robot door bovenstaand netwerk te besturen. In de hoop dat degenen die niet vertrouwd zijn met de materie er enigszins gevoel voor krijgen.

We beginnen met te onderzoeken of Madeleine iets kan leren.

Madeleine leert de tafel van drie

Wij mensen leren van alles. We leren praten. We leren lopen. We leren fietsen. Dat doen we aan de hand van voorbeelden en door te oefenen. Zo leren we. Bij een neuraal netwerk gaat dat ook zo. Aan de hand van voorbeelden en training leert het iets.

In het verleden had ik al geëxperimenteerd met het leren van de tafels van vermenigvuldiging zoals we die op school moesten leren. Dus: Madeleine moet aan de slag met de tafel van drie. De 10 producten daarvan vormen de voorbeelden die ze moet leren.

Als het leren is klaar is moet het bewijs geleverd worden. Bij het testen zien we het volgende resultaat:

Er valt onmiddellijk iets op. We krijgen geen exacte resultaten, maar een benadering van de uitkomst. En nog iets: Madeleine weet ook hoeveel 6.5 x 3 en 1.5 x 3 ongeveer is. Die stonden niet bij de voorbeelden!. De robot heeft iets opgestoken dat ze niet heeft geleerd.

Het is wel duidelijk dat rekenroutines waar een computer over beschikt dit allemaal veel beter doen en vrijwel precieze uitkomsten geven. Als gegevens goed gestructureerd zijn denk je niet direct aan het gebruik van een neuraal netwerk.

Waarom dan toch dit voorbeeld? Het was me opgevallen dat de inputvector van een vermenigvuldiging uit twee elementen bestaat. De dataopbouw van een tafel van vermenigvuldiging heeft dezelfde opbouw als die voor het besturen van een robotje. De input van twee sensoren kan gebruikt worden om de motoren aan te sturen. En hoewel het ook anders kan hoeft de outputvector maar een element te bevatten. Met andere woorden als Madeleine tafels kan leren moet ze op grond van sensormetingen ook kunnen leren om te sturen. De opbouw van het netwerk zou hetzelfde kunnen zijn. Hetgeen veel experimenteren voorkomt.

Madeleine leert langs een wand te rijden.

De eerste vraag die beantwoord moeten worden is: wat moet de robot precies leren?. De leeropgave moest natuurlijk eenvoudig zijn. Ik dacht aan de oude zeevaarders die langs de kust voeren om op zee niet te verdwalen. Voor Madeleine hield dat in: evenwijdig langs een wand rijden gebruik makend van twee sensoren aan de zijkant om de afstand te meten.

De tweede vraag is: hoe komen we aan voorbeelden? Bij een tafel van drie is dat eenvoudig maar hier? Als mensen iets leren is er vaak iemand die het voordoet. En dat wordt dan nagedaan. Dat besloot ik ook te doen. Madeleine langs een wand laten rijden en haar te zeggen of ze naar links, naar rechts of rechtuit moest gaan. Met behulp van de cursortoetsen op het toetsenbord van de laptop moest dat lukken. Daarbij geldt: 1 = rechtuit, 2 = naar links, 3 = naar rechts.

Na het leerproces volgen testopgaven. Die zijn hetzelfde als bij de voorbeelden. We kunnen dan zien hoe dicht ze bij de juiste antwoorden komt. Er zitten twee fouten in. Net als bij menselijk leren is het niet altijd perfect. Dat hoeft niet dramatisch te zijn. 87% van de antwoorden is juist.

We gebruiken deze set voorbeelden om eens een echte rit te maken. Een paar oude planken tegen het wandmeubel gezet, voor het geval dat het robotje uit zijn koers raakt, want je weet maar nooit... Het traject is ongeveer 260 centimeter lang. De startpositie is nog wel even een probleem. Hoe groot moet de afstand zijn tussen Madeleine en de wand? Aan de hand van wat korte testen vooraf gokte ik op zo'n 24 centimeter.

Gedurende de rit wisselden de robot en de laptop veel informatie uit. Die laat ik hier zien om een indruk te geven, niet zozeer om te bestuderen.

Uit dit ritlogboek heb ik de sensormetingen gehaald en de commando's waar deze toe leiden. Wellicht een overbodige opmerking,maar de outputwaarden geven dus geen spanningen aan maar gewoon een reële waarde van 0 tot 3.

Je kunt ze vergelijken met de gegevens van de datasheet.

Maar nog steeds was het niet eenvoudig om aan de hand van deze brei van gegevens de rit te analyseren. Daarom een poging gedaan om een grafische voorstelling van de rit te maken aan de hand van de meetmomenten tijdens de rit. Een kort python programma met bovenstaande input leverde dit resultaat op. Je kunt het verschil zien tussen de outputwaarde (gele ster) en de daaruit afgeleide opdracht (rode ster). En het verschil tussen de spanning van de voorste sensor (groen) en de achterste (blauw)

grafiek van rit
grafiek van rit.

Enkele dingen vallen op.

Tenslotte

Het is duidelijk dat onze robot aan de hand van sensorinput en voorbeelden een eenvoudige opgave kan leren. Maar er valt nog veel te doen.

In de eerste plaats moet het 25-jaar oude Visual Prolog programma dat ik gebruikte een grondige opknapbeurt krijgen. Zoals het nu is, is het vrijwel onleesbaar. En het moet worden opgeschoond. Dat is ook de reden waarom ik hier geen code toon.

In de tweede plaats moet er worden onderzocht wat de robot moet doen als hij in een situatie terecht komt, die buiten zijn sensorinput valt. Zoals ook mensen niet weten wat te doen in een vreemde omgeving waarop ze niet zijn voorbereid. Of moet de robot volledig zijn aangepast aan zijn robotwereld?

Documentatie

Een tekst die helder uitlegt wat neurale netwerken zijn is lastig te vinden. Hieronder wat verwijzingen.

Algemene overzichten.

Gericht op backpropagation.

Backpropagation en mobiele robots.