Fjol med intelligent robot

Jeg har fjollet lidt mere med en robot, som lærer via Q-learning, der baserer sig på data (maskinlæring). Dens udfordring er at lære de bevægelser, som ikke i sig selv giver belønning:

  1. løfte grabben
  2. føre grabben fremad
  3. sænke grabben

Derefter bliver der adgang til de trin, som giver en stor belønning:

4. Føre grabben tilbage, og dermed skubbe robotten fremad.

1. Tro på fremtiden:

Variation i gamma-værdierne, som afgør i hvor høj grad robotten, skal tage hensyn til fremtidige potentielle belønninger. Da miljøet i fremtiden, kan se anderledes ud end det gør lige nu, nedreguleres fremtiden med en faktor gamma i n’de (n=trin):

gamma = 0,75: nær optimalt, kommer hurtigt i mål

gamma = 0,25: robotten kommer kun langsomt fremad

Det kan undre, at robotten i dette setup, hvor miljøet er meget konstant, klarer sig dårligt med gamma = 1 (ikke vist). Den litteratur jeg har set bruger også altid gamma<1.

2. Go deep:

Hver motor i grabben kan bevæge sig i 6 states, dvs. der er 6*6=36 states i alt. Arduino UNO løber tør for plads, hvis jeg øger antal states til 8 for hver servo. Dvs. der er kun plads til meget få typer af bevægelser med Q-learning.

I stedet for Q learning, har jeg forsøgt deep Q-learning, dvs. lave et dybt neuralt netværk, som kan funktions-approksimere fra motorernes stadier til belønnings-værdier, i stedet for at finde dem ud fra en erfaringstabel (Q-tabel).

Input er to vinkler, en fra hver servo, og output er en approksimeret Q værdi. Hver knude (firkant nedenfor) har desuden et konstantled (bias, v3, x3 og y3). Jeg har sat det nok simplest mulige dybe netværk (2×2) op i Excel med en logistisk funktion (f) som virker på en vægtet sum i hver knude (firkant):

2×2 ANN

Netværket skal selvfølgelig trænes på eksisterende Q-værdier fra robotten. Alle input og Q-værdier skal normaliseres til mellem 0 og 1. Error (målt Q-værdi minus approksimeret Q værdi) ligner differentialkvotienten på cost-funktionen (samlet afvigelse fra forventning, ofte sum af error^2).

W-værdierne justeres ud fra: (error*input til knuden*learning rate). Gradient Descent ville måske øge sandsynligheden for at opnå de globalt bedste w-værdier.

Jeg har oprettet nogle macro’er i Excel til at lave træningen til hurtigere. Første macro udfører en gange træning, ved at justere w’erne, når den løber hele datasættet igennem een gang. 10x træning kalder første makro 10 gange, mens 100xtræning kalder forrige macro 10 gange.

Det har endnu ikke været muligt at træne netværket til at forudsige realistiske Q-værdier. Kunsten for netværket er at finde systemet, som vist i de fire punkter ovenfor (løft, grab frem, sænk..). Men alle de approksimerede Q-værdier går hurtigt mod den samme værdi. Måske fordi:

  • Netværket er ikke dybt (antal hidden layers) eller bredt (antal knuder i hvert lag) nok.
  • Netværket har ikke trænet længe nok. Måske skal der 10000 træninger til. Det tager tid at gøre i Excel, så en del af svaret er at skifte til fx TensorFlow.
  • Data har været ret svære at opnå, bl.a. fordi afstandsmålingen ikke altid slår igennem på Q værdien. Derfor har jeg selv lavet nogle data.
  • Jeg har ikke data nok. Jeg har lavet en Q-værdi for hver state og action = 36*4=148, hvoraf de fleste er 10 (initialiserings-værdien). Dvs. der er rigtig mange ens Q-værdier.
  • Jeg har måske lavet en fejl i netværket 🙂
  • Data er ikke adskillelige, og netværket vil derfor aldrig komme til et stabilt sæt af w’er, fordi netværket ikke er dybt nok.
  • Learning rate er for stor eller lille. I et andet system, kunne den ændres fra stor (0,5) mod lille (0,001), efterhånden som summen af fejl mindskes.

Jeg har set en anbefaling på at bruge deep Q learning til at forfine bevægelser, frem for at prøve hele spektret af states og actions af.

Det kunne måske også være relevant at koble lagene sammen i et recurrent netværk, da grabbens bevægelser er i en tids-sekvens. Recurrent tilføjer netværket en form for hukommelse ligesom traditionel Q-learning.

Det har vist sig overordenlig svært, at finde det rette setup. TensorFlow eller PyTorch giver måske mulighed for at teste forskellige netværk og antal træninger, da der ikke ser ud til at være en metode til at forudsige en god tilgang. Pga. Excel har jeg måtte bruge det simplest mulige.

Hvordan skal vi så have en chance for at give eleverne indblik i maskinlæring, hvis feltet er så specialiseret og utilgængeligt?

Dette indlæg blev udgivet i Arduino, Digital Dannelse, Elektronik, Maker. Bogmærk permalinket.