====== 4. Posilované učení ====== Vaším úkolem je implementovat algoritmus //Q-learning// pro nalezení co nejlepší strategie v prostředí, o němž máte jen velmi neúplné informace. Můžete jen vykonávat dostupné akce a pozorovat jejich účinky (posilované učení). ===== Specifikace ===== V modulu ''rl_agent.py'' implementujte třídu ''RLAgent''. Třída musí implementovat následující rozhraní: ^ metoda ^ vstupní parametry ^ výstupní parametry ^vysvětlení ^ | ''%%__%%init%%__%%'' | ''env: RLProblem'', ''gamma: float'', ''alpha: float'' | //žádné// | Inicializace agenta.| | ''learn_policy'' | //žádné// | ''Policy'' | Vrátí co nejlepší strategii, tedy slovník dvojic (stav, akce). | * Třída se bude inicializovat následujícími **parametry**: * ''env'' je prostředí, tj. objekt typu ''kuimaze2.RLProblem'', * ''gamma'' je tzv. "discount factor" (zlevnění) z rozmezi ''(0,1)'', * ''alpha'' je tzv. "learning rate" (rychlost učení); předanou hodnotu považujte pouze za doporučení: chcete-li použít jinou, příp. ji v průběhu učení měnit/adaptovat, klidně můžete. * **Výstupem** metody ''learn_policy()'' musí být **strategie (policy)** reprezentovaná jako **slovník**, kde klíčem je vždy stav (instance třídy ''kuimaze2.State'') a hodnotou je optimální akce pro daný stav (instance třídy ''kuimaze2.Action''). Strategie musí obsahovat akci pro všechny volné stavy, včetně terminálních. U terminálních stavů na konkrétní zvolené akci nezáleží. * **Timeout:** na naučení strategie pro danou instanci problému máte časový limit 20s. * Očekáváme, že v metodě ''learn_policy()'' implementujete algoritmus //Q-learning//. * V implementaci algoritmů můžete používat jen [[..:kuimaze:30_rlproblem|veřejné rozhraní třídy ''RLProblem'']]. Pokud byste měli pocit, že potřebujete využívat metody jiných tříd než ''RLProblem'' nebo že potřebujete využít neveřejné proměnné a metody (jejichž jméno začíná na ''_''), proberte to se svým cvičícím. **Poznámka:** Prostředí (''env'') je instance třídy ''RLProblem''. Inicializace prostředí a vizualizační metody jsou stejné, jako u ''MDPProblem'', ale práce s prostředím je odlišná. Vykonání 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 jen 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 |}} ===== Jak na to? ===== * Doporučujeme vytvořit si pro úlohu nový pracovní adresář oddělený od předchozích sem. úloh v prostředí ''kuimaze2''. [[..:kuimaze:00_install|Zprovozněte si]] v něm aktualizovanou verzi balíčku ''kuimaze2''. * Seznamnte se s prostředím [[..:kuimaze:30_rlproblem|RLProblem]]. * V balíčku ''kuimaze2'' najdete také skript ''example_rl.py''. Skript obsahuje kostru třídy RLAgent, demonstruje náhodné procházení prostředí, inicializaci tabulky q-hodnot, i vizualizaci. Lze jej využít jako výchozí kód pro implementaci třídy ''RLAgent''. ==== Jak bude váš kód volán hodnotícím skriptem? ==== Váš kód bude hodnoticím skriptem volán cca takto: import kuimaze2 import rl_agent env = kuimaze2.RLProblem(...) # tady skript vytvoří prostředí # Volání vaší funkce! agent = rl_agent.RLAgent(env, gamma, alpha) policy = agent.learn_policy() # limit 20 sekund # Ohodnocení jedné epizody využívající vaší policy state = env.reset() episode_finished = False while not episode_finished: action = policy[state] next_state, reward, episode_finished = env.step(action) total_reward += reward state = next_state ==== 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 slovník slovníků ''q_table'' (jak je vidět v modulu ''example_rl.py''), kde lze k jednotlivým prvkům přistupovat jako ''q_table[state][action]''; * jako 3D ''numpy'' array , které je indexováno třemi "souřadnicemi": //r//, //c//, //action//; * ... ==== Inicializace Q-funkce ==== 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ů (a že jsme se všechny q-hodnoty naučili dostatečně dobře). V naší úloze ale RL skončit musí a vy musíte vrátit úplnou strategii, tedy co nejlepší akci pro každý stav. Musí tedy existovat možnost, jak zjistit množinu všech stavů. Seznam všech validních stavů lze získat pomocí metody ''get_states()''. Ve skriptu ''example_rl.py'' je již implementována inicializace ''q_table'' ve formě slovníku slovníků. Zvolíte-li jinou reprezentaci tabulky q-hodnot, je třeba inicializaci adekvátně upravit. ===== Odevzdání ===== * Termín odevzdání úlohy najdete v [[https://cw.felk.cvut.cz/brute|BRUTE]], úloha ''11-RL''. * Odevzdejte modul ''rl_agent.py'', příp. ZIP archiv s modulem ''rl_agent.py'' a dalšími vámi vytvořenými moduly, které váš agent potřebuje/importuje. **Tyto soubory musí být v kořeni archívu, archív nesmí obsahovat žádné adresáře!** Neodevzdávejte žádné moduly, které jste dostali od nás! ===== Hodnocení ===== Seznamte se s [[courses:b3b33kui:semestralni_ulohy:4_rl:hodnoceni|bodovým hodnocením]] úlohy.