From 7d3a1010a80c5fef9a8b2a19757ac74fbaf1c2da Mon Sep 17 00:00:00 2001 From: Dmitri Soshnikov Date: Fri, 18 Jun 2021 23:42:24 +0300 Subject: [PATCH] Add RL lesson 2 training progress --- 8-Reinforcement/2-Gym/README.md | 26 ++- .../2-Gym/images/cartpole-balance.gif | Bin 41888 -> 391958 bytes .../2-Gym/images/train_progress_raw.png | Bin 0 -> 3932 bytes .../2-Gym/images/train_progress_runav.png | Bin 0 -> 7443 bytes 8-Reinforcement/2-Gym/notebook.ipynb | 216 ++++++++++++------ 5 files changed, 170 insertions(+), 72 deletions(-) create mode 100644 8-Reinforcement/2-Gym/images/train_progress_raw.png create mode 100644 8-Reinforcement/2-Gym/images/train_progress_runav.png diff --git a/8-Reinforcement/2-Gym/README.md b/8-Reinforcement/2-Gym/README.md index 787cff6287..21c3269a00 100644 --- a/8-Reinforcement/2-Gym/README.md +++ b/8-Reinforcement/2-Gym/README.md @@ -236,6 +236,27 @@ What you may notice from those results: * We are very close achieving the goal of getting 195 cumulative reward over 100+ consecutive runs of the simulation, or we may have actually achieved it! Even if we get smaller numbers, we still do not know, because we average over 5000 runs, and only 100 runs is required in the formal criteria. * Sometimes the reward start to drop, which means that we can "destroy" already learnt values in Q-Table with the ones that make situation worse +This is more clearly visible if we plot training progress. + +## Plotting Training Progress + +During training, we have collected the cumulative reward value at each of the iterations into `rewards` vector. Here is how it looks when we plot it against the iteration number: + +![](images/train_progress_raw.png) + +From this graph, it is not possible to tell anything, because due to the nature of stochastic training process the length of training sessions varies greatly. To make more sense of this graph, we can calculate **running average** over series of experiments, let's say 100. This can be done conveniently using `np.convolve`: + +```python +def running_average(x,window): + return np.convolve(x,np.ones(window)/window,mode='valid') + +plt.plot(running_average(rewards,100)) +``` + +![](images/train_progress_runav.png) + +## Varying Hyperparameters + To make learning more stable, it makes sense to adjust some of our hyperparameters during training. In particular: * For **learning rate**, `alpha`, we may start with values close to 1, and then keep decreasing the parameter. With time, we will be getting good probability values in Q-Table, and thus we should be adjusting them slightly, and not overwriting completely with new values. * We may want to increase the `eplilon` slowly, in order to be exploring less, and expliting more. It probably makes sense to start with lower value of `epsilon`, and move up to almost 1 @@ -247,9 +268,6 @@ To make learning more stable, it makes sense to adjust some of our hyperparamete ## Seeing the Result in Action Now it would be interesting to actually see how the trained model behaves. Let's run the simulation, and we will be following the same action selection strategy as during training: sampling according to the probability distribution in Q-Table: -## 🚀Challenge - -Add a challenge for students to work on collaboratively in class to enhance the project ```python obs = env.reset() @@ -277,4 +295,4 @@ You should see something like this: ## Conclusion -We have now learnt how to train agents to achieve good results just by providing them a reward function that defines the desired state of the game, and by giving it an opportinity to intellegently explore the search space. We have successfully applied Q-Learning algorithm in the cases of discrete and continuous environments, but with discrete actions. In the are of reinforcement learning, we need to further study situations where action state is also continuous, and when observation space is much more complex, such as the image from Atarti game screen. In those problems we often need to use more powerful machine learning techniques, such as neural networks, in order to achieve good results. Those more advanced topics are the subject of more advanced Deep Reinforcement Learning course. \ No newline at end of file +We have now learnt how to train agents to achieve good results just by providing them a reward function that defines the desired state of the game, and by giving it an opportunity to intelligently explore the search space. We have successfully applied Q-Learning algorithm in the cases of discrete and continuous environments, but with discrete actions. In the are of reinforcement learning, we need to further study situations where action state is also continuous, and when observation space is much more complex, such as the image from Atari game screen. In those problems we often need to use more powerful machine learning techniques, such as neural networks, in order to achieve good results. Those more advanced topics are the subject of more advanced Deep Reinforcement Learning course. \ No newline at end of file diff --git a/8-Reinforcement/2-Gym/images/cartpole-balance.gif b/8-Reinforcement/2-Gym/images/cartpole-balance.gif index 836845a8bdeb55902cc95eecc02a5f2c6e4c305d..52dbd2043f010d52a0238bf5bdb6e4d472663cfd 100644 GIT binary patch literal 391958 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

