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