====== 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: {{section>courses:b3b33kui:kuimaze:00_instalace#download&noheader&firstsectiononly}} * [[.:hodnoceni|Hodnocení úlohy]]. * Termín odevzdání úlohy je uveden v [[https://cw.felk.cvut.cz/brute|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. {{ :courses:b3b33kui:cviceni:sekvencni_rozhodovani:agent-environment-reward.png?400 |}} 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 [[courses:b3b33kui:kuimaze:3_hardmaze|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)