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)
Enkele dingen vallen op.
-
Hoewel de robot bij de start netjes evenwijdig staat aan de wand, meten de sensoren verschillende waarden. De voorste sensor levert een lagere spanning dan de achtersensor. Of dat een probleem is valt te bezien. Want bij het maken van de voorbeelden, was dat waarschijnlijk ook zo. Na het leren zit dat dus in het netwerk en wordt er rekening mee gehouden. Niettemin, bij inspectie van de robot bleek dat afstand van de voorsensor tot de wand 8 mm groter was dan die van de achtersensor. Dat moet aangepast! En dat betekent waarschijnlijk ook het maken en leren van een nieuwe voorbeeldenset.
-
Bij het derde meetmoment gaat de sensorwaarde van de voorste sensor plotseling omhoog. Als je het filmpje heel goed bekijkt lijkt het of de voorste sensor op dat moment een lichtere plek ziet dan de achterste sensor.
-
Het is me niet duidelijk waarom bij de meetmomenten 6 en 7 er een opdracht naar rechts wordt gegeven. Speelt de fout die we in de testopgaven hierboven zien een rol?
-
Ook valt op dat een opdracht naar rechts een grotere draaihoek oplevert heeft dan een draai naar links.
-
Bij de laatste twee meetmomenten liggen de spanningen boven de toegestane waarden. Althans volgens de sharp datasheet. Nergens in de geleerde voorbeelden komen die voor. Toch produceert het netwerk zo op 't oog een zinvol antwoord. Of is dat puur toeval?
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.
- neurale netwerken de beslissende kracht achter internet neurale netwerken zijn overal.Een leesbare tekst in zeven korte artikelen.
- neurale netwerken.Een mooi overzicht voor wie wiskundig onderlegd is.
- neuraal netwerk.Een redelijk leesbare tekst.
Gericht op backpropagation.
- Neural networks: representation.Een mooie inleiding.
- Neural networks: training with backpropagation.Een mooie inleiding.
- Principles of training multi-layer neural network using backpropagation.Een mooi visueel overzicht van hoe backpropagation werkt.
Backpropagation en mobiele robots.
- The mobile robot control For obstacle avoidance with an artificial neural network application.Recent artikel. Niet gemakkelijk, maar toch interresant.
- Neural network control of a wheeled mobile robot based on optimal trajectories.Heel interessant, maar lastig. Gebruikt Tensorflow
- A neural network for Java Lego robots: Learn to program intelligent Lego Mindstorms robots with Java.Met broncode.
- Lowcost Mobile Robot using Neural Networks inObstacle Detection.Gebruikt Matlab.
- Neural Control System in Obstacle Avoidance in Mobile Robots Using Ultrasonic Sensors.Gebruikt matlab.
- Intelligent Surveillance Robot with Obstacle Avoidance Capabilities Using Neural Network.Gebruikt Raspberry Pi en arduino UNO.