Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

4. Posilované učení

Vaším úkolem je najít co nejlepší strategii v prostředí, o němž nemáte žádné informace (posilované učení). Můžete jen vykonávat dostupné akce a pozorovat jejich účinky.

  • Úloha bude opět probíhat v prostředí KUIMaze:

    Stáhněte si archiv kuimaze.zip (Aktualizováno 21.4.2023)

    2023/03/11 16:50 · xposik

  • Termín odevzdání úlohy je uveden v BRUTE.

Specifikace

V modulu rl_agent.py implementujte funkci learn_policy(env). Hledáme strategii, která nás dovede do cíle s co nejvyšším očekávaným součtem zlevněných odměn. Během přednášek jste slyšeli o několika metodách pro řešení tohoto problému (Q-learning, Sarsa, …).

Výstupem funkce má být strategie (policy). Její reprezentace je shodná s předchozí úlohou (MDP), tj. slovník, který každému stavu přiřadí akci. Akce jsou označeny hodnotami [0,1,2,3], což odpovídá akcím up, right, down, left (N,E,S,W).

Vstupem funkce (env) je instance třídy HardMaze. Inicializace prostředí a vizualizační metody jsou stejné, jako u MDPMaze, ale práce s prostředím je odlišná. Připomeňme z přednášky, že akce je nutná, abychom se o prostředí vůbec něco dozvěděli. Nemáme mapu a prostředí můžeme prozkoumávat pomocí hlavní metody env.step(action). Prostředí-simulátor ví, jaký je aktuální stav.

Další požadavky:

  • Limit na učení na jednom postředí je 20 sekund.
  • Nezapomeňte před odevzdáním vypnout vizualizace, viz VERBOSITY v rl_sandbox.py.

Pokyny pro vypracování

Jak bude váš kód volán hodnotícím skriptem?

Váš kód bude hodnoticím skriptem volán cca takto:

import rl_agent
 
env = kuimaze.HardMaze(...)  # tady skript vytvoří prostředí
 
# Volání vaší funkce!
policy = rl_agent.learn_policy(env)  # limit 20 sekund
 
# Ohodnocení jedné epizody využívající vaší policy
observation = env.reset()
state = observation[0:2]
is_done = False
while not is_done:
  action = int(policy[state])
  observation, reward, is_done, _ = env.step(action)
  next_state = observation[0:2]
  total_reward += reward
  state = next_state

Jak začít s implementací?

  • Začněte popisem prostředí HardMaze.
  • Zkuste porozumět kódu v souboru rl_sandbox.py, kde je vidět základní náhodné procházení, možná inicializace tabulky Q hodnot, vizualizace atp.

Reprezentace Q-funkce

Při implementaci budete patrně potřebovat pracovat s Q-funkcí. V našem diskrétním světě bude mít podobu tabulky. Tuto tabulku lze reprezentovat různými způsoby, např.

  • jako 3D numpy array (jak je naznačeno v souboru rl_sandbox.py), které je indexováno třemi “souřadnicemi”: x, y, action;
  • jako slovník q indexovaný dvojicí state, action, v němž k jednotlivým prvkům budete přistupovat jako q[state, action];
  • jako slovník seznamů q, kde slovník je indexován stavem a vnitřní seznam číslem akce, takže k jednotlivým prvkům budete přistupovat jako q[state][action]; atd.

Inicializace Q-funkce

Ať už si reprezentaci Q-funkce vyberete jakoukoli, budete potřebovat ji nějak inicializovat, k čemuž by se hodilo znát množinu stavů. V reálných RL úlohách nemáme “mapu” prostředí a často ani neznáme množinu všech stavů. RL pak nikdy nekončí, protože si nikdy nemůžeme být jistí, že jsme se už dostali do všech dosažitelných stavů. V naší úloze ale RL musí skončit a vy musíte vrátit úplnou strategii, tedy co nejlepší akci pro každý stav. Proto i zde lze získat seznam všech validních stavů v prostředí pomocí metody get_all_states():

>>> env.get_all_states()
[(x=0, y=0),
 ...
 (x=4, y=2)]
Případně si lze všechny stavy vygenerovat, znáte-li rozměry mapy:
>>> x_dims = env.observation_space.spaces[0].n
>>> y_dims = env.observation_space.spaces[1].n
>>> maze_size = (x_dims, y_dims)

courses/b3b33kui/semestralni_ulohy/4_rl/start.txt · Last modified: 2023/04/29 11:15 by xposik