Iti0210lab142

Allikas: Lambda

Stiimulõpe

Sissejuhatus

Rakendame stiimulõpet (reinforcement learning), et lahendada klassikalist masinõppimise ülesannet: tagurpidi pendel, rohkem tuntud kui "Cartpole".

Õppimiseks kasutame Q-learning algoritmi, keskkonnaks on OpenAI Gym. See eeldab Pythoni kasutamist, kui soovid midagi muud proovida, vt juhendi lõppu.

Juhendid, mis keskenduvad sellele, kuidas Q-learning toimib: [1],[2].

Koduülesanne loetakse lahendatuks ka juhul kui õppimine täielikult ei õnnestu. Oluline on proovida ja tulemustest kokkuvõte teha.

Ettevalmistus

Paigalda OpenAI Gym.

 pip install gym

Kui sul Windowsi arvuti ja Anaconda, siis peaks seda tegema "Anaconda Prompt" aknas.

Ülesande tingimused

Tuleb tasakaalus hoida püsti seisvat varrast, mis on sõiduki peal. Sõiduk saab vasakule ja paremale liikuda.

Igal ajahetkel näeme:

  • sõiduki positsioon x
  • sõiduki kiirus x'
  • varda nurk θ
  • varda nurkkiirus θ'

Tegevused:

  • kiirenda vasakule
  • kiirenda paremale

Tingimused:

  • Iga simulatsiooni samm, kui varras pole maha kukkunud, annab tasu +1
  • Simulatsioon kestab 200 sammu, eesmärk on algoritm treenida nii kaua vastu pidama
  • Simulatsioon katkeb enne, kui varda nurk on üle 15 kraadi kummagis suunas või sõiduk liigub keskkohast liiga kaugele (-2.4, +2.4).

Et õppimine paremini toimiks, lisame varda maha kukkumise korral karistuse (tasu -1).

Koodi toorik

OpenAI Gym simulatsioonid töötavad sellise tsüklina:

env = gym.make('CartPole-v0')

for i_episode in range(200):
    observation = env.reset()
    for t in range(200):
        env.render()

        # juhuslik action, selle asemel tee q-tabelist valimine epsilon-greedy põhimõttel
        #action = env.action_space.sample()

        next_observation, reward, done, info = env.step(action)
        if done:
            reward = -reward   # simulatsioon lõppes enne 200 sammu, negatiivne tasu

        # treeni siin Q-tabelit
        #  Q[s,a] += alpha * (r + gamma * Q[s',a'] - Q[s,a])
        #  s: observation
        #  a: action
        #  r: reward
        #  s': next_observation
        #  a': parim action olekus s',
        #      pead ise leidma Q tabelist suurima väärtuse

        observation = next_observation
        if done:
            print("Episode {} finished after {} timesteps".format(i_episode, t+1))
            break
env.close()

Kirjuta sinna oma Q-learning kood vahele. Katsetamiseks võid esialgu action = algavalt realt kommentaari ära võtta, et näha kuidas simulatsioon töötab.

Kõigepealt tuleb sisendandmed diskretiseerida (vahemikeks jaotada), et olekuid saaks Q-tabelisse panna. Põhimõtteliselt saaks näiteks positsiooni diskretiseerida round() funktsiooniga, mis annaks väärtused hulgast -2, -1, 0, 1, 2 (aga positsiooni kohta vaata ka järgmist lõiku). Kõikide sisendite juures proovi kõigepealt uurida, mis vahemikes nad enamasti muutuvad, siis saad selle vahemiku sobivateks tükkideks jagada.

Tulemuste saavutamine

Hoolimata ülesande lihtsusest võib õppimine esialgu ebaõnnestuda. Mõned ideed:

  1. Kõik sisendparameetrid pole võrdselt kasulikud. Mida rohkem neid on, seda aeglasem on õppimine. Kõige vähem kasulik on sõiduki positsioon, kuna varda tasakaalustamiseks vajalikud tegevused on samad sõltumatult sellest, kus sõiduk asub.
  2. Mida vähem on sisendite diskreetseid väärtusi, seda kiirem on õppimine, aga samas ka ebastabiilsem.
  3. Siin ülesandes on efektiivne gamma=1 ja epsiloni sujuv vähendamine 1.0-->0.1 umbes 100..300 tsükli jooksul
  4. Põhimõte, mis kehtib mujal ka: kui õppimine on ebastabiilne, vähenda õppimise kiirust (alpha) ja õpeta kauem.

Aruanne

Lisa aruandesse graafik, mis näitab episoodi pikkuse muutust õppimise jooksul. Sõltuvalt oma treenimise pikkusest võid valida, kas graafikul on iga episoodi tulemus, keskmised üle mingi arvu mängude, või mõlemad.

Alternatiiv

Kui ei soovi Pythonit kasutada, võid Cartpole asemel lahendada endale sobivas keeles selle ülesande:

Antud on ruudustik:

MDP Grid

  • Agent alustab START ruudust, eesmärk jõuda "+1" tähistatud ruutu
  • Tasu: +1 lõpp-punkti jõudmisel, -1 kui satud seal kõrval olevasse ohtlikku ruutu, igas muus ruudus -0.04
  • Kui agent liigub mingis suunas, siis see õnnestub 80% juhtudel, 10% liigub ta hoopis soovitud suunast vasakule ja 10% paremale.

Kasuta Q-learning algoritmi.