{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Configurations for Colab" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "IN_COLAB = \"google.colab\" in sys.modules\n", "\n", "if IN_COLAB:\n", " !apt install python-opengl\n", " !apt install ffmpeg\n", " !apt install xvfb\n", " !pip install PyVirtualDisplay==3.0\n", " !pip install gym==0.21.0\n", " from pyvirtualdisplay import Display\n", " \n", " # Start virtual display\n", " dis = Display(visible=0, size=(400, 400))\n", " dis.start()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 01. DQN\n", "\n", "[V. Mnih et al., \"Human-level control through deep reinforcement learning.\" Nature, 518\n", "(7540):529–533, 2015.](https://storage.googleapis.com/deepmind-media/dqn/DQNNaturePaper.pdf)\n", "\n", "Reinforcement learning is known to be unstable or even to diverge when a nonlinear function approximator such as a neural network is used to represent the action-value (also known as $Q$) function. This instability has several causes: the correlations present in the sequence of observations, the fact that small updates to $Q$ may significantly change the policy and therefore change the data distribution, and the correlations between the action-values ($Q$) and the target values $r + \\gamma \\max_{a'} Q(s', a')$.\n", "\n", "The authors suggest two key ideas to address these instabilities with a novel variant of Q-learning: Replay buffer and Fixed Q-target.\n", "\n", "#### Uniformly random sampling from Experience Replay Memory\n", "\n", "Reinforcement learning agent stores the experiences consecutively in the buffer, so adjacent ($s, a, r, s'$) transitions stored are highly likely to have correlation. To remove this, the agent samples experiences uniformly at random from the pool of stored samples $\\big( (s, a, r, s') \\sim U(D) \\big)$. See sample_batch method of ReplayBuffer class for more details.\n", "\n", "#### Fixed Q-target\n", "\n", "DQN uses an iterative update that adjusts the action-values ($Q$) towards target values that are only periodically updated, thereby reducing correlations with the target; if not, it is easily divergy because the target continuously moves. The Q-learning update at iteration $i$ uses the following loss function:\n", "\n", "$$\n", "L_i(\\theta_i) = \\mathbb{E}_{(s,a,r,s') \\sim U(D)} \\big[ \\big( r + \\gamma \\max_{a'} Q(s',a';\\theta_i^-) - Q(s, a; \\theta_i) \\big)^2 \\big]\n", "$$\n", "\n", "in which $\\gamma$ is the discount factor determining the agent’s horizon, $\\theta_i$ are the parameters of the Q-network at iteration $i$ and $\\theta_i^-$ are the network parameters used to compute the target at iteration $i$. The target network parameters $\\theta_i^-$ are only updated with the Q-network parameters ($\\theta_i$) every C steps and are held fixed between individual updates. ($C = 200$ in CartPole-v0)\n", "\n", "#### For more stability: Gradient clipping\n", "\n", "The authors also found it helpful to clip the error term from the update $r + \\gamma \\max_{a'} Q(s', a'; \\theta_i^-) - Q(s,a,;\\theta_i)$ to be between -1 and 1. Because the absolute value loss function $|x|$ has a derivative of -1 for all negative values of x and a derivative of 1 for all positive values of x, clipping the squared error to be between -1 and 1 corresponds to using an absolute value loss function for errors outside of the (-1,1) interval. This form of error clipping further improved the stability of the algorithm." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import os\n", "from typing import Dict, List, Tuple\n", "\n", "import gym\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "import torch.optim as optim\n", "from IPython.display import clear_output" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Replay buffer\n", "\n", "Typically, people implement replay buffers with one of the following three data structures:\n", "\n", " - collections.deque\n", " - list\n", " - numpy.ndarray\n", " \n", "**deque** is very easy to handle once you initialize its maximum length (e.g. deque(maxlen=buffer_size)). However, the indexing operation of deque gets terribly slow as it grows up because it is [internally doubly linked list](https://wiki.python.org/moin/TimeComplexity#collections.deque). On the other hands, **list** is an array, so it is relatively faster than deque when you sample batches at every step. Its amortized cost of *Get item* is [O(1)](https://wiki.python.org/moin/TimeComplexity#list).\n", "\n", "Last but not least, let's see **numpy.ndarray**. numpy.ndarray is even faster than list due to the fact that it is [a homogeneous array of fixed-size items](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html#numpy.ndarray), so you can get the benefits of [locality of reference](https://en.wikipedia.org/wiki/Locality_of_reference). Whereas list is an array of pointers to objects, even when all of them are of the same type.\n", "\n", "Here, we are going to implement a replay buffer using numpy.ndarray.\n", "\n", "\n", "Reference: [OpenAI spinning-up](https://github.com/openai/spinningup/blob/master/spinup/algos/sac/sac.py#L10)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class ReplayBuffer:\n", " \"\"\"A simple numpy replay buffer.\"\"\"\n", "\n", " def __init__(self, obs_dim: int, size: int, batch_size: int = 32):\n", " self.obs_buf = np.zeros([size, obs_dim], dtype=np.float32)\n", " self.next_obs_buf = np.zeros([size, obs_dim], dtype=np.float32)\n", " self.acts_buf = np.zeros([size], dtype=np.float32)\n", " self.rews_buf = np.zeros([size], dtype=np.float32)\n", " self.done_buf = np.zeros(size, dtype=np.float32)\n", " self.max_size, self.batch_size = size, batch_size\n", " self.ptr, self.size, = 0, 0\n", "\n", " def store(\n", " self,\n", " obs: np.ndarray,\n", " act: np.ndarray, \n", " rew: float, \n", " next_obs: np.ndarray, \n", " done: bool,\n", " ):\n", " self.obs_buf[self.ptr] = obs\n", " self.next_obs_buf[self.ptr] = next_obs\n", " self.acts_buf[self.ptr] = act\n", " self.rews_buf[self.ptr] = rew\n", " self.done_buf[self.ptr] = done\n", " self.ptr = (self.ptr + 1) % self.max_size\n", " self.size = min(self.size + 1, self.max_size)\n", "\n", " def sample_batch(self) -> Dict[str, np.ndarray]:\n", " idxs = np.random.choice(self.size, size=self.batch_size, replace=False)\n", " return dict(obs=self.obs_buf[idxs],\n", " next_obs=self.next_obs_buf[idxs],\n", " acts=self.acts_buf[idxs],\n", " rews=self.rews_buf[idxs],\n", " done=self.done_buf[idxs])\n", "\n", " def __len__(self) -> int:\n", " return self.size" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Network\n", "\n", "We are going to use a simple network architecture with three fully connected layers and two non-linearity functions (ReLU)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "class Network(nn.Module):\n", " def __init__(self, in_dim: int, out_dim: int):\n", " \"\"\"Initialization.\"\"\"\n", " super(Network, self).__init__()\n", "\n", " self.layers = nn.Sequential(\n", " nn.Linear(in_dim, 128), \n", " nn.ReLU(),\n", " nn.Linear(128, 128), \n", " nn.ReLU(), \n", " nn.Linear(128, out_dim)\n", " )\n", "\n", " def forward(self, x: torch.Tensor) -> torch.Tensor:\n", " \"\"\"Forward method implementation.\"\"\"\n", " return self.layers(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## DQN Agent\n", "\n", "Here is a summary of DQNAgent class.\n", "\n", "| Method | Note |\n", "| --- | --- |\n", "|select_action | select an action from the input state. |\n", "|step | take an action and return the response of the env. |\n", "|compute_dqn_loss | return dqn loss. |\n", "|update_model | update the model by gradient descent. |\n", "|target_hard_update| hard update from the local model to the target model.|\n", "|train | train the agent during num_frames. |\n", "|test | test the agent (1 episode). |\n", "|plot | plot the training progresses. |\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class DQNAgent:\n", " \"\"\"DQN Agent interacting with environment.\n", " \n", " Attribute:\n", " env (gym.Env): openAI Gym environment\n", " memory (ReplayBuffer): replay memory to store transitions\n", " batch_size (int): batch size for sampling\n", " epsilon (float): parameter for epsilon greedy policy\n", " epsilon_decay (float): step size to decrease epsilon\n", " max_epsilon (float): max value of epsilon\n", " min_epsilon (float): min value of epsilon\n", " target_update (int): period for target model's hard update\n", " gamma (float): discount factor\n", " dqn (Network): model to train and select actions\n", " dqn_target (Network): target model to update\n", " optimizer (torch.optim): optimizer for training dqn\n", " transition (list): transition information including \n", " state, action, reward, next_state, done\n", " \"\"\"\n", "\n", " def __init__(\n", " self, \n", " env: gym.Env,\n", " memory_size: int,\n", " batch_size: int,\n", " target_update: int,\n", " epsilon_decay: float,\n", " max_epsilon: float = 1.0,\n", " min_epsilon: float = 0.1,\n", " gamma: float = 0.99,\n", " ):\n", " \"\"\"Initialization.\n", " \n", " Args:\n", " env (gym.Env): openAI Gym environment\n", " memory_size (int): length of memory\n", " batch_size (int): batch size for sampling\n", " target_update (int): period for target model's hard update\n", " epsilon_decay (float): step size to decrease epsilon\n", " lr (float): learning rate\n", " max_epsilon (float): max value of epsilon\n", " min_epsilon (float): min value of epsilon\n", " gamma (float): discount factor\n", " \"\"\"\n", " obs_dim = env.observation_space.shape[0]\n", " action_dim = env.action_space.n\n", " \n", " self.env = env\n", " self.memory = ReplayBuffer(obs_dim, memory_size, batch_size)\n", " self.batch_size = batch_size\n", " self.epsilon = max_epsilon\n", " self.epsilon_decay = epsilon_decay\n", " self.max_epsilon = max_epsilon\n", " self.min_epsilon = min_epsilon\n", " self.target_update = target_update\n", " self.gamma = gamma\n", " \n", " # device: cpu / gpu\n", " self.device = torch.device(\n", " \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", " )\n", " print(self.device)\n", "\n", " # networks: dqn, dqn_target\n", " self.dqn = Network(obs_dim, action_dim).to(self.device)\n", " self.dqn_target = Network(obs_dim, action_dim).to(self.device)\n", " self.dqn_target.load_state_dict(self.dqn.state_dict())\n", " self.dqn_target.eval()\n", " \n", " # optimizer\n", " self.optimizer = optim.Adam(self.dqn.parameters())\n", "\n", " # transition to store in memory\n", " self.transition = list()\n", " \n", " # mode: train / test\n", " self.is_test = False\n", "\n", " def select_action(self, state: np.ndarray) -> np.ndarray:\n", " \"\"\"Select an action from the input state.\"\"\"\n", " # epsilon greedy policy\n", " if self.epsilon > np.random.random():\n", " selected_action = self.env.action_space.sample()\n", " else:\n", " selected_action = self.dqn(\n", " torch.FloatTensor(state).to(self.device)\n", " ).argmax()\n", " selected_action = selected_action.detach().cpu().numpy()\n", " \n", " if not self.is_test:\n", " self.transition = [state, selected_action]\n", " \n", " return selected_action\n", "\n", " def step(self, action: np.ndarray) -> Tuple[np.ndarray, np.float64, bool]:\n", " \"\"\"Take an action and return the response of the env.\"\"\"\n", " next_state, reward, done, _ = self.env.step(action)\n", "\n", " if not self.is_test:\n", " self.transition += [reward, next_state, done]\n", " self.memory.store(*self.transition)\n", " \n", " return next_state, reward, done\n", "\n", " def update_model(self) -> torch.Tensor:\n", " \"\"\"Update the model by gradient descent.\"\"\"\n", " samples = self.memory.sample_batch()\n", "\n", " loss = self._compute_dqn_loss(samples)\n", "\n", " self.optimizer.zero_grad()\n", " loss.backward()\n", " self.optimizer.step()\n", "\n", " return loss.item()\n", " \n", " def train(self, num_frames: int, plotting_interval: int = 200):\n", " \"\"\"Train the agent.\"\"\"\n", " self.is_test = False\n", " \n", " state = self.env.reset()\n", " update_cnt = 0\n", " epsilons = []\n", " losses = []\n", " scores = []\n", " score = 0\n", "\n", " for frame_idx in range(1, num_frames + 1):\n", " action = self.select_action(state)\n", " next_state, reward, done = self.step(action)\n", "\n", " state = next_state\n", " score += reward\n", "\n", " # if episode ends\n", " if done:\n", " state = self.env.reset()\n", " scores.append(score)\n", " score = 0\n", "\n", " # if training is ready\n", " if len(self.memory) >= self.batch_size:\n", " loss = self.update_model()\n", " losses.append(loss)\n", " update_cnt += 1\n", " \n", " # linearly decrease epsilon\n", " self.epsilon = max(\n", " self.min_epsilon, self.epsilon - (\n", " self.max_epsilon - self.min_epsilon\n", " ) * self.epsilon_decay\n", " )\n", " epsilons.append(self.epsilon)\n", " \n", " # if hard update is needed\n", " if update_cnt % self.target_update == 0:\n", " self._target_hard_update()\n", "\n", " # plotting\n", " if frame_idx % plotting_interval == 0:\n", " self._plot(frame_idx, scores, losses, epsilons)\n", " \n", " self.env.close()\n", " \n", " def test(self, video_folder: str) -> None:\n", " \"\"\"Test the agent.\"\"\"\n", " self.is_test = True\n", " \n", " # for recording a video\n", " naive_env = self.env\n", " self.env = gym.wrappers.RecordVideo(self.env, video_folder=video_folder)\n", " \n", " state = self.env.reset()\n", " done = False\n", " score = 0\n", " \n", " while not done:\n", " action = self.select_action(state)\n", " next_state, reward, done = self.step(action)\n", "\n", " state = next_state\n", " score += reward\n", " \n", " print(\"score: \", score)\n", " self.env.close()\n", " \n", " # reset\n", " self.env = naive_env\n", "\n", " def _compute_dqn_loss(self, samples: Dict[str, np.ndarray]) -> torch.Tensor:\n", " \"\"\"Return dqn loss.\"\"\"\n", " device = self.device # for shortening the following lines\n", " state = torch.FloatTensor(samples[\"obs\"]).to(device)\n", " next_state = torch.FloatTensor(samples[\"next_obs\"]).to(device)\n", " action = torch.LongTensor(samples[\"acts\"].reshape(-1, 1)).to(device)\n", " reward = torch.FloatTensor(samples[\"rews\"].reshape(-1, 1)).to(device)\n", " done = torch.FloatTensor(samples[\"done\"].reshape(-1, 1)).to(device)\n", "\n", " # G_t = r + gamma * v(s_{t+1}) if state != Terminal\n", " # = r otherwise\n", " curr_q_value = self.dqn(state).gather(1, action)\n", " next_q_value = self.dqn_target(\n", " next_state\n", " ).max(dim=1, keepdim=True)[0].detach()\n", " mask = 1 - done\n", " target = (reward + self.gamma * next_q_value * mask).to(self.device)\n", "\n", " # calculate dqn loss\n", " loss = F.smooth_l1_loss(curr_q_value, target)\n", "\n", " return loss\n", "\n", " def _target_hard_update(self):\n", " \"\"\"Hard update: target <- local.\"\"\"\n", " self.dqn_target.load_state_dict(self.dqn.state_dict())\n", " \n", " def _plot(\n", " self, \n", " frame_idx: int, \n", " scores: List[float], \n", " losses: List[float], \n", " epsilons: List[float],\n", " ):\n", " \"\"\"Plot the training progresses.\"\"\"\n", " clear_output(True)\n", " plt.figure(figsize=(20, 5))\n", " plt.subplot(131)\n", " plt.title('frame %s. score: %s' % (frame_idx, np.mean(scores[-10:])))\n", " plt.plot(scores)\n", " plt.subplot(132)\n", " plt.title('loss')\n", " plt.plot(losses)\n", " plt.subplot(133)\n", " plt.title('epsilons')\n", " plt.plot(epsilons)\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Environment\n", "\n", "You can see the [code](https://github.com/openai/gym/blob/master/gym/envs/classic_control/cartpole.py) and [configurations](https://github.com/openai/gym/blob/master/gym/envs/__init__.py#L53) of CartPole-v0 from OpenAI's repository." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# environment\n", "env_id = \"CartPole-v0\"\n", "env = gym.make(env_id)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Set random seed" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[777]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seed = 777\n", "\n", "def seed_torch(seed):\n", " torch.manual_seed(seed)\n", " if torch.backends.cudnn.enabled:\n", " torch.backends.cudnn.benchmark = False\n", " torch.backends.cudnn.deterministic = True\n", "\n", "np.random.seed(seed)\n", "seed_torch(seed)\n", "env.seed(seed)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initialize" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cpu\n" ] } ], "source": [ "# parameters\n", "num_frames = 10000\n", "memory_size = 1000\n", "batch_size = 32\n", "target_update = 100\n", "epsilon_decay = 1 / 2000\n", "\n", "agent = DQNAgent(env, memory_size, batch_size, target_update, epsilon_decay)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "agent.train(num_frames)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test\n", "\n", "Run the trained agent (1 episode)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "score: 200.0\n" ] } ], "source": [ "video_folder=\"videos/dqn\"\n", "agent.test(video_folder=video_folder)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Render" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Played: videos/dqn/rl-video-episode-0.mp4\n" ] } ], "source": [ "import base64\n", "import glob\n", "import io\n", "import os\n", "\n", "from IPython.display import HTML, display\n", "\n", "\n", "def ipython_show_video(path: str) -> None:\n", " \"\"\"Show a video at `path` within IPython Notebook.\"\"\"\n", " if not os.path.isfile(path):\n", " raise NameError(\"Cannot access: {}\".format(path))\n", "\n", " video = io.open(path, \"r+b\").read()\n", " encoded = base64.b64encode(video)\n", "\n", " display(HTML(\n", " data=\"\"\"\n", " \n", " \"\"\".format(encoded.decode(\"ascii\"))\n", " ))\n", "\n", "\n", "def show_latest_video(video_folder: str) -> str:\n", " \"\"\"Show the most recently recorded video from video folder.\"\"\"\n", " list_of_files = glob.glob(os.path.join(video_folder, \"*.mp4\"))\n", " latest_file = max(list_of_files, key=os.path.getctime)\n", " ipython_show_video(latest_file)\n", " return latest_file\n", "\n", "\n", "latest_file = show_latest_video(video_folder=video_folder)\n", "print(\"Played:\", latest_file)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.13" } }, "nbformat": 4, "nbformat_minor": 4 }