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 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.

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. Zprovozněte si v něm aktualizovanou verzi balíčku kuimaze2.
  • Seznamnte se s prostředím 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 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 bodovým hodnocením úlohy.

courses/b3b33kui/semestralni_ulohy/4_rl/start.txt · Last modified: 2024/04/16 09:32 by xposik