Iti0210lab142
Sisukord
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:
- 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.
- Mida vähem on sisendite diskreetseid väärtusi, seda kiirem on õppimine, aga samas ka ebastabiilsem.
- Siin ülesandes on efektiivne gamma=1 ja epsiloni sujuv vähendamine 1.0-->0.1 umbes 100..300 tsükli jooksul
- 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:
- 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.