From 79ed9e3cfc0f3f43d203deed6dc5babca0466409 Mon Sep 17 00:00:00 2001 From: Marius Lindauer Date: Thu, 9 Nov 2023 16:20:38 +0100 Subject: [PATCH] Updates from Overleaf --- latex_main/preamble.tex | 4 + latex_main/tntbeamer.cls | 1 - latex_main_old/macros.tex | 18 +- pseudocodes/pseudocodes.tex | 437 +++++++++ w00_init/equation_cheat_sheet.tex | 24 +- w00_init/notation_sheet.tex | 2 +- w00_init/t01_big_picture.tex | 835 ++++++++++++------ w01_big_picture/t04_rl_nutshell.tex | 1 + w02_basics/t01_markov_assumption.tex | 6 +- w02_basics/t05_policy_iteration.tex | 64 +- w02_basics/t06_value_iteration.tex | 28 +- w03_policy_evaluation/t02_dyn_prog.tex | 15 + w03_policy_evaluation/t03_monte_carlo.tex | 39 +- .../t04_monte_carlo_bias_variance.tex | 91 +- w03_policy_evaluation/t05_td.tex | 25 +- w03_policy_evaluation/t06_td_gamma.tex | 29 +- .../images/cliff_walking.png | Bin 0 -> 49996 bytes .../t02_gen_policy_iter.tex | 84 +- w04_model_free_control/t03_exploration.tex | 28 +- ...{t04_sarsa.tex => t04_sarsa_qlearning.tex} | 122 ++- .../t05_maximization_bias.tex | 57 +- w05_function_approx/t02_vfa_grad.tex | 2 +- w05_function_approx/t03_vfa_mc_td.tex | 53 +- w05_function_approx/t04_vfa_td.tex | 21 +- w06_deep_rl/images/rainbow.png | Bin 0 -> 110317 bytes w06_deep_rl/t03_ddqn.tex | 48 +- w06_deep_rl/t05_dueling.tex | 23 + .../images/ES_DNN_Playing.png | Bin .../images/FinalPEL.pdf | Bin .../images/gridworld1.png | Bin .../images/gridworld2.png | Bin .../images/gridworld3.png | Bin .../images/scoring_function_1.png | Bin .../images/scoring_function_2.png | Bin .../images/trpo.PNG | Bin .../t01_big_picture.tex | 44 +- .../t02_gradient_free.tex | 2 +- .../t03_finite_difference.tex | 8 +- .../t04_analytic.tex | 64 +- w07_01_policy_search/t05_score_function.tex | 141 +++ .../images/ac-arch.pdf | Bin 0 -> 20415 bytes .../images/grid1.pdf | Bin 0 -> 10840 bytes .../images/grid2.pdf | Bin 0 -> 10841 bytes .../images/grid3.pdf | Bin 0 -> 10820 bytes .../t01_big_picture.tex | 82 ++ .../t02_reinforce.tex | 105 +++ .../t03_the baseline.tex | 125 +++ .../t04_actor_critic_approaches.tex | 81 ++ .../t05_step_size_intro.tex | 126 +++ .../t06_step_size_bounds.tex | 63 ++ .../t07_step_size_in_practice.tex | 84 ++ w07_2_policy_gradient_methods/t08_ppo.tex | 131 +++ w07_policy_search/t05_score_function.tex | 72 -- w07_policy_search/t06_pg_algorithms.tex | 158 ---- w07_policy_search/t07_step_size.tex | 260 ------ w08_exploration/t02_bandit_exploration.tex | 4 +- .../t03_classic_mdp_exploration.tex | 2 +- w08_exploration/t04_intrinsic_exploration.tex | 2 +- .../t05_pred_intrinsic_exploration.tex | 6 +- w09_meta_rl/t01_big_picture.tex | 9 - w09_meta_rl/t03_challenges_in_cRL.tex | 2 +- w09_meta_rl/t04_curriculum_learning.tex | 2 +- w09_meta_rl_new/t05_curriculum_learning.tex | 2 +- 63 files changed, 2533 insertions(+), 1099 deletions(-) create mode 100644 pseudocodes/pseudocodes.tex create mode 100644 w04_model_free_control/images/cliff_walking.png rename w04_model_free_control/{t04_sarsa.tex => t04_sarsa_qlearning.tex} (60%) create mode 100644 w06_deep_rl/images/rainbow.png rename {w07_policy_search => w07_01_policy_search}/images/ES_DNN_Playing.png (100%) rename {w07_policy_search => w07_01_policy_search}/images/FinalPEL.pdf (100%) rename {w07_policy_search => w07_01_policy_search}/images/gridworld1.png (100%) rename {w07_policy_search => w07_01_policy_search}/images/gridworld2.png (100%) rename {w07_policy_search => w07_01_policy_search}/images/gridworld3.png (100%) rename {w07_policy_search => w07_01_policy_search}/images/scoring_function_1.png (100%) rename {w07_policy_search => w07_01_policy_search}/images/scoring_function_2.png (100%) rename {w07_policy_search => w07_01_policy_search}/images/trpo.PNG (100%) rename {w07_policy_search => w07_01_policy_search}/t01_big_picture.tex (78%) rename {w07_policy_search => w07_01_policy_search}/t02_gradient_free.tex (98%) rename {w07_policy_search => w07_01_policy_search}/t03_finite_difference.tex (91%) rename {w07_policy_search => w07_01_policy_search}/t04_analytic.tex (64%) create mode 100644 w07_01_policy_search/t05_score_function.tex create mode 100644 w07_2_policy_gradient_methods/images/ac-arch.pdf create mode 100644 w07_2_policy_gradient_methods/images/grid1.pdf create mode 100644 w07_2_policy_gradient_methods/images/grid2.pdf create mode 100644 w07_2_policy_gradient_methods/images/grid3.pdf create mode 100644 w07_2_policy_gradient_methods/t01_big_picture.tex create mode 100644 w07_2_policy_gradient_methods/t02_reinforce.tex create mode 100644 w07_2_policy_gradient_methods/t03_the baseline.tex create mode 100644 w07_2_policy_gradient_methods/t04_actor_critic_approaches.tex create mode 100644 w07_2_policy_gradient_methods/t05_step_size_intro.tex create mode 100644 w07_2_policy_gradient_methods/t06_step_size_bounds.tex create mode 100644 w07_2_policy_gradient_methods/t07_step_size_in_practice.tex create mode 100644 w07_2_policy_gradient_methods/t08_ppo.tex delete mode 100644 w07_policy_search/t05_score_function.tex delete mode 100644 w07_policy_search/t06_pg_algorithms.tex delete mode 100644 w07_policy_search/t07_step_size.tex diff --git a/latex_main/preamble.tex b/latex_main/preamble.tex index c62e6bf..e5f2937 100644 --- a/latex_main/preamble.tex +++ b/latex_main/preamble.tex @@ -126,3 +126,7 @@ % Adds a frame with the current page layout. Just call \layout inside of a frame. \usepackage{layout} + + +\usepackage{algorithm} +\usepackage{algorithmic} \ No newline at end of file diff --git a/latex_main/tntbeamer.cls b/latex_main/tntbeamer.cls index 18bd4bb..bc62365 100644 --- a/latex_main/tntbeamer.cls +++ b/latex_main/tntbeamer.cls @@ -1043,7 +1043,6 @@ %........................................... \usepackage{url} \usepackage{dsfont} -\usepackage{algorithmic} \mode diff --git a/latex_main_old/macros.tex b/latex_main_old/macros.tex index 7e981fb..83d4d41 100644 --- a/latex_main_old/macros.tex +++ b/latex_main_old/macros.tex @@ -207,15 +207,15 @@ \newcommand{\rewardRL}[0]{r} \newcommand{\rewardfuncRL}[0]{\mathcal{R}} -\RestyleAlgo{algoruled} -\DontPrintSemicolon -\LinesNumbered -\SetAlgoVlined -\SetFuncSty{textsc} - -\SetKwInOut{Input}{Input} -\SetKwInOut{Output}{Output} -\SetKw{Return}{return} +%\RestyleAlgo{algoruled} +%\DontPrintSemicolon +%\LinesNumbered +%\SetAlgoVlined +%\SetFuncSty{textsc} + +%\SetKwInOut{Input}{Input} +%\SetKwInOut{Output}{Output} +%\SetKw{Return}{return} %\newcommand{\changed}[1]{{\color{red}#1}} diff --git a/pseudocodes/pseudocodes.tex b/pseudocodes/pseudocodes.tex new file mode 100644 index 0000000..0d18e87 --- /dev/null +++ b/pseudocodes/pseudocodes.tex @@ -0,0 +1,437 @@ +\documentclass[11pt,a4paper,ngerman]{article} + +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{babel} +\usepackage{amsmath} +\usepackage{algorithm} +\usepackage[ruled,vlined,algo2e,linesnumbered]{algorithm2e} +\usepackage{amsfonts} +\newcommand{\vect}[1]{\mathbf{#1}} + +\DeclareMathOperator*{\argmax}{arg\,max} +\DeclareMathOperator*{\argmin}{arg\,min} + +\begin{document} + +\section{Policy Iteration} +\subsection{Old version} +\begin{itemize} + \item Set $i=0$ + \item Initialize $\pi_0(s)$ randomly for all states $s$ + \item While $i == 0$ or\\ $||\pi_i - \pi_{i-1}||_1 > 0$ (L1-norm, measures if the policy changed for any state) + \begin{itemize} + \item $V^{\pi_i} \gets$ MDP V-function policy evaluation of $\pi_i$ + \item $\pi_{i+1} \gets$ Policy improvement + \item $i \gets i+1$ + \end{itemize} +\end{itemize} +\subsection{New Version} + +\begin{algorithm}[H] + \caption{Policy Iteration} + \DontPrintSemicolon + \textbf{Initialise}: $i \leftarrow 0$\\ + \textbf{Initialise}: $\pi_i$ as random policy\\ + \While{$i == 0$ or $||\pi_i - \pi_{i-1}||_1 > 0$}{ + $V^{\pi_i} \gets$ MDP V-function policy evaluation of $\pi_i$\\ + $\pi_{i+1} \gets$ Policy improvement\\ + $i \gets i+1$ + } + \KwOut{{}Return $\pi_i, V^{\pi_i}$} +\end{algorithm} + +\newpage + +\section{Value Iteration} +\subsection{Old Version} +\begin{itemize} + \item Set $k = 1$ + \item Initialize $V_0(s) = 0$ for all states $s$ + \item Loop until convergence + \begin{itemize} + \item For each state $s$ + $$V_{k+1}(s) = \max_{a\in A } R(s,a) + \gamma \sum_{s' \in S } P(s' \mid s,a) V_k(s') $$ + \item View as Bellmann backup on the value function + $$V_{k+1} = BV_k$$ + $$\pi_{k+1}(s) \in \argmax_{a \in A} R(s,a) + \gamma \sum_{s' \in S} P(s' \mid s,a) V_k(s') $$ + \end{itemize} +\end{itemize} +\subsection{New Version} +\begin{algorithm}[H] + \caption{Value Iteration} + \textbf{Initialise}: $k \gets 1$\\ + \textbf{Initialise}: $V_0(s) \gets 0 \quad \forall s \in S$\\ + \While{$k == 1$ or $V_{k+1} \not\approx V_k$}{ + \For{each state $s \in S$}{ + $V_{k+1}(s) \gets \max_{a\in A } \bigg (R(s,a) + \gamma \sum_{s' \in S } P(s' \mid s,a) V_k(s')\bigg)$ + } + $V_{k+1} \gets BV_k$\\ + $k \gets k+1$ + } + $\pi \leftarrow$ extract policy from $V_k$ + + \KwOut{{}Return $\pi, V_k$} +\end{algorithm} + +\newpage + +\section{First Visit Monte Carlo} +\subsection{Old Version} +Initialize $N(s) = 0$, $G(s) = 0$ $\forall s \in S$\\ +Loop +\begin{itemize} + \item Sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots,s_{i,n}$ + \item Define $G_{i,t} = r_{i,t} + \gamma r_{i,t+1} + \gamma^2 r_{i,t+2} + \ldots$ + \item For each state $s$ visited in episode $i$ + \begin{itemize} + \item for first time $t$ that state $s$ is visited in episode $i$ + \begin{itemize} + \item Increment counter of total first visits: $N(s) = N(s) + 1$ + \item Increment total return $G(s) = G(s) + G_{i,t}$ + \item Update estimate $V^\pi (s) = G(s) /N(s)$ + \end{itemize} + \end{itemize} +\end{itemize} + + +\begin{algorithm} + \caption{First Visit Monte Carlo} + \DontPrintSemicolon + \LinesNotNumbered + + \KwIn{{}\\ $\pi$ - Policy to evaluate} + + \textbf{Initialise}: $N(s) \gets 0 \quad \forall s \in S$ \tcp*{Amount of times $s$ visited} + \textbf{Initialise}: $G(s) \gets 0 \quad \forall s \in S$ \tcp*{Accumulated discounted returns} + \While{not converged}{ + Sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots,s_{i,n}$ + + \If{s visited for the first time in current episode}{ + $N(s) \leftarrow N(s) + 1$ + + $G(s) \leftarrow G(s) + G_{i,t}$ + + $V^\pi (s) \leftarrow G(s)/N(s)$ + } + } + \KwOut{{} Return $V^\pi$} +\end{algorithm} + +\newpage +\section{TD(0)} +\subsection{Old Version} + Input: $\alpha$\\ + Initialize $V^\pi(s) = 0. \forall s \in S$\\ + Loop\\ + \begin{itemize} + \item Sample tuple $(s_t, a_t, r_t, s_{t+1})$ + \item $V^\pi(s) = V^\pi(s) + \alpha (\underbrace{[r_t + \gamma V^\pi (s_{t+1})]}_{\text{TD target}} - V^\pi(s))$ + \end{itemize} +\subsection{New Version} + +\begin{algorithm}[H] + \caption{TD(0)} + \LinesNotNumbered + \DontPrintSemicolon + \KwIn{{}\\ + $\pi$ - Policy to evaluate\\ + $\alpha$ - Learning Rate} + \textbf{Initialise}: $V^\pi(s) = 0 \quad \forall s \in S$ + + \While{Not converged}{ + Sample tuple $(s_t, a_t, r_t, s_{t+1})$ + + Compute $\text{TD target} = r_t + \gamma V^\pi (s_{t+1})$ + + $V^\pi(s) \gets V^\pi(s) + \alpha ([\text{TD target}] - V^\pi(s))$ + } + \KwOut{{} Return $V^\pi$} +\end{algorithm} +\newpage + +\section{Model Free Control} +\subsection{Old Version} + \begin{itemize} + \item Given an estimate $Q^{\pi_i}(s,a) \forall s\in S, a \in A$ + \item Update new policy + $$\pi_{i+1}(s) \in \argmax_{a \in A} Q^{\pi_i} (s,a) $$ + \end{itemize} + +\subsection{New Version} + +\begin{algorithm}[H] + \caption{General Model Free Control Algorithm} + \DontPrintSemicolon + \LinesNotNumbered + \textbf{Initialise}: $\pi$ randomly + + \While{not finished}{ + \textbf{Policy evaluation:} compute $Q^{\pi_i}$ + + \textbf{Policy improvement:} update $\pi_{i+1}(s) \in \argmax_{a \in A} Q^{\pi_i} (s,a)$ + } + \KwOut{{} Return $\pi$} +\end{algorithm} + +\newpage + +\section{SARSA} +\subsection{Old Version} + \begin{itemize} + \item Initialization: + \begin{itemize} + \item $\epsilon$-greedy policy + \item $t=0$ + \item initial state $s_t = s_0$ + \end{itemize} + \item Loop + \begin{itemize} + \item Take action $a_t \sim \pi(s_t)$ + \item Observe $(r_t, s_{t+1})$, $a_{t+1} \sim \pi(s_{t+1})$ + \item Update Q given $(s_t, a_t, r_t, s_{t+1}, a_{t+1})$: + $$Q(s_t,a_t) \gets Q(s_t, a_t) + \alpha (r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t))$$ + \item $\pi(s_t) \in \argmax_{a\in A} Q(s_t, a)$ with probability $1-\epsilon$, else random + \item $t = t+1$ + \end{itemize} + \end{itemize} + + \subsection{New Version} + \textbf{Question:} Do we return the greedy policy here or the epsilon greedy policy +\begin{algorithm} + \caption{SARSA} + \DontPrintSemicolon + \LinesNotNumbered + \KwIn{{}\\ + $s_o$ - start state\\ + $\alpha$ - learning rate\\} + \textbf{Initialise}: $\pi \gets$ random policy + + \textbf{Initialise}: $t \gets 0$ + + \While{Not converged}{ + Take action $a_t \sim \pi(s_t)$ + + Observe ($r_t$, $s_{t+1}$) + + $a_{t+1} \sim \pi(s_{t+1})$ + + $Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha (r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t))$ + + $\pi(s_t)\in \argmax_{a \in A} Q(s_t, a)$ with probability $1-\epsilon$, else random + + $t \gets t+1$ + } + + $\pi \gets$ GreedyPolicy(Q) + + \KwOut{{} Return $\pi, Q$} +\end{algorithm} + +\newpage + +\section{Tabular Q-Learing} +\subsection{Old Version} +\begin{itemize} + \item Initialization: + \begin{itemize} + \item $Q(s,a)=0. \forall s \in S, a \in A$ + \item $t=0$ + \item initial state $s_t = s_0$ + \end{itemize} + \item Loop + \begin{itemize} + \item Take action $a_{t} \sim \pi_b(s_{t})$ + \item Observe $(r_{t}, s_{t+1})$ + \item Update Q + $$Q(s_t,a_t) \gets Q(s_t, a_t) + \alpha (r_t + \gamma \max_{a\in A} Q(s_{t+1}, a) - Q(s_t, a_t))$$ + \item $\pi_b(s_t) \in \argmax_{a\in A} Q(s_t, a)$ with probability $1-\epsilon$, else random + \item $t = t+1$ + \end{itemize} + \end{itemize} +\subsection{New Version} + +\begin{algorithm} + \caption{Tabular Q-Learning} + \DontPrintSemicolon + \LinesNotNumbered + + \KwIn{{}\\ + $\pi_b$ - behaviour policy\\ + $s_o$ - start state\\ + $\alpha$ - learning rate\\} + + \textbf{Initialise}: $Q(s,a) \leftarrow 0 \quad \forall s \in S, a \in A$ + + \textbf{Initialise}: $t \gets 0$ + + \While{Not converged}{ + Take action $a_t \sim \pi(s_t)$ + + Observe ($r_t$, $s_{t+1}$) + + $a_{t+1} \sim \pi(s_{t+1})$ + + $Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha (r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t))$ + + $\pi(s_t)\in \argmax_{a \in A} Q(s_t, a)$ with probability $1-\epsilon$, else random + $t \gets t+1$ + $\pi \gets$ GreedyPolicy(Q) + } + + + \KwOut{{} Return $\pi, Q$} +\end{algorithm} + +\newpage +\section{Double Q-Learning} +\subsection{Old Version} +\begin{itemize} + \item Initialization: + \begin{itemize} + \item $Q_1(s,a)$ and $Q_2(s,a)$ $\forall s \in S, a\in A$ + \item $t= 0$ + \item initial state $s_t = s_0$ + \end{itemize} + \item Loop + \begin{itemize} + \item Select $a_t$ using $\epsilon$-greedy $\pi(s) \in \argmax_{a \in A} Q_1(s_t, a) + Q_2(s_t , a)$ + \item Observe $(r_t, s_{t+1})$ + \item With 50-50 probability either + \begin{enumerate} + \item $Q_1(s_t, a_t) \gets Q_1(s_t, a_t) + \alpha (r_t +\gamma Q_2(s_{t+1}, \argmax_{a \in A} Q_1(s_{t+1},a) ) - Q_1(s_t, a_t))$\\ + or + \item $Q_2(s_t, a_t) \gets Q_2(s_t, a_t) + \alpha (r_t +\gamma Q_1(s_{t+1}, \argmax_{a \in A} Q_2(s_{t+1},a) ) - Q_2(s_t, a_t))$ + \end{enumerate} + \item $t = t + 1 $ + \end{itemize} +\end{itemize} +\subsection{New Version} + +\textbf{How exactly do we initialize the Q tables, what do we return} +\begin{algorithm} + \caption{Double Q-Learning} + \DontPrintSemicolon + \LinesNotNumbered + \KwIn{{}\\ + $s_o$ - start state\\ + $\alpha$ - learning rate\\} + + \textbf{Initialise}: $Q_{1}(s,a) \leftarrow 0 \quad \forall s \in S, a \in A$ + + \textbf{Initialise}: $Q_{2}(s,a) \leftarrow 0 \quad \forall s \in S, a \in A$ + + \textbf{Initialise}: $t \gets 0$ + + \While{Not converged}{ + {Take action $a_t \in \argmax Q_1(s_t,a) + Q_2(s_t,a)$}\\ + Observe ($r_t$, $s_{t+1}$)\\ + $x \sim U(0,1)$\\ + \If {$x \leq 0.5$}{ + $Q_1(s_t, a_t) \gets Q_1(s_t, a_t) + \alpha (r_t +\gamma Q_2(s_{t+1}, \argmax_{a \in A} Q_1(s_{t+1},a) ) - Q_1(s_t, a_t))$ + } + \Else{ + $Q_2(s_t, a_t) \gets Q_2(s_t, a_t) + \alpha (r_t +\gamma Q_1(s_{t+1}, \argmax_{a \in A} Q_2(s_{t+1},a) ) - Q_2(s_t, a_t))$ + } + $t \gets t+1$ + } + \KwOut{{} Return $\pi, Q$} +\end{algorithm} + +\newpage +\section{First Visit Monte Carlo Approx} +\subsection{Old Version} +Initialize $\vect{w}= \mathbf{0}$, $k=1$\\ +Loop + \begin{itemize} + \item Sample $k$-th episode $s_{k,1}, a_{k,1}, r_{k,1}, s_{k,2}, a_{k,2}, r_{k,2}, \ldots$ + \item for $t=1, \ldots, L_k$ do + \begin{itemize} + \item If First visit to $s_{k,t}$ in episode $k$ then + \begin{itemize} + \item $G_t(s) = \sum_{j}^{L_k} r_{k,j}$ + \item Update weights by $\alpha (G_t - \vect{x}(s_{k,t})^T \vect{w}) \vect{x}(s_{k,t})$ + \end{itemize} + \end{itemize} + \item $k = k + 1$ + \end{itemize} +\subsection{New Version} + +\begin{algorithm}[H] + \caption{Monte Carlo Value Function Approximation} + \DontPrintSemicolon + \LinesNotNumbered + \KwIn{{}\\ + $\alpha$ - Learning rate,\\ + $K$ - number of episodes,\\ + $L_k$ - episode Length} + \textbf{Initialise}: $\vect{w}= \mathbf{0}$, $k=1$\\ + \While{$k \leq K$}{ + Sample $k-th$ episode $s_{k,1}, a_{k,1}, r_{k,1}, s_{k,2}, a_{k,2}, r_{k,2}, \ldots$\\ + \For{$t \gets 1,2,...L_k$}{ + \If{First visit to state}{ + {$G_t(s) \gets \sum_{j}^{L_k} r_{k,j}$}\\ + Update weights by $\alpha (G_t - \vect{x}(s_{k,t})^T \vect{w}) \vect{x}(s_{k,t})$ + } + } + } +\KwOut{Return: $\hat{V}(\cdot)$} +\end{algorithm} + +\newpage + + +\section{VFA TD} +\subsection{Old Version} +Initialize $\vect{w}= 0$, $k=1$;\\ +Loop + \begin{itemize} + \item Sample tuple $(s_k, a_k, r_k, s_{k+1})$ given $\pi$ + \item Update weights b< + $$ \vect{w} = \vect{w} + \alpha( r + \gamma \vect{x}(s')^T \vect{w} - \vect{x}(s)^T\vect{w}) \vect{x}(s) $$ + \item $k = k + 1$ + \end{itemize} + +\begin{algorithm}[H] + \caption{TD(0) Value Function Approximation} + \DontPrintSemicolon + \LinesNotNumbered + \KwIn{{}\\ + $\alpha$ - Learning rate} + \textbf{Initialise}: $\vect{w}= \mathbf{0}$, $k=1$\\ + \While{Not converged}{ + {Sample tuple $(s_k, a_k, r_k, s_{k+1})$ given $\pi$}\\ + Update weights by $\alpha( r + \gamma \vect{x}(s')^T \vect{w} - \vect{x}(s)^T\vect{w}) \vect{x}(s) $ + } +\KwOut{Return: $\hat{V}(\cdot)$} +\end{algorithm} + +\newpage + +\begin{algorithm}[H] + \scriptsize + \DontPrintSemicolon + \KwIn{{}\\{$\theta_0$ - Initial policy vector parameters}\\ + {$T$ - time budget}\\ + {$\lambda$ - Population size}\\ + {$\mu$ - Parent population size}\\ + {$\sigma$ - Mutation step-size}\\ + {$F(\theta)$ - Fitness function for policy evaluation}\\ + } + \For{$j \in \{1 \ldots \mu\}$}{ + $ w_j = \frac{log(\mu+0.5)-log(j)}{\sum\nolimits_{k=1}^\mu log(\mu+0.5)-log(k)} $ \\ + } + \For{$t=0,1, \ldots, T$}{ + \For{$i=1,2, \ldots, \lambda$}{ + {$\epsilon_i\sim\mathcal{N}(0,I)$}\;\\ + $s_i\leftarrow F(\theta_t+\sigma\cdot\epsilon_i)$ + } + Sort $(\epsilon_1,\ldots,\epsilon_\lambda)$ according to $s$ in descending order\\ + {Update policy: $\theta_{t+1}\leftarrow \theta_t + \sigma\cdot\sum\nolimits_{j=1}^\mu w_j\cdot\epsilon_j$} + } + \KwOut{{} Return best found policy $\theta_t$} + \caption{Canonical Evolution Strategy}\label{alg:canonical} +\end{algorithm} + + +\end{document} \ No newline at end of file diff --git a/w00_init/equation_cheat_sheet.tex b/w00_init/equation_cheat_sheet.tex index d79baa0..3278d36 100644 --- a/w00_init/equation_cheat_sheet.tex +++ b/w00_init/equation_cheat_sheet.tex @@ -6,7 +6,6 @@ \usepackage{lmodern} \usepackage{amssymb,amsmath} \usepackage{ifxetex,ifluatex} -\usepackage{fixltx2e} % provides \textsubscript \ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} @@ -106,7 +105,7 @@ \section{Basics} p(s_{t+1} \mid s_t, a_t) &=& p(s_{t+1} \mid h_t, a_t) \\ G_t &=& r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \ldots\\ V(s) &=& R(s) + \gamma \sum_{s' \in S} P(s'\mid s) V(s')\\ - V_k(s) &=& R(s) + \gamma \sum_{s' \in S} P(s' \mid s) V_{k-1}(s')\\ + V_k(s) &=& R(s) + \gamma \sum_{s' \in S} P(s' \mid s) V_{k-1}(s')]\\ R(s_t=s, a_t=a) &=& \mathbb{E}[r_t \mid s_t=s, a_t=a\\ R^\pi (s) &=& \sum_{a\in A} \pi(a\mid s ) R(s,a) \\ P^\pi (s'\mid s) &=& \sum_{a\in A} \pi(a \mid s) P(s' \mid s,a)\\ @@ -140,9 +139,13 @@ \section{Policy Evaluation} \section{Model-free Control} \begin{eqnarray} - &\lim_{i\to\infty}& N_i(s,a) \to \infty\\ - &\lim_{i\to \infty}& \pi(a\mid s) \to \argmax_{a\in A} Q(s,a)\\ + % Q^\pi(s,a) &=& \frac{G(s,a)}{N(s,a)}\\ + \pi_{i+1}(s) &\in& \argmax_{a \in A} Q^{\pi_i}(s,a)\\ + Q^{\pi_i}(s,\pi_{i+1}(s)) &\geq& \sum_{a \in A} \pi_i(a|s) Q^{\pi_i}(s,a)= V^{\pi_i}(s)\nonumber\\ Q(s_t,a_t) &\gets& Q(s_t, a_t) + \alpha (r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t))\\ + Q(s_t,a_t) &\gets& Q(s_t, a_t) + \alpha (r_t + \gamma \max_{a' \in A} Q(s_{t+1}, a') - Q(s_t, a_t))\\ + \hat{V}^{\hat{\pi}}(s) &\geq& V^\pi(s)\\ + Q_1(s_t,a_t) &\gets& Q_1(s_t,a_t) + \alpha (r_t + \gamma Q_2(s_t+1, \argmax_{a \in A}Q_1(s_{t+1},a)) - Q_1(s_t,a_t)) \end{eqnarray} \section{Function Approximation} @@ -155,17 +158,16 @@ \section{Function Approximation} \nabla_{\vect{w}} J(\vect{w}) &=& \nabla_{\vect{w}} \mathbb{E}_{\pi}[V^\pi (s) - \hat{V}^\pi (s; \vect{w})^2]\\ &=& \mathbb{E}_\pi [-2 (V^\pi(s) - \hat{V}^\pi (s;\vect{w})) \nabla_{\vect{w}} \hat{V}(s;\vect{w})]\\ \hat{V}^\pi(s; \vect{w}) &=& \sum_{j=1}^n \vect{x}_j (s) \vect{w}_j = \vect{x}(s)^T\vect{w}\\ - \Delta \vect{w} &=& - \frac{1}{2} \alpha \nabla_{\vect{w}} J (\vect{w})\\ - \Delta \vect{w} &=& -\frac{1}{2} \alpha(2(V^\pi(s) - \vect{x}(s)^T \vect{w})) \vect{x}(s)\\ + \Delta \vect{w} &=& -\frac{1}{2} \alpha(-2(V^\pi(s) - \vect{x}(s)^T \vect{w})) \vect{x}(s)\\ \Delta \vect{w} &=& \alpha (G_t - \hat{V} (s_t; \vect{w})) \nabla_{\vect{w}}\hat{V}(s_t; \vect{w})\\ - &=& \alpha (G_t - \hat{V} (s_t; \vect{w})) \vect{x}(s_t) \\ - &=& \alpha (G_t - \vect{x}(s_t)^T \vect{w}) \vect{x}(s_t) \\ + &=& \alpha (G_t - \hat{V} (s_t; \vect{w})) \vect{x}(s_t) \nonumber\\ + &=& \alpha (G_t - \vect{x}(s_t)^T \vect{w}) \vect{x}(s_t) \nonumber\\ \text{MSVE}(\vect{w}_{MC}) &=& \min_{\vect{w}}\sum_{s \in S} d(s) (V^\pi (s) - \hat{V}^\pi(s;\vect{w}))^2 \\ J(\vect{w}) &=& \mathbb{E}_\pi [(V(s_{j+1}, \vect{w}) - \hat{V}^\pi(s_j;\vect{w}))^2]\\ - &\approx& \mathbb{E}_\pi [(\underbrace{r_j + \gamma \hat{V}^\pi(s_{j+1}, \vect{w})}_{\text{target approximation}} - \hat{V}^\pi(s_j;\vect{w}))^2]\\ + &\approx& \mathbb{E}_\pi [(\underbrace{r_j + \gamma \hat{V}^\pi(s_{j+1}, \vect{w})}_{\text{target approximation}} - \hat{V}^\pi(s_j;\vect{w}))^2]\nonumber \\ \Delta \vect{w} &=& \alpha( r + \gamma \hat{V}^\pi(s'; \vect{w}) - \hat{V}^\pi(s;\vect{w})) \nabla_{\vect{w}} \hat{V}^\pi (s;\vect{w})\\ - &=& \alpha( r + \gamma \hat{V}^\pi(s'; \vect{w}) - \hat{V}^\pi(s;\vect{w})) \vect{x}(s)\\ - &=& \alpha( r + \gamma \vect{x}(s')^T \vect{w} - \vect{x}(s)^T\vect{w}) \vect{x}(s)\\ + &=& \alpha( r + \gamma \hat{V}^\pi(s'; \vect{w}) - \hat{V}^\pi(s;\vect{w})) \vect{x}(s) \nonumber\\ + &=& \alpha( r + \gamma \vect{x}(s')^T \vect{w} - \vect{x}(s)^T\vect{w}) \vect{x}(s) \nonumber\\ \vect{w} &=& \vect{w} + \alpha( r + \gamma \vect{x}(s')^T \vect{w} - \vect{x}(s)^T\vect{w}) \vect{x}(s)\\ \text{MSVE}(\vect{w}_{TD}) &\leq& \frac{1}{1-\gamma} \min_\vect{w}\sum_{s\in S} d(s) (V^\pi(s) - \hat{V}(s;\vect{w}))^2\\ \Delta \vect{w} &=& \alpha(G_t - \hat{Q}(s_t,a_t; \vect{w})) \nabla_{\vect{w}} \hat{Q}(s_t, a_t; \vect{w})\\ diff --git a/w00_init/notation_sheet.tex b/w00_init/notation_sheet.tex index 5a50c7c..576d44a 100644 --- a/w00_init/notation_sheet.tex +++ b/w00_init/notation_sheet.tex @@ -108,7 +108,7 @@ $A$ & space of Actions (\textbf{Warning:} overloaded notation with advantage function)\\ $a \in A$ & one specific action\\ $P: S \times A \to S$ & dynamics of environment \\ - $R: S \times A \to \mathbb{R}$ & reward function\\ + $R: S \times A \to \mathbb{R}$ & reward function (\textbf{Warning:} overloaded notation with the reward of a trajectory)\\ $r \in \mathbb{R}$ & concrete reward value\\ $\gamma \in [0,1]$ & discount factor\\ $T$ & maximal time horizon (\textbf{Warning:} overloaded notation with terminal states)\\ diff --git a/w00_init/t01_big_picture.tex b/w00_init/t01_big_picture.tex index bcaa630..2c0c836 100644 --- a/w00_init/t01_big_picture.tex +++ b/w00_init/t01_big_picture.tex @@ -1,4 +1,4 @@ -\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' +\documentclass[aspectratio=169, handout]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' \input{../latex_main/preamble} \title[ML-RL: Big Picture]{Welcome to the RL Lecture} @@ -61,7 +61,6 @@ \end{frame} %----------------------------------------------------------------------- -%---------------------------------------------------------------------- \begin{frame}[c]{Machine Learning} \centering @@ -119,65 +118,41 @@ \item Model Free Control \item Linear Function Approximation \item Deep RL - \item Policy Gradient + \item Policy Gradient I + II \item Exploration - \item Meta-RL - \item Reproducibility in RL - \item Auto-RL + %\item Meta-RL + \item Auto-RL + \item Reproducibility in RL \item Project \end{enumerate} \pause - $\leadsto$ \alert{More an introduction into RL!} + $\leadsto$ \alert{More an introduction into RL! Next semester SOTA RL!} \end{frame} -%---------------------------------------------------------------------- + %---------------------------------------------------------------------- \begin{frame}[c]{Course Format} - + +\begin{itemize} + \item Concepts over details \begin{itemize} - \item Concepts \& Details - \begin{itemize} - \item We provide references and links to papers\\ s.t. you can read up more details! - \item Nevertheless, we cover all the basic math for RL - \end{itemize} - \smallskip - \item Interactive lecture and exercise sessions - \begin{itemize} - \item Watch lecture at home! - \item Discuss it with us on-site - \item Interactive quizzes in exercise sessions to reinforce your knowledge and understanding - \item[$\leadsto$] The success of it depends on whether you are willing to talk to us! - \end{itemize} - \smallskip - \item (Mostly) Practical exercises - \begin{itemize} - \item Implement it, use it and play with it! - \item We will answer questions for the current exercise and partially discuss solutions from the last week in the on-site sessions - \end{itemize} + \item we provide references and links to papers\\ s.t. you can read up details! \end{itemize} - -\end{frame} -%---------------------------------------------------------------------- - -%---------------------------------------------------------------------- -\begin{frame}[c]{Organization (Lectures)} - + \smallskip + \item Interactive lecture \begin{itemize} - \item Lectures are pre-recorded - \item We will make them available on StudIP via Flowcast - \item[$\leadsto$] Flipped classroom lecture - \begin{itemize} - \item You watch the lectures whenever it suits you - \item We will discuss the lecture content in our on-site sessions - \item[$\leadsto$] each week Thursday at 2pm (s.t). - \item The meetings will not be recorded - \end{itemize} - \item If you are sick (or have symptoms), please send me an email in advance and we will set up a hybrid meeting via Zoom + \item more efficient learning through self-reflection \end{itemize} - + \smallskip + \item Practical exercises and projects + \begin{itemize} + \item implement it, use it and play with it! + \end{itemize} +\end{itemize} + \end{frame} -%----------------------------------------------------------------------- +%---------------------------------------------------------------------- %---------------------------------------------------------------------- \begin{frame}[c]{Why Videos?} @@ -210,113 +185,227 @@ \end{frame} %----------------------------------------------------------------------- %---------------------------------------------------------------------- -\begin{frame}[c]{Details on On-Site Meetings} - - \begin{enumerate} - \item Answering your questions regarding the videos - \item Breakout groups discussing some more in-depth questions - \item Kahoot-Quiz - \begin{itemize} - \item Helps you to check whether you really understand the topics - \item Gamified quiz - \end{itemize} - \item Feedback to exercise sheet - \begin{itemize} - \item You don't need to achieve any point threshold - %\item But you need to submit something every week - \item There is no extra exercise slot - \item[$\leadsto$] Consultation hour: - \begin{itemize} - \item You can meet with Aditya and/or Carolin Fridays from 13:00 - 14:30 - \item They will clarify all your detailed questions regarding the exercise - \item Send them an email beforehand to make an appointment - \end{itemize} - \end{itemize} - \end{enumerate} - +\begin{frame}[c]{Organization (Exercises)} + +\begin{itemize} + \item Every week new exercise sheet + \begin{itemize} + \item before Week N: watch videos of Lecture N (on your own) + \item Week N (Thursday): discussion of questions, quiz, and presentation of exercise solutions about Lecture N + \item Week N (Friday, 17:00): The exercise sheet for Lecture N is due + \item[$\leadsto$] \alert{Reasoning:} (i) You watch the videos; (ii) you work directly on the exercises to deepen your understanding; (iii) you discuss missing pieces with us; (iv) you complete the exercise (if not already done). + \end{itemize} + \item Optional exercise/consultation slot on Thursday 4pm - 5:30pm. + \begin{itemize} + \item Request it in advance if you are in need for that! + \end{itemize} + \item Most exercises will be practical, i.e., you have to implement something + \begin{itemize} + \item Expected work load: 1.5h - 2h each week + \end{itemize} + \item Teamwork highly recommended, team size at most 3! + \item Build upon GitHub classroom $\leadsto$ enables auto-grading + \begin{itemize} + \item There will be an invitation link each week -- distributed via StudIP + \end{itemize} +\end{itemize} + \end{frame} %----------------------------------------------------------------------- %---------------------------------------------------------------------- -\begin{frame}[c]{Organization (Exercise Assignments)} - - \begin{itemize} - \item Every week, a new exercise sheet - \item Exercise focus is aligned with the week's lecture topic - \begin{itemize} - \item \alert{Deadline} is always Fridays at 4pm - \end{itemize} - \item Most exercises will be practical, i.e., you have to implement something - \item Teamwork highly recommended, team size at most 3! - \pause - \item Build upon GitHub classroom $\leadsto$ enables auto-grading - \begin{itemize} - \item There will be an invitation link each week on each exercise sheet. - \item You will have to click on the link on exercise sheet one to be able to form groups. - \item Submit solutions via git - \end{itemize} - \pause - \item Don't cheat (incl. plagiarism) - \begin{itemize} - \item First time cheating: $0$ points for exercise - \item Second time cheating: failing the course - \end{itemize} - \pause - \item Exercises are not mandatory\\ \alert{BUT: quite unlikely that you will pass the course without doing them} - \end{itemize} - +\begin{frame}[c]{Bonus Points for Final Grade} + +\begin{itemize} + \item Up to \alert{$8$ bonus points} by solving the exercises + \begin{itemize} + \item Solving Level 1 and 2 of an exercise sheet to obtain $1$ bonus point + \item Solving Level 3 of an exercise sheet to obtain another $1$ bonus point + \end{itemize} + \item Up to \alert{$4$ bonus points} for presenting your solution in our Thursday meetings before the exercise deadline + \begin{itemize} + \item $1$ bonus point for volunteering to present your current solution + \item additional $1$ bonus point for presenting a complete solution + \item[$\leadsto$] at most $2$ bonus points for presenting each week + \item Can also be done as a group or as an individual + \begin{itemize} + \item Only those who are there and are part of the presentation can get these bonus points + \end{itemize} + \end{itemize} + \item $4$ bonus points $\leadsto$ grading boost by 0.3/0.4 (e.g., $1.7 \mapsto 1.3$) +\end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Don't cheat} + +\begin{itemize} + \item Don't cheat (incl. plagiarism) + \begin{itemize} + \item First time cheating: $0$ points for exercise + \item Second time cheating: failing the course + \end{itemize} + \pause + \item Exercises are not mandatory\\ \alert{BUT: quite unlikely that you will pass the course without doing them} + \medskip + \item If you think that it will help you to understand a solution better, we will not stop you from using Co-Pilot, GPT4 or similar systems + \begin{itemize} + \item However, you might learn less by using AI systems compared to solving it on your own + \item These systems can be frustrating if you don't have the underlying skills yourself. It will solve $80\%$ for you, but if you don't know how to solve the other $20\%$ yourself, you still screwed up. + \item \alert{Mandatory:} Mark whenever an AI system supported you! + \end{itemize} +\end{itemize} + \end{frame} %----------------------------------------------------------------------- %---------------------------------------------------------------------- -\begin{frame}[c]{Bonus Points} +\begin{frame}[c]{Live Discussion} \begin{itemize} + \item Every week at Thursday: 14:15 (s.t) - 15:45am\\ + \item Room F128, Building 1101 (Welfengarten 1) + \pause + \item Warning: Does not replace watching the recorded lecture videos! + \pause + \smallskip + \item Components: + \begin{enumerate} + \item You can ask anything related to the recent lecture videos or exercises + \item Break-out to discuss questions in small groups + \item \alert{Interactive quiz} where you can check whether you understood the main points\\ $\leadsto$ \alert{Important for passing the course!} + \pause + \item Presentation of exercise solutions + \end{enumerate} + \pause + \medskip + \item No recordings of the live sessions +\end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Get in Touch with Us} - \item Up to \alert{$8$ bonus points} for final grade +\begin{itemize} + \item Live session every Thursday (14:15 s.t.) + \item \alert{Use the forum in StudIP for all kind of questions} \begin{itemize} - \item Solve at least $80\%$ of an exercise sheet to obtain a bonus point - \item $4$ bonus points $\leadsto$ grading boost by 0.3/0.4 + \item Only use the "lecture" course and not the "exercise" course in StudIP! \end{itemize} - \item We will (sometimes) ask someone of you to present your solution + \item Don't send us emails \begin{itemize} - \item We will only ask students who got at least 80\% correct - \item If you refuse or fail to present your solution, you lose 2 bonus points + \item[$\leadsto$] Only in case of emergencies \end{itemize} \end{itemize} \end{frame} %----------------------------------------------------------------------- %---------------------------------------------------------------------- -\begin{frame}[c]{You need help?} - -Priority list: - \begin{enumerate} - \item Ask your friends and peers - \item Stud.IP Forum - \begin{itemize} - %\item[$\leadsto$] Channel ``2022 RL Lecture'' - \item Only use the lecture forum - \item You can also answer the questions of your peers! - \item We will only reply if we have the feeling that it is necessary. - \end{itemize} - \item If there are organizational questions, contact Carolin or Aditya directly - \begin{itemize} - \item Don't write them emails about how to solve an exercise or that you found a bug in the exercise - \item[$\leadsto$] all of these belong into the Stud.IP forum - \end{itemize} - \item Only as the very last option, contact me ;-) - \end{enumerate} - +\begin{frame}[c]{Sick or Symptoms} + +\begin{itemize} + \item COVID and other flu are still unpleasant (to say the least) + \item If you have symptoms, please stay at home and do not infect others + \item If you tell us in advance (i.e., send us an email), we can offer a hybrid setup s.t. you can join online. +\end{itemize} + \end{frame} %----------------------------------------------------------------------- -\begin{frame}{AI Courses at LUH} - - \centering - \vspace{-2em} - \includegraphics[width=0.38\textwidth]{images/aicources22.png} +%---------------------------------------------------------------------- +\begin{frame}[c]{Requirements for Attending} + +\begin{itemize} + \item Knowledge and hands-on exp. in \alert{Machine Learning}\\ + \begin{itemize} + \item Classification, regression, clustering, decision tree, training-test split, cross validation, pre-processing \ldots + \item as offered by Prof. Rosenhahn + \item to catch up (if nec.): \url{https://www.coursera.org/learn/machine-learning} + \end{itemize} + \pause + \item Knowledge and hands-on exp. in \alert{Deep Learning} (PyTorch)\\ + \begin{itemize} + \item feed-forward network, recurrent network, convolutions, learning rates, regularization, \ldots + \item to catch up (if nec.): \url{https://course.fast.ai/} + \end{itemize} + \pause + \item Experience in \alert{Python and git}\\ + \begin{itemize} + \item all exercises will require + that you implement something in~Python and\\ submit the solution to a git repo + \end{itemize} +\end{itemize} \end{frame} +%----------------------------------------------------------------------- %---------------------------------------------------------------------- +\begin{frame}[c]{Minimal (not sufficient!) Requirements for Passing} +\begin{itemize} + \item We will have a quiz each week + \item To have the chance to pass the course, you need to correctly answer at least $50\%$ of all questions + \begin{itemize} + \item In exchange, I will not further bother you with theory questions during the exam (see next slide) + \end{itemize} + \item If you should be sick, please notify Aditya or Carolin s.t. this week will not count for you + \item If you should fail this threshold, we will offer a short written exam at the end of the lecture period to compensate for it. + \begin{itemize} + \item if you failed that too, you failed the entire course prematuarly + \end{itemize} + \item This part is only about passing and will otherwise not influence your grade. +\end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Final Project Exam} + +\begin{itemize} + \item Implement a larger project (worth $1-2$ weeks full time) + \begin{itemize} + \item You can either propose a topic yourself or we will propose topics that you can choose from + \item Write a 1-page project proposal (incl. a research question, required steps and evaluation strategy) $\leadsto$ we will provide feedback on whether we believe that the project will be feasible or not + \item Team work with up to $3$ students possible + \end{itemize} + \pause + \item Exam: Poster Presentation + \begin{itemize} + \item You will provide peer feedback to one poster of others + \item We all meet for a day in February + \item You will present your project results as a poster + \begin{itemize} + \item We will provide a template for the poster and also will print it for you + \end{itemize} + \item Presentation will be done in two or three groups (depending on the number of students) s.t. some students are free to check out the others' posters + \end{itemize} + \item Tentative date: February 15th 2024 +\end{itemize} + +\end{frame} +%---------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Additional Resources} + +\begin{itemize} + \item To get a deep understanding of RL,\\ you should also read some papers + \item We provide links to important papers after each video + \item RL book: + \begin{itemize} + \item \url{https://www.andrew.cmu.edu/course/10-703/textbook/BartoSutton.pdf} + \begin{itemize} + \item Warning: uses a different notation + \end{itemize} + \item Video lectures -- click on it! + \begin{itemize} + \item \lit{Emma Brunskill (2019-20)}{https://www.youtube.com/watch?v=FgzM3zpZ55o&list=PLRQmQC3wIq9yxKVK1qc0r2nPuInn92LmK&index=1} + \item \lit{Sergey Levine (2020)}{https://www.youtube.com/playlist?list=PL_iWQOsE6TfURIIhCrlt-wj9ByIVpbfGc} + \item \lit{David Silver (2015)}{https://www.youtube.com/playlist?list=PLbWDNovNB5mqFBgq7i3MY6Ui4zudcvNFJ} + \item \lit{Robot Learning by Jan Peters (2021)}{https://learn.ki-campus.org/courses/moocrobot-tud2021} + \end{itemize} + \end{itemize} +\end{itemize} + +\end{frame} +%---------------------------------------------------------------------- \begin{frame}{Leibniz AI Academy} \centering @@ -333,104 +422,17 @@ $\leadsto$ more details at \url{https://www.ai-academy.uni-hannover.de/} -\end{frame} -%---------------------------------------------------------------------- -\begin{frame}[c]{Requirements for Attending} - - \vspace{-1em} - \begin{itemize} - \item Basics of \alert{AI} (recommended) - \begin{itemize} - \item Search, planning, optimization \ldots, expectations, \ldots - \end{itemize} - \pause - \item Basics of \alert{Machine Learning} (mandatory) - \begin{itemize} - \item Classification, regression, clustering, decision tree, training-test split, cross validation, pre-processing \ldots - \item For example, ML lecture by Prof. Rosenhahn - \item to catch up (if nec.): - \url{https://www.coursera.org/learn/machine-learning} - \end{itemize} - \pause - \item Knowledge and hands-on exp. in \alert{Deep Learning} (PyTorch)\\ (mandatory) - \begin{itemize} - \item feed-forward network, recurrent network, convolutions, learning rates, regularization, \ldots - \item For example, DL lecture by Prof. Anand - \item to catch up (if nec.): \url{https://course.fast.ai/} - \end{itemize} - \pause - \item Experience in \alert{Python and git} (mandatory) - \begin{itemize} - \item nearly all exercises will require - that you implement something in~Python and submit the solution to a git repo - \end{itemize} - \end{itemize} - \pause - $\leadsto$ If you solved the self-assessment test, you should be ready. - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Final Grading} - - \begin{itemize} - \item Implement a larger project (worth $1-2$ weeks full time) - \begin{itemize} - \item You can propose your own project idea! - \begin{itemize} - \item Hand-in a short summary of the idea (half a page) and we will provide feedback regarding feasibility - \end{itemize} - \item Teamwork (at most 3) again possible - \begin{itemize} - \item Larger team $\to$ larger scope of the project - \end{itemize} - \end{itemize} - \item ``Exam'' - \begin{itemize} - \item First $15$ minutes: Present your project idea and results - % \begin{itemize} - % \item Of course, everyone will present the project on their own - % \end{itemize} - \item Second 15+min: We will ask further questions about your project and how it relates to stuff you learned in the lecture. - \end{itemize} - \item \alert{Tentative dates}: Feb 27th - March 3rd (mornings) - % \item You will have the choice between a virtual and on-site exam. - \end{itemize} - -\end{frame} -%---------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c,fragile]{Material} - - \begin{itemize} - \item Slides: \url{https://github.com/automl-edu/RL_lecture} - \item Additional Material: - \begin{itemize} - \item To get a deep understanding of RL,\\ you should also read some papers - \item RL book by Sutton and Barto: - \url{https://www.andrew.cmu.edu/course/10-703/textbook/BartoSutton.pdf} - \item Video lectures -- click on it! - \begin{itemize} - \item \lit{Emma Brunskill (2019-20)}{https://www.youtube.com/watch?v=FgzM3zpZ55o&list=PLRQmQC3wIq9yxKVK1qc0r2nPuInn92LmK&index=1} - \item \lit{Sergey Levine (2020)}{https://www.youtube.com/playlist?list=PL_iWQOsE6TfURIIhCrlt-wj9ByIVpbfGc} - \item \lit{David Silver (2015)}{https://www.youtube.com/playlist?list=PLbWDNovNB5mqFBgq7i3MY6Ui4zudcvNFJ} - \item \lit{Robot Learning by Jan Peters (2021)}{https://learn.ki-campus.org/courses/moocrobot-tud2021} - \end{itemize} - \end{itemize} - \end{itemize} - \end{frame} %---------------------------------------------------------------------- %---------------------------------------------------------------------- \begin{frame}[c]{Opportunities and Risks} - - \vspace{-1em} - RL is an advanced lecture and we present it for the third time - - \medskip - \pause - - Opportunities: + +RL is an advanced lecture and we update it each time. + +\bigskip +\pause + +Opportunities: \begin{itemize} \item RL is a very hot topic these days \item We will start with the basics and go step by step to the more advanced (research) topics @@ -445,42 +447,371 @@ \item The origins of RL go back to robotics, control, theory on bandits and computer science\\ $\leadsto$ different notations \item You will find some typos and issues in the slides\newline $\leadsto$ please tell us if you find something \end{itemize} - - \pause - $\to$ Give us some feedback and we will improve the course! - - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Additional Bonus Point} -\begin{itemize} - \item GitHub repo: - \begin{itemize} - \item Slides: \url{https://github.com/automl-edu/RL_lecture} - \end{itemize} - \item If you find bugs in the slides or exercises,\\ you can obtain bonus points: - \begin{itemize} - \item 0.5 point for every major bug in an equation - \item 0.1 point for every typo in the slides - \item 0.5 point for every code bug in the exercise - \end{itemize} - \item At most 4 points $\leadsto$ 1 grading boost - \item Submit a PR to our repos and ensure that we can decipher your real name -\end{itemize} +\medskip +$\to$ Give us some feedback and we will improve the course! \end{frame} %----------------------------------------------------------------------- + \begin{frame}[c]{} + +\centering +\huge +Questions? + +\end{frame} +%---------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Course Format} + +% \begin{itemize} +% \item Concepts \& Details +% \begin{itemize} +% \item We provide references and links to papers\\ s.t. you can read up more details! +% \item Nevertheless, we cover all the basic math for RL +% \end{itemize} +% \smallskip +% \item Interactive lecture and exercise sessions +% \begin{itemize} +% \item Watch lecture at home! +% \item Discuss it with us on-site +% \item Interactive quizzes in exercise sessions to reinforce your knowledge and understanding +% \item[$\leadsto$] The success of it depends on whether you are willing to talk to us! +% \end{itemize} +% \smallskip +% \item (Mostly) Practical exercises +% \begin{itemize} +% \item Implement it, use it and play with it! +% \item We will answer questions for the current exercise and partially discuss solutions from the last week in the on-site sessions +% \end{itemize} +% \end{itemize} + +% \end{frame} +% %---------------------------------------------------------------------- + +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Organization (Lectures)} + +% \begin{itemize} +% \item Lectures are pre-recorded +% \item We will make them available on StudIP via Flowcast +% \item[$\leadsto$] Flipped classroom lecture +% \begin{itemize} +% \item You watch the lectures whenever it suits you +% \item We will discuss the lecture content in our on-site sessions +% \item[$\leadsto$] each week Thursday at 2pm (s.t). +% \item The meetings will not be recorded +% \end{itemize} +% \item If you are sick (or have symptoms), please send me an email in advance and we will set up a hybrid meeting via Zoom +% \end{itemize} + +% \end{frame} +% %----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Why Videos?} + +% \begin{itemize} +% \item Advantages of videos: +% \begin{itemize} +% \item Neither YOUTUBE nor NETFLIX VIDEOS! +% \item Watch it whenever (wherever) you want +% \item Watch it at your own speed +% \begin{itemize} +% \item[$\leadsto$] Stop it if you need time to think about it +% \end{itemize} +% \item Go back and watch it again, if you missed or forgot something +% \item Annotate questions on the fly %(e.g., using the Miro boards) +% \item Take notes of what you have learned $\leadsto$ Learning Diary +% \item After each video ($\sim$10-20min), you can take a break and\\ think about what you learned in this video (and whether you understood it) +% \end{itemize} +% \medskip +% \pause +% \item Risks and challenges: +% \begin{itemize} +% \item You have to be self-disciplined +% \item You have to wait with your questions until our meetings +% \begin{itemize} +% \item[$\leadsto$] Use the StudIP forum to discuss with your peers +% \end{itemize} +% \end{itemize} +% \end{itemize} + +% \end{frame} +% %----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Details on On-Site Meetings} + +% \begin{enumerate} +% \item Answering your questions regarding the videos +% \item Breakout groups discussing some more in-depth questions +% \item Kahoot-Quiz +% \begin{itemize} +% \item Helps you to check whether you really understand the topics +% \item Gamified quiz +% \end{itemize} +% \item Feedback to exercise sheet +% \begin{itemize} +% \item You don't need to achieve any point threshold +% %\item But you need to submit something every week +% \item There is no extra exercise slot +% \item[$\leadsto$] Consultation hour: +% \begin{itemize} +% \item You can meet with Aditya and/or Carolin Fridays from 13:00 - 14:30 +% \item They will clarify all your detailed questions regarding the exercise +% \item Send them an email beforehand to make an appointment +% \end{itemize} +% \end{itemize} +% \end{enumerate} + +% \end{frame} +% %----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Organization (Exercise Assignments)} + +% \begin{itemize} +% \item Every week, a new exercise sheet +% \item Exercise focus is aligned with the week's lecture topic +% \begin{itemize} +% \item \alert{Deadline} is always Fridays at 4pm +% \end{itemize} +% \item Most exercises will be practical, i.e., you have to implement something +% \item Teamwork highly recommended, team size at most 3! +% \pause +% \item Build upon GitHub classroom $\leadsto$ enables auto-grading +% \begin{itemize} +% \item There will be an invitation link each week on each exercise sheet. +% \item You will have to click on the link on exercise sheet one to be able to form groups. +% \item Submit solutions via git +% \end{itemize} +% \pause +% \item Don't cheat (incl. plagiarism) +% \begin{itemize} +% \item First time cheating: $0$ points for exercise +% \item Second time cheating: failing the course +% \end{itemize} +% \pause +% \item Exercises are not mandatory\\ \alert{BUT: quite unlikely that you will pass the course without doing them} +% \end{itemize} + +% \end{frame} +% %----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Bonus Points} + +% \begin{itemize} + +% \item Up to \alert{$8$ bonus points} for final grade +% \begin{itemize} +% \item Solve at least $80\%$ of an exercise sheet to obtain a bonus point +% \item $4$ bonus points $\leadsto$ grading boost by 0.3/0.4 +% \end{itemize} +% \item We will (sometimes) ask someone of you to present your solution +% \begin{itemize} +% \item We will only ask students who got at least 80\% correct +% \item If you refuse or fail to present your solution, you lose 2 bonus points +% \end{itemize} +% \end{itemize} + +% \end{frame} +% %----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{You need help?} + +% Priority list: +% \begin{enumerate} +% \item Ask your friends and peers +% \item Stud.IP Forum +% \begin{itemize} +% %\item[$\leadsto$] Channel ``2022 RL Lecture'' +% \item Only use the lecture forum +% \item You can also answer the questions of your peers! +% \item We will only reply if we have the feeling that it is necessary. +% \end{itemize} +% \item If there are organizational questions, contact Carolin or Aditya directly +% \begin{itemize} +% \item Don't write them emails about how to solve an exercise or that you found a bug in the exercise +% \item[$\leadsto$] all of these belong into the Stud.IP forum +% \end{itemize} +% \item Only as the very last option, contact me ;-) +% \end{enumerate} + +% \end{frame} +% %----------------------------------------------------------------------- +% \begin{frame}{AI Courses at LUH} + +% \centering +% \vspace{-2em} +% \includegraphics[width=0.38\textwidth]{images/aicources22.png} + +% \end{frame} +% %---------------------------------------------------------------------- + +% \begin{frame}{Leibniz AI Academy} + +% \centering +% \vspace{-2em} +% \includegraphics[width=0.6\textwidth]{images/laa.png} + +% \end{frame} +% %---------------------------------------------------------------------- +% \begin{frame}{Leibniz AI Academy} + +% \centering +% % \vspace{-2em} +% \includegraphics[width=0.7\textwidth]{images/LAI-New-Blue.png} + +% $\leadsto$ more details at \url{https://www.ai-academy.uni-hannover.de/} + +% \end{frame} +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Requirements for Attending} + +% \vspace{-1em} +% \begin{itemize} +% \item Basics of \alert{AI} (recommended) +% \begin{itemize} +% \item Search, planning, optimization \ldots, expectations, \ldots +% \end{itemize} +% \pause +% \item Basics of \alert{Machine Learning} (mandatory) +% \begin{itemize} +% \item Classification, regression, clustering, decision tree, training-test split, cross validation, pre-processing \ldots +% \item For example, ML lecture by Prof. Rosenhahn +% \item to catch up (if nec.): +% \url{https://www.coursera.org/learn/machine-learning} +% \end{itemize} +% \pause +% \item Knowledge and hands-on exp. in \alert{Deep Learning} (PyTorch)\\ (mandatory) +% \begin{itemize} +% \item feed-forward network, recurrent network, convolutions, learning rates, regularization, \ldots +% \item For example, DL lecture by Prof. Anand +% \item to catch up (if nec.): \url{https://course.fast.ai/} +% \end{itemize} +% \pause +% \item Experience in \alert{Python and git} (mandatory) +% \begin{itemize} +% \item nearly all exercises will require +% that you implement something in~Python and submit the solution to a git repo +% \end{itemize} +% \end{itemize} +% \pause +% $\leadsto$ If you solved the self-assessment test, you should be ready. + +% \end{frame} +% %----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Final Grading} + +% \begin{itemize} +% \item Implement a larger project (worth $1-2$ weeks full time) +% \begin{itemize} +% \item You can propose your own project idea! +% \begin{itemize} +% \item Hand-in a short summary of the idea (half a page) and we will provide feedback regarding feasibility +% \end{itemize} +% \item Teamwork (at most 3) again possible +% \begin{itemize} +% \item Larger team $\to$ larger scope of the project +% \end{itemize} +% \end{itemize} +% \item ``Exam'' +% \begin{itemize} +% \item First $15$ minutes: Present your project idea and results +% % \begin{itemize} +% % \item Of course, everyone will present the project on their own +% % \end{itemize} +% \item Second 15+min: We will ask further questions about your project and how it relates to stuff you learned in the lecture. +% \end{itemize} +% \item \alert{Tentative dates}: Feb 27th - March 3rd (mornings) +% % \item You will have the choice between a virtual and on-site exam. +% \end{itemize} + +% \end{frame} +% %---------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c,fragile]{Material} + +% \begin{itemize} +% \item Slides: \url{https://github.com/automl-edu/RL_lecture} +% \item Additional Material: +% \begin{itemize} +% \item To get a deep understanding of RL,\\ you should also read some papers +% \item RL book by Sutton and Barto: +% \url{https://www.andrew.cmu.edu/course/10-703/textbook/BartoSutton.pdf} +% \item Video lectures -- click on it! +% \begin{itemize} +% \item \lit{Emma Brunskill (2019-20)}{https://www.youtube.com/watch?v=FgzM3zpZ55o&list=PLRQmQC3wIq9yxKVK1qc0r2nPuInn92LmK&index=1} +% \item \lit{Sergey Levine (2020)}{https://www.youtube.com/playlist?list=PL_iWQOsE6TfURIIhCrlt-wj9ByIVpbfGc} +% \item \lit{David Silver (2015)}{https://www.youtube.com/playlist?list=PLbWDNovNB5mqFBgq7i3MY6Ui4zudcvNFJ} +% \item \lit{Robot Learning by Jan Peters (2021)}{https://learn.ki-campus.org/courses/moocrobot-tud2021} +% \end{itemize} +% \end{itemize} +% \end{itemize} + +% \end{frame} +% %---------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Opportunities and Risks} + +% \vspace{-1em} +% RL is an advanced lecture and we present it for the third time + +% \medskip +% \pause + +% Opportunities: +% \begin{itemize} +% \item RL is a very hot topic these days +% \item We will start with the basics and go step by step to the more advanced (research) topics +% \item The course will provide a solid background for doing a master project/thesis in our group +% \end{itemize} + +% \pause + +% Challenges: +% \begin{itemize} +% \item The research on RL is very active and there is so much progress\newline $\leadsto$ impossible to catch up with state of the art with one course +% \item The origins of RL go back to robotics, control, theory on bandits and computer science\\ $\leadsto$ different notations +% \item You will find some typos and issues in the slides\newline $\leadsto$ please tell us if you find something +% \end{itemize} + +% \pause +% $\to$ Give us some feedback and we will improve the course! + + +% \end{frame} +% %----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Additional Bonus Point} + +% \begin{itemize} +% \item GitHub repo: +% \begin{itemize} +% \item Slides: \url{https://github.com/automl-edu/RL_lecture} +% \end{itemize} +% \item If you find bugs in the slides or exercises,\\ you can obtain bonus points: +% \begin{itemize} +% \item 0.5 point for every major bug in an equation +% \item 0.1 point for every typo in the slides +% \item 0.5 point for every code bug in the exercise +% \end{itemize} +% \item At most 4 points $\leadsto$ 1 grading boost +% \item Submit a PR to our repos and ensure that we can decipher your real name +% \end{itemize} + + +% \end{frame} +% %----------------------------------------------------------------------- +% \begin{frame}[c]{} - \centering - \huge - Questions? +% \centering +% \huge +% Questions? -\end{frame} +% \end{frame} -%----------------------------------------------------------------------- +% %----------------------------------------------------------------------- \end{document} diff --git a/w01_big_picture/t04_rl_nutshell.tex b/w01_big_picture/t04_rl_nutshell.tex index d1d090c..22c839f 100644 --- a/w01_big_picture/t04_rl_nutshell.tex +++ b/w01_big_picture/t04_rl_nutshell.tex @@ -118,6 +118,7 @@ \item Examples: Saving for retirement or Finding a key in video game Montezuma’s revenge \item Extreme case: we get only feedback at the end of an episode\newline (e.g., who won a board game match) \end{itemize} + \item Either deterministic or stochastic (focus on deterministic) \pause \item Introduces two challenges \begin{itemize} diff --git a/w02_basics/t01_markov_assumption.tex b/w02_basics/t01_markov_assumption.tex index f738cf3..5912e06 100644 --- a/w02_basics/t01_markov_assumption.tex +++ b/w02_basics/t01_markov_assumption.tex @@ -29,7 +29,7 @@ \end{frame} %----------------------------------------------------------------------- %---------------------------------------------------------------------- -\begin{frame}[c]{Why is Markov Assumption Popular?} +\begin{frame}[c]{Markov Assumption} \begin{itemize} \item Can always be satisfied @@ -44,6 +44,10 @@ \item Data required \item Resulting performance \end{itemize} + \item Why is Markov Assumption popular? + \begin{itemize} + \item Problems become feasible to handle + \end{itemize} \end{itemize} \end{frame} diff --git a/w02_basics/t05_policy_iteration.tex b/w02_basics/t05_policy_iteration.tex index 21abebc..c88d41b 100644 --- a/w02_basics/t05_policy_iteration.tex +++ b/w02_basics/t05_policy_iteration.tex @@ -25,16 +25,18 @@ %---------------------------------------------------------------------- \begin{frame}[c]{MDP Policy Iteration (PI)} -\begin{itemize} - \item Set $i=0$ - \item Initialize $\pi_0(s)$ randomly for all states $s$ - \item While $i == 0$ or\\ $||\pi_i - \pi_{i-1}||_1 > 0$ (L1-norm, measures if the policy changed for any state) - \begin{itemize} - \item $V^{\pi_i} \gets$ MDP V-function policy evaluation of $\pi_i$ - \item $\pi_{i+1} \gets$ Policy improvement - \item $i \gets i+1$ - \end{itemize} -\end{itemize} +\begin{algorithm}[H] + \caption{Policy Iteration} + \DontPrintSemicolon + \textbf{Initialise}: $i \leftarrow 0$\\ + \textbf{Initialise}: $\pi_i$ as random policy\\ + \While{$i == 0$ or $||\pi_i - \pi_{i-1}||_1 > 0$}{ + $V^{\pi_i} \gets$ MDP V-function policy evaluation of $\pi_i$\\ + $\pi_{i+1} \gets$ Policy improvement\\ + $i \gets i+1$ + } + \KwOut{{}Return $\pi_i, V^{\pi_i}$} +\end{algorithm} \end{frame} %----------------------------------------------------------------------- @@ -71,16 +73,18 @@ %---------------------------------------------------------------------- \begin{frame}[c]{MDP Policy Iteration (PI)} -\begin{itemize} - \item Set $i=0$ - \item Initialize $\pi_0(s)$ randomly for all states $s$ - \item While $i == 0$ or $||\pi_i - \pi_{i-1}||_1 > 0$ (L1-norm, measures if the policy changed for any state) - \begin{itemize} - \item $V^{\pi_i} \gets$ MDP V function policy \alert{evaluation} of $\pi$ \hspace{1em} $\leadsto$ use $Q$ - \item $\pi_{i+1} \gets$ Policy \alert{improvement} - \item $i \gets i+1$ - \end{itemize} -\end{itemize} +\begin{algorithm}[H] + \caption{Policy Iteration} + \DontPrintSemicolon + \textbf{Initialise}: $i \leftarrow 0$\\ + \textbf{Initialise}: $\pi_i$ as random policy\\ + \While{$i == 0$ or $||\pi_i - \pi_{i-1}||_1 > 0$}{ + $V^{\pi_i} \gets$ MDP V-function policy \alert{evaluation} of $\pi_i$ $\leadsto$ use $Q$\\ + $\pi_{i+1} \gets$ Policy \alert{improvement}\\ + $i \gets i+1$ + } + \KwOut{{}Return $\pi_i, V^{\pi_i}$} +\end{algorithm} \end{frame} %----------------------------------------------------------------------- @@ -122,15 +126,19 @@ %---------------------------------------------------------------------- \begin{frame}[c]{MDP Policy Iteration (PI): Check your Understanding} +\begin{algorithm}[H] + \caption{Policy Iteration} + \DontPrintSemicolon + \textbf{Initialise}: $i \leftarrow 0$\\ + \textbf{Initialise}: $\pi_i$ as random policy\\ + \While{$i == 0$ or $||\pi_i - \pi_{i-1}||_1 > 0$}{ + $V^{\pi_i} \gets$ MDP V-function policy \alert{evaluation} of $\pi_i$ $\leadsto$ use $Q$\\ + $\pi_{i+1} \gets$ Policy \alert{improvement}\\ + $i \gets i+1$ + } + \KwOut{{}Return $\pi_i, V^{\pi_i}$} +\end{algorithm} \begin{itemize} - \item Set $i=0$ - \item Initialize $\pi_0(s)$ randomly for all states $s$ - \item While $i == 0$ or\\ $||\pi_i - \pi_{i-1}||_1 > 0$ (L1-norm, measures if the policy changed for any state) - \begin{itemize} - \item $V^{\pi_i} \gets$ MDP V function policy \alert{evaluation} of $\pi$ \hspace{1em} $\leadsto$ use $Q$ - \item $\pi_{i+1} \gets$ Policy \alert{improvement} - \item $i \gets i+1$ - \end{itemize} \item \alert{If the policy doesn't change, can it ever change?} \item \alert{Is there a maximum of iterations of policy iteration?} \end{itemize} diff --git a/w02_basics/t06_value_iteration.tex b/w02_basics/t06_value_iteration.tex index aa6a83f..e4c88fd 100644 --- a/w02_basics/t06_value_iteration.tex +++ b/w02_basics/t06_value_iteration.tex @@ -49,19 +49,21 @@ %---------------------------------------------------------------------- \begin{frame}[c]{Value Iteration (VI)} -\begin{itemize} - \item Set $k = 1$ - \item Initialize $V_0(s) = 0$ for all states $s$ - \item Loop until convergence - \begin{itemize} - \item For each state $s$ - $$V_{k+1}(s) = \max_{a\in A } R(s,a) + \gamma \sum_{s' \in S } P(s' \mid s,a) V_k(s') $$ - \item View as Bellmann backup on the value function - $$V_{k+1} = BV_k$$ - $$\pi_{k+1}(s) \in \argmax_{a \in A} R(s,a) + \gamma \sum_{s' \in S} P(s' \mid s,a) V_k(s') $$ - \end{itemize} - -\end{itemize} +\begin{algorithm}[H] + \caption{Value Iteration} + \textbf{Initialise}: $k \gets 1$\\ + \textbf{Initialise}: $V_0(s) \gets 0 \quad \forall s \in S$\\ + \While{$k == 1$ or $V_{k+1} \not\approx V_k$}{ + \For{each state $s \in S$}{ + $V_{k+1}(s) \gets \max_{a\in A } \bigg (R(s,a) + \gamma \sum_{s' \in S } P(s' \mid s,a) V_k(s')\bigg)$ + } + $V_{k+1} \gets BV_k$\\ + $k \gets k+1$ + } + $\pi \leftarrow$ extract policy from $V_k$ + + \KwOut{{}Return $\pi, V_k$} +\end{algorithm} \end{frame} %----------------------------------------------------------------------- diff --git a/w03_policy_evaluation/t02_dyn_prog.tex b/w03_policy_evaluation/t02_dyn_prog.tex index f0d8af4..2be52ef 100644 --- a/w03_policy_evaluation/t02_dyn_prog.tex +++ b/w03_policy_evaluation/t02_dyn_prog.tex @@ -60,6 +60,21 @@ \item[$\leadsto$] bootstrapping the rest of the expected return\newline by the value estimate $V_{k-1}$ \end{itemize} +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{What do we mean by bootstrapping?} +\begin{itemize} + \item We want to get an exact state value $V^\pi(s)$. + \item To do this, we would ideally need to roll the whole sequence out + \item \textbf{Problem:} What if the sequence is too long, or even infinite? + \item \textbf{Idea:} We treat the current state value as an estimate of the exact value and run with it + \begin{itemize} + \item This adds bias to the process since we are basically treating the estimation as truth + \end{itemize} + \item \textbf{Key:} If we refine this estimation over time, then we can get closer to the actual value + \item \alert{"Pull ourselves out, by the bootstraps" } +\end{itemize} \end{frame} %----------------------------------------------------------------------- %---------------------------------------------------------------------- diff --git a/w03_policy_evaluation/t03_monte_carlo.tex b/w03_policy_evaluation/t03_monte_carlo.tex index 7bd5011..559b19c 100644 --- a/w03_policy_evaluation/t03_monte_carlo.tex +++ b/w03_policy_evaluation/t03_monte_carlo.tex @@ -84,22 +84,29 @@ %---------------------------------------------------------------------- \begin{frame}[c]{First-Visit Monte Carlo (MC) On Policy Evaluation} -Initialize $N(s) = 0$, $G(s) = 0$ $\forall s \in S$\\ -Loop -\begin{itemize} - \item Sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots,s_{i,n}$ - \item Define $G_{i,t} = r_{i,t} + \gamma r_{i,t+1} + \gamma^2 r_{i,t+2} + \ldots$ - \item For each state $s$ visited in episode $i$ - \begin{itemize} - \item for first time $t$ that state $s$ is visited in episode $i$ - \begin{itemize} - \item Increment counter of total first visits: $N(s) = N(s) + 1$ - \item Increment total return $G(s) = G(s) + G_{i,t}$ - \item Update estimate $V^\pi (s) = G(s) /N(s)$ - \end{itemize} - \end{itemize} -\end{itemize} - +\begin{algorithm}[H] + \caption{First Visit Monte Carlo} + \DontPrintSemicolon + \LinesNotNumbered + + \KwIn{{}\\ $\pi$ - Policy to evaluate} + + \textbf{Initialise}: $N(s) \gets 0 \quad \forall s \in S$ \tcp*{Amount of times $s$ visited} + \textbf{Initialise}: $G(s) \gets 0 \quad \forall s \in S$ \tcp*{Accumulated discounted returns} + \While{not converged}{ + Sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots,s_{i,n}$ + + \If{s visited for the first time in current episode}{ + $N(s) \leftarrow N(s) + 1$ + + $G(s) \leftarrow G(s) + G_{i,t}$ + + $V^\pi (s) \leftarrow G(s)/N(s)$ + } + } + \KwOut{{} Return $V^\pi$} +\end{algorithm} + \end{frame} %----------------------------------------------------------------------- %----------------------------------------------------------------------- diff --git a/w03_policy_evaluation/t04_monte_carlo_bias_variance.tex b/w03_policy_evaluation/t04_monte_carlo_bias_variance.tex index f1e0bf9..e824f01 100644 --- a/w03_policy_evaluation/t04_monte_carlo_bias_variance.tex +++ b/w03_policy_evaluation/t04_monte_carlo_bias_variance.tex @@ -14,21 +14,28 @@ %---------------------------------------------------------------------- \begin{frame}[c]{First-Visit Monte Carlo (MC) On Policy Evaluation} -Initialize $N(s) = 0$, $G(s) = 0$ $\forall s \in S$\\ -Loop -\begin{itemize} - \item Sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots$ - \item Define $G_{i,t} = r_{i,t} + \gamma r_{i,t+1} + \gamma^2 r_{i,t+2} + \ldots$ - \item For each state $s$ visited in episode $i$ - \begin{itemize} - \item for first time $t$ that state $s$ is visited in episode $i$ - \begin{itemize} - \item Increment counter of total first visits: $N(s) = N(s) + 1$ - \item Increment total return $G(s) = G(s) + G_{i,t}$ - \item Update estimate $V^\pi (s) = G(s) /N(s)$ - \end{itemize} - \end{itemize} -\end{itemize} +\begin{algorithm}[H] + \caption{First Visit Monte Carlo} + \DontPrintSemicolon + \LinesNotNumbered + + \KwIn{{}\\ $\pi$ - Policy to evaluate} + + \textbf{Initialise}: $N(s) \gets 0 \quad \forall s \in S$ \tcp*{Amount of times $s$ visited} + \textbf{Initialise}: $G(s) \gets 0 \quad \forall s \in S$ \tcp*{Accumulated discounted returns} + \While{not converged}{ + Sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots,s_{i,n}$ + + \If{s visited for the first time in current episode}{ + $N(s) \leftarrow N(s) + 1$ + + $G(s) \leftarrow G(s) + G_{i,t}$ + + $V^\pi (s) \leftarrow G(s)/N(s)$ + } + } + \KwOut{{} Return $V^\pi$} +\end{algorithm} \end{frame} %----------------------------------------------------------------------- @@ -57,21 +64,35 @@ %---------------------------------------------------------------------- \begin{frame}[c]{First-Visit Monte Carlo (MC) On Policy Evaluation} -Initialize $N(s) = 0$, $G(s) = 0$ $\forall s \in S$\\ -Loop -\begin{itemize} - \item Sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots$ - \item Define $G_{i,t} = r_{i,t} + \gamma r_{i,t+1} + \gamma^2 r_{i,t+2} + \ldots$ - \item For each state $s$ visited in episode $i$ - \begin{itemize} - \item for first time $t$ that state $s$ is visited in episode $i$ - \begin{itemize} - \item Increment counter of total first visits: $N(s) = N(s) + 1$ - \item Increment total return $G(s) = G(s) + G_{i,t}$ - \item Update estimate $V^\pi (s) = G(s) /N(s)$ - \end{itemize} - \end{itemize} -\end{itemize} +\begin{algorithm}[H] + \caption{First Visit Monte Carlo} + \DontPrintSemicolon + \LinesNotNumbered + + \KwIn{{}\\ $\pi$ - Policy to evaluate} + + \textbf{Initialise}: $N(s) \gets 0 \quad \forall s \in S$ \tcp*{Amount of times $s$ visited} + \textbf{Initialise}: $G(s) \gets 0 \quad \forall s \in S$ \tcp*{Accumulated discounted returns} + \While{not converged}{ + Sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots,s_{i,n}$ + + \If{s visited for the first time in current episode}{ + $N(s) \leftarrow N(s) + 1$ + + $G(s) \leftarrow G(s) + G_{i,t}$ + + $V^\pi (s) \leftarrow G(s)/N(s)$ + } + } + \KwOut{{} Return $V^\pi$} +\end{algorithm} +\end{frame} + +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- + + +\begin{frame}[c]{Properties and Limitations of First-Visit Monte Carlo (MC)} Properties: \begin{itemize} @@ -85,12 +106,8 @@ \end{itemize} -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Monte Carlo (MC) Policy Evaluation Key Limitations} - - \begin{itemize} +Limitations: +\begin{itemize} \item Generally high variance estimator \begin{itemize} \item Reducing variance can require a lot of data @@ -106,8 +123,8 @@ \end{itemize} \end{itemize} - \end{frame} + %----------------------------------------------------------------------- %---------------------------------------------------------------------- \begin{frame}[c]{Monte Carlo (MC) Policy Evaluation Summary} diff --git a/w03_policy_evaluation/t05_td.tex b/w03_policy_evaluation/t05_td.tex index ee601eb..61e97d2 100644 --- a/w03_policy_evaluation/t05_td.tex +++ b/w03_policy_evaluation/t05_td.tex @@ -65,13 +65,24 @@ %---------------------------------------------------------------------- \begin{frame}[c]{Temporal Difference [TD(0)] Learning Algorithm} - Input: $\alpha$\\ - Initialize $V^\pi(s) = 0. \forall s \in S$\\ - Loop\\ - \begin{itemize} - \item Sample tuple $(s_t, a_t, r_t, s_{t+1})$ - \item $V^\pi(s) = V^\pi(s) + \alpha (\underbrace{[r_t + \gamma V^\pi (s_{t+1})]}_{\text{TD target}} - V^\pi(s))$ - \end{itemize} + \begin{algorithm}[H] + \caption{TD(0)} + \LinesNotNumbered + \DontPrintSemicolon + \KwIn{{}\\ + $\pi$ - Policy to evaluate\\ + $\alpha$ - Learning Rate} + \textbf{Initialise}: $V^\pi(s) = 0 \quad \forall s \in S$ + + \While{Not converged}{ + Sample tuple $(s_t, a_t, r_t, s_{t+1})$ + + Compute $\text{TD target} = r_t + \gamma V^\pi (s_{t+1})$ + + $V^\pi(s) \gets V^\pi(s) + \alpha ([\text{TD target}] - V^\pi(s))$ + } + \KwOut{{} Return $V^\pi$} +\end{algorithm} \end{frame} %----------------------------------------------------------------------- diff --git a/w03_policy_evaluation/t06_td_gamma.tex b/w03_policy_evaluation/t06_td_gamma.tex index eb375d2..ddd4709 100644 --- a/w03_policy_evaluation/t06_td_gamma.tex +++ b/w03_policy_evaluation/t06_td_gamma.tex @@ -71,12 +71,16 @@ \column{0.5\textwidth} \begin{itemize} - \item The $\lambda$-return $G_t^ {\lambda}$ combines all $n$-steps returns $G_t^{(n)}$ - \item Using weight $(1-\lambda) \lambda^{n-1}$ - $$G_t^\lambda = (1-\lambda) \sum_{n=1}^{T-t-2} \lambda^{n-1} G_t^{(n)} + \lambda^{T-t-1} G_t$$ - $$ \sum_{n=1}^{T-t-2} (1-\lambda) \lambda^{n-1} + \lambda^{T-t-1} = 1 $$ - \item Forward-view TD($\lambda$) - $$V(s_t) \gets V(s_t) + \alpha \left(G_t^\lambda - V(s_t)\right) $$ + \item $G_t^{\lambda}$ averages all $n$-steps returns $G_t^{(n)}$ with weights $(1-\lambda) \lambda^{n-1}$ + \vspace{-0.1cm} + \begin{align*} + &G_t^\lambda = (1-\lambda) \sum_{n=1}^{T-t-2} \lambda^{n-1} G_t^{(n)} + \lambda^{T-t-1} G_t\\ + & \text{that sum up to}\\ + &1 = \sum_{n=1}^{T-t-2} (1-\lambda) \lambda^{n-1} + \lambda^{T-t-1} + \end{align*} + \item Forward-view TD($\lambda$) + \vspace{-0.1cm} + $$V(s_t) \gets V(s_t) + \alpha \left(G_t^\lambda - V(s_t)\right) $$ \end{itemize} \column{0.5\textwidth} @@ -96,12 +100,15 @@ %----------------------------------------------------------------------- %---------------------------------------------------------------------- -\begin{frame}[c]{Backward View TD($\lambda$)} +\begin{frame}[c]{Backward View TD($\lambda$) - Motivation} \begin{itemize} - \item Forward view provides a theory - \item Backward view provides a mechanism - \item Update online, every step, from incomplete sequences + \item Problem: Forward view needs information on what will happen in future states + \item Idea: Do not compute returns for the following but past transitions + \begin{itemize} + \item[$\leadsto$] Backwards View TD($\lambda$) to approximate forwards view + \item Update online, every step, from incomplete sequences + \end{itemize} \end{itemize} \end{frame} @@ -131,7 +138,7 @@ \end{frame} %----------------------------------------------------------------------- %---------------------------------------------------------------------- -\begin{frame}[c]{Backward View TD($\lambda$)} +\begin{frame}[c]{Backward View TD($\lambda$) + Eligibility Traces} \begin{itemize} diff --git a/w04_model_free_control/images/cliff_walking.png b/w04_model_free_control/images/cliff_walking.png new file mode 100644 index 0000000000000000000000000000000000000000..e94763fee01bf49680b4b1425f2e53473c864cdd GIT binary patch literal 49996 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 0$}{ + $V^{\pi_i} \gets$ MDP V-function policy evaluation of $\pi_i$\\ + $\pi_{i+1} \gets$ Policy improvement\\ + \vspace{-13pt} + $$\pi'(s) \in \argmax_{a \in A} R(s,a) + \gamma \sum_{s' \in S} P(s' \mid s,a) V^\pi (s') = \argmax_{a \in A} Q^\pi (s,a) $$\\ + \vspace{-17pt} + $i \gets i+1$\\ + } +\end{algorithm} \begin{itemize} - \item Initialize policy $\pi$ - \item Repeat: - \begin{itemize} - \item Policy evaluation: compute $V^\pi$ - \item Policy improvement: update $\pi$ - $$\pi'(s) \in \argmax_{a \in A} R(s,a) + \gamma \sum_{s' \in S} P(s' \mid s,a) V^\pi (s') = \argmax_{a \in A} Q^\pi (s,a) $$ - \end{itemize} \item Now want to do the above two steps \alert{without} access to the true dynamics and reward models \item Before we introduced methods for model-free policy evaluation \end{itemize} @@ -31,40 +37,46 @@ %---------------------------------------------------------------------- \begin{frame}[c]{Model-Free Policy Iteration} - \begin{itemize} - \item Initialize policy $\pi$ - \item Repeat: - \begin{itemize} - \item Policy evaluation: compute $Q^\pi$ - \item Policy improvement: update $\pi$ - \end{itemize} - \end{itemize} + \begin{algorithm}[H] + \caption{General Model Free Policy Iteration} + \DontPrintSemicolon + \LinesNotNumbered + \textbf{Initialise}: $\pi$ randomly + + \While{not finished}{ + \textbf{Policy evaluation:} compute $Q^{\pi_i}$ + + \textbf{Policy improvement:} update $\pi_{i+1}(s) \in \argmax_{a \in A} Q^{\pi_i} (s,a)$ + } + \KwOut{{} Return $\pi$} +\end{algorithm} \end{frame} %-------------------------------------------------------------- %---------------------------------------------------------------------- \begin{frame}[c]{MC for On-Policy Q-Evaluation} - \begin{itemize} - \item Initialize $\forall s\in S, a\in A$: - \begin{itemize} - \item $N(s,a) = 0$ - \item $G(s,a) = 0$ - \item $Q^\pi(s,a) =0$ - \end{itemize} - \item Loop - \begin{itemize} - \item Using policy $\pi$ sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots, s_{i, T_i}$ - \item $G_{i,t} = r_{i,t} + \gamma r_{i,t+1} + \gamma^2 r_{i,t+2} + \ldots \gamma^{T_i -1} r_{i,T_i}$ - \item For each pair $(s,a)$ visited in episode $i$ - \begin{itemize} - \item For first (or every) time $t$ that $(s,a)$ is visited in episode $i$: - \item $N(s,a) = N(s,a) + 1$ - \item $G(s,a) = G(s,a) + G_{i,t}$ - \item Update estimate $Q^\pi(s,a) = G(s,a) /N(s,a)$ - \end{itemize} - \end{itemize} - \end{itemize} + \begin{algorithm}[H] + \caption{First Visit Monte Carlo} + \DontPrintSemicolon + \LinesNotNumbered + + \KwIn{{}\\ $\pi$ - Policy to evaluate} + + \textbf{Initialise}: $N(s) \gets 0 \quad \forall s \in S$ \tcp*{Amount of times $s$ visited} + \textbf{Initialise}: $G(s) \gets 0 \quad \forall s \in S$ \tcp*{Accumulated discounted returns} + \While{not converged}{ + Sample episode $i = s_{i,1}, a_{i,1}, r_{i,1}, s_{i,2}, a_{i,2}, r_{i,2}, \ldots,s_{i,n}$ + + \If{s visited for the first time in current episode}{ + $N(s,a) \leftarrow N(s) + 1$ + + $G(s,a) \leftarrow G(s) + G_{i,t}$ + + $Q^\pi(s,a) \leftarrow G(s,a)/N(s.a)$ + } + } +\end{algorithm} \end{frame} %-------------------------------------------------------------- diff --git a/w04_model_free_control/t03_exploration.tex b/w04_model_free_control/t03_exploration.tex index fb90368..d50a122 100644 --- a/w04_model_free_control/t03_exploration.tex +++ b/w04_model_free_control/t03_exploration.tex @@ -1,4 +1,3 @@ -% !TeX spellcheck = en_US \documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' \input{../latex_main/preamble} \title[RL: Model Free Control]{Model Free Control} @@ -14,15 +13,22 @@ %---------------------------------------------------------------------- \begin{frame}[c]{Recap Model-free Policy Iteration} - \begin{itemize} - \item Initialize policy $\pi$ - \item Repeat: - \begin{itemize} - \item Policy evaluation: compute $Q^\pi$ - \item Policy improvement: update $\pi$ given $Q^\pi$ - \end{itemize} - \bigskip - \pause + \begin{algorithm}[H] + \caption{General Model Free Control Algorithm} + \DontPrintSemicolon + \LinesNotNumbered + \textbf{Initialise}: $\pi$ randomly + + \While{not finished}{ + \textbf{Policy evaluation:} compute $Q^{\pi_i}$ + + \textbf{Policy improvement:} update $\pi_{i+1}(s) \in \argmax_{a \in A} Q^{\pi_i} (s,a)$ + } + \KwOut{{} Return $\pi$} + \end{algorithm} + \bigskip + \pause + \begin{itemize} \item Policy may be suboptimal \begin{itemize} \item If $\pi$ is deterministic, we may not observe all possible actions $a\in A$ in a state $s$ @@ -73,7 +79,7 @@ \begin{frame}[c]{Monotonic $\epsilon$-greedy Policy Improvement} \vspace{-1em} \begin{itemize} - \item Theorem: For any $\epsilon$-greedy policy $\pi_i$, the $\epsilon$-greedy policy wrt $Q^{\pi}_i$ is a monotonic improvement $V^{\pi_{i+1}} \geq V^{\pi_i}$ + \item Theorem: For any $\epsilon$-greedy policy $\pi_i$, the $\epsilon$-greedy policy w.r.t. $Q^{\pi}_i$ is a monotonic improvement $V^{\pi_{i+1}} \geq V^{\pi_i}$ \end{itemize} \footnotesize diff --git a/w04_model_free_control/t04_sarsa.tex b/w04_model_free_control/t04_sarsa_qlearning.tex similarity index 60% rename from w04_model_free_control/t04_sarsa.tex rename to w04_model_free_control/t04_sarsa_qlearning.tex index 3c9fc9e..ee973d2 100644 --- a/w04_model_free_control/t04_sarsa.tex +++ b/w04_model_free_control/t04_sarsa_qlearning.tex @@ -31,23 +31,33 @@ %---------------------------------------------------------------------- \begin{frame}[c]{General Form of SARSA Algorithm} - \begin{itemize} - \item Initialization: - \begin{itemize} - \item $\epsilon$-greedy policy - \item $t=0$ - \item initial state $s_t = s_0$ - \end{itemize} - \item Loop - \begin{itemize} - \item Take action $a_t \sim \pi(s_t)$ - \item Observe $(r_t, s_{t+1})$, $a_{t+1} \sim \pi(s_{t+1})$ - \item Update Q given $(s_t, a_t, r_t, s_{t+1}, a_{t+1})$: - $$Q(s_t,a_t) \gets Q(s_t, a_t) + \alpha (r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t))$$ - \item $\pi(s_t) \in \argmax_{a\in A} Q(s_t, a)$ with probability $1-\epsilon$, else random - \item $t = t+1$ - \end{itemize} - \end{itemize} + \begin{algorithm}[H] + \caption{SARSA} + \DontPrintSemicolon + \LinesNotNumbered + \KwIn{{}\\ + $s_o$ - start state and $\alpha$ - learning rate\\} + \textbf{Initialise}: $\pi \gets$ random policy and $t \gets 0$ + + \While{Not converged}{ + Take action $a_t \sim \pi(s_t)$ + + Observe ($r_t$, $s_{t+1}$) + + $a_{t+1} \sim \pi(s_{t+1})$ + + $Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha (r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t))$ + + Update $\pi(s_t)$ based on $Q$ (e.g., $\epsilon$-greedy) + + + $t \gets t+1$ + } + + $\pi \gets$ GreedyPolicy(Q) + + \KwOut{{} Return $\pi, Q$} + \end{algorithm} \end{frame} %-------------------------------------------------------------- @@ -101,25 +111,56 @@ \end{frame} %-------------------------------------------------------------- %---------------------------------------------------------------------- +% \begin{frame}[c]{Q-Learning with $\epsilon$-greedy Exploration} + +% \begin{itemize} +% \item Initialization: +% \begin{itemize} +% \item $Q(s,a)=0. \forall s \in S, a \in A$ +% \item $t=0$ +% \item initial state $s_t = s_0$ +% \end{itemize} +% \item Loop +% \begin{itemize} +% \item Take action $a_{t} \sim \pi_b(s_{t})$ +% \item Observe $(r_{t}, s_{t+1})$ +% \item Update Q +% $$Q(s_t,a_t) \gets Q(s_t, a_t) + \alpha (r_t + \gamma \max_{a\in A} Q(s_{t+1}, a) - Q(s_t, a_t))$$ +% \item $\pi_b(s_t) \in \argmax_{a\in A} Q(s_t, a)$ with probability $1-\epsilon$, else random +% \item $t = t+1$ +% \end{itemize} +% \end{itemize} + +% \end{frame} + \begin{frame}[c]{Q-Learning with $\epsilon$-greedy Exploration} - \begin{itemize} - \item Initialization: - \begin{itemize} - \item $Q(s,a)=0. \forall s \in S, a \in A$ - \item $t=0$ - \item initial state $s_t = s_0$ - \end{itemize} - \item Loop - \begin{itemize} - \item Take action $a_{t} \sim \pi_b(s_{t})$ - \item Observe $(r_{t}, s_{t+1})$ - \item Update Q - $$Q(s_t,a_t) \gets Q(s_t, a_t) + \alpha (r_t + \gamma \max_{a\in A} Q(s_{t+1}, a) - Q(s_t, a_t))$$ - \item $\pi_b(s_t) \in \argmax_{a\in A} Q(s_t, a)$ with probability $1-\epsilon$, else random - \item $t = t+1$ - \end{itemize} - \end{itemize} + \begin{algorithm}[H] + \caption{Tabular Q-Learning} + \DontPrintSemicolon + \LinesNotNumbered + + \KwIn{{}\\ + $\pi_b$ - behaviour policy, $s_o$ - start state, $\alpha$ - learning rate\\} + + \textbf{Initialise}: $Q(s,a) \leftarrow 0 \quad \forall s \in S, a \in A$ + + \textbf{Initialise}: $t \gets 0$ + + \While{Not converged}{ + Take action $a_t \sim \pi_b(s_t)$, i.e. with probability $1-\epsilon$ follow $Q$, else random + + Observe ($r_t$, $s_{t+1}$) + + $Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha (r_t + \gamma \max_{a' \in A} Q(s_{t+1}, a') - Q(s_t, a_t))$ + + $t \gets t+1$ + } + + $\pi \gets$ GreedyPolicy($Q$) + + \KwOut{{} Return $\pi, Q$} + \end{algorithm} \end{frame} %-------------------------------------------------------------- @@ -140,7 +181,18 @@ \item The algorithm is GLIE \end{itemize} \end{itemize} - +\end{frame} +%-------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{SARSA vs. Q-Learning (Example)} +\begin{center} + \includegraphics[width = .5\linewidth]{w04_model_free_control/images/cliff_walking.png} +\end{center} +\begin{itemize} + \item SARSA will learn the safe path + \item Q-Learning will learn the optimal path + \item Why? +\end{itemize} \end{frame} %-------------------------------------------------------------- %----------------------------------------------------------------------- diff --git a/w04_model_free_control/t05_maximization_bias.tex b/w04_model_free_control/t05_maximization_bias.tex index 1aa2de6..da44330 100644 --- a/w04_model_free_control/t05_maximization_bias.tex +++ b/w04_model_free_control/t05_maximization_bias.tex @@ -2,7 +2,7 @@ \documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' \input{../latex_main/preamble} \title[RL: Model Free Control]{Model Free Control} -\subtitle{Bias Maximization and Double Q-Learning} +\subtitle{Maximization Bias and Double Q-Learning} @@ -61,42 +61,45 @@ %---------------------------------------------------------------------- \begin{frame}[c]{Double Q-Learning for Full MDP} - \begin{itemize} - \item Initialization: - \begin{itemize} - \item $Q_1(s,a)$ and $Q_2(s,a)$ $\forall s \in S, a\in A$ - \item $t= 0$ - \item initial state $s_t = s_0$ - \end{itemize} - \item Loop - \begin{itemize} - \item Select $a_t$ using $\epsilon$-greedy $\pi(s) \in \argmax_{a \in A} Q_1(s_t, a) + Q_2(s_t , a)$ - \item Observe $(r_t, s_{t+1})$ - \item With 50-50 probability either - \begin{enumerate} - \item $Q_1(s_t, a_t) \gets Q_1(s_t, a_t) + \alpha (r_t +\gamma Q_2(s_{t+1}, \argmax_{a \in A} Q_1(s_{t+1},a) ) - Q_1(s_t, a_t))$\\ - or - \item $Q_2(s_t, a_t) \gets Q_2(s_t, a_t) + \alpha (r_t +\gamma Q_1(s_{t+1}, \argmax_{a \in A} Q_2(s_{t+1},a) ) - Q_2(s_t, a_t))$ - \end{enumerate} - \item $t = t + 1 $ - \end{itemize} - \bigskip - \pause - \item[$\leadsto$] Doubles the memory, same computation requirements, data requirements are subtle\\ -- might reduce the amount of exploration needed due to lower bias - \end{itemize} + \begin{algorithm}[H] + \caption{Double Q-Learning} + \DontPrintSemicolon + \LinesNotNumbered + \KwIn{{}\\ + $s_o$ - start state, $\alpha$ - learning rate\\} + + \textbf{Initialise}: $Q_{1}(s,a) \leftarrow \quad Q_{2}(s,a) \leftarrow\quad \forall s \in S, a \in A$, $t \gets 0$ + + \While{Not converged}{ + {Take action $a_t \in \argmax Q_1(s_t,a) + Q_2(s_t,a)$}, Observe ($r_t$, $s_{t+1}$)\\ + \If {with probability~ $0.5$}{ + $Q_1(s_t, a_t) \gets Q_1(s_t, a_t) + \alpha (r_t +\gamma Q_2(s_{t+1}, \argmax_{a \in A} Q_1(s_{t+1},a) ) - Q_1(s_t, a_t))$ + } + \Else{ + $Q_2(s_t, a_t) \gets Q_2(s_t, a_t) + \alpha (r_t +\gamma Q_1(s_{t+1}, \argmax_{a \in A} Q_2(s_{t+1},a) ) - Q_2(s_t, a_t))$ + } + $t \gets t+1$ + } + \KwOut{{} Return $Q$} + \end{algorithm} \end{frame} %-------------------------------------------------------------- %---------------------------------------------------------------------- \begin{frame}[c]{Double Q-Learning~\lit{Sutton \& Barto 2018}{http://incompleteideas.net/book/RLbook2020.pdf}} - + + \begin{itemize} + \item[$\leadsto$] Doubles the memory, same computation requirements, data requirements are subtle\\ -- might reduce the amount of exploration needed due to lower bias + \end{itemize} + \bigskip + \pause \begin{center} -\includegraphics[width=0.8\textwidth]{images/double_q.png} +\includegraphics[width=0.4\textwidth]{images/double_q.png} \end{center} Due to the maximization bias, Q-learning spends much more time -selecting sub-optimal actions ("left") than double Q-learning. +selecting sub-optimal actions ("left") than double Q-learning. (Note: $5\%$ exploration rate) \end{frame} diff --git a/w05_function_approx/t02_vfa_grad.tex b/w05_function_approx/t02_vfa_grad.tex index c2f281d..09d95aa 100644 --- a/w05_function_approx/t02_vfa_grad.tex +++ b/w05_function_approx/t02_vfa_grad.tex @@ -167,7 +167,7 @@ \item Recall weight update: $$ \Delta \vect{w} = - \frac{1}{2} \alpha \nabla_{\vect{w}} J (\vect{w})$$ \item Update (- step size $\times$ prediction error $\times$ feature value) - $$ \Delta \vect{w} = -\frac{1}{2} \alpha(2(V^\pi(s) - \vect{x}(s)^T \vect{w})) \vect{x}(s)$$ + $$ \Delta \vect{w} = -\frac{1}{2} \alpha(-2(V^\pi(s) - \vect{x}(s)^T \vect{w})) \vect{x}(s)$$ \end{itemize} diff --git a/w05_function_approx/t03_vfa_mc_td.tex b/w05_function_approx/t03_vfa_mc_td.tex index ecd9efb..252d748 100644 --- a/w05_function_approx/t03_vfa_mc_td.tex +++ b/w05_function_approx/t03_vfa_mc_td.tex @@ -28,8 +28,6 @@ %----------------------------------------------------------------------- %---------------------------------------------------------------------- \begin{frame}[c]{Monte Carlo Value Function Approximation (VFA)} - - \begin{itemize} \item Return $G_t$ is an unbiased but noisy sample of the true expected return $V^\pi(s_t)$ \item Therefore, we can reduce MC VFA to doing supervised learning on a set of (state, return) pairs; $\langle s_1, G_1 \rangle, \langle s_2, G_2 \rangle,\ldots, \langle s_T, G_T \rangle$ @@ -37,16 +35,16 @@ \item Substitute $G_t$ for the true $V^\pi(s)$ when fit function approximator \end{itemize} \item Concretely when using linear VFA for policy evaluation - - \begin{eqnarray} - \Delta \vect{w} &=& \alpha (G_t - \hat{V} (s_t; \vect{w})) \nabla_{\vect{w}}\hat{V}(s_t; \vect{w}) \nonumber\\ - &=& \alpha (G_t - \hat{V} (s_t; \vect{w})) \vect{x}(s_t) \nonumber\\ - &=& \alpha (G_t - \vect{x}(s_t)^T \vect{w}) \vect{x}(s_t) \nonumber - \end{eqnarray} + \vspace{-.2cm} + \begin{eqnarray*} + \Delta \vect{w} &=&- (1/2) \alpha \nabla_{\vect{w}} J (\vect{w})\\ + &=& - (1/2) \alpha \nabla_{\vect{w}} (-2(G_t - \vect{x}(s)^T \vect{w})) \hat{V}(s_t; \vect{w})\\ + &=& \alpha (G_t - \hat{V} (s_t; \vect{w})) \nabla_{\vect{w}}\hat{V}(s_t; \vect{w}) \\ + &=& \alpha (G_t - \hat{V} (s_t; \vect{w})) \vect{x}(s_t)\\ + &=& \alpha (G_t - \vect{x}(s_t)^T \vect{w}) \vect{x}(s_t) + \end{eqnarray*} \item Note: $G_t$ may be a very noisy estimate of true return - \item Note(2): We dropped the factor $2$ and see it as part of $\alpha$ - \end{itemize} \end{frame} @@ -54,22 +52,27 @@ %---------------------------------------------------------------------- \begin{frame}[c]{MC Linear Value Function Approximation for Policy Evaluation} - -Initialize $\vect{w}= \mathbf{0}$, $k=1$\\ -Loop - \begin{itemize} - \item Sample $k$-th episode $s_{k,1}, a_{k,1}, r_{k,1}, s_{k,2}, a_{k,2}, r_{k,2}, \ldots$ - \item for $t=1, \ldots, L_k$ do - \begin{itemize} - \item If First visit to $s_{k,t}$ in episode $k$ then - \begin{itemize} - \item $G_t(s) = \sum_{j}^{L_k} r_{k,j}$ - \item Update weights by $\alpha (G_t - \vect{x}(s_{k,t})^T \vect{w}) \vect{x}(s_{k,t})$ - \end{itemize} - \end{itemize} - \item $k = k + 1$ - \end{itemize} + \begin{algorithm}[H] + \caption{Monte Carlo Value Function Approximation} + \DontPrintSemicolon + \LinesNotNumbered + \KwIn{{}\\ + $\alpha$ - Learning rate,\\ + $K$ - number of episodes,\\ + $L_k$ - episode Length} + \textbf{Initialise}: $\vect{w}= \mathbf{0}$, $k=1$\\ + \While{$k \leq K$}{ + Sample $k-th$ episode $s_{k,1}, a_{k,1}, r_{k,1}, s_{k,2}, a_{k,2}, r_{k,2}, \ldots$\\ + \For{$t \gets 1,2,...L_k$}{ + \If{First visit to state}{ + {$G_t(s) \gets \sum_{j}^{L_k} r_{k,j}$}\\ + Update weights by $\alpha (G_t - \vect{x}(s_{k,t})^T \vect{w}) \vect{x}(s_{k,t})$ + } + } + } + \KwOut{Return: $\hat{V}(\cdot)$} + \end{algorithm} \end{frame} %----------------------------------------------------------------------- diff --git a/w05_function_approx/t04_vfa_td.tex b/w05_function_approx/t04_vfa_td.tex index 430028a..55a20f0 100644 --- a/w05_function_approx/t04_vfa_td.tex +++ b/w05_function_approx/t04_vfa_td.tex @@ -81,14 +81,19 @@ %---------------------------------------------------------------------- \begin{frame}[c]{Temporal Difference (TD(0)) Learning\\ with Value Function Approximation} -Initialize $\vect{w}= 0$, $k=1$;\\ -Loop - \begin{itemize} - \item Sample tuple $(s_k, a_k, r_k, s_{k+1})$ given $\pi$ - \item Update weights: - $$ \vect{w} = \vect{w} + \alpha( r + \gamma \vect{x}(s')^T \vect{w} - \vect{x}(s)^T\vect{w}) \vect{x}(s) $$ - \item $k = k + 1$ - \end{itemize} + \begin{algorithm}[H] + \caption{TD(0) Value Function Approximation} + \DontPrintSemicolon + \LinesNotNumbered + \KwIn{{}\\ + $\alpha$ - Learning rate} + \textbf{Initialise}: $\vect{w}= \mathbf{0}$, $k=1$\\ + \While{Not converged}{ + {Sample tuple $(s_k, a_k, r_k, s_{k+1})$ given $\pi$}\\ + Update weights by $\alpha( r + \gamma \vect{x}(s')^T \vect{w} - \vect{x}(s)^T\vect{w}) \vect{x}(s) $ + } + \KwOut{Return: $\hat{V}(\cdot)$} + \end{algorithm} \end{frame} %----------------------------------------------------------------------- diff --git a/w06_deep_rl/images/rainbow.png b/w06_deep_rl/images/rainbow.png new file mode 100644 index 0000000000000000000000000000000000000000..a654897856083492c9871fbec4a9c86f14cad0fb GIT binary patch literal 110317 zcmbq)Ra9I{)Mj_%PUEf}T!OoMa0wFJ-Q7J9+}(l%2<{L(5G=U6ySvMf`_DYi!>s9- zQ>%K_Ikly>e)UaBK?((t01*HHpvXvzs{jC?_aSf_9`^kqEs=Wl{(yECl~IF#|M|e1 zgaZI%02y%+HIJ<0Y|}IyiP?a)TgO~Es>ETrW#R;32M~1AAHxR+?PXs_PGPcUzT?{F z)=;uQ;pG+GzT$=s(!JG_C4rT##Hi^f{uep-m0zw$w=VA4&WG?W{HV}5^D~L#7VHGk zW*SCoGnoGkCF`yxKmn2k6Bg{m=!}4W|4L2)|39XLkNUqp=i2lYbQA&v0=9YkqC*RS zbMLPwkS7#J0#xKu2a=()k^l{09elH1p#pe>@vE_D;C?{)=06IUMLlV%c{6vx9WNm} z&;46NFY&&H6t@~x8gLl^?#k@a?UJNuxY_8^G1<5y`{GAcji?!}2`wjQ{aYwtRC#VX z7b*IkntHy)FD!X`fype3NB|hQ+WMCWhUz=tlyl*ZzKKV2GKPbs&0ea(xYy!XAG z;O$lB2osVyA5NDJ7D&aak9 z94_M@Hj$zss~@n#5;FqZAxr@}wxItf?0WBdfD)HNW(E1iT>~aOw9W`8o=yP6vWNk~ zCWD7aR>vN|8XgI8LI-q=KqNL_`;SK%ZV{`Xl1zLkSY(XNon07zOHSu^~d(KeZ~b#H?@l*p&(f8W3+jbmGiM zai5|@OuTvZq8T8Zf7ry*41xzvY)MK{Vo?T#fKV;IwphQf`;j~e=4gis+(J)u*ERqs zg*;b13x6;gicKc$Duk;R+C+0;GIGVkGhVi#aE1azfocOvyKbpQb^qyfhPs$`9e_QV z-vINxhbbrQpQ3*OFT&-$)PeWEYJxE=v(SS6O)lbp0qo;>OlZCS+p4ih7|`nf?I;Kz z?Kv5+p0k}3pX;x~8kqyz(C#PppHR-J9AL%;M&}Q@Is;~;gTALrn|4{80)Hs6@vW1s zJ41Sv{_WEio)J**_Z3hOc!&PZ9tR4Q?z4-M4sTFdBrVotYjE0ebZ`43Xg zbrW}FvP)cDUWLtZ$pXzRr8huy50SbS!td29X$o4_5aF|WbyyeMC7{EWV7VI+yG>+_b89@Hn>psID8}gr7 zKfkaktW}|3bu3Np!k$7W#M{FBcPL@rxV( z+-sAH*wJsaKgyAXbHC1T+Huy(1J*yj>c!rJ_>n>gShfCp3CX+ml42FOL(l3JDMgd~ zhBf*1iwTgS3fQ-KMwuWsKi~@=HIyFLQ0Z zZ}2^#<^udPY!dM0r~~CcBB<(N^89GJIwLD>;eG+{D7^0K9@(HT4&h5GIZmK#KvO_5gRd^jt}FIAuMu#3wD6zh=zAyYXb-Ln z>RMRt(mG%)s=u$KgOoz+DWxPk%Dh<+cApRkQKn*0^Q0mQm;bn@f?<2C%E=NR=aohA;SQ*n0o-6hA`W z9R*cJtosf0e~i7f*kk-hn*}e~7r=k+(Dinc_vvyQw4GxNIj&el$~JLr`Le zqulXED?0e*Wd_9sjzOmp#z4^OfgXb$1>D+iHdq-GIq*3^sww*%`JC1kq#w;lRmLq~ zs`-Cb5#q&~$khY&wgq&*LbM}73Ay3taS;-qq3)9$;y)x}#uduv;%{Xji-aS`aR(&Oa0k04N>djB<3K}Cc40Yx`4BcjV}$3L{4WD zH%M|Aad!hq!*J>ppf0z<6cKaTH5~|_5rPVlWkb;!p|IEVyebX)(?%42R3HGxFiYF1C^PodWiv-Emoaa6aqNuj-!#XZ!L6`>fz3vJ z;<*xLCS$>iYV8=(P>X{LXaHKm>%E?ACdxdV);gEgqBA=EZ=MuRY6oZ~)MtE-TmA44 z-&NJ#?Bnu3X{Fp+iGS1-D@;D|6Bqs`J>8gFpar4kn<94jXEG#O)M+HzLuWFT>?#6o z658V{{P>Jx50k)h*jW&lr0yQ$x{3j)7T(XY{w*M_!&dr_NPtG5L`cJHV&GlW9!z*# zEgmg?8z2qAN5td13*n19-rY5n%Jsm|8~#-}s6%r2W`YC3XrqQ-qsv4bet_e2>{HN= zCxB&)GzLqVx6eWd0}nMzvJf5oaW@TB2ha6ID!Qhis`$T+ifh*c%EPU^k+tT9ZlGmlJMB?^8bJI$$51s8dwMj3RV+{-x<=%7Qjsm^?&ByQTq!^IxJ4(y zgqKMDBl$o+&ve?9ia7j7j!nic4Pl{P_Ba08X1=Jce!RIBXj*QUhzlhWHlm7=BeQiyn0!zB^((4irolbe1_k7bE?Dp#p&{??;4-;94W7h;aLw z=twtEIh-zaDSvBp4(Dg)6E>=$uPB5&WlRktmg}YD+ob*!wSZ`m`Vs1aM_rH)`V0;k z1I==Qv)^iiPdw-yz_le`(zX6RFy*1;FK9ntfC0bA2`Vus z5{`lkPMHFRZ$Q0Ys=FrpiNYUN zkF}%Q!Z?lmVKJfw)rWcX!faBPrC%DE{}~n7?O?n#7k49C*OEb>jlbVvVgvH#QP$WXaElmDdxK zd%L3)72OJzemAPhv~G#x__@K)!^C9T^;GR&BP&?3j(Qj0ZLNUx*n0M%)0kRj#RY*5 zd=uk#N$M?rWS>>rZi}FJI3A{}jpEi>grrVcrC)Fy%nPi^QTLF3*FjfiLsn;a#%#j( zaCD_P3WB3Z2d2%3x1ftfb=kEtaP(SIwGiNxbNAUmZS5jFwx^+Ccn`zm?@j~v+|>J7 zUfhq5<}2`NjkbFTc-~Dr7OY1ahu;xJ0^AskYBg4fe_c6|vzfNFi^ZKZr*0dU7r&kE zC;x8U9>*9s$FRp8-d?>_u=p2T+$J#))JSfXlZ`(1G#B6x#^2o&Yh|PBH%yzk^SkFk}iqk7fX5owp^FNSEI8kcS!ouSDK7sb2yeVJ7ka2qM!L`$+o+HhW3wB!NxaSq$x)E?E6I!5+B`nJ3!NbrqL zQ;wUVI?KWBx9Apu6d<`T&2&ICBl5Unk36SL@Lz~d%~f?pIUCB31nl8X5C4)6TKQ*>)fAfH8m4`udib|3epU8RBB6b$j@yG%#6P48RE6F zE6VyNF1Rl)Od$VcRw7VQR!eRE5Y9fs6$ z&IJ$^kw~`t@**z$9%=Cu;w%kQIuxn2+HZdBFS#+c>TdumUPjK4h}Wy?M;VhFSSA`ag(IG|L?tdt$%s4~`TYI&3#vt)DtBowSilx$t>;++Y+ zd-9WDzPhoOl444FT#Z-2aj19n2i65m<9#+778ZdCL-Ro@X6?Uus&oe1N;21RgoqO~ ziY))K$!K!~70mAhhx}pj_ux@(fU!f;TLvjhKtI3ObrEh zn*_IZ+GFi?x4OkWsC!dY{B3hU9NKYW4!{}0_YDW|FQ}=L<)*n9YO4qn)P82$NZKL} zC6d|``R1mGA)?RG^)hp`w=s11)%%Pd4pS?lO$6DYRf^A+6X&xA6#vtUN*BV5(}BOV zy_@Vs*Wrn<$;`ah_x}lq*ptPW1hZn#_{hIK7&|Xe>&Vo#8%QMttjHec8?=muB$;5{ z&yF=fF@Ju3#zK@HK1q*+uvjCnNK#X6)-IeszAOcH`sqZV5k}EcxVvyIlW^ITkpYJ7 zhvhB*i^Vj*=KA2Bt$NevD9d~(hyPtgnb3;a>1C$99kGeXQp+HR+jn_MA?8D6ZJdTI7^lEt0{MO5?rv{?NcgH&%jgy zKZ_kXh7_@Gw%gk|eKM`P0Wkj9LMr3mN-*fu1Wl{pjLS#~Zvu5kjtvs2eO&oFs`b1I z@u{MZlMC*o#7C}Zj(-Fl1#%3m&WRczCfIS|>``J|8Wl!ez^>~Sp2sGaN=x=w^k=K0 zV`?K3ME9AT`Rk78g-V=nwnFQ9k7yq(9#htsQ%si&Osdxap>%nemRsypB#W=9bm*1~ z=hHujBf=nbs}!8zo;7|Ricg9$AAZm^`bP)07rz=@aNabj`5;+_3Zh2VzyL&2C zoiwO_C*p!E@-s=o{RUv&6JmP`oAKt4Ct4^sRdCI`9o))&ia#R7s#2VXl<@SXRG2po zS#K)oDD9FBFET=}HF*0rjq1Vm^Q@tZOv?QzIx_#s%KD$=T@c<%(A9FfN5WSsnNRwB5FCgZ`Hfil zwUg-`M6H4N_mBJZ8KjO9B|o9l>oyaDJ-Ck)QyT^~b4dBfK)E+x?B`m%ul&6j+rF!l z;Wh6;wml|_tEVycJ_e9oU43gDFSKQsg!0@}Wap1|Hp>~t;LNDTyz3oRMzlz5Bfkja-+W!I{((4L29$DqJo}C4^4YBx)oe!~0Rd_Eh{i z6E|4X5_mrLbibF^logV%OeWDMoRloO<%xRP>T6bxbe0mQWCDdF3mu>(eSA^3x*1;+ zdxcy(qB1#8I0X`3D#EIPCW^Fy;g0{qx_Ioy;_!3l=3u}mJ)B__3SCx|pF9u!!jGc~ z;6)jE&?LE}FWs_K#kjW(#TJM5EEWD$5dT4Buwtvj=tF&0SlX^4t6tfcN54QDgtWW1 z+>5&#Jl{Do(YOY(1mcCDW+;!^m=-Jclj!zV)88Ee8(HyLvL4?f{(PV&1cW zP*lHZ@it&dMFjWe_v+!nSTAxHBzRG6tZf!wkE!USGi8O2hHnd^!U@>AQFkY}k_|-; z&b_+UIqclRazm&2sH94*5~h0oVKul&n`YC2@ zTRmuia51zBE4tsSXMWt^Xs#NBSV%?=CT~XiK+vHi&L1l>^qGEHlhwC5^pRV+-g-Zp zTFo`=Jp%GVuiTao1~Ee52f%8O#j-bMM`u}_&wVR-mw^wTFb>VKkWBsa!`R^Y@hYP$>ze}!DsVt|8<^a*-kG>@6oQh9S z&}LyjMGI8i6-~G52;HT!?3U;_y*t`t`PStB1R*x^cZ5ExUdbG0B}LJ2(+B97r;;;e zPRV@4D+h6Ejppt#E;MV=I%U7a8qPO@%PTVavl5tT)~8-0?ePLvfE#Th`KzbUfqV<5UEq2@ zte*BC54%zF?2JjP5BbVm`DWN;8{S9pEq(OFHY#%WaMnCVUx!8Ho@)A{_k^$THv1hY z>B*P4Seu$eIx`GV8}T4XPv_!#=lG#JYWc1GQT zvHp5F77urr4xD3odo|bUB#kjrqr)>Gr@%b@h>?aFym&)ZS|6fu_!&o`R9lJoje>Py z_hsXCXQ^K|$J=LfwXik8)4j)bn8y1|95P9Fmc$gR&&7KHiCbgD-54r)X>DF%DEk>y zoiJ1W?+`pEu`=wqZKjr2pt*&9S<}H}1S=BV_s%IBw zc#p9&k^_OfwNaBuw&5wPW_$2wwmB8M3{y*v&dnpj(n({C2j{3HQ2KgNid?F`#V~d(o1_iK66}W+5=y^~2B4kbzx}_BneJH42ig9drJ0?^HI2YMb#_gr` z&+WprA~hpz=rf*=SN1;`pCP~dLhMuqh6B0nj{DI~cmq<%b5qUJUe8ot;djx9!_PC$ zfuwXApVdvN&8TxQnhX>x3OU$|^2CwS9s6d&!2V<>8WL4pQd*-EZt#`=S8{hFtb|uT>oy>LDmxmiI zsqH(j(I0zUfkD@S2Q34fU882}Nd4SGs~(A4UmO&QE{0C`3+)ips&0esc^DWTI!s*i zAi^ql5OkQLGPZUky8R|9VC`jp&`>V5|JHqo<<6T|oU~zyRj_^cknn))U7<3W!r$9b zwmq9J@ z_lkGmCTLm^V$d~@b9W$WVeR2p?cr68d{XTsM-853_9su@{mI zp^_*pRV}b&KJL_KE@22;AWTCkKYyU@Q8=`NIiGUE2(J&gQIHQjxwI{-*?*XQSS{7l zeQBy+nH0|QUt2@CGuY`;2!!yu(wScVxnACr(fhzk^h*y}U{&z<)ZjPcXxykZ#50{U z+>VM4!BR0*k#gh@qvb{*(@b(V!Pm?5NNN&ZRjio(EkA=D)VE*cmX-YIxrI{-BSVMT z8xH6DvlRd?E|=Ate=WCM?CI;Sis(P$8JDTO`>J0pW^((vcg4!#sFIbd{s!n5j3R(J zD}qBlpu+4@fFw9K<%QB0+{(pJc!-f;t?iOBi zPb|Y>9L!nlP89Kn2OVqg!fp8-k&AUMf&OGEgO5hcpQ>F2`5ThXIK3Y}CsYG{bRMk_ zOtTfw@L zCm)uVvN=!JT(k=7dYuMP6jFg>Mk^30RAM=+_kaU*_d(n{IdUf&oSdr=+$|hS~ta!fW|Ks;oF`^L4?l6OydVo%Ms% z>|t#v+%p(zDBSZeQ6j2WKMm&$07=??#Tp&BHH z`S>(?XO3xH4Z*LV%JuN#xgw&v)}l$rSw(UFab@e8teQtqP8 zdhYn#Y~TP~2#L&^39~si`EF3FhRotm&zaJu%i7=CC+lQSxI+2>$4T9M_367~r=#;H zUqTsYSCEGOQpvXX?30g=s@4N%O_Nt<^ez_QD+O04{yi4UTMD`7a)k@)<4c5^3lh45 zlCeriNcl_Xu`#_t(vAngX0KbjV>V&_Xf8nKQ=wFg*1TAE!mId+M+>A#aOw}bScV%X!jcdtHM2qSf=LY3BvHJ&p#!9SEIEZwHG2Y zky)=APZmw=f@*0ytdZ&FE%4GrvKR8Djt z--k%cKkF6fc0NxXL{S1G+P$-C^xJXjbIZw99 z3~~0jw%XtGe0lF8`zmOzTXC5C3jDp4C#Z3Wp#Uw8z5Kv-APgaAZPtCfz*_1k{mS>C zh$sP8{&1*MSNtbE(aZ5N2bWr*MbI7SV`XlCk9sGml0KCG$P)ZYAzk-8Y}8b{201!N z-xNhCY>dml4Sx+*sEkCrH=}i}Q7bnoncR*)SvaKlAHck-_ zOh7I=^AThCZaen3DkiGhgk?Qxawwt8?iM&O`f&60cWJyil#s+3ooILv96=QvIk_%b z46U2V2AoW_15bl@=D(h=B%X@Jb`~|!3skj@G0*nj-udYa_cu}2$@X#hf?Z!Q_q4jkS;)twK-$Y{6x}eqA zuInOgGDhI-+30!6De9&<&dF32TvE8ccs-!nq(6+WGTnJR>mgHr*$vdNhf$gdKuV(f zo@tDI^vr4Y`0{2s>2Xt7lnr>#FWTljY%?zWo30mve8Pw6+=8QDXVGR+A;Z@CTQ?ZL zYgQ%tI5`TP|kPPqT!~P9}>@m0mhQB5Y&(UcM0_7m#+-odNCQk`#OaMTS z@udJuQ3DN?$bXDP-@?5}SH8puOxyGNm6(e6iBy2=W__ucVs?FTpNH;bde46Ux0V@Lup5PJ~U3SrRfA9SPVfnJ#6OY~8ph4)C zK+R4UB!l41xc5y&2k}X@h3U8eYA0qGCbb1od@}6_M_8?iRni?|o(1^XD zJL=m?_B8LmN#Jn|4q?{bMOc_Y)O$@j`> zW>yE2hWgJQkrsHs>@&d*;a?g!?hjdEf0`L_fEcX?Jri?+x*u)|IyL zG`K(|${ISI-@|>m|MFJw0Xo10^5(^}!L`_nY+0>d=}eLFOH0JEjz!WXO&XV?jKMQ- zE*`=G71v%k6{s4Arp#6FV)Pq>RC>DmyL932C*@eQ0Iqn6+6G4g73N1#E1X3~O3-gi z>91{d=tAGLq~UX9NP8*$6-~yhNP7cokrJ>9N^LRoDYfXmD8VRM4fCMnogsu{>(XGzm1nmRj!7<-BPXNW(i^@ zv5xLn;S)nI0U}Q7PoewitT=^4_Usbb*$O|!$g3etAgZcG)Sf@EwvyQ>!Qxn4lKl#4B&e>sz9JTN;}K0!MOZBl;>s(vsbrclC?ioOxtRBG0rHr6jp z@wGlOaKBULPU z5LtDY+=Xd7F1*~)Ej=06boyow>Go-@#K}K4o0DsWtbb2c7Jo$U-D({nwXLk>u~B0z z`_0$Ghrhr(PmPsF|B-PU#(i!>$@?|UC{+L$N->d+IPI_xMWf)vJ->e^RyZr@`uIiK zMZ_-SJ`-i2Aa(>H*9W?k_WTCPCEG(lmTINTX8mZ}1Oxu}@&{-OPavSzX=xeT*!rKD zhc*cu6qch^*z!!-;f(~B9_OZ9jY`$~vQaMC4`li#7L756S9PVbRC==}X#RG2*8Zl} z2nA-EL?`e1q^-S=2&V6Y6b`Ml+;I0_H+`(2YNeb!`7AyQ`!OAf!$|j^PM8UQUy@g% zg@-klAV%`5OJLNd>!S3#)D7%GU50A33zne2FVC5q*Sv84)3n3(cY(zfF66I$82XN> zmcbD#(cpqoBp_}NFDrFj8V2iIj0-xwImFGohIpP~3BQa%YS)&DGVVAK$*llW$;U*f z3&vg$u5&EJ5w0tFZ@uFfM1-3)@G&(Kx(e;bvkd+Td$FAJEQlNDVtXyTmpQ|@m~0R? zh5YSYH4g7JeISz;O9pH$Pvr<}l%E?WEm063>L)wRff@I5+yl>SH3qt)cv@^n_YYX8 zx2+V0F6Ic&b0JN5TaPU9^QL$UBia^d!O)r)`OQqu3KA=raIyKi+p4o0girr%`3BH z$@OAwzs-sGmT-vy;=^UaQkKwF- z7-xg7#cvN2}kQQ0{BA=|^ui=RNzK zfGe{JByNvh0ExgMfaVl&2BS(nwZJ&@pVG@u3)x?wLPDxI8v#`_6V$&hvj^3Ge{ji+ zG2$Z9nJiovA_hU1V5`;gm-G%A#DB;?|up~IyMp|j0P)jKFyzLyzp z=a+WqE)HQGO*LdB>+15^+lQT;@26zBcqN^AI#frb|O!xI?$EiaM5m~ z?a!%$ArPT|a$8Sc{e_7aA}bAbST#UNbKA`rN;FWIheH+1zo8>(MG70Jl$40fM`!q| zorvt^$?dmcPbDXhW5&Fl zL?iGY1Cqo#ud<7SR!PBt;rfIy^rckMcjaV2JxEPT+NfEW-?)1CRw4KDIiHNqVW(_t#qqqn#2#8cOnaKrHhAT8^<>mkhI+b@+h!6EKAX;+>68cvx{ zN+Zoi0pR>9iaqVJ`?~S;VVPfPh)^{NCQ^biVwJ*gz1UKx=}xcOh6DY{*An-=JVrAA z_{J<=U5XGwaOg7+!wurbL{MZ`HC3m)0auDb1GqS{)qati`A_*Yzz;^BBV&9AGZK?V z-|JdP2}l1hb~szLw6r;Y@@y|Z=IWIr9jSdA-F@!Py*Os1hQdE5b$oeh_}Ue9=#ybPMa7~nPYJ07IkR#N8!ma3h?g#(44Eai^T8+2T|bAjk^RjRCD95-)UL9 zttNzcelX1euduMoN9(ZwCZK=y?d#Dk2~?&;$b4ze17Bi_0?cxbMa*#^3h~xkROg!{ z&hDozuxLKXFUkoZCHh*#Qyg758o9~^1BL1*64PgnCW=wGQ(+?ZH4{EfI%GxB{?lJ8`dZ5`+_o3)byb5q2f3Gxq& ztI6{xgU&hG2^SgpjlDhw#0vwe8RJEUb=?G?x|M9?(%pFuDMclUGr z&xm6y+=1(Nofq^*^0uiKNWw=y63%gi+5O4B(MJT9hKH^TuS@q{-zY*T@~53faUg?# z7Q*}d;S(4y4A(!qM3_YXC~#QwJ2?2q^@>6h)&!wKPCJ1Mbqta(e-@CM97sp1u*Z

@M%mjWaK0<2jI&z}NS=#6x@|9*I` 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 literal 0 HcmV?d00001 diff --git a/w07_2_policy_gradient_methods/images/grid2.pdf b/w07_2_policy_gradient_methods/images/grid2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d73a404fc52ac5b19c343f5c81523da57ca2ddc2 GIT binary patch literal 10841 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 YZpE0HJ7YIc1#y!Uh4Aw$YpFo~4HZ0xtN;K2 literal 0 HcmV?d00001 diff --git a/w07_2_policy_gradient_methods/t01_big_picture.tex b/w07_2_policy_gradient_methods/t01_big_picture.tex new file mode 100644 index 0000000..b189759 --- /dev/null +++ b/w07_2_policy_gradient_methods/t01_big_picture.tex @@ -0,0 +1,82 @@ +% !TeX spellcheck = en_US +\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' +\input{../latex_main/preamble} +\title[RL: Big Picture]{RL: Policy Gradient Methods} +\subtitle{The Big Picture} + + + +\begin{document} + + \maketitle + +%---------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Policy Gradient Methods} + +\begin{itemize} + \item Before, we showed how to find a good policy without value approximation\\ by directly optimizing the policy gradient + \item But: + \begin{itemize} + \item scalability of black-box optimizers might be limited + \item the finite difference method is noisy and inefficient + \end{itemize} + \item We showed the policy gradient can be computed analytically\\ + $\leadsto$ How exactly can we leverage this in RL algorithms? +\end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Recap: Policy Gradient Theorem} + + \begin{itemize} + \item For any differentiable policy $\pi_\theta$ and objective function $J$, the policy gradient is $$\nabla_\theta J_\theta= \mathbb{E}_{\pi_\theta} [Q^{\pi_\theta}(s,a) \nabla_\theta \log \pi_\theta(s,a) ] $$ + \item To compute this gradient, we only need trajectories from $\pi_\theta$ and its Q-function $Q^{\pi_\theta}$ + \item A trajectory is a tuple $\tau = (s_0, a_0, r_1, \ldots, s_{T-1}, a_{T-1}, r_{T-1}, s_T)$ + \end{itemize} +\bigskip + $\leadsto$ The data we collect through environment interactions is enough to compute the gradient + \newline + \textbf{Problem}: the gradient estimate is unbiased but very noisy (i.e., high variance) +\end{frame} +%----------------------------------------------------------------------- +%----------------------------------------------------------------------- +\begin{frame}[c]{A Simple Policy Gradient Update} +\begin{enumerate} + \item for each episode $\{s_0, a_0, r_1, \ldots, s_{T-1}, a_{T-1}, r_T \} \sim \pi_\theta $ do + \begin{itemize} + \item for $t=0$ to $T - 1$ do + \begin{itemize} + \item $\theta := \theta + \alpha Q^{\pi_\theta}(s,a) \nabla_\theta \log \pi_\theta (s_t, a_t) $ + \end{itemize} + \end{itemize} + \item return $\theta$ +\end{enumerate} + +\medskip +Note: This is gradient ascent ($+$) and not gradient descent + +\pause +\medskip +\textbf{Questions:} How do we estimate $Q^{\pi_\theta}(s,a)$ efficiently? Can we make the gradient estimation less noisy? +\end{frame} +%----------------------------------------------------------------------- +%----------------------------------------------------------------------- +\begin{frame}[c]{Policy Gradient Algorithms} +\begin{itemize} + \item We can construct algorithms using the policy gradient to update a policy function iteratively + \item The policy can be modeled in different ways; though DNNs are the most common + \item We can use algorithmic improvements to stabilize the gradient estimation + \pause + \item In this module, we will introduce some of them: + \begin{itemize} + \item Estimation via sampling: REINFORCE + \item Utilizing value baselines: Actor-Critic + \item Limiting the size of each policy update: PPO + \end{itemize} +\end{itemize} +\end{frame} +%----------------------------------------------------------------------- +%----------------------------------------------------------------------- +\end{document} diff --git a/w07_2_policy_gradient_methods/t02_reinforce.tex b/w07_2_policy_gradient_methods/t02_reinforce.tex new file mode 100644 index 0000000..5439ca0 --- /dev/null +++ b/w07_2_policy_gradient_methods/t02_reinforce.tex @@ -0,0 +1,105 @@ +% !TeX spellcheck = en_US +\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' +\input{../latex_main/preamble} +\title[RL: Policy Gradient]{RL: Policy Gradient} +\subtitle{Policy Gradient Algorithm: REINFORCE} + + + +\begin{document} + + \maketitle + +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Fixing Policy Gradient I: Use Temporal Structure} +\vspace{-1.5em} +We know: +$$ \nabla_\theta V(\theta) = \nabla_\theta \mathbb{E}_\tau [R(\tau)] = \mathbb{E}_\tau \left[ R(\tau) \left( \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \right) \right]$$ + +And since $R(\tau) = \sum_{t'=0}^{T-1} r_{t'}$: + +$$ + \nabla_\theta \mathbb{E}[R(\tau)] = \mathbb{E} \left[ \bigg ( \sum_{t'=0}^{T-1} r_{t'} \bigg ) \bigg ( \sum^{t'}_{t=0} \nabla_\theta \log \pi_\theta (a_t \mid s_t) \bigg ) \right] +$$ + +We can distribute $\sum_{t'=0}^{T-1} r_{t'}$ inside the second sum to get + +$$ + \nabla_\theta V(\theta) = \nabla_\theta \mathbb{E}[R(\tau)] = \mathbb{E} \bigg [ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta (a_t \mid s_t) \sum^{T-1}_{t'=0} r_{t'} \bigg ] +$$ + + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Policy Gradient: Use Temporal Structure} + +\begin{itemize} + \item Note that the return at timestep $t$ cannot impact returns at timesteps $t' < t$. So, we can change the sum $\sum_{t'=0}^{T-1} r_{t'}$ to $\sum_{t'=t}^{T-1} r_{t'}$. These are \textbf{future rewards}. + + $$ + \nabla_\theta \mathbb{E}[R(\tau)] = \mathbb{E} \bigg [ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta (a_t \mid s_t) \underbrace{\sum^{T-1}_{t'=t} r_{t'} }_{\text{future rewards}} \bigg ] + $$ + + \item[$\leadsto$] If we consider less sampled rewards, the estimate will have less variance. + \item Recall for a particular trajectory $\tau^{(i)}$, $\sum_{t'=t}^{T-1} r_{t'}^{(i)}$ is the return $G_t^{(i)}$ + \item We estimate the value of the expectation using $m$ trajectories: +\end{itemize} + +$$\nabla_\theta \mathbb{E}[R(\tau)] \approx \frac{1}{m} \sum_{i=1}^m \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta (a_t,s_t) G_t^{(i)} $$ + + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Monte-Carlo Policy Gradient (REINFORCE)} + +REINFORCE is an algorithm that approximates the policy gradient using sampled trajectories in this manner: + +$$ \Delta \theta_t = \alpha \nabla_\theta \log \pi_\theta (s_t, a_t) G_t $$ + + +REINFORCE: +\begin{enumerate} + \item Initialize policy parameters $\theta$ arbitrarily + \item for each episode $\{s_0, a_0, r_1, \ldots, s_{T-1}, a_{T-1}, r_T \} \sim \pi_\theta $ do + \begin{itemize} + \item for $t=0$ to $T - 1$ do + \begin{itemize} + \item $\theta := \theta + \alpha \nabla_\theta \log \pi_\theta (s_t, a_t) G_t $ + \end{itemize} + \end{itemize} + \item return $\theta$ +\end{enumerate} + +\begin{itemize} + \item Policy gradient via Monte Carlo sampling + \item[$\leadsto$] still high variance +\end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Where Does The Variance Come From?} + +\begin{itemize} + \item Sampling trajectories will not necessarily lead to similar results from non-deterministic policies and environments + \item Example: 3 steps in a Gridworld +\end{itemize} + + \begin{figure} + \centering +\includegraphics[width=0.3\textwidth]{w07_2_policy_gradient_methods/images/grid1.pdf} +\includegraphics[width=0.3\textwidth]{w07_2_policy_gradient_methods/images/grid2.pdf} +\includegraphics[width=0.3\textwidth]{w07_2_policy_gradient_methods/images/grid3.pdf} + \label{fig:enter-label} + \end{figure} + + $\leadsto$ three very different gradient estimates + \pause + \newline + $\leadsto$ \alert{three very different updates} +\end{frame} +%----------------------------------------------------------------------- +\end{document} diff --git a/w07_2_policy_gradient_methods/t03_the baseline.tex b/w07_2_policy_gradient_methods/t03_the baseline.tex new file mode 100644 index 0000000..46b6b6f --- /dev/null +++ b/w07_2_policy_gradient_methods/t03_the baseline.tex @@ -0,0 +1,125 @@ +% !TeX spellcheck = en_US +\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' +\input{../latex_main/preamble} +\title[RL: Policy Gradient]{RL: Policy Search} +\subtitle{Policy Gradient Algorithms} + + + +\begin{document} + + \maketitle +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Fixing Policy Gradient II: Value Baselines} + +\begin{itemize} + \item We identified a problem: using the sampled return introduces a lot of variance in our gradient estimation: + $$\theta := \theta + \alpha \nabla_\theta \log \pi_\theta (s_t, a_t) G_t $$ + \item So: we need to offset the noise we incur from using the return samples + \item Ideally, we want to keep the gradient unbiased +\end{itemize} + $\leadsto$ \alert{Idea}: We use a baseline for the return estimation to reduce variance without introducing bias +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Fixing Policy Gradient II: Value Baselines} + +\begin{itemize} + \item Reduce variance by introducing a baseline $b(s)$ to remove the influence of future actions + + $$\nabla_\theta \mathbb{E}_\tau [R] = \mathbb{E}_\tau \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi(a_t \mid s_t; \theta) \left( \sum_{t'=t}^{T-1} r_{t'} - \alert{b(s_t)} \right) \right] $$ + + \item For any choice of $b$, gradient estimator is unbiased + \item Near-optimal choice is our approximation of the expected return + $$b(s_t) \approx \mathbb{E} [r_t + r_{t+1} +\ldots + r_{T-1}] $$ + + \item Interpretation: increase logprob of action $a_t$ proportionally to how much returns $\sum_{t'=t}^{T-1} r_{t'}$ are better than expected + +\end{itemize} +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Why Does This Not Introduce Bias?} + +\begin{itemize} + \item Mathematically, when we distribute the sum on the right side we get two terms: the original policy gradient term, and an \alert{expectation that includes the baseline}: + $$ \mathbb{E}_\tau \bigg [ \nabla_\theta \log \pi(a_t \mid s_t; \theta) \cdot b(s_t) \bigg ]$$ + + $$= \mathbb{E}_{s_{0;t},a_{0;t-1}} \left[ b(s_t) \cdot \mathbb{E}_{a_t} \left[ \nabla_\theta \log \pi(a_t \mid s_t; \theta) \right] \right] $$ + + $$=\mathbb{E}_\tau \left[ b(s_t) \cdot 0 \right] $$ + + \item The expectation goes to zero because of the log derivative trick \href{https://danieltakeshi.github.io/2017/03/28/going-deeper-into-reinforcement-learning-fundamentals-of-policy-gradients/}{\alert{(click here for more details)}} + + \item More intuitively: there's no additional bias because we only re-weigh the action $a_t$ at timestep $t$ with a function $b$ that does not depend on the action at all + +\end{itemize} + +\end{frame} +% %----------------------------------------------------------------------- +\begin{frame}[c]{Intuition: Why Does It Help?} + +\begin{itemize} + \item Usually we would assume not changing the bias will also not change the variance + + \item In this case, it does since we offset the effect of our sampling procedure + + \item While the expectations in our gradient are technically constant, in practice, we approximate them with samples + + \item As we have seen, samples can diverge greatly over the course of a single training run + + \item With the baseline, we can get better updates on diverse samples since now we can remove the influence of future actions on each return step + \newline + $\leadsto$ Bringing the approximation of the expectation closer to the theoretical true value +\end{itemize} + +\end{frame} +%---------------------------------------------------------------------- +% \begin{frame}[c]{”Vanilla” Policy Gradient Algorithm} + +% \begin{itemize} +% \item Initialize policy parameters $\theta$ and baseline $b$ +% \item for iteration$=1,2,\ldots$ do +% \begin{itemize} +% \item Collect a set of trajectories by executing the current policy +% \item At each time step $t$ in each trajectory $\tau^i$, compute +% \begin{itemize} +% \item Return $G_t^i= \sum_{t'=t}^{T-1} r_{t'}^i$ and +% \item Advantage estimate $\hat{A}^i_t = G^i_t - b(s_t)$ +% \end{itemize} +% \item Re-fit the baseline by minimizing $\sum_i \sum_t || b(s_t) - G^i_t||^2$ +% \item Update the policy, using a policy gradient estimate $\hat{g}$ +% \begin{itemize} +% \item which is a sum of terms $\nabla_\theta \log \pi(a_t \mid s_t; \theta) \hat{A}_t$ +% \item Apply gradient $\hat{g}$ by any DL-optimizer (e.g., SGD or ADAM) +% \end{itemize} +% \end{itemize} + +% \end{itemize} + +% \bigskip + +% $\leadsto$ Actor-Critic method + +% \end{frame} +%----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +% \begin{frame}[c]{Choosing the Baseline: Value Functions} + +% \begin{itemize} +% \item Recall $Q$-function: +% $$Q^\pi(s,a) = \mathbb{E}_\pi [r_0 + \gamma r_1 + \gamma^2 r_2 + \ldots \mid s_0 = s, a_0 = a ]$$ +% \item State-value function can serve as a great baseline +% \begin{eqnarray} +% V^\pi (s) &=& \mathbb{E}_\pi [r_0 + \gamma r_1 + \gamma^2 r_2 + \ldots \mid s_0 = s]\nonumber\\ +% &=& \mathbb{E}_{a\sim\pi} [Q^\pi(s,a)]\nonumber +% \end{eqnarray} +% \item Advantage function: Combining $Q$ with baseline $V$: +% $$A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s) $$ +% \end{itemize} + +% \end{frame} +% %----------------------------------------------------------------------- +%----------------------------------------------------------------------- +\end{document} \ No newline at end of file diff --git a/w07_2_policy_gradient_methods/t04_actor_critic_approaches.tex b/w07_2_policy_gradient_methods/t04_actor_critic_approaches.tex new file mode 100644 index 0000000..0ce6c7f --- /dev/null +++ b/w07_2_policy_gradient_methods/t04_actor_critic_approaches.tex @@ -0,0 +1,81 @@ +% !TeX spellcheck = en_US +\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' +\input{../latex_main/preamble} +\title[RL: Policy Gradient]{RL: Policy Search} +\subtitle{Policy Gradient Algorithms: Actor-Critic} + + + +\begin{document} + + \maketitle +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Incorporating Baselines: Actor-Critic Methods} + +\begin{itemize} + \item We know the near-optimal baseline is: + $$b(s_t) \approx \mathbb{E} [r_t + r_{t+1} +\ldots + r_{T-1}] = G_t$$ + \item That should look very familiar since we know: + $$ V(s) = \mathbb{E}[G_t \mid s_t=s] $$ +\end{itemize} +$\leadsto$ We can use value estimation to approximate the optimal baseline +\end{frame} +%----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +\begin{frame}[c]{Choosing the Baseline: Value Functions} + + \begin{itemize} + \item Recall $Q$-function: + $$Q^\pi(s,a) = \mathbb{E}_\pi [r_0 + \gamma r_1 + \gamma^2 r_2 + \ldots \mid s_0 = s, a_0 = a ]$$ + \item State-value function can serve as a great baseline since it's often easier to estimate: + \begin{eqnarray} + V^\pi (s) &=& \mathbb{E}_\pi [r_0 + \gamma r_1 + \gamma^2 r_2 + \ldots \mid s_0 = s]\nonumber\\ + &=& \mathbb{E}_{a\sim\pi} [Q^\pi(s,a)]\nonumber + \end{eqnarray} + \item Advantage function: estimating the advantage of a given action over the state value: + $$A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s) $$ + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +% %---------------------------------------------------------------------- +\begin{frame}[c]{”Vanilla” Policy Gradient Algorithm With Advantage Baseline} + + \begin{itemize} + \item Initialize policy parameters $\theta$ and baseline $b$ + \item for iteration$=1,2,\ldots$ do + \begin{itemize} + \item Collect a set of $K$ trajectories by executing the current policy + \item At each time step $t$ in each trajectory $\tau^k$, compute + \begin{itemize} + \item Return $G_t^k= \sum_{t'=t}^{T-1} r_{t'}^k$ and + \item Advantage estimate (actual return - general return estimate) $\hat{A}^k_t = G^k_t - b(s^k_t) = G^k_t - G^t$ + \end{itemize} + \item Re-fit the baseline by minimizing $b := \sum_k \sum_t || b(s^k_t) - G^k_t||^2$ (MSE) + \item Update the policy, using a policy gradient estimate $\hat{g}$ + \begin{itemize} + \item which is a sum over k: $\hat{A}_t \nabla_\theta \log \pi(a^k_t \mid s^k_t; \theta) $ + \item Apply gradient $\hat{g}$ by any DL-optimizer (e.g., SGD or ADAM) + \end{itemize} + \end{itemize} + + \end{itemize} + +\end{frame} + +\begin{frame}[c]{Actor-Critic Methods} + + \begin{itemize} + \item Methods combining policy approximation (an "Actor") with value approximation (a "Critic") are called "Actor-Critic" approaches + \item Many different configurations depending on the exact combination of policy and value learning methods -- previous slide shows a basic version + \item Most modern policy gradient algorithms are Actor-Critic algorithms + \item A big difference to REINFORCE: we now update over a set of trajectories at once instead of updating at each step + \end{itemize} + \bigskip + $\leadsto$ More stable, highly parallelizable policy gradient algorithms +\end{frame} + +% %----------------------------------------------------------------------- +%----------------------------------------------------------------------- +\end{document} \ No newline at end of file diff --git a/w07_2_policy_gradient_methods/t05_step_size_intro.tex b/w07_2_policy_gradient_methods/t05_step_size_intro.tex new file mode 100644 index 0000000..3540c5c --- /dev/null +++ b/w07_2_policy_gradient_methods/t05_step_size_intro.tex @@ -0,0 +1,126 @@ +% !TeX spellcheck = en_US +\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' +\input{../latex_main/preamble} +\title[RL: Policy Gradient]{RL: Policy Search} +\subtitle{Step Size and Trust Region} + + +\begin{document} + + \maketitle + +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Fixing Policy Gradient III: Limiting Update Size} +\begin{itemize} + \item We can approximate the return for the gradient computation using samples + \item We can stabilize that return to a degree using value estimation + \item Important: value estimation does not solve the variance problem; it can only reduce variance + \item It's still possible to sample very good or bad trajectories and thus perform extreme updates +\end{itemize} +\bigskip +$\leadsto$ The policy can still change drastically with only one update +\end{frame} + +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Why are Step Sizes a Big Deal in RL?} + + \begin{itemize} + \item Step size (aka learning rate) is important in any gradient-based approach + \item Supervised learning: Step too far $\leadsto$ next updates might fix it + \item Reinforcement learning: + \begin{itemize} + \item Step too far $\leadsto$ bad policy + \item Next batch: collected under bad policy + \item \alert{Policy is determining data collection!} + \begin{itemize} + \item Essentially controlling exploration and exploitation trade-off due to particular policy parameters and the stochasticity of the policy + \end{itemize} + \item May not be able to recover from a bad choice $\leadsto$ collapse in performance + \end{itemize} + \end{itemize} + +\end{frame} + +%---------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Policy Gradient and Step Size} + + \begin{itemize} + \item Goal: Each step of policy gradient yields an updated policy $\pi'$ whose value is greater than\\ (or equal) to the prior policy $\pi$: $V^{\pi'} \geq V^\pi$ + \begin{itemize} + \item Monotonic improvement + \item Important in some applications + \item PG often more stable than DQN + \end{itemize} + \item Gradient descent approaches update the weights a small step in direction of the gradient + \item First order / linear approximation of the value function's dependence on the policy parameterization + \item Locally a good approximation; further away less good + \end{itemize} + +\end{frame} + +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Policy Gradient Methods with Auto-Step-Size Selection} + + \begin{itemize} + \item Can we automatically ensure the updated policy $\pi'$ has a value greater than (or equal to) the prior policy $V^{\pi'} \geq V^\pi$? + \item We will: + \begin{itemize} + \item Consider this question for the policy gradient setting + \item Try to address this by modifying step size + \item Introduce an algorithm implementing such an auto-adaption approach + \end{itemize} + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Objective Function} + + \begin{itemize} + \item Goal: find policy parameters that maximize the value function + $$ V(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{\infty} \gamma^t r(s_t, a_t) \right]$$ + \item Having access to samples from the current policy $\pi_\theta$ + \item But what if we want to predict the value of a different policy ($\leadsto$ off-policy learning)? + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Objective Function} + \vspace{-1em} + \begin{itemize} + \item Goal: find policy parameters that maximize value function + $$ V(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{\infty} \gamma^t r(s_t, a_t)\right]$$ + \item Express value of a second policy $\Tilde{\pi}$ in terms of advantage of original policy $\pi$ + \begin{eqnarray} + V(\Tilde{\theta}) &=& V(\theta) + \mathbb{E}_{\pi_{\Tilde{\theta}}} \left[ \sum_{t=0}^{\infty} \gamma^t A_\pi(s_t, a_t) \right] \nonumber\\ + &=& V(\theta) + \sum_{s} \mu_{\Tilde{\pi}}(s) \sum_{a} \Tilde{\pi}(a \mid s) A_\pi(s_t, a_t) \nonumber + \end{eqnarray} + %\item $ \mu_{\Tilde{\pi}}(s)$ is the discounted weighted frequency of state $s$ under policy $\Tilde{\pi}$ + \item Assume for now that we know the true advantage $A_\pi$ and $\Tilde{\pi}$ + \item But we cannot compute the above if we don't know $\mu(\Tilde{\pi})$,\\ i.e., the state distribution under the newly proposed policy (a.k.a. state visitation frequency) + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Local Approximation} + + \begin{itemize} + \item Can we remove the dependency on the discounted visitation frequencies under the new policy? + \item Substitute in the state distribution under the \alert{current} policy to define a new objective function to \alert{maximize}: + $$ L_\pi(\Tilde{\pi}) = V(\theta) + \sum_{s} \alert{\mu_\pi (s)} \sum_{a} \Tilde{\pi}(a \mid s) A_\pi(s,a)$$ + \item Note that $L_{\pi_{\theta}}(\pi_{\theta}) = V(\theta)$ since the unweighted sum of $A_\pi$ is zero + \item Thus, the gradient of $L$ is identical to the gradient of the value function at policy parameterized by $\theta_0$: + $$\nabla_{\theta} L_{\pi_{\theta'}}(\pi_{\theta'})\mid_{\theta = \theta'} = \nabla_\theta V(\theta)\mid_{\theta = \theta'}$$ + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- + +\end{document} diff --git a/w07_2_policy_gradient_methods/t06_step_size_bounds.tex b/w07_2_policy_gradient_methods/t06_step_size_bounds.tex new file mode 100644 index 0000000..1ea3c84 --- /dev/null +++ b/w07_2_policy_gradient_methods/t06_step_size_bounds.tex @@ -0,0 +1,63 @@ +% !TeX spellcheck = en_US +\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' +\input{../latex_main/preamble} +\title[RL: Policy Gradient]{RL: Policy Search} +\subtitle{Step Size and Trust Region} + + +\begin{document} + + \maketitle + +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Conservative Policy Iteration} + + \begin{itemize} + \item Can we lower bound the improvement gained by optimizing the policy gradient? + \item Consider mixture policies that blend an old policy and a different policy $\pi'$ ($\approx$ the step size): + $$\pi_{new}(a \mid s) = (1 - \alpha) \pi_{old} (a \mid s) + \alpha \pi'(a \mid s) $$ + \item In this case, we can guarantee a lower bound on the difference between $\pi_{old}$ and $\pi_{new}$: + $$ L_{\pi_{old}}(\pi_{new}) = V_{{\pi_{old}}} + \sum_{s} \mu_{\pi_{old}} (s) \sum_{a} \pi_{new}(a \mid s) A_{\pi_{old}}(s,a)$$ + $$ V_{\pi_{new}} = V_{{\pi_{old}}} + \sum_{s} \mu_{\pi_{new}} (s) \sum_{a} \pi_{new}(a \mid s) A_{\pi_{old}}(s,a)$$ + $$ V_{\pi_{new}} - L_{\pi_{old}}(\pi_{new}) = \alert{(\sum_{s} \mu_{\pi_{new}}(s) - \sum_{s} \mu_{\pi_{old}} (s))} \sum_{a} \pi_{new}(a \mid s) A_{\pi_{old}}(s,a)$$ + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Conservative Policy Iteration} + + \begin{itemize} + \item The improvement is bounded by the difference in visitation frequencies + \item Substituted with the mixture parameters, we get: + $$V^{\pi_{new}} \geq L_{\pi_{old}} (\pi_{new}) - \frac{2\epsilon\gamma}{(1- \gamma)^2} \alpha^2 \geq V^{\pi_{old}}$$ + where $\epsilon = \max_{s} \mathbb{E}_{a \sim \pi'(a \mid s) [A_\pi(s,a)]}$ + \item How can we express the difference in visitation frequencies between policies generally? + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Find the Lower-Bound in General Stochastic Policies} + + \vspace{-1.5em} + \begin{itemize} + \item Would like to similarly obtain a lower bound on the potential performance for general stochastic policies (not just mixture policies) + \item Recall that the deciding factor for the lower bound is the degree of difference between the generated trajectories + \end{itemize} + + \begin{block}{Theorem} + Let $D_{TV}^{\max} (\pi_1, \pi_2) = \max_{s} D_{TV}(\pi_1(\cdot \mid s), \pi_2(\cdot\mid s)) = \max_{s} \max_{a} (\pi_1(a\mid s) -\pi_2 (a\mid s))$. Then + $$V^{\pi_{new}} \geq L_{\pi_{old}} (\pi_{new}) - \frac{4\epsilon\gamma}{(1-\gamma)^2} (D_{TV}^{\max}(\pi_{old}, \pi_{new}))^2$$ + \vspace{-0.3em} + where $\epsilon = \max_{s,a}|A_\pi(s,a)|$ + \end{block} + + \begin{itemize} + \item Note that $D_{TV}(p,q)^2 \leq D_{KL}(p,q)$ for prob. distribution $p$ and $q$, so: + $$ V^{\pi_{new}} \geq L_{\pi_{old}} (\pi_{new}) - \frac{4\epsilon\gamma}{(1-\gamma)^2} D_{KL}^{\max}(\pi_{old}, \pi_{new}) $$ + \end{itemize} + +\end{frame} +\end{document} \ No newline at end of file diff --git a/w07_2_policy_gradient_methods/t07_step_size_in_practice.tex b/w07_2_policy_gradient_methods/t07_step_size_in_practice.tex new file mode 100644 index 0000000..465e057 --- /dev/null +++ b/w07_2_policy_gradient_methods/t07_step_size_in_practice.tex @@ -0,0 +1,84 @@ +% !TeX spellcheck = en_US +\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' +\input{../latex_main/preamble} +\title[RL: Policy Gradient]{RL: Policy Search} +\subtitle{Step Size and Trust Region} + + +\begin{document} + + \maketitle + +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Optimization of Parameterized Policies} + + \begin{itemize} + \item Goal is to optimize + $$ L_{\pi_{old}} (\pi_{new}) - \frac{4\epsilon\gamma}{(1-\gamma)^2} D_{KL}^{\max}(\pi_{old}, \pi_{new}) = L_{\pi_{old}} (\pi_{new}) - C \cdot D_{KL}^{\max}(\pi_{old}, \pi_{new}) $$ + where $C$ is the penalty coefficient (i.e. hyperparameter) + \item The penalty would be fairly small in practice (as we know from theory) + \medskip + \item Since the penalty depends on the KL divergence between old and new policy, we can constrain the update to keep divergence low: + \begin{eqnarray} + \max_{\theta} L_{\pi_{old}} (\pi_{new})\\ + \text{subject to } D_{KL}^{s \sim \mu_{\pi_{old}}} (\pi_{old}, \pi_{new}) \leq \delta + \end{eqnarray} + \item This uses the average KL instead of max (the max requires the KL to be bounded at all states and yields an impractical number of constraints) + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{From Theory to Practice} + + \begin{itemize} + \item Current objective: + $$ \max_{\theta} L_{\pi_{old}} (\pi_{new})$$ + {\centering subject to $ D_{KL}^{s \sim \alert{\mu_{\pi_{old}}}} (\pi_{old}, \pi_{new}) \leq \delta$\\} + where $ L_{\pi_{old}}(\pi_{new}) = V(\pi_{old}) + \sum_{s} \alert{\mu_{\pi_{old}}(s)} \sum_{a} \pi_{new}(a \mid s) \alert{A_{\pi_{old}}(s,a)}$ + \item But: in practice we don't know the visitation weights nor true advantage function + \pause + \item Step 1: estimate $\mu_\pi$ using samples we have already collected: + $$ \sum_{s} \mu_\pi (s) \to \frac{1}{1- \gamma} \mathbb{E}_{s\sim \mu_{\pi_{old}}} [\ldots]$$ + \item[$\leadsto$] estimate $\mu_\pi (s)$ wrt the sampled trajectories we have already + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{From Theory to Practice II} + + \begin{itemize} + \item Step 2: use \alert{importance sampling} to estimate the desired sum: + $$\sum_{a} \pi_{new} (a\mid s_n) A_{\pi_{old}} (s_n, a) \to \mathbb{E}\left[ \frac{\pi_{new}(a \mid s_n)}{q(a\mid s_n)} A_{\pi_{old}} (s_n, a) \right] $$ + \item where $q$ is some sampling distribution over actions and $s_n$ is a particular sampled state + \item Now we are able to use samples from $q$ (instead of the new policy $\pi_{new}$) + \pause + \item Step 3: + $$ A_{\theta_{old}} \to Q_{\theta_{old}}$$ + \item Note that these substitutions do not change the solution to the optimization problem + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Policy Gradient with Step Size Adaption} + + \begin{itemize} + \item Optimize new surrogate objective $L$: + $$ \mathbb{E}_{s\sim \mu_{\pi_{old}}, a \sim q} \left[ \frac{\pi_{new}(a \mid s_n)}{q(a\mid s_n)} Q_{\pi_{old}} (s_n, a) \right]$$ + {\centering subject to $\mathbb{E}_{s\sim \mu_{\pi_{old}}} D_{KL}(\pi_{old}(\cdot \mid s), \pi_{new} (\cdot \mid s)) \leq \delta$ \\} + \item Standard approach: sampling distribution $q(a\mid s)$ is simply $\pi_{old}(a \mid s)$ + \item Then we can compute this update using existing samples and don't need to evaluate $\pi_{new}$ + %\item For the vine procedure see the paper + \end{itemize} + + % \centering + % \includegraphics[width=0.5\textwidth]{images/trpo.PNG}\\ + % \lit{Schulman et al. 2015}{https://arxiv.org/abs/1502.05477} + +\end{frame} + + +\end{document} \ No newline at end of file diff --git a/w07_2_policy_gradient_methods/t08_ppo.tex b/w07_2_policy_gradient_methods/t08_ppo.tex new file mode 100644 index 0000000..dcc14bd --- /dev/null +++ b/w07_2_policy_gradient_methods/t08_ppo.tex @@ -0,0 +1,131 @@ +% !TeX spellcheck = en_US +\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' +\input{../latex_main/preamble} +\title[RL: Policy Gradient]{RL: Policy Search} +\subtitle{Step Size and Trust Region: PPO} + + +\begin{document} + + \maketitle + +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}{The State Of The Art in Policy Gradient Methods} +We combine all improvements from this lecture into one algorithm: + \begin{itemize} + \item Policy gradient estimation from Monte Carlo samples + \item Actor-Critic algorithm with value estimation + \item Limited updates to improve continuously + \end{itemize} +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Common Template of Policy Gradient Algorithms} + + \begin{itemize} + \item For $i= 1,2,\ldots$ do + \begin{enumerate} + \item Run policy for $T$ timesteps or $N$ trajectories + \item At each timestep in each trajectory, compute baseline $b(s_t)$ + \item Compute surrogate objective $L$ + \item Update the policy to optimize $L$ $\leadsto$ constrain the update to ensure policy improvement + \end{enumerate} + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{The Current Standard: PPO Algorithm~\lit{Schulman et al. 2017}{https://arxiv.org/pdf/1707.06347.pdf}} + + \begin{itemize} + \item For $i= 1,2,\ldots$ do + \begin{enumerate} + \item Run policy for $T$ timesteps or $N$ trajectories + \item At each timestep in each trajectory, \alert{compute advantage using value function $V$} + \item Compute surrogate objective $L$ + \item \alert{Clip $L$} for large updates + \item Add the \alert{value loss} term to $L$ + \item Add a term to $L$ that provides a \alert{bonus for entropy} + \item Update the policy to optimize $L$ + \item \alert{Update target value function $V^{target}$} + \end{enumerate} + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Update I: The CLIP Objective} + + \begin{itemize} + \item Recall our surrogate objective $L$: + $$\mathbb{E}_{s\sim \mu_{\pi_{old}}, a \sim \pi_{old}} \left[ \frac{\pi_{new}(a \mid s_n)}{\pi_{old}(a\mid s_n)} A_{\pi_{old}} (s_n, a) \right]$$ + \item We want to ensure similarity between the old and new policy and thus improvement + \item Instead of trying to approximate the distance between the old and new policy explicitly with a KL divergence (which can be hard to compute), we simply clip the importance sampling term: + $$L = L^{CLIP} = \mathbb{E}_{s\sim \mu_{\pi_{old}}, a \sim \pi_{old}} \left[ min( r(\pi_{new}) A_{\pi_{old}} (s_n, a), clip(r(\pi_{new}), 1-\epsilon, 1+\epsilon) A_{\pi_{old}} ) \right]$$ + with $r(\pi) = \frac{\pi_new(a \mid s_n)}{\pi_{old}(a\mid s_n)}$ + \item This penalizes large changes away from the old policy by limiting the advantage from them + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Update II: The Value Error} + +\begin{columns} + + \column{0.3\textwidth} + +\centering + \includegraphics[scale=0.2]{w07_2_policy_gradient_methods/images/ac-arch.pdf} + + \column{0.7\textwidth} + +\begin{itemize} + \item A second change to our PG template is the addition of a value error loss term for learning $V$ + \item This term is updating the value function $V$ (used for advantage estimation) + \item This is part of the overall objective since in practice a single network predicts policy and values + \item We add the hyperparameter $c_1$ to weigh it against the policy improvement term + \item Our updated objective is: + $$L = L^{CLIP} + c_1 \mathbb{E}_{s\sim \mu_{\pi_{old}}, a \sim \pi_{old}} \left[ (V(s_n) - V^{target}(s_n))^2 \right] $$ + $$= L^{CLIP} + c_1 L^V$$ + \end{itemize} + +\end{columns} + + + + + + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Update III: The Entropy Bonus} + + \begin{itemize} + \item The entropy bonus is added to ensure sufficient exploration ($\to$ maximize entropy!) + \item It measures the entropy $H$ of our current policy across the states of our sampled trajectories + \item We introduce the hyperparameter $c_2$ to weigh it against the other loss terms + \item Now we have the full PPO objective: + $$L^{PPO} = L^{CLIP} + c_1 L^V + c_2 \mathbb{E}_{s\sim \mu_{\pi_{old}}, a \sim \pi_{old}} \left[ H(\pi_{old}, s_n) \right] $$ + $$= L^{CLIP} + c_1 L^V + c_2 L^{ENT}$$ + \end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%---------------------------------------------------------------------- +\begin{frame}[c]{Policy Gradient Summary} + +\begin{itemize} + \item Extremely popular and useful set of approaches + \item Can input prior knowledge in the form of specifying policy parameterization + \item You should be familiar with REINFORCE and the policy gradient template + \item Understand where different estimators can be slotted in + \item (You don't have to be able to derive or remember the specific formulas in PPO for approximating the objectives and constraints) +\end{itemize} + +\end{frame} +%----------------------------------------------------------------------- +%----------------------------------------------------------------------- +\end{document} \ No newline at end of file diff --git a/w07_policy_search/t05_score_function.tex b/w07_policy_search/t05_score_function.tex deleted file mode 100644 index 1b48e19..0000000 --- a/w07_policy_search/t05_score_function.tex +++ /dev/null @@ -1,72 +0,0 @@ -% !TeX spellcheck = en_US -\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' -\input{../latex_main/preamble} -\title[RL: Score Function]{RL: Policy Search} -\subtitle{Score Function} - - - -\begin{document} - - \maketitle - -%---------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Likelihood Ratio + Score Function Policy Gradient} - - \begin{itemize} - \item Putting everything together from the last slide deck - \item Our goal is to find the policy parameters $\theta^*$ - $$\theta^* \in \argmax_{\theta} V(\theta) = \argmax_{\theta}\sum_{\tau} P(\tau; \theta) R(\tau) $$ - \item Approximate with empirical estimate for $m$ sample trajectories under - policy $\pi_\theta$: - \begin{eqnarray} - \nabla_\theta V(\theta) &\approx& \frac{1}{m} \sum_{i=1}^{m} R(\tau^{(i)}) \nabla_\theta \log P(\tau^{(i)}; \theta) \nonumber\\ - &=& \frac{1}{m} \sum_{i=1}^{m} R(\tau^{(i)}) \sum_{t=0}^{T-1} \underbrace{\nabla_\theta \log \pi_\theta (a_t^{(i)} \mid s_t^{(i)})}_{\text{Score Function}} - \end{eqnarray} - \item[$\leadsto$] Do not need to know dynamics model! - - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Score Function Gradient Estimator: Intuition} - - \begin{itemize} - \item Consider generic form of $R(\tau^{(i)}) \nabla_\theta \log P(\tau^{(i)}; \theta)$:\\ - $\hat{g}_i = f(x_i) \nabla_\theta \log p(x_i \mid \theta)$ - \item $f(x)$ measures how good the sample $x$ is - \item Moving in the direction $\hat{g}_i$ pushes up to the logprob of the sample,\\ in proportion of how good it is - \item Valid even if $f(x)$ is discontinuous; and unknown;\\ or sample space (containing $x$) is a discrete set - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Score Function Gradient Estimator: Intuition} - - -\centering -$\hat{g}_i = f(x_i) \nabla_\theta \log p(x_i \mid \theta)$ -\bigskip - -\includegraphics[width=0.4\textwidth]{images/scoring_function_1.png} -\pause -\includegraphics[width=0.4\textwidth]{images/scoring_function_2.png} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Policy Gradient Theorem} - -The policy gradient theorem generalizes the likelihood ratio approach: -\begin{block}{Theorem} -For any differentiable policy $\pi_\theta$, the policy gradient is -$$\nabla_\theta= \mathbb{E}_{\pi_\theta} [\nabla_\theta \log \pi_\theta(s,a) Q^{\pi_\theta}(s,a)] $$ - -\end{block} - -\end{frame} -%----------------------------------------------------------------------- -\end{document} diff --git a/w07_policy_search/t06_pg_algorithms.tex b/w07_policy_search/t06_pg_algorithms.tex deleted file mode 100644 index 1a8bb2e..0000000 --- a/w07_policy_search/t06_pg_algorithms.tex +++ /dev/null @@ -1,158 +0,0 @@ -% !TeX spellcheck = en_US -\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' -\input{../latex_main/preamble} -\title[RL: Policy Gradient]{RL: Policy Search} -\subtitle{Policy Gradient Algorithms} - - - -\begin{document} - - \maketitle - -%---------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Likelihood Ratio / Score Function Policy Gradient} - - - $$\nabla_\theta V(\theta) = \frac{1}{m} \sum_{i=1}^{m} R(\tau^{(i)}) \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta (a_t^{(i)} \mid s_t^{(i)}) $$ - - \begin{itemize} - \item Unbiased but very noisy - \item Fixes that can make it practical - \begin{itemize} - \item Temporal structure - \item Baseline - \item (and some more) - \end{itemize} - - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Policy Gradient: Use Temporal Structure} -\vspace{-1.5em} -$$ \nabla_\theta \mathbb{E}_\tau [R] = \mathbb{E}_\tau \left[ \left(\sum_{t=0}^{T-1} r_t\right) \left( \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \right) \right]$$ - -We can repeat the same argument to derive the gradient estimator for a single reward term $r_{t'}$ - -$$\nabla_\theta \mathbb{E} [r_{t'}] = \mathbb{E} \left[r_{t'} \sum_{t=0}^{t'} \nabla_\theta \log \pi_\theta (a_t \mid s_t)\right] $$ - -Summing this formula over $t$, we obtain: - -\begin{eqnarray} -\nabla_\theta V(\theta) = \nabla_\theta \mathbb{E}[R] &=& \mathbb{E} \left[ \sum_{t'=0}^{T-1} r_{t'} \sum^{t'}_{t=0} \nabla_\theta \log \pi_\theta (a_t \mid s_t) \right]\nonumber\\ -&=& \mathbb{E} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta (a_t \mid s_t) \sum^{T-1}_{t'=t} r_{t'} \right]\nonumber -\end{eqnarray} - - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Policy Gradient: Use Temporal Structure} - -\begin{itemize} - \item Recall for a particular trajectory $\tau^{(i)}$, $\sum_{t'=t}^{T-1} r_{t'}^{(i)}$ is the return $G_t^{(i)}$ -\end{itemize} - -$$\nabla_\theta \mathbb{E}[R] \approx \frac{1}{m} \sum_{i=1}^m \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta (a_t,s_t) G_t^{(i)} $$ - - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Monte-Carlo Policy Gradient (REINFORCE)} - -Leverages likelihood ratio / score function and temporal structure - -$$ \Delta \theta_t = \alpha \nabla_\theta \log \pi_\theta (s_t, a_t) G_t $$ - - -REINFORCE: -\begin{enumerate} - \item Initialize policy parameters $\theta$ arbitrarily - \item for each episode $\{s_1, a_1, r_2, \ldots, s_{T-1}, a_{T-1}, r_T \} \sim \pi_\theta $ do - \begin{itemize} - \item for $t=0$ to $T - 1$ do - \begin{itemize} - \item $\theta := \theta + \alpha \nabla_\theta \log \pi_\theta (s_t, a_t) G_t $ - \end{itemize} - \end{itemize} - \item return $\theta$ -\end{enumerate} - -\begin{itemize} - \item Somehow Monte-Carlo for policy gradient - \item[$\leadsto$] high variance -\end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Policy Gradient: Introduce Baseline} - -\begin{itemize} - \item Reduce variance by introducing a baseline $b(s)$ - - $$\nabla_\theta \mathbb{E}_\tau [R] = \mathbb{E}_\tau \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi(a_t \mid s_t; \theta) \left( \sum_{t'=t}^{T-1} r_{t'} - b(s_t) \right) \right] $$ - - \item For any choice of $b$, gradient estimator is unbiased - \item Near optimal choice is the expected return - $$b(s_t) \approx \mathbb{E} [r_t + r_{t+1} +\ldots + r_{T-1}] $$ - - \item Interpretation: increase logprob of action $a_t$ proportionally to how much returns $\sum_{t'=t}^{T-1} r_{t'}$ are better than expected - -\end{itemize} - - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{”Vanilla” Policy Gradient Algorithm} - - \begin{itemize} - \item Initialize policy parameters $\theta$ and baseline $b$ - \item for iteration$=1,2,\ldots$ do - \begin{itemize} - \item Collect a set of trajectories by executing the current policy - \item At each time step $t$ in each trajectory $\tau^i$, compute - \begin{itemize} - \item Return $G_t^i= \sum_{t'=t}^{T-1} r_{t'}^i$ and - \item Advantage estimate $\hat{A}^i_t = G^i_t - b(s_t)$ - \end{itemize} - \item Re-fit the baseline by minimizing $\sum_i \sum_t || b(s_t) - G^i_t||^2$ - \item Update the policy, using a policy gradient estimate $\hat{g}$ - \begin{itemize} - \item which is a sum of terms $\nabla_\theta \log \pi(a_t \mid s_t; \theta) \hat{A}_t$ - \item Apply gradient $\hat{g}$ by any DL-optimizer (e.g., SGD or ADAM) - \end{itemize} - \end{itemize} - - \end{itemize} - -\bigskip - -$\leadsto$ Actor-Critic method - -\end{frame} -%----------------------------------------------------------------------- -% %---------------------------------------------------------------------- -% \begin{frame}[c]{Choosing the Baseline: Value Functions} - -% \begin{itemize} -% \item Recall $Q$-function: -% $$Q^\pi(s,a) = \mathbb{E}_\pi [r_0 + \gamma r_1 + \gamma^2 r_2 + \ldots \mid s_0 = s, a_0 = a ]$$ -% \item State-value function can serve as a great baseline -% \begin{eqnarray} -% V^\pi (s) &=& \mathbb{E}_\pi [r_0 + \gamma r_1 + \gamma^2 r_2 + \ldots \mid s_0 = s]\nonumber\\ -% &=& \mathbb{E}_{a\sim\pi} [Q^\pi(s,a)]\nonumber -% \end{eqnarray} -% \item Advantage function: Combining $Q$ with baseline $V$: -% $$A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s) $$ -% \end{itemize} - -% \end{frame} -% %----------------------------------------------------------------------- -%----------------------------------------------------------------------- -\end{document} diff --git a/w07_policy_search/t07_step_size.tex b/w07_policy_search/t07_step_size.tex deleted file mode 100644 index ae045fc..0000000 --- a/w07_policy_search/t07_step_size.tex +++ /dev/null @@ -1,260 +0,0 @@ -% !TeX spellcheck = en_US -\documentclass[aspectratio=169]{../latex_main/tntbeamer} % you can pass all options of the beamer class, e.g., 'handout' or 'aspectratio=43' -\input{../latex_main/preamble} -\title[RL: Policy Gradient]{RL: Policy Search} -\subtitle{Step Size and Trust Region} - - -\begin{document} - - \maketitle - -%---------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Policy Gradient and Step Size} - - \begin{itemize} - \item Goal: Each step of policy gradient yields an updated policy $\pi'$ whose value is greater than (or equal) to the prior policy $\pi$: $V^{\pi'} \geq V^\pi$ - \begin{itemize} - \item Monotonic improvement - \item Important in some applications - \item PG often more stable than DQN - \end{itemize} - \item Gradient descent approaches update the weights a small step in direction of the gradient - \item First order / linear approximation of the value function's dependence on the policy parameterization - \item Locally a good approximation; further away less good - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Why are step sizes a big deal in RL?} - - \begin{itemize} - \item Step size is important in any problem involving the optima of a function - \item Supervised learning: Step too far $\leadsto$ next updates might fix it - \item Reinforcement learning: - \begin{itemize} - \item Step too far $\leadsto$ bad policy - \item Next batch: collected under bad policy - \item \alert{Policy is determining data collection!} - \begin{itemize} - \item Essentially controlling exploration and exploitation trade-off due to particular policy parameters and the stochasticity of the policy - \end{itemize} - \item May not be able to recover from a bad choice $\leadsto$ collapse in performance - \end{itemize} - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Policy Gradient Methods with Auto-Step-Size Selection} - - \begin{itemize} - \item Can we automatically ensure the updated policy $\pi'$ has value greater than (or equal to) the prior policy $V^{\pi'} \geq V^\pi$? - \item Consider this for the policy gradient setting, and hope to address this by modifying step size - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Objective Function} - - \begin{itemize} - \item Goal: find policy parameters that maximize value function - $$ V(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{\infty} \gamma^t r(s_t, a_t); \pi_\theta \right]$$ - \item have access to samples from the current policy $\pi_\theta$ - \item Want to predict the value of a different policy ($\leadsto$ off-policy learning) - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Objective Function} - \vspace{-1em} - \begin{itemize} - \item Goal: find policy parameters that maximize value function - $$ V(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{\infty} \gamma^t r(s_t, a_t); \pi_\theta \right]$$ - \item Express value of $\Tilde{\pi}$ in terms of advantage of $\pi$ - \begin{eqnarray} - V(\Tilde{\theta}) &=& V(\theta) + \mathbb{E}_{\pi_{\Tilde{\theta}}} \left[ \sum_{t=0}^{\infty} \gamma^t A_\pi(s_t, a_t) \right]\\ - &=& V(\theta) + \sum_{s} \mu_{\Tilde{\pi}}(s) \sum_{a} \Tilde{\pi}(a \mid s) A_\pi(s_t, a_t) - \end{eqnarray} - \item $ \mu_{\Tilde{\pi}}(s)$ is the discounted weighted frequency of state $s$ under policy $\Tilde{\pi}$ - \item We know the advantage $A_\pi$ and $\Tilde{\pi}$ - \item But we cannot compute the above we don't know $\mu(\Tilde{\pi})$, the state distribution under the newly proposed policy - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Local Approximation} - - \begin{itemize} - \item Can we remove the dependency on the discounted visitation frequencies under the new policy? - \item Substitute in the discounted visitation frequency under the current policy to define a new objective function: - $$ L_\pi(\Tilde{\pi}) = V(\theta) + \sum_{s} \alert{\mu_\pi (s)} \sum_{a} \Tilde{\pi}(a \mid s) A_\pi(s,a)$$ - \item Note that $L_{\pi_{\theta_0}}(\pi_{\theta_0}) = V(\theta_0)$ - \item Gradient of $L$ is identical to gradient of value function at policy parameterized evaluated at $\theta_0$: - $$\nabla_{\theta} L_{\pi_{\theta_0}}(\pi_{\theta_0})\mid_{\theta = \theta_0} = \nabla_\theta V(\theta)\mid_{\theta = \theta_0}$$ - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Conservative Policy Iteration} - - \begin{itemize} - \item Is there a bound on the performance of a new policy obtained by optimizing the surrogate objective? - \item Consider mixture policies that blend an old policy and a different policy - $$\pi_{new}(a \mid s) = (1 - \alpha) \pi_{old} (a \mid s) + \alpha \pi'(a \mid s) $$ - \item In this case, we can guarantee a lower bound on value of the new $\pi_{new}$: - $$V^{\pi_{new}} \geq L_{\pi_{old}} (\pi_{new}) - \frac{2\epsilon\gamma}{(1- \gamma)^2} \alpha^2 $$ - where $\epsilon = \max_{s} \mathbb{E}_{a \sim \pi'(a \mid s) [A_\pi(s,a)]}$ - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Find the Lower-Bound in General Stochastic Policies} - - \vspace{-1.5em} - \begin{itemize} - \item Would like to similarly obtain a lower bound on the potential performance for general stochastic policies (not just mixture policies) - \item Recall $ L_\pi(\Tilde{\pi}) = V(\theta) + \sum_{s} \mu_\pi (s) \sum_{a} \Tilde{\pi}(a \mid s) A_\pi(s,a)$ - \end{itemize} - - \begin{block}{Theorem} - Let $D_{TV}^{\max} (\pi_1, \pi_2) = \max_{s} D_{TV}(\pi_1(\cdot \mid s), \pi_2(\cdot\mid s)) = \max_{s} \max_{a} (\pi_1(a\mid s) -\pi_2 (a\mid s))$. Then - $$V^{\pi_{new}} \geq L_{\pi_{old}} (\pi_{new}) - \frac{4\epsilon\gamma}{(1-\gamma)^2} (D_{TV}^{\max}(\pi_{old}, \pi_{new}))^2$$ - \vspace{-0.3em} - where $\epsilon = \max_{s,a}|A_\pi(s,a)|$ - \end{block} - - \begin{itemize} - \item Note that $D_{TV}(p,q)^2 \leq D_{KL}(p,q)$ for prob. distribution $p$ and $q$ - \item Then the above theorem immediately implies that - $$ V^{\pi_{new}} \geq L_{\pi_{old}} (\pi_{new}) - \frac{4\epsilon\gamma}{(1-\gamma)^2} D_{KL}^{\max}(\pi_{old}, \pi_{new}) $$ - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Optimization of Parameterized Policies} - - \begin{itemize} - \item Goal is to optimize - $$ L_{\pi_{old}} (\pi_{new}) - \frac{4\epsilon\gamma}{(1-\gamma)^2} D_{KL}^{\max}(\pi_{old}, \pi_{new}) = L_{\pi_{old}} (\pi_{new}) - C \cdot D_{KL}^{\max}(\pi_{old}, \pi_{new}) $$ - where $C$ is the penalty coefficient (i.e. hyperparameter) - \item The penalty (from theory) would be fairly small in practice - \medskip - \item New Idea: Use a trust region constraint on step sizes. Do this by imposing a constraint on the KL divergence between the new and old policy: - \begin{eqnarray} - \max_{\theta} L_{\theta_{old}} (\theta)\\ - \text{subject to } D_{KL}^{s \sim \mu_{\theta_{old}}} (\theta_{old}, \theta) \leq \delta - \end{eqnarray} - \item This uses the average KL instead of max (the max requires the KL is bounded at all states and yields an impractical number of constraints) - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{From Theory to Practice} - - \begin{itemize} - \item Prior objective: - $$ \max_{\theta} L_{\theta_{old}} (\theta)$$ - {\centering subject to $ D_{KL}^{s \sim \alert{\mu_{\theta_{old}}}} (\theta_{old}, \theta) \leq \delta$\\} - where $ L_\pi(\Tilde{\pi}) = V(\theta) + \sum_{s} \alert{\mu_\pi (s)} \sum_{a} \Tilde{\pi}(a \mid s) \alert{A_\pi(s,a)}$ - \item Don't know the visitation weights nor true advantage function - \pause - \item Instead do the following substitutions: - $$ \sum_{s} \mu_\pi (s) \to \frac{1}{1- \gamma} \mathbb{E}_{s\sim \mu_{\theta_{old}}} [\ldots]$$ - \item[$\leadsto$] estimate $\mu_\pi (s)$ wrt the sampled trajectories we have already - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{From Theory to Practice II} - - \begin{itemize} - \item Next substitution: - $$\sum_{a} \pi_\theta (a\mid s_n) A_{\theta_{old}} (s_n, a) \to \mathbb{E}\left[ \frac{\pi_\theta(a \mid s_n)}{q(a\mid s_n)} A_{\theta_{old}} (s_n, a) \right] $$ - \item where $q$ is some sampling distribution over actions and $s_n$ is a particular sampled state - \item This second substitution is to use \alert{importance sampling} to estimate the desired sum, enabling the use of an alternate sampling distribution $q$ (other than the new policy $\pi_\theta$) - \pause - \item Third substitution: - $$ A_{\theta_{old}} \to Q_{\theta_{old}}$$ - \item Note that the above substitutions do not change the solution to the above optimization problem - \end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Selecting the Sampling Policy} - - \begin{itemize} - \item Optimize - $$ \max_\theta \mathbb{E}_{s\sim \mu_{\theta_{old}}, a \sim q} \left[ \frac{\pi_\theta(a \mid s_n)}{q(a\mid s_n)} A_{\theta_{old}} (s_n, a) \right]$$ - {\centering subject to $\mathbb{E}_{s\sim \mu_{\theta_{old}}} D_{KL}(\pi_{old}(\cdot \mid s), \pi_\theta (\cdot \mid s)) \leq \delta$ \\} - \item Standard approach: sampling distribution is $q(a\mid s)$ is simply $\pi_{old}(a \mid s)$ - %\item For the vine procedure see the paper - \end{itemize} - - % \centering - % \includegraphics[width=0.5\textwidth]{images/trpo.PNG}\\ - % \lit{Schulman et al. 2015}{https://arxiv.org/abs/1502.05477} - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{TRPO Algorithm~\lit{Schulman et al. 2015}{https://arxiv.org/abs/1502.05477}} - - \begin{itemize} - \item For $i= 1,2,\ldots$ do - \begin{enumerate} - \item Run policy for $T$ timesteps or $N$ trajectories - \item Estimate advantage function at all timesteps - \item Compute estimated policy gradient $\hat{g}$ - \item Use CG to compute $F^{-1}g$ where F is the fisher information matrix - \item Do line search on surrogate loss $L$ and KL constraint - \end{enumerate} - \end{itemize} - - - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Common Template of Policy Gradient Algorithms} - - \begin{itemize} - \item For $i= 1,2,\ldots$ do - \begin{enumerate} - \item Run policy for $T$ timesteps or $N$ trajectories - \item At each timestep in each trajectory, compute target $Q^\pi(s_t, a_t)$ and baseline $b(s_t)$ - \item Compute estimated policy gradient $\hat{g}$ - \item Update the policy using $\hat{g}$, potentially constrained to a local region\\ (i.e., try to ensure monotonic improviement) - \end{enumerate} - \end{itemize} - - - -\end{frame} -%----------------------------------------------------------------------- -%---------------------------------------------------------------------- -\begin{frame}[c]{Policy Gradient Summary} - -\begin{itemize} - \item Extremely popular and useful set of approaches - \item Can input prior knowledge in the form of specifying policy parameterization - \item You should be familiar with REINFORCE and the policy gradient template on the previous slide - \item Understand the where different estimators can be slotted in - \item (You don't have to be able to derive or remember the specific formulars in TRPO for approximating the objectives and constraints) -\end{itemize} - -\end{frame} -%----------------------------------------------------------------------- -%----------------------------------------------------------------------- -\end{document} diff --git a/w08_exploration/t02_bandit_exploration.tex b/w08_exploration/t02_bandit_exploration.tex index 3571649..30d1e5f 100644 --- a/w08_exploration/t02_bandit_exploration.tex +++ b/w08_exploration/t02_bandit_exploration.tex @@ -52,7 +52,7 @@ \item Question: Is this a zero-regret strategy for a constant $\epsilon$? \pause \begin{itemize} - \item No, since with probability $\epsilon$ we will obtain a non-zero regret and therefore, even in the limit the regret will not go to zero, but obtain a linear regret. + \item No, since with probability $\epsilon$ we will obtain a non-zero regret, and therefore, even in the limit the regret will not go to zero, but obtain a linear regret. \end{itemize} \smallskip\pause \item Solution: Anneal $\epsilon$ over time @@ -109,7 +109,7 @@ \item Draw from each estimated distribution a single realization and simply play the action with the best one, e.g. $$ s_k \sim \mathcal{N}(\mu(a_k), \sigma(a_k))$$ $$ a \in \argmax_{a_k} s_k$$ - \item In the limit, only the best performing action will be played with high probability + \item In the limit, only the best-performing action will be played with a high probability \end{itemize} \end{frame} diff --git a/w08_exploration/t03_classic_mdp_exploration.tex b/w08_exploration/t03_classic_mdp_exploration.tex index 103ae3e..ffc1190 100644 --- a/w08_exploration/t03_classic_mdp_exploration.tex +++ b/w08_exploration/t03_classic_mdp_exploration.tex @@ -29,7 +29,7 @@ \item Initialize action-value function $Q(s,a)$ to $\frac{r_{max}}{1-\gamma}$ \item Run favorite model-free RL algorithm \begin{itemize} - \item Monte-carlo method + \item Monte-Carlo method \item Sarsa \item Q-Learning \end{itemize} diff --git a/w08_exploration/t04_intrinsic_exploration.tex b/w08_exploration/t04_intrinsic_exploration.tex index 2459df1..7882bf2 100644 --- a/w08_exploration/t04_intrinsic_exploration.tex +++ b/w08_exploration/t04_intrinsic_exploration.tex @@ -33,7 +33,7 @@ \item Montezuma's Revenge (Atari): long sequence of steps needed to figure out that ``key'' is needed to open ``door'' \item Noisy-TV problem: \begin{itemize} - \item Assumption: Agent gets explicit reward for seeking novel experience + \item Assumption: Agent gets explicit reward for seeking novel experiences \item Agent discovers TV that only shows random images \item Agent will watch TV forever (without solving the real task)! \end{itemize} diff --git a/w08_exploration/t05_pred_intrinsic_exploration.tex b/w08_exploration/t05_pred_intrinsic_exploration.tex index 6f613fb..4896525 100644 --- a/w08_exploration/t05_pred_intrinsic_exploration.tex +++ b/w08_exploration/t05_pred_intrinsic_exploration.tex @@ -94,7 +94,7 @@ \begin{itemize} \item Pure exploration and ignoring the extrinsic reward signal $$r_t = r_t^i = ||f(\phi(s_t), a_t) - \phi(s_{t+1}) ||_2^2 $$ - \item Study on different state encodings: compact, sufficient and stable + \item Study on different state encodings: compact, sufficient, and stable \begin{enumerate} \item Raw image pixels; no encoding \item Neural network with fixed random weights @@ -106,7 +106,7 @@ \item No clear winner overall \item Random network quite competitive \item IDF can generalize better (e.g., learn IDF on one Super Mario Bros level and then test it on another) - \item On the noisy TV env, IDF performed best, followed by random network, but overall very hard to learn anything reasonable (wrt extrinsic reward) + \item On the noisy TV env, IDF performed best, followed by the random network, but overall very hard to learn anything reasonable (wrt extrinsic reward) \end{itemize} \end{itemize} @@ -118,7 +118,7 @@ \begin{itemize} \item Idea: maximize information gain about the agent's belief of env dynamics. - \item Information gain often measured by reduction in entropy + \item Information gain is often measured by a reduction in entropy \begin{eqnarray} &&\sum_t H(\Theta \mid e_t, a_t) - H(\Theta | s_{t+1}, e_t, a_t)\nonumber\\ diff --git a/w09_meta_rl/t01_big_picture.tex b/w09_meta_rl/t01_big_picture.tex index a823210..2eea038 100644 --- a/w09_meta_rl/t01_big_picture.tex +++ b/w09_meta_rl/t01_big_picture.tex @@ -49,15 +49,6 @@ \item Can we train a policy that generalizes to new environments without any new training? \end{enumerate} - %\begin{itemize} - % \item Assumption: We sample our environments i.i.d. from a fixed distribution - % \begin{itemize} - % \item Similar to the assumption in supervised learning, but on a meta-level - % \item Training environments to train our agent on and test environments to check how well it performs. - % \item We might have control how we sample from this distribution;\\ we might not. - % \end{itemize} - %\end{itemize} - \end{frame} %----------------------------------------------------------------------- %----------------------------------------------------------------------- diff --git a/w09_meta_rl/t03_challenges_in_cRL.tex b/w09_meta_rl/t03_challenges_in_cRL.tex index 3d3d3d8..84727e0 100644 --- a/w09_meta_rl/t03_challenges_in_cRL.tex +++ b/w09_meta_rl/t03_challenges_in_cRL.tex @@ -30,7 +30,7 @@ \begin{figure} \centering \includegraphics[width=0.75\textwidth]{./images/CARLPendulumEnv_mean_ep_rew_over_step_hidden.png} - \caption{Context variations on CARLPendulum. For most context features, difficulty increases with variation.} + \caption{Context variations on CARLPendulum. For most context features, the difficulty increases with each variation.} \label{fig:my_label} \end{figure} diff --git a/w09_meta_rl/t04_curriculum_learning.tex b/w09_meta_rl/t04_curriculum_learning.tex index 7334db0..426c7ac 100644 --- a/w09_meta_rl/t04_curriculum_learning.tex +++ b/w09_meta_rl/t04_curriculum_learning.tex @@ -16,7 +16,7 @@ \begin{itemize} \item We humans also learn step by step \begin{itemize} - \item E.g., in math, we learn first basic arithmetics before we later learn complex derivatives and integrals + \item E.g., in math, we learn first basic arithmetic before we later learn complex derivatives and integrals \item E.g., in this lecture, we first talked about simple planning on MDPs, before we talked about complex meta-RL ideas \end{itemize} \smallskip diff --git a/w09_meta_rl_new/t05_curriculum_learning.tex b/w09_meta_rl_new/t05_curriculum_learning.tex index 43ce645..55268e8 100644 --- a/w09_meta_rl_new/t05_curriculum_learning.tex +++ b/w09_meta_rl_new/t05_curriculum_learning.tex @@ -16,7 +16,7 @@ \begin{itemize} \item We humans also learn step by step \begin{itemize} - \item E.g., in math, we learn first basic arithmetics before we later learn complex derivatives and integrals + \item E.g., in math, we learn first basic arithmetic before we later learn complex derivatives and integrals \item E.g., in this lecture, we first talked about simple planning on MDPs, before we talked about complex meta-RL ideas \end{itemize} \smallskip