y^IDB&dUgf@^!fh+ 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 literal 0 HcmV?d00001 diff --git a/8-Reinforcement/2-Gym/images/train_progress_runav.png b/8-Reinforcement/2-Gym/images/train_progress_runav.png new file mode 100644 index 0000000000000000000000000000000000000000..4eccb762c97c8716325af1b4feffddde43c46c79 GIT binary patch literal 7443 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.10.4 in c:\\winapp\\conda\\lib\\site-packages (from gym) (1.18.1)\nCollecting pyglet<=1.5.15,>=1.4.0\n Downloading pyglet-1.5.15-py3-none-any.whl (1.1 MB)\nRequirement already satisfied: Pillow<=8.2.0 in c:\\winapp\\conda\\lib\\site-packages (from gym) (8.2.0)\nCollecting cloudpickle<1.7.0,>=1.2.0\n Downloading cloudpickle-1.6.0-py3-none-any.whl (23 kB)\nBuilding wheels for collected packages: gym\n Building wheel for gym (setup.py): started\n Building wheel for gym (setup.py): finished with status 'done'\n Created wheel for gym: filename=gym-0.18.3-py3-none-any.whl size=1657521 sha256=23743ca1a46d6268b5aed87007ab14cf9597d1f0e9c38417574741617f6bb13f\n Stored in directory: c:\\users\\dmitr\\appdata\\local\\pip\\cache\\wheels\\1a\\ec\\6d\\705d53925f481ab70fd48ec7728558745eeae14dfda3b49c99\nSuccessfully built gym\nInstalling collected packages: pyglet, cloudpickle, gym\nSuccessfully installed cloudpickle-1.6.0 gym-0.18.3 pyglet-1.5.15\n" + "Requirement already satisfied: gym in c:\\winapp\\miniconda3\\lib\\site-packages (0.18.3)\nRequirement already satisfied: pyglet<=1.5.15,>=1.4.0 in c:\\winapp\\miniconda3\\lib\\site-packages (from gym) (1.5.15)\nRequirement already satisfied: cloudpickle<1.7.0,>=1.2.0 in c:\\winapp\\miniconda3\\lib\\site-packages (from gym) (1.2.2)\nRequirement already satisfied: Pillow<=8.2.0 in c:\\winapp\\miniconda3\\lib\\site-packages (from gym) (7.2.0)\nRequirement already satisfied: scipy in c:\\winapp\\miniconda3\\lib\\site-packages (from gym) (1.6.1)\nRequirement already satisfied: numpy>=1.10.4 in c:\\winapp\\miniconda3\\lib\\site-packages (from gym) (1.19.5)\n" ] } ], @@ -67,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -91,7 +91,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -120,14 +120,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ - "c:\\winapp\\conda\\lib\\site-packages\\gym\\logger.py:30: UserWarning: \u001b[33mWARN: You are calling 'step()' even though this environment has already returned done = True. You should always call 'reset()' once you receive 'done = True' -- any further steps are undefined behavior.\u001b[0m\n warnings.warn(colorize('%s: %s'%('WARN', msg % args), 'yellow'))\n" + "C:\\winapp\\miniconda3\\lib\\site-packages\\gym\\logger.py:30: UserWarning: \u001b[33mWARN: You are calling 'step()' even though this environment has already returned done = True. You should always call 'reset()' once you receive 'done = True' -- any further steps are undefined behavior.\u001b[0m\n warnings.warn(colorize('%s: %s'%('WARN', msg % args), 'yellow'))\n" ] } ], @@ -142,36 +142,34 @@ }, { "source": [ - "During simulation, we need to get observatons in order to decide how to act. In fact, `step` function returns us back current observations, reward function, and the `done` flag that indicates whether it makes sense to continue the simulation or not:" + "During simulation, we need to get observations in order to decide how to act. In fact, `step` function returns us back current observations, reward function, and the `done` flag that indicates whether it makes sense to continue the simulation or not:" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ - "[ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0\n", - "[ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0\n", - "[ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0\n", - "[ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0\n", - "[ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0\n", - "[ 4.86688335e-02 7.30636325e-01 -9.80354340e-04 -1.13072712e+00] -> 1.0\n", - "[ 0.06328156 0.9257711 -0.0235949 -1.42371736] -> 1.0\n", - "[ 0.08179698 1.1211767 -0.05206924 -1.72368043] -> 1.0\n", - "[ 0.10422052 0.92668783 -0.08654285 -1.44764396] -> 1.0\n", - "[ 0.12275427 0.73273015 -0.11549573 -1.18320812] -> 1.0\n", - "[ 0.13740888 0.53928047 -0.13915989 -0.9288471 ] -> 1.0\n", - "[ 0.14819448 0.34628356 -0.15773684 -0.68293142] -> 1.0\n", - "[ 0.15512016 0.54320334 -0.17139546 -1.0208266 ] -> 1.0\n", - "[ 0.16598422 0.35072788 -0.191812 -0.78648764] -> 1.0\n", - "[ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0\n", - "[ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0\n" + "[-0.01781364 0.16446158 0.00575593 -0.26601863] -> 1.0\n", + "[-1.45244123e-02 3.59500908e-01 4.35556587e-04 -5.56880543e-01] -> 1.0\n", + "[-0.00733439 0.55461674 -0.01070205 -0.84942621] -> 1.0\n", + "[ 0.00375794 0.35964236 -0.02769058 -0.56012774] -> 1.0\n", + "[ 0.01095079 0.16491978 -0.03889313 -0.27629582] -> 1.0\n", + "[ 0.01424918 0.36057441 -0.04441905 -0.58098753] -> 1.0\n", + "[ 0.02146067 0.5562897 -0.0560388 -0.8873258 ] -> 1.0\n", + "[ 0.03258647 0.75212567 -0.07378532 -1.19708542] -> 1.0\n", + "[ 0.04762898 0.55803219 -0.09772702 -0.92841056] -> 1.0\n", + "[ 0.05878962 0.75432799 -0.11629524 -1.25013537] -> 1.0\n", + "[ 0.07387618 0.56087255 -0.14129794 -0.99602608] -> 1.0\n", + "[ 0.08509363 0.75757231 -0.16121846 -1.32953877] -> 1.0\n", + "[ 0.10024508 0.56480922 -0.18780924 -1.09133681] -> 1.0\n", + "[ 0.11154126 0.76184222 -0.20963598 -1.43658114] -> 1.0\n" ] } ], @@ -201,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -245,7 +243,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -262,7 +260,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -298,14 +296,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ - "(0, 0, 3, 3)\n(0, 0, 4, 0)\n(0, 0, 4, 3)\n(0, 0, 4, 0)\n(0, 0, 4, 3)\n(0, 0, 5, 0)\n(0, 0, 5, 3)\n(0, -1, 6, 7)\n(0, -2, 7, 10)\n(0, -3, 10, 13)\n(0, -3, 12, 16)\n(0, -4, 15, 19)\n(0, -3, 19, 17)\n(0, -4, 23, 20)\n" + "(0, 0, -2, -2)\n(0, 1, -2, -5)\n(0, 2, -3, -8)\n(0, 3, -5, -11)\n(0, 3, -7, -14)\n(0, 4, -10, -17)\n(0, 3, -14, -15)\n(0, 3, -17, -12)\n(0, 3, -20, -16)\n(0, 4, -23, -19)\n" ] } ], @@ -327,14 +325,14 @@ "\n", "In our previous lesson, the state was a simple pair of numbers from 0 to 8, and thus it was convenient to represent Q-Table by numpy tensor with shape 8x8x2. If we use bins discretization, the size of our state vector is also known, so we can use the same approach and represent state by an array of shape 20x20x10x10x2 (here 2 is the dimension of action space, and first dimensions correspond to the number of bins we have selected to use for each of the parameters in observation space).\n", "\n", - "However, sometimes precise dimensions of the observation space are not known. In case of `discretize` function, we may never be sure that our state stays within certain limits, because some of the original values are not boind. Thus, we will use slightly different approach and represent Q-Table by a dictionary. We will use the pair *(state,action)* as the dictionary key, and the value would correspond to Q-Table entry value. " + "However, sometimes precise dimensions of the observation space are not known. In case of `discretize` function, we may never be sure that our state stays within certain limits, because some of the original values are not bound. Thus, we will use slightly different approach and represent Q-Table by a dictionary. We will use the pair *(state,action)* as the dictionary key, and the value would correspond to Q-Table entry value. " ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -358,7 +356,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -376,47 +374,47 @@ "\n", "`epsilon` is the **exploration/exploitation factor** that determines whether we should prefer exploration to exploitation or vice versa. In our algorithm, we will in `epsilon` percent of the cases select the next action according to Q-Table values, and in the remaining number of cases we will execute random action. This will allow us to explore the areas of search space that we have never seen before. \n", "\n", - "> In terms of balancing - chosing random action (exploration) would act as a random punch in the wrong direction, and the pole would have to learn how to recover the balance from those \"mistakes\"\n", + "> In terms of balancing - choosing random action (exploration) would act as a random punch in the wrong direction, and the pole would have to learn how to recover the balance from those \"mistakes\"\n", "\n", "We would also make two improvements to our algorithm from the previous lesson:\n", "\n", "* Calculating average cumulative reward over a number of simulations. We will print the progress each 5000 iterations, and we will average out our cumulative reward over that period of time. It means that if we get more than 195 point - we can consider the problem solved, with even higher quality than required.\n", - "* We will calculate maximim average cumulative result `Qmax`, and we will store the Q-Table corresponding to that result. When you run the training you will notice that sometimes the average cumulative result starts to drop, and we want to keep the values of Q-Table that correspond to the best model observed during training.\n", + "* We will calculate maximum average cumulative result `Qmax`, and we will store the Q-Table corresponding to that result. When you run the training, you will notice that sometimes the average cumulative result starts to drop, and we want to keep the values of Q-Table that correspond to the best model observed during training.\n", "\n", - "We will also collect all cumulative rewards at each simulaiton at `rewards` vector for further plotting." + "We will also collect all cumulative rewards at each simulation in `rewards` vector for further plotting." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 14, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ - "0: 36.0, alpha=0.3, epsilon=0.9\n", - "5000: 79.9322, alpha=0.3, epsilon=0.9\n", - "10000: 136.5074, alpha=0.3, epsilon=0.9\n", - "15000: 166.0206, alpha=0.3, epsilon=0.9\n", - "20000: 179.561, alpha=0.3, epsilon=0.9\n", - "25000: 195.6424, alpha=0.3, epsilon=0.9\n", - "30000: 213.3106, alpha=0.3, epsilon=0.9\n", - "35000: 227.8582, alpha=0.3, epsilon=0.9\n", - "40000: 230.849, alpha=0.3, epsilon=0.9\n", - "45000: 246.6194, alpha=0.3, epsilon=0.9\n", - "50000: 270.2226, alpha=0.3, epsilon=0.9\n", - "55000: 266.2084, alpha=0.3, epsilon=0.9\n", - "60000: 281.3548, alpha=0.3, epsilon=0.9\n", - "65000: 285.2666, alpha=0.3, epsilon=0.9\n", - "70000: 298.7658, alpha=0.3, epsilon=0.9\n", - "75000: 314.9734, alpha=0.3, epsilon=0.9\n", - "80000: 325.5224, alpha=0.3, epsilon=0.9\n", - "85000: 325.1302, alpha=0.3, epsilon=0.9\n", - "90000: 330.4744, alpha=0.3, epsilon=0.9\n", - "95000: 309.4724, alpha=0.3, epsilon=0.9\n" + "0: 22.0, alpha=0.3, epsilon=0.9\n", + "5000: 70.1384, alpha=0.3, epsilon=0.9\n", + "10000: 121.8586, alpha=0.3, epsilon=0.9\n", + "15000: 149.6368, alpha=0.3, epsilon=0.9\n", + "20000: 168.2782, alpha=0.3, epsilon=0.9\n", + "25000: 196.7356, alpha=0.3, epsilon=0.9\n", + "30000: 220.7614, alpha=0.3, epsilon=0.9\n", + "35000: 233.2138, alpha=0.3, epsilon=0.9\n", + "40000: 248.22, alpha=0.3, epsilon=0.9\n", + "45000: 264.636, alpha=0.3, epsilon=0.9\n", + "50000: 276.926, alpha=0.3, epsilon=0.9\n", + "55000: 277.9438, alpha=0.3, epsilon=0.9\n", + "60000: 248.881, alpha=0.3, epsilon=0.9\n", + "65000: 272.529, alpha=0.3, epsilon=0.9\n", + "70000: 281.7972, alpha=0.3, epsilon=0.9\n", + "75000: 284.2844, alpha=0.3, epsilon=0.9\n", + "80000: 269.667, alpha=0.3, epsilon=0.9\n", + "85000: 273.8652, alpha=0.3, epsilon=0.9\n", + "90000: 278.2466, alpha=0.3, epsilon=0.9\n", + "95000: 269.1736, alpha=0.3, epsilon=0.9\n" ] } ], @@ -427,6 +425,8 @@ " return v\n", "\n", "random.seed(13)\n", + "np.random.seed(13)\n", + "env.seed(13)\n", "\n", "Qmax = 0\n", "cum_rewards = []\n", @@ -467,19 +467,99 @@ "* We are very close achieving the goal of getting 195 cumulative reward over 100+ consecutive runs of the simulation, or we may have actually achieved it! Even if we get smaller numbers, we still do not know, because we average over 5000 runs, and only 100 runs is required in the formal criteria.\n", "* Sometimes the reward start to drop, which means that we can \"destroy\" already learnt values in Q-Table with the ones that make situation worse\n", "\n", - "To make learning more stable, it makes sense to adjust some of our hyperparameters during training. In particular:\n", - "* For **learning rate**, `alpha`, we may start with values close to 1, and then keep decreasing the parameter. With time, we will be getting good probability values in Q-Table, and thus we should be adjusting them slightly, and not overwriting completely with new values.\n", - "* We may want to increase the `eplilon` slowly, in order to be exploring less, and expliting more. It probably makes sense to start with lower value of `epsilon`, and move up to almost 1\n", + "This is more clearly visible if we plot training progress.\n", "\n", - "> **Task 1**: Play with hyperparameter values and see if you can achieve higher cumulative reward. Are you getting above 195?\n", + "## Plotting Training Progress\n", "\n", - "> **Task 2**: To formally solve the problem, you need to get 195 average reward across 100 consecutive runs. Measure that during training and make sure that you have formally solved the problem!" + "During training, we have collected the cumulative reward value at each of the iterations into `rewards` vector. Here is how it looks when we plot it against the iteration number:" + ], + "cell_type": "markdown", + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": {}, + "execution_count": 20 + }, + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], + "source": [ + "plt.plot(rewards)" + ] + }, + { + "source": [ + "From this graph, it is not possible to tell anything, because due to the nature of stochastic training process the length of training sessions varies greatly. To make more sense of this graph, we can calculate **running average** over series of experiments, let's say 100. This can be done conveniently using `np.convolve`:" ], "cell_type": "markdown", "metadata": {} }, { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": {}, + "execution_count": 22 + }, + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/svg+xml": "\r\n\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n", + "image/png": "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\n" + }, + "metadata": { + "needs_background": "light" + } + } + ], "source": [ + "def running_average(x,window):\n", + " return np.convolve(x,np.ones(window)/window,mode='valid')\n", + "\n", + "plt.plot(running_average(rewards,100))" + ] + }, + { + "source": [ + "## Varying Hyperparameters\n", + "\n", + "To make learning more stable, it makes sense to adjust some of our hyperparameters during training. In particular:\n", + "* For **learning rate**, `alpha`, we may start with values close to 1, and then keep decreasing the parameter. With time, we will be getting good probability values in Q-Table, and thus we should be adjusting them slightly, and not overwriting completely with new values.\n", + "* We may want to increase the `eplilon` slowly, in order to be exploring less, and expliting more. It probably makes sense to start with lower value of `epsilon`, and move up to almost 1\n", + "\n", + "> **Task 1**: Play with hyperparameter values and see if you can achieve higher cumulative reward. Are you getting above 195?\n", + "\n", + "> **Task 2**: To formally solve the problem, you need to get 195 average reward across 100 consecutive runs. Measure that during training and make sure that you have formally solved the problem!\n", + "\n", "## Seeing the Result in Action\n", "\n", "Now it would be interesting to actually see how the trained model behaves. Let's run the simulation, and we will be following the same action selection strategy as during training: sampling according to the probability distribution in Q-Table: " @@ -489,7 +569,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -519,14 +599,14 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 26, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ - "159\n" + "360\n" ] } ], @@ -553,7 +633,7 @@ "source": [ "## Conclusion\n", "\n", - "We have now learnt how to train agents to achieve good results just by providing them a reward function that defines the desired state of the game, and by giving it an opportinity to intellegently explore the search space. We have successfully applied Q-Learning algorithm in the cases of discrete and continuous environments, but with discrete actions. In the are of reinforcement learning, we need to further study situations where action state is also continuous, and when observation space is much more complex, such as the image from Atarti game screen. In those problems we often need to use more powerful machine learning techniques, such as neural networks, in order to achieve good results. Those more advanced topics are the subject of more advanced Deep Reinforcement Learning course." + "We have now learnt how to train agents to achieve good results just by providing them a reward function that defines the desired state of the game, and by giving it an opportunity to intelligently explore the search space. We have successfully applied Q-Learning algorithm in the cases of discrete and continuous environments, but with discrete actions. In the are of reinforcement learning, we need to further study situations where action state is also continuous, and when observation space is much more complex, such as the image from Atari game screen. In those problems we often need to use more powerful machine learning techniques, such as neural networks, in order to achieve good results. Those more advanced topics are the subject of more advanced Deep Reinforcement Learning course." ], "cell_type": "markdown", "metadata": {}