From 53b64f24fd4afd884169f96ccffa7b7c28a1c427 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Mon, 3 Oct 2016 22:01:46 +0800 Subject: [PATCH 01/24] init --- policy_gradient/policy.py | 7 +++++-- policy_gradient/util.py | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/policy_gradient/policy.py b/policy_gradient/policy.py index 70b8cdc..bbda1c0 100644 --- a/policy_gradient/policy.py +++ b/policy_gradient/policy.py @@ -27,9 +27,12 @@ def __init__(self, in_dim, out_dim, hidden_dim, optimizer, session): Sample solution is about 2~4 lines. """ # YOUR CODE HERE >>>>>> - # probs = ??? + # Andrew + var = {} + self.h1, self.var['l1_w'], self.var['l1_b'] = linear(self._observations, hidden_dim, activation_fn=tf.tanh, batch_norm=False, name='l1') + self.h2, self.var['l2_w'], self.var['l2_b'] = linear(self.h1, self._actions, activation_fn=tf.tanh, batch_norm=False, name='l2') + probs = tf.nn.softmax(self.h2) # <<<<<<<< - # -------------------------------------------------- # This operation (variable) is used when choosing action during data sampling phase # Shape of probs: [1, n_actions] diff --git a/policy_gradient/util.py b/policy_gradient/util.py index 4c57674..db41095 100644 --- a/policy_gradient/util.py +++ b/policy_gradient/util.py @@ -2,6 +2,35 @@ import numpy as np from scipy.signal import lfilter +def linear(inputs, output_size, + weights_initializer=initializers.xavier_initializer(), + biases_initializer=tf.zeros_initializer, synthetic=False, + activation_fn=None, batch_norm=True, name='linear'): + + var = {} + shape = inputs.get_shape().as_list() + with tf.variable_scope(name): + var['w'] = tf.get_variable('w', [shape[1], output_size], tf.float32, + initializer=weights_initializer) + var['b'] = tf.get_variable('b', [output_size], + initializer=biases_initializer) + out = tf.nn.bias_add(tf.matmul(inputs, var['w']), var['b']) + + if batch_norm: + out = tf.contrib.layers.batch_norm(out) + if activation_fn is not None: + out = activation_fn(out) + if synthetic: + with tf.variable_scope('synthetic_grad'): + out_shape = out.get_shape() + h1, var['l1_w'], var['l1_b'] = linear(out, 4000, weights_initializer=tf.zeros_initializer, + biases_initializer=tf.zeros_initializer, activation_fn=tf.nn.relu, batch_norm=True, name='l1') + synthetic_grad, var['l2_w'], var['l2_b'] = linear(h1, out_shape[1], weights_initializer=tf.zeros_initializer, + biases_initializer=tf.zeros_initializer, activation_fn=tf.nn.relu, batch_norm=True, name='l2') + return out, var['w'], var['b'], synthetic_grad + else: + return out, var['w'], var['b'] + def flatten_space(space): if isinstance(space, Box): return np.prod(space.shape) @@ -19,7 +48,9 @@ def flatten_space(space): Sample solution is about 1~7 lines. """ -# def discount_cumsum(x, discount_rate): +def discount_cumsum(x, discount_rate): + + # YOUR CODE HERE >>>>>> # return ??? - # <<<<<<<< \ No newline at end of file + # <<<<<<<< From 01e57fa840776189e275c3047d2ae19f253ce1e4 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Tue, 4 Oct 2016 00:06:43 +0800 Subject: [PATCH 02/24] trace code --- policy_gradient/policy.py | 19 +++++++++++-------- policy_gradient/util.py | 33 ++++----------------------------- 2 files changed, 15 insertions(+), 37 deletions(-) diff --git a/policy_gradient/policy.py b/policy_gradient/policy.py index bbda1c0..8e0df9a 100644 --- a/policy_gradient/policy.py +++ b/policy_gradient/policy.py @@ -1,5 +1,6 @@ import tensorflow as tf import numpy as np +import pdb class CategoricalPolicy(object): def __init__(self, in_dim, out_dim, hidden_dim, optimizer, session): @@ -28,17 +29,20 @@ def __init__(self, in_dim, out_dim, hidden_dim, optimizer, session): """ # YOUR CODE HERE >>>>>> # Andrew - var = {} - self.h1, self.var['l1_w'], self.var['l1_b'] = linear(self._observations, hidden_dim, activation_fn=tf.tanh, batch_norm=False, name='l1') - self.h2, self.var['l2_w'], self.var['l2_b'] = linear(self.h1, self._actions, activation_fn=tf.tanh, batch_norm=False, name='l2') - probs = tf.nn.softmax(self.h2) + self.var = {} + self.var['l1_W'] = tf.get_variable('l1_W', [in_dim, hidden_dim], tf.float32) + self.var['l1_b'] = tf.get_variable('l1_b', [hidden_dim], tf.float32) + self.var['l2_W'] = tf.get_variable('l2_W', [hidden_dim, out_dim], tf.float32) + self.var['l2_b'] = tf.get_variable('l2_b', [out_dim], tf.float32) + + self.h1 = tf.tanh(tf.nn.bias_add(tf.matmul(self._observations, self.var['l1_W']), self.var['l1_b'])) + self.h2 = tf.nn.bias_add(tf.matmul(self.h1, self.var['l2_W']), self.var['l2_b']) + probs = tf.nn.softmax(self.h2) # <<<<<<<< # -------------------------------------------------- # This operation (variable) is used when choosing action during data sampling phase # Shape of probs: [1, n_actions] - act_op = probs[0, :] - # -------------------------------------------------- # Following operations (variables) are used when updating model # Shape of probs: [n_timestep_per_iter, n_actions] @@ -60,7 +64,6 @@ def __init__(self, in_dim, out_dim, hidden_dim, optimizer, session): # Add 1e-8 to `probs_vec` so as to prevent log(0) error log_prob = tf.log(probs_vec + 1e-8) - """ Problem 2: @@ -72,7 +75,7 @@ def __init__(self, in_dim, out_dim, hidden_dim, optimizer, session): Sample solution is about 1~3 lines. """ # YOUR CODE HERE >>>>>> - # surr_loss = ??? + surr_loss = tf.reduce_mean(tf.mul(log_prob, self._advantages)) # <<<<<<<< grads_and_vars = self._opt.compute_gradients(surr_loss) diff --git a/policy_gradient/util.py b/policy_gradient/util.py index db41095..428879a 100644 --- a/policy_gradient/util.py +++ b/policy_gradient/util.py @@ -2,34 +2,6 @@ import numpy as np from scipy.signal import lfilter -def linear(inputs, output_size, - weights_initializer=initializers.xavier_initializer(), - biases_initializer=tf.zeros_initializer, synthetic=False, - activation_fn=None, batch_norm=True, name='linear'): - - var = {} - shape = inputs.get_shape().as_list() - with tf.variable_scope(name): - var['w'] = tf.get_variable('w', [shape[1], output_size], tf.float32, - initializer=weights_initializer) - var['b'] = tf.get_variable('b', [output_size], - initializer=biases_initializer) - out = tf.nn.bias_add(tf.matmul(inputs, var['w']), var['b']) - - if batch_norm: - out = tf.contrib.layers.batch_norm(out) - if activation_fn is not None: - out = activation_fn(out) - if synthetic: - with tf.variable_scope('synthetic_grad'): - out_shape = out.get_shape() - h1, var['l1_w'], var['l1_b'] = linear(out, 4000, weights_initializer=tf.zeros_initializer, - biases_initializer=tf.zeros_initializer, activation_fn=tf.nn.relu, batch_norm=True, name='l1') - synthetic_grad, var['l2_w'], var['l2_b'] = linear(h1, out_shape[1], weights_initializer=tf.zeros_initializer, - biases_initializer=tf.zeros_initializer, activation_fn=tf.nn.relu, batch_norm=True, name='l2') - return out, var['w'], var['b'], synthetic_grad - else: - return out, var['w'], var['b'] def flatten_space(space): if isinstance(space, Box): @@ -50,7 +22,10 @@ def flatten_space(space): def discount_cumsum(x, discount_rate): - + # assume the x is 1-D + n_steps = x.shape()[0] + discount_r = np.zeros(x.shape()) + for i in range() # YOUR CODE HERE >>>>>> # return ??? # <<<<<<<< From 8fa65afa626e92ce7cc59f36b8852cc6595fcdf5 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Mon, 10 Oct 2016 13:52:02 +0800 Subject: [PATCH 03/24] complete --- HW2_Policy_Graident.ipynb | 110 +++++++++++++++++++++++++++++++++----- policy_gradient/policy.py | 19 +++---- policy_gradient/util.py | 19 +++---- 3 files changed, 113 insertions(+), 35 deletions(-) diff --git a/HW2_Policy_Graident.ipynb b/HW2_Policy_Graident.ipynb index 3b51aa3..21d75a6 100644 --- a/HW2_Policy_Graident.ipynb +++ b/HW2_Policy_Graident.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "collapsed": false }, @@ -26,11 +26,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:gym.envs.registration:Making new env: CartPole-v0\n", + "[2016-10-10 13:39:59,156] Making new env: CartPole-v0\n" + ] + } + ], "source": [ "import gym\n", "import tensorflow as tf\n", @@ -42,7 +51,7 @@ "np.random.seed(0)\n", "tf.set_random_seed(0)\n", "\n", - "# CartPole-v0 is a MDP with finite state and action space. \n", + "# CartPole-v0 is a MDP with finite st ate and action space. \n", "# In this environment, A pendulum is attached by an un-actuated joint to a cart, \n", "# and the goal is to prevent it from falling over. You can apply a force of +1 or -1 to the cart.\n", "# A reward of +1 is provided for every timestep that the pendulum remains upright. \n", @@ -95,17 +104,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients.py:90: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", + " \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n" + ] + } + ], "source": [ "sess = tf.Session()\n", "\n", "# Construct a neural network to represent policy which maps observed state to action. \n", - "in_dim = util.flatten_space(env.observation_space)\n", - "out_dim = util.flatten_space(env.action_space)\n", + "in_dim = util.flatten_space(env.observation_space) #4\n", + "out_dim = util.flatten_space(env.action_space) #2\n", "hidden_dim = 8\n", "\n", "opt = tf.train.AdamOptimizer(learning_rate=0.01)\n", @@ -114,6 +132,25 @@ "sess.run(tf.initialize_all_variables())" ] }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" + ] + } + ], + "source": [ + "print in_dim" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -151,7 +188,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": { "collapsed": true }, @@ -176,7 +213,7 @@ " ob = self.env.reset()\n", "\n", " for _ in range(self.path_length):\n", - " a = self.policy.act(ob.reshape(1, -1))\n", + " a = self.policy.act(ob.reshape(1, -1)) # (1,4)\n", " next_ob, r, done, _ = self.env.step(a)\n", " obs.append(ob)\n", " actions.append(a)\n", @@ -200,7 +237,6 @@ " \n", " # `p[\"rewards\"]` is a matrix contains the rewards of each timestep in a sample path\n", " r = util.discount_cumsum(p[\"rewards\"], self.discount_rate)\n", - " \n", " \"\"\"\n", " Problem 4:\n", "\n", @@ -210,7 +246,7 @@ " Sample solution should be only 1 line.\n", " \"\"\"\n", " # YOUR CODE HERE >>>>>>\n", - " # a = ???\n", + " a = r - b\n", " # <<<<<<<<\n", "\n", " p[\"returns\"] = r\n", @@ -254,7 +290,53 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration 1: Average Return = 16.34\n", + "Iteration 2: Average Return = 16.79\n", + "Iteration 3: Average Return = 18.41\n", + "Iteration 4: Average Return = 19.16\n", + "Iteration 5: Average Return = 20.89\n", + "Iteration 6: Average Return = 20.58\n", + "Iteration 7: Average Return = 21.34\n", + "Iteration 8: Average Return = 26.2\n", + "Iteration 9: Average Return = 28.86\n", + "Iteration 10: Average Return = 30.38\n", + "Iteration 11: Average Return = 31.1\n", + "Iteration 12: Average Return = 33.45\n", + "Iteration 13: Average Return = 36.07\n", + "Iteration 14: Average Return = 34.87\n", + "Iteration 15: Average Return = 35.84\n", + "Iteration 16: Average Return = 37.31\n", + "Iteration 17: Average Return = 39.12\n", + "Iteration 18: Average Return = 42.12\n", + "Iteration 19: Average Return = 37.55\n", + "Iteration 20: Average Return = 38.88\n", + "Iteration 21: Average Return = 40.26\n", + "Iteration 22: Average Return = 48.22\n", + "Iteration 23: Average Return = 41.83\n", + "Iteration 24: Average Return = 42.61\n", + "Iteration 25: Average Return = 46.83\n", + "Iteration 26: Average Return = 47.45\n", + "Iteration 27: Average Return = 48.16\n", + "Iteration 28: Average Return = 49.67\n", + "Iteration 29: Average Return = 51.1\n", + "Iteration 30: Average Return = 50.29\n", + "Iteration 31: Average Return = 52.83\n", + "Iteration 32: Average Return = 53.88\n", + "Iteration 33: Average Return = 53.71\n", + "Iteration 34: Average Return = 55.2\n", + "Iteration 35: Average Return = 53.63\n", + "Iteration 36: Average Return = 53.98\n", + "Iteration 37: Average Return = 55.63\n", + "Iteration 38: Average Return = 56.11\n", + "Iteration 39: Average Return = 53.36" + ] + } + ], "source": [ "n_iter = 200\n", "n_episode = 100\n", @@ -327,7 +409,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.6" } }, "nbformat": 4, diff --git a/policy_gradient/policy.py b/policy_gradient/policy.py index 8e0df9a..bbc45fe 100644 --- a/policy_gradient/policy.py +++ b/policy_gradient/policy.py @@ -29,15 +29,9 @@ def __init__(self, in_dim, out_dim, hidden_dim, optimizer, session): """ # YOUR CODE HERE >>>>>> # Andrew - self.var = {} - self.var['l1_W'] = tf.get_variable('l1_W', [in_dim, hidden_dim], tf.float32) - self.var['l1_b'] = tf.get_variable('l1_b', [hidden_dim], tf.float32) - self.var['l2_W'] = tf.get_variable('l2_W', [hidden_dim, out_dim], tf.float32) - self.var['l2_b'] = tf.get_variable('l2_b', [out_dim], tf.float32) - - self.h1 = tf.tanh(tf.nn.bias_add(tf.matmul(self._observations, self.var['l1_W']), self.var['l1_b'])) - self.h2 = tf.nn.bias_add(tf.matmul(self.h1, self.var['l2_W']), self.var['l2_b']) - probs = tf.nn.softmax(self.h2) + h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) + h2 = tf.contrib.layers.fully_connected(h1, num_outputs=out_dim, activation_fn=None) + probs = tf.nn.softmax(h2) # (None,out_dim) # <<<<<<<< # -------------------------------------------------- # This operation (variable) is used when choosing action during data sampling phase @@ -78,9 +72,10 @@ def __init__(self, in_dim, out_dim, hidden_dim, optimizer, session): surr_loss = tf.reduce_mean(tf.mul(log_prob, self._advantages)) # <<<<<<<< - grads_and_vars = self._opt.compute_gradients(surr_loss) - train_op = self._opt.apply_gradients(grads_and_vars, name="train_op") - + #grads_and_vars = self._opt.compute_gradients(surr_loss) + #train_op = self._opt.apply_gradients(grads_and_vars, name="train_op") + + train_op =self._opt.minimize(-surr_loss) # -------------------------------------------------- # This operation (variable) is used when choosing action during data sampling phase self._act_op = act_op diff --git a/policy_gradient/util.py b/policy_gradient/util.py index 428879a..1d43f69 100644 --- a/policy_gradient/util.py +++ b/policy_gradient/util.py @@ -1,7 +1,8 @@ from gym.spaces import Box, Discrete import numpy as np from scipy.signal import lfilter - +import math +import pdb def flatten_space(space): if isinstance(space, Box): @@ -21,11 +22,11 @@ def flatten_space(space): """ def discount_cumsum(x, discount_rate): - - # assume the x is 1-D - n_steps = x.shape()[0] - discount_r = np.zeros(x.shape()) - for i in range() - # YOUR CODE HERE >>>>>> - # return ??? - # <<<<<<<< + # YOUR CODE HERE >>>>>> + discounted_r = np.zeros(len(x)) + num_r = len(x) + for i in range(num_r): + discounted_r[i] = x[i]*math.pow(discount_rate,i) + discounted_r = np.cumsum(discounted_r[::-1]) + return discounted_r[::-1] + # <<<<<<<< From dd3a97fbe3cb3937ed210c94dddefe8df417e394 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Mon, 10 Oct 2016 23:35:23 +0800 Subject: [PATCH 04/24] complete problem 5 --- HW2_Policy_Graident.ipynb | 189 ++++++++++++++++++++++---------------- compare.png | Bin 0 -> 41284 bytes 2 files changed, 110 insertions(+), 79 deletions(-) create mode 100644 compare.png diff --git a/HW2_Policy_Graident.ipynb b/HW2_Policy_Graident.ipynb index 21d75a6..5e693e7 100644 --- a/HW2_Policy_Graident.ipynb +++ b/HW2_Policy_Graident.ipynb @@ -36,7 +36,7 @@ "output_type": "stream", "text": [ "INFO:gym.envs.registration:Making new env: CartPole-v0\n", - "[2016-10-10 13:39:59,156] Making new env: CartPole-v0\n" + "[2016-10-10 21:39:42,591] Making new env: CartPole-v0\n" ] } ], @@ -104,20 +104,11 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 35, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients.py:90: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", - " \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n" - ] - } - ], + "outputs": [], "source": [ "sess = tf.Session()\n", "\n", @@ -127,28 +118,7 @@ "hidden_dim = 8\n", "\n", "opt = tf.train.AdamOptimizer(learning_rate=0.01)\n", - "policy = CategoricalPolicy(in_dim, out_dim, hidden_dim, opt, sess)\n", - "\n", - "sess.run(tf.initialize_all_variables())" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4\n" - ] - } - ], - "source": [ - "print in_dim" + "policy = CategoricalPolicy(in_dim, out_dim, hidden_dim, opt, sess)" ] }, { @@ -188,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 36, "metadata": { "collapsed": true }, @@ -266,6 +236,7 @@ " )\n", "\n", " def train(self):\n", + " avg_return_list = []\n", " for i in range(1, self.n_iter + 1):\n", " paths = []\n", " for _ in range(self.n_episode):\n", @@ -274,19 +245,20 @@ " loss = self.policy.train(data[\"observations\"], data[\"actions\"], data[\"advantages\"])\n", " avg_return = np.mean([sum(p[\"rewards\"]) for p in paths])\n", " print(\"Iteration {}: Average Return = {}\".format(i, avg_return))\n", - " \n", + " avg_return_list.append(avg_return)\n", " # CartPole-v0 defines \"solving\" as getting average reward of 195.0 over 100 consecutive trials.\n", " if avg_return >= 195:\n", " print(\"Solve at {} iterations, which equals {} episodes.\".format(i, i*100))\n", " break\n", "\n", " if self.baseline != None:\n", - " self.baseline.fit(paths)" + " self.baseline.fit(paths)\n", + " return avg_return_list" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": { "collapsed": false }, @@ -295,60 +267,119 @@ "name": "stdout", "output_type": "stream", "text": [ - "Iteration 1: Average Return = 16.34\n", - "Iteration 2: Average Return = 16.79\n", - "Iteration 3: Average Return = 18.41\n", - "Iteration 4: Average Return = 19.16\n", - "Iteration 5: Average Return = 20.89\n", - "Iteration 6: Average Return = 20.58\n", - "Iteration 7: Average Return = 21.34\n", - "Iteration 8: Average Return = 26.2\n", - "Iteration 9: Average Return = 28.86\n", - "Iteration 10: Average Return = 30.38\n", - "Iteration 11: Average Return = 31.1\n", - "Iteration 12: Average Return = 33.45\n", - "Iteration 13: Average Return = 36.07\n", - "Iteration 14: Average Return = 34.87\n", - "Iteration 15: Average Return = 35.84\n", - "Iteration 16: Average Return = 37.31\n", - "Iteration 17: Average Return = 39.12\n", - "Iteration 18: Average Return = 42.12\n", - "Iteration 19: Average Return = 37.55\n", - "Iteration 20: Average Return = 38.88\n", - "Iteration 21: Average Return = 40.26\n", - "Iteration 22: Average Return = 48.22\n", - "Iteration 23: Average Return = 41.83\n", - "Iteration 24: Average Return = 42.61\n", - "Iteration 25: Average Return = 46.83\n", - "Iteration 26: Average Return = 47.45\n", - "Iteration 27: Average Return = 48.16\n", - "Iteration 28: Average Return = 49.67\n", - "Iteration 29: Average Return = 51.1\n", - "Iteration 30: Average Return = 50.29\n", - "Iteration 31: Average Return = 52.83\n", - "Iteration 32: Average Return = 53.88\n", - "Iteration 33: Average Return = 53.71\n", - "Iteration 34: Average Return = 55.2\n", - "Iteration 35: Average Return = 53.63\n", - "Iteration 36: Average Return = 53.98\n", - "Iteration 37: Average Return = 55.63\n", - "Iteration 38: Average Return = 56.11\n", - "Iteration 39: Average Return = 53.36" + "Iteration 1: Average Return = 13.24\n", + "Iteration 2: Average Return = 13.6\n", + "Iteration 3: Average Return = 15.32\n", + "Iteration 4: Average Return = 14.52\n", + "Iteration 5: Average Return = 15.84\n", + "Iteration 6: Average Return = 15.74\n", + "Iteration 7: Average Return = 16.17\n", + "Iteration 8: Average Return = 16.95\n", + "Iteration 9: Average Return = 17.5\n", + "Iteration 10: Average Return = 19.63\n", + "Iteration 11: Average Return = 20.31\n", + "Iteration 12: Average Return = 19.71\n", + "Iteration 13: Average Return = 19.32\n", + "Iteration 14: Average Return = 22.48\n", + "Iteration 15: Average Return = 21.94\n", + "Iteration 16: Average Return = 24.71\n", + "Iteration 17: Average Return = 26.15\n", + "Iteration 18: Average Return = 24.37\n", + "Iteration 19: Average Return = 26.24\n", + "Iteration 20: Average Return = 29.57\n", + "Iteration 21: Average Return = 30.41\n", + "Iteration 22: Average Return = 31.64\n", + "Iteration 23: Average Return = 28.6\n", + "Iteration 24: Average Return = 31.85\n", + "Iteration 25: Average Return = 33.51\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[1;31m# Train the policy optimizer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 12\u001b[1;33m \u001b[0mavg_return_list\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpo\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mtrain\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 75\u001b[0m \u001b[0mpaths\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 76\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mn_episode\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 77\u001b[1;33m \u001b[0mpaths\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msample_path\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 78\u001b[0m \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprocess_paths\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpaths\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 79\u001b[0m \u001b[0mloss\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpolicy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"observations\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"actions\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"advantages\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36msample_path\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 19\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpath_length\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 20\u001b[1;33m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpolicy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mact\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# (1,4)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 21\u001b[0m \u001b[0mnext_ob\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0menv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[0mobs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mob\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/home/andrewliao11/CEDL/homework2/policy_gradient/policy.py\u001b[0m in \u001b[0;36mact\u001b[1;34m(self, observation)\u001b[0m\n\u001b[0;32m 89\u001b[0m \u001b[1;31m# expect observation to be of shape [1, observation_space]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[1;32massert\u001b[0m \u001b[0mobservation\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 91\u001b[1;33m \u001b[0maction_probs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_sess\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_act_op\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m{\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_observations\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mobservation\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 92\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 93\u001b[0m \u001b[1;31m# `action_probs` is an array that has shape [1, action_space], it contains the probability of each action\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m 715\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 716\u001b[0m result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[1;32m--> 717\u001b[1;33m run_metadata_ptr)\n\u001b[0m\u001b[0;32m 718\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 719\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_run\u001b[1;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m 913\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 914\u001b[0m results = self._do_run(handle, final_targets, final_fetches,\n\u001b[1;32m--> 915\u001b[1;33m feed_dict_string, options, run_metadata)\n\u001b[0m\u001b[0;32m 916\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 917\u001b[0m \u001b[0mresults\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_do_run\u001b[1;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m 963\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 964\u001b[0m return self._do_call(_run_fn, self._session, feed_dict, fetch_list,\n\u001b[1;32m--> 965\u001b[1;33m target_list, options, run_metadata)\n\u001b[0m\u001b[0;32m 966\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 967\u001b[0m return self._do_call(_prun_fn, self._session, handle, feed_dict,\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_do_call\u001b[1;34m(self, fn, *args)\u001b[0m\n\u001b[0;32m 970\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 971\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 972\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 973\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 974\u001b[0m \u001b[0mmessage\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_run_fn\u001b[1;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[0;32m 952\u001b[0m return tf_session.TF_Run(session, options,\n\u001b[0;32m 953\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 954\u001b[1;33m status, run_metadata)\n\u001b[0m\u001b[0;32m 955\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 956\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msession\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ + "sess.run(tf.initialize_all_variables())\n", "n_iter = 200\n", "n_episode = 100\n", "path_length = 200\n", "discount_rate = 0.99\n", "baseline = LinearFeatureBaseline(env.spec)\n", "\n", - "po = PolicyOptimizer(env, policy, baseline, n_iter, n_episode, path_length,\n", + "po = PolicyOptimizer(env, policy, None, n_iter, n_episode, path_length,\n", " discount_rate)\n", "\n", "# Train the policy optimizer\n", - "po.train()" + "avg_return_list_n = po.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import seaborn as sns \n", + "import matplotlib.pyplot as plt\n", + "\n", + "xs=np.linspace(1,len(avg_return_list),len(avg_return_list))\n", + "plt.plot(xs, avg_return_list)\n", + "plt.xlabel('Iteration')\n", + "plt.ylabel('Avg_return')\n", + "plt.show()\n", + "plt.savefig('with_variance_reduce.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "xs=np.linspace(1,len(avg_return_list_n),len(avg_return_list_n))\n", + "plt.plot(xs, avg_return_list_n)\n", + "plt.xlabel('Iteration')\n", + "plt.ylabel('Avg_return')\n", + "plt.show()\n", + "plt.savefig('without_variance_reduce.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "xs=np.linspace(1,len(avg_return_list),len(avg_return_list))\n", + "xs_n=np.linspace(1,len(avg_return_list_n),len(avg_return_list_n))\n", + "plt.plot(xs, avg_return_list, xs_n, avg_return_list_n)\n", + "plt.xlabel('Iteration')\n", + "plt.ylabel('Avg_return')\n", + "plt.legend(['With variance reduction', 'Without variance reduction'], loc='upper left')\n", + "plt.savefig('compare.png')\n", + "plt.show()\n" ] }, { diff --git a/compare.png b/compare.png new file mode 100644 index 0000000000000000000000000000000000000000..063aeb880282e8e9b6225002f3cc307a3e6aa9b1 GIT binary patch literal 41284 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 z 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 literal 0 HcmV?d00001 From 5977d9057efa5a3b3d8e084de34a2daa9586da02 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Mon, 10 Oct 2016 23:38:35 +0800 Subject: [PATCH 05/24] add report --- report.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 report.md diff --git a/report.md b/report.md new file mode 100644 index 0000000..d257400 --- /dev/null +++ b/report.md @@ -0,0 +1,7 @@ +# Policy gradient report + +- Problem 5: +Here I compare the result of with/without variance reduction: +![](https://github.com/andrewliao11/homework2/blob/master/compare.png?raw=true) + + From 37d17fa030aba6b7eb10d0be1d829d08aef8a4d3 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Mon, 10 Oct 2016 23:40:23 +0800 Subject: [PATCH 06/24] add report --- report.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/report.md b/report.md index d257400..fe36495 100644 --- a/report.md +++ b/report.md @@ -2,6 +2,5 @@ - Problem 5: Here I compare the result of with/without variance reduction: -![](https://github.com/andrewliao11/homework2/blob/master/compare.png?raw=true) - +

From ba6c99e6cd4e27531ad45f86915dda1f78884c33 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Mon, 10 Oct 2016 23:41:24 +0800 Subject: [PATCH 07/24] fix size --- report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report.md b/report.md index fe36495..52db138 100644 --- a/report.md +++ b/report.md @@ -2,5 +2,5 @@ - Problem 5: Here I compare the result of with/without variance reduction: -

+

From 127d71fdd91aaa4bcf711e5eff305d8e37552bf9 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Thu, 13 Oct 2016 09:37:06 +0800 Subject: [PATCH 08/24] add graph --- HW2_Policy_Graident.ipynb | 212 +++++++++++++++++++++++--------- without_variance_reduce_max.png | Bin 0 -> 24126 bytes without_variance_reduce_min.png | Bin 0 -> 21466 bytes 3 files changed, 156 insertions(+), 56 deletions(-) create mode 100644 without_variance_reduce_max.png create mode 100644 without_variance_reduce_min.png diff --git a/HW2_Policy_Graident.ipynb b/HW2_Policy_Graident.ipynb index 5e693e7..adcce41 100644 --- a/HW2_Policy_Graident.ipynb +++ b/HW2_Policy_Graident.ipynb @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": { "collapsed": false }, @@ -36,7 +36,7 @@ "output_type": "stream", "text": [ "INFO:gym.envs.registration:Making new env: CartPole-v0\n", - "[2016-10-10 21:39:42,591] Making new env: CartPole-v0\n" + "[2016-10-12 13:50:57,388] Making new env: CartPole-v0\n" ] } ], @@ -47,6 +47,7 @@ "from policy_gradient import util\n", "from policy_gradient.policy import CategoricalPolicy\n", "from policy_gradient.baselines.linear_feature_baseline import LinearFeatureBaseline\n", + "from IPython.display import clear_output\n", "\n", "np.random.seed(0)\n", "tf.set_random_seed(0)\n", @@ -104,11 +105,20 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 2, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gradients.py:90: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n", + " \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n" + ] + } + ], "source": [ "sess = tf.Session()\n", "\n", @@ -158,7 +168,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 3, "metadata": { "collapsed": true }, @@ -253,12 +263,12 @@ "\n", " if self.baseline != None:\n", " self.baseline.fit(paths)\n", - " return avg_return_list" + " return avg_return_list, i" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": { "collapsed": false }, @@ -267,75 +277,165 @@ "name": "stdout", "output_type": "stream", "text": [ - "Iteration 1: Average Return = 13.24\n", - "Iteration 2: Average Return = 13.6\n", - "Iteration 3: Average Return = 15.32\n", - "Iteration 4: Average Return = 14.52\n", - "Iteration 5: Average Return = 15.84\n", - "Iteration 6: Average Return = 15.74\n", - "Iteration 7: Average Return = 16.17\n", - "Iteration 8: Average Return = 16.95\n", - "Iteration 9: Average Return = 17.5\n", - "Iteration 10: Average Return = 19.63\n", - "Iteration 11: Average Return = 20.31\n", - "Iteration 12: Average Return = 19.71\n", - "Iteration 13: Average Return = 19.32\n", - "Iteration 14: Average Return = 22.48\n", - "Iteration 15: Average Return = 21.94\n", - "Iteration 16: Average Return = 24.71\n", - "Iteration 17: Average Return = 26.15\n", - "Iteration 18: Average Return = 24.37\n", - "Iteration 19: Average Return = 26.24\n", - "Iteration 20: Average Return = 29.57\n", - "Iteration 21: Average Return = 30.41\n", - "Iteration 22: Average Return = 31.64\n", - "Iteration 23: Average Return = 28.6\n", - "Iteration 24: Average Return = 31.85\n", - "Iteration 25: Average Return = 33.51\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[1;31m# Train the policy optimizer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 12\u001b[1;33m \u001b[0mavg_return_list\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpo\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m\u001b[0m in \u001b[0;36mtrain\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 75\u001b[0m \u001b[0mpaths\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 76\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mn_episode\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 77\u001b[1;33m \u001b[0mpaths\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msample_path\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 78\u001b[0m \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mprocess_paths\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpaths\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 79\u001b[0m \u001b[0mloss\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpolicy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"observations\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"actions\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"advantages\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36msample_path\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 19\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpath_length\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 20\u001b[1;33m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpolicy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mact\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# (1,4)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 21\u001b[0m \u001b[0mnext_ob\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0menv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[0mobs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mob\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/home/andrewliao11/CEDL/homework2/policy_gradient/policy.py\u001b[0m in \u001b[0;36mact\u001b[1;34m(self, observation)\u001b[0m\n\u001b[0;32m 89\u001b[0m \u001b[1;31m# expect observation to be of shape [1, observation_space]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[1;32massert\u001b[0m \u001b[0mobservation\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 91\u001b[1;33m \u001b[0maction_probs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_sess\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_act_op\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m{\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_observations\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mobservation\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 92\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 93\u001b[0m \u001b[1;31m# `action_probs` is an array that has shape [1, action_space], it contains the probability of each action\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m 715\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 716\u001b[0m result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[1;32m--> 717\u001b[1;33m run_metadata_ptr)\n\u001b[0m\u001b[0;32m 718\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 719\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_run\u001b[1;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m 913\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 914\u001b[0m results = self._do_run(handle, final_targets, final_fetches,\n\u001b[1;32m--> 915\u001b[1;33m feed_dict_string, options, run_metadata)\n\u001b[0m\u001b[0;32m 916\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 917\u001b[0m \u001b[0mresults\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_do_run\u001b[1;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m 963\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 964\u001b[0m return self._do_call(_run_fn, self._session, feed_dict, fetch_list,\n\u001b[1;32m--> 965\u001b[1;33m target_list, options, run_metadata)\n\u001b[0m\u001b[0;32m 966\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 967\u001b[0m return self._do_call(_prun_fn, self._session, handle, feed_dict,\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_do_call\u001b[1;34m(self, fn, *args)\u001b[0m\n\u001b[0;32m 970\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 971\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 972\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 973\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 974\u001b[0m \u001b[0mmessage\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.pyc\u001b[0m in \u001b[0;36m_run_fn\u001b[1;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[0;32m 952\u001b[0m return tf_session.TF_Run(session, options,\n\u001b[0;32m 953\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 954\u001b[1;33m status, run_metadata)\n\u001b[0m\u001b[0;32m 955\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 956\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msession\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + "Iteration 1: Average Return = 18.04\n", + "Iteration 2: Average Return = 18.83\n", + "Iteration 3: Average Return = 21.8\n", + "Iteration 4: Average Return = 20.61\n", + "Iteration 5: Average Return = 23.93\n", + "Iteration 6: Average Return = 23.09\n", + "Iteration 7: Average Return = 27.2\n", + "Iteration 8: Average Return = 29.16\n", + "Iteration 9: Average Return = 31.71\n", + "Iteration 10: Average Return = 32.73\n", + "Iteration 11: Average Return = 34.81\n", + "Iteration 12: Average Return = 37.38\n", + "Iteration 13: Average Return = 39.43\n", + "Iteration 14: Average Return = 40.16\n", + "Iteration 15: Average Return = 41.08\n", + "Iteration 16: Average Return = 49.69\n", + "Iteration 17: Average Return = 50.16\n", + "Iteration 18: Average Return = 45.54\n", + "Iteration 19: Average Return = 49.39\n", + "Iteration 20: Average Return = 54.45\n", + "Iteration 21: Average Return = 48.18\n", + "Iteration 22: Average Return = 52.51\n", + "Iteration 23: Average Return = 49.41\n", + "Iteration 24: Average Return = 56.92\n", + "Iteration 25: Average Return = 55.99\n", + "Iteration 26: Average Return = 51.51\n", + "Iteration 27: Average Return = 62.38\n", + "Iteration 28: Average Return = 55.51\n", + "Iteration 29: Average Return = 58.85\n", + "Iteration 30: Average Return = 62.69\n", + "Iteration 31: Average Return = 57.4\n", + "Iteration 32: Average Return = 58.77\n", + "Iteration 33: Average Return = 65.02\n", + "Iteration 34: Average Return = 65.5" ] } ], "source": [ - "sess.run(tf.initialize_all_variables())\n", + "#sess.run(tf.initialize_all_variables())\n", "n_iter = 200\n", "n_episode = 100\n", "path_length = 200\n", "discount_rate = 0.99\n", "baseline = LinearFeatureBaseline(env.spec)\n", "\n", - "po = PolicyOptimizer(env, policy, None, n_iter, n_episode, path_length,\n", + "po = PolicyOptimizer(env, policy, baseline, n_iter, n_episode, path_length,\n", " discount_rate)\n", "\n", "# Train the policy optimizer\n", - "avg_return_list_n = po.train()" + "avg_return_list = []\n", + "iter_list = []\n", + "for i in range(10):\n", + " sess.run(tf.initialize_all_variables())\n", + " avg_return_list_tem, iter = po.train()\n", + " avg_return_list.append(avg_return_list_tem)\n", + " iter_list.append(iter)\n", + " print i, 'trial =', iter\n", + "np.savez('w_baseline', avg_return_list=avg_return_list, iter_list=iter_list)" ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 9, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "ename": "ValueError", + "evalue": "zero-size array to reduction operation maximum which has no identity", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mseaborn\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0msns\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mll\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0miter_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mll\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mavg_return_list\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mavg_return_list\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/numpy/core/fromnumeric.pyc\u001b[0m in \u001b[0;36mamax\u001b[1;34m(a, axis, out, keepdims)\u001b[0m\n\u001b[0;32m 2291\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2292\u001b[0m return _methods._amax(a, axis=axis,\n\u001b[1;32m-> 2293\u001b[1;33m out=out, **kwargs)\n\u001b[0m\u001b[0;32m 2294\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mamax\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2295\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/numpy/core/_methods.pyc\u001b[0m in \u001b[0;36m_amax\u001b[1;34m(a, axis, out, keepdims)\u001b[0m\n\u001b[0;32m 24\u001b[0m \u001b[1;31m# small reductions\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 25\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_amax\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mNone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mNone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 26\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mumr_maximum\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 27\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_amin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mNone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mout\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mNone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkeepdims\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mValueError\u001b[0m: zero-size array to reduction operation maximum which has no identity" + ] + } + ], + "source": [ + "import seaborn as sns \n", + "import matplotlib.pyplot as plt\n", + "ll = np.zeros([10, np.max(iter_list)])\n", + "for i in range(10):\n", + " ll[i,:len(avg_return_list[i])] = avg_return_list[i]\n", + "s = np.sum(ll, axis=0)\n", + "nonzero = np.sum((ll != 0)+0, axis=0)\n", + "s_ = s/nonzero\n", + "max = np.zeros([np.max(iter_list)])\n", + "min = np.zeros([np.max(iter_list)])\n", + "for i in range(np.max(iter_list)):\n", + " max[i] = 0\n", + " min[i] = 1000\n", + " for j in range(10):\n", + " try:\n", + " if max[i] < avg_return_list[j][i]:\n", + " max[i] = avg_return_list[j][i]\n", + " if min[i] > avg_return_list[j][i]:\n", + " min[i] = avg_return_list[j][i]\n", + " except IndexError:\n", + " a=1\n", + "max = max - s_\n", + "min = s_ - min\n", + "xs=np.linspace(1,np.max(iter_list),np.max(iter_list))\n", + "plt.errorbar(xs, s_, yerr = [min, max])\n", + "plt.xlabel('Iteration')\n", + "plt.ylabel('Avg_return')\n", + "#plt.show()\n", + "plt.savefig('without_variance_reduce_max.png')" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(103,)\n" + ] + } + ], + "source": [ + "print min.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "ValueError", + "evalue": "setting an array element with a sequence.", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mxs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlinspace\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mavg_return_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mavg_return_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mxs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mavg_return_list\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 6\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mxlabel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Iteration'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mylabel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Avg_return'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/matplotlib/pyplot.pyc\u001b[0m in \u001b[0;36mplot\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 3152\u001b[0m \u001b[0max\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhold\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhold\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3153\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3154\u001b[1;33m \u001b[0mret\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0max\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3155\u001b[0m \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3156\u001b[0m \u001b[0max\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhold\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mwashold\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/matplotlib/__init__.pyc\u001b[0m in \u001b[0;36minner\u001b[1;34m(ax, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1809\u001b[0m warnings.warn(msg % (label_namer, func.__name__),\n\u001b[0;32m 1810\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[1;32m-> 1811\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0max\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1812\u001b[0m \u001b[0mpre_doc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0minner\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__doc__\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1813\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mpre_doc\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_axes.pyc\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1426\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1427\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_lines\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1428\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_line\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mline\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1429\u001b[0m \u001b[0mlines\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mline\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1430\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_base.pyc\u001b[0m in \u001b[0;36madd_line\u001b[1;34m(self, line)\u001b[0m\n\u001b[0;32m 1697\u001b[0m \u001b[0mline\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_clip_path\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpatch\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1698\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1699\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_update_line_limits\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mline\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1700\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mline\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_label\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1701\u001b[0m \u001b[0mline\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_label\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'_line%d'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlines\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_base.pyc\u001b[0m in \u001b[0;36m_update_line_limits\u001b[1;34m(self, line)\u001b[0m\n\u001b[0;32m 1708\u001b[0m \u001b[0mFigures\u001b[0m \u001b[0mout\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mdata\u001b[0m \u001b[0mlimit\u001b[0m \u001b[0mof\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mgiven\u001b[0m \u001b[0mline\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mupdating\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdataLim\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1709\u001b[0m \"\"\"\n\u001b[1;32m-> 1710\u001b[1;33m \u001b[0mpath\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mline\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_path\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1711\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mpath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvertices\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msize\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1712\u001b[0m \u001b[1;32mreturn\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/matplotlib/lines.pyc\u001b[0m in \u001b[0;36mget_path\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 924\u001b[0m \"\"\"\n\u001b[0;32m 925\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_invalidy\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_invalidx\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 926\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrecache\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 927\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_path\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 928\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/matplotlib/lines.pyc\u001b[0m in \u001b[0;36mrecache\u001b[1;34m(self, always)\u001b[0m\n\u001b[0;32m 618\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mma\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0myconv\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfloat_\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfilled\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 619\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 620\u001b[1;33m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0myconv\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfloat_\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 621\u001b[0m \u001b[0my\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 622\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.pyc\u001b[0m in \u001b[0;36masarray\u001b[1;34m(a, dtype, order)\u001b[0m\n\u001b[0;32m 480\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 481\u001b[0m \"\"\"\n\u001b[1;32m--> 482\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0morder\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0morder\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 483\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 484\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0masanyarray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mNone\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0morder\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mValueError\u001b[0m: setting an array element with a sequence." + ] + } + ], "source": [ "import seaborn as sns \n", "import matplotlib.pyplot as plt\n", diff --git a/without_variance_reduce_max.png b/without_variance_reduce_max.png new file mode 100644 index 0000000000000000000000000000000000000000..6b54c818bc2d5670d883a1b9917137dda5f2d784 GIT binary patch literal 24126 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 literal 0 HcmV?d00001 diff --git a/without_variance_reduce_min.png b/without_variance_reduce_min.png new file mode 100644 index 0000000000000000000000000000000000000000..175f423b938fc000031d7deaa9f8f6009111b780 GIT binary patch literal 21466 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 YDawkkdK|f}@#GoNZb@p>&i!St0WT^+IsgCw literal 0 HcmV?d00001 From 4ae4bc109974cffaff4beb85e5c8753080a61314 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Thu, 13 Oct 2016 09:52:09 +0800 Subject: [PATCH 09/24] add figure --- with_variance_reduce_max.png | Bin 0 -> 22141 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 with_variance_reduce_max.png diff --git a/with_variance_reduce_max.png b/with_variance_reduce_max.png new file mode 100644 index 0000000000000000000000000000000000000000..62ddbd226e78cd36193e2bda518759c16e4a4aee GIT binary patch literal 22141 zcmeFZWmr{h*DgFk6ch;qltx8VQb}nHKvY1wOQch}Sr*(Vh=PP5Aq@*ybf+jtcb5oA zH;axvrtkB-&;IuQ;?Ms1c^n>VF4l}I#x=$`&v9PU|B1W|*(usn2!fEwKDe)hAjg;y zgpifw1pEc7w^RckL=JalRY>5UC&{ya;QL9t2bvBDLScyhCrFh@F-H()ME3q271u8d zBW|85_=@_Yt;f!1bAu6042zW^)t%!XrLs?*`iD8I$Kze01ujTWyF7DCDbu>=k zPv2(xeuh@Y!#8Yd)$tsSb0-=r<@_-OE5;pSGLkl4@8 zDxG7~^}_e;{^0ihnw!fb+nFpE#b??|A4o5x)Rm&pmuuYQ8MC)LkF#w2bc2@P;?q*) zp3UNLNmoD-Iy)L?2@+`}4p)Py7#K1YBo0)VJXc=i=H=nb#t!6DHyXTJKWXlk0Ti4elAGhQHT z493RBw4$!rj9wdxZ~Xk&FI~FBYuef!uJ4^T)fCPyCZ=07Z2#`=y?gxb8)kAbqMDDw zxk6bubxT$9Ojbqw8%@kl^6j z+FEyohs)wi&pA zd^_&#+qdT#7#1BwSy`puym=GsI65IECFPC104Hbj5dJ)FHBzd&HRe-=_8^dkS2}nS z?=F{xT6{J);ZL^=-7+-_(G|>}wpd)*a;0|g`3o2N5(N`dQy-i>c``V0d)qZZFmZLY zuC|2B7jq0jFp|_(&ID@t){kOdamQg6Q=J4`<|wW-x~F3o6Zq&S?XRHuMM0i zb6M_f{>*z-mN7`iV{@V7i;#nsr;T6j*WloXB_lD;uGh@C@7$4>l992q=6E}Aq^mTQrNzu$KwOkKJPwuyRbhJM$5gHYRO^I=TI505qP*%31+-==)#Ho*_ zO~2eVN6&l5I9kj@?VcZbPl$qeTBX-sVY=_PZ}#F=9IUtd(~659WCcq7&kxg3KPae4 zx`NT5WD@AD(*1T#h{i6F)Iv&x^g=w_=qT*wGz z$MrARV+4l0CNmh_3=<9y)0!5PD61o0lOsrLQ>c1I$_49CmX<1)M4k|%$5|u{NrkPM zed!i-on%b&R*q-(pA|=QJ$Vj3(BA9F9>yChhbJ?xpb2t z(?=Hkqri@z1pbS=yOKskl!#>YIQKF`lZAvnw#P`ONq|vJHBdX)v3}Cq{x&_U`fEvP zgaGNM)fYERmfT+E-g5jbe!!|8%;#?BlC%{dP;!|_7`$h-?clC4CuQY=rlz)cr4HSm zyJ_?zJ>2=T3*8H=pH0GF$zu>$aqaIH&eu5`UobOue!(*9%ii^g@|=ym)XZtLnbpAy z8&Z`CswzDNdzPhQj0e_>mt>V3pQR@2^^}dY5%BrJEwWiEJ)OVQNet;9{5pkS8ts{U z+urYjQ@F2@eYiF*KCxYy@Mdvs+3;ZVT%(vWmuw`z_`NfRo}90JR`h9+Y89fucN3=1 zxcLigjLOoJt;H_5nKt5!_=#1O6fN^J`|VYXPHa8#+(@Db7xqqn?4#}QB=}S0#WYLb zO)KSSNz272S=_lJMY?_0+8mwK$C15g;%2(Wr z#piLE!zmKDer#@|Z?)ac6b-DngmVKkDRV;%we%`HIuOinI zCr_pJFu2m^0I?|}t-6AN826eTr?Dkopw%^9!L81v|NFV2GnrSQ$0hmmDi4Cs#@Bi> zu5T&i6&z_8zSCdN8@U#^xYEun=3Z~yICsu8|EkNoPb?KxL~XB{=*6Z~Ij^wdlPvtudcc974Nb;8?t$`?gq`zUbuncH*3UHqsSk~|j!#=> z3`8dU7?VGZ3%^L$G5P$tZmnY**)bMb)3?}-X(|uL?fd@2jBUp)y><>p)*ilnOVUv_ z!gK#p%^gnnSV@lwE)AI6vFAA=L1^O-$HhzNj=%l6LMf|cVjrOAWfk0^r>2Ni)u-

qidnLYMPD>)M_hiY#5+W$f^# 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 literal 0 HcmV?d00001 From 2cebc84e519c033777e31a6f3b676f0b8a6b5a57 Mon Sep 17 00:00:00 2001 From: andrewliao11 Date: Sat, 15 Oct 2016 14:41:36 +0800 Subject: [PATCH 10/24] rm redundant --- without_variance_reduce_min.png | Bin 21466 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 without_variance_reduce_min.png diff --git a/without_variance_reduce_min.png b/without_variance_reduce_min.png deleted file mode 100644 index 175f423b938fc000031d7deaa9f8f6009111b780..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21466 zcmeFZbyQVf*EYOC6hr}o5RgzprIkhrMZlxd-6Gu$(pVrWAqXhlap;l`MJ1GwI?|{h zaX6H8zH|G#?{PoR^S*z42;?-Bd%6 zL#zlw%t>|xKFKp$cn=p6*BclOGWh39X7&vJKI(K!*A+piOwb>q9O-Op1Yt!mH?M0v zNSGh>dZ3}1bg-hsx}plaRnPW9Epsz(=zuWK|tm5V73PK+RFZMdMhu|cY$@}!`&uRwpzUot#gb3>zl zZ{S?+WRz>Cq)4;CaU$qYAl>&4KDZ(>6Rd&gb%}wP480be3q&vf|DXRaN~2YmnwolM zxrGI%sco2G(iHN^wVfMLOQc|K>ETu%Q+R?(PFR}5vg=mk*We{;$H@9*l-(@)tPR^Pz z8fxl`;^MkqUS93(?JhpP;|+d>z4;=JWBLAj+tn4878X}1j=>kj9wIJ8@gnv;3F5A+ zt!&{r`T6Lm9SF|O&Ro2_(HXAqVxyzI3XI^{rr47*ou-7L3h$-&q-%ZZ%CmEMMKSF3 zK_)Jma68Z)Zl4ns)uxi(EzVL-F7#QbR)~BZ5z%cYln%{eFqp`Uj~{R1tXgLY*~-&3 zCx|KGYrDF|gNHZM-0=gm#`{yotL@xHRq|5oxd8|J+cW9mBh0ndy_^(h#k%{GVq>#I zPG7hknV^*Y&TcTRE$V{tYPG#cJQtVEl#|%-L?TI03Ty3sQ??mVs%}eO*+#E0DO>vO z4%b!PFWrtwR|hSv#EDz!&r${_`K{|#T5DfWd?RqZs9_uH;^HD?@`0qls9tZ}_fP2W zj`$0h8hl}`ko}NQD2ud_-}dUac*lm^;$nf&v*JC?3<)+iKV_TLSL3H=%3@N-uPG!~ z9N+sbzMXGABl;k!<6dWYys+)S%$U!jCd}9I=7Hq%1uEcr4^0P!ANte$}&`VvD{I8wq`u2|?kRETI8>Arb31N~Ga6yb@5mZG@2pb$m z7lOmevG%o}^A(X9vl|p@@-_)=H1CrIh>77=lPwu5T#&k;OFD4jG{K%GK1oD^ASqAD zP6STBd2|>){m(r5B%G6Xysp>`}ctU&wo}O=SL6$ zrq~llh)Mtb`hPu%4pt^mz%}l)dOniyk?bG+WkLc&dU21MC{X$y`YRHMJ0SxXQcWps6`XgR~44YE*GbBa`*2d zU~Li>5f|q7jHNxOGPdljy8V(uH2dNvFFHx~7aLOy_&bfbF>(ImtmYY?-x{2BGI8{c z%Ql^IkIZ;h%oqxLilc8&-ZOJbu>EZ6!+{V z%`hVPSC+e9M@ABd+-EeJ9?Zn}*GS|=h0qXXJJF-MR64SDAtk0ze8wZ+^u`lRKhkkh z20q^X_~)WLe=nbRH)J=j3i_Tlev96YExTsi!ZpW^ z*$5@1H;kUTTSz7*`d1*ButZsuU|1(y2z1{1RVIrQ!?jzTphT4?#8FgiozWj&{{xs?P^=4 zk5I8?B>sW3b-{qWblT!O>fG|uhCy3p=6-dPbJq#l*SdrLZhe9o?!9`fjTF7qqsQ|# z=gZRN4P!V5kMI3Rgk_0g^Pb5zREQ49x#3Ph>DQR~eQl(X@B7d7nv*8i=SDe<7(JMx z*gxG2D&Np28an=06Nb_UrE*9!ch^nT8nm3c|G{l!MvTSMU3_xSUN z61qxOBmw!cXl($}$e(F|Pt z>&upR&t83t6BaY89CYhis~4JE>EzTpyeWdNEtz9|qGILuri^fVuwy0tecqM!obKQz zFGl{ZykPP$Eqq0|D8BofI^(hZX2rKps3y+;-9p!jC5lwa8ow8A%LflH-}(7L5ldD~ zTZmd5r;~AKmG<^t*l*(>@nRj_F19-KQfPZzuH|WR`PzyZ|K@Lc%cmECTKW!}czW18C0 zFn7hU%h_j|x}0cuV0updq+`5Za;YmLQB+QLcK2IqeD7Dk?Cb07aM z#i>oQ$?~^TN2MLOW7ypnP83)!R2!7M3`Fe1&`}V_HCtDWDl3QdOON}}_Z9_ud^qoh zASa4Fn0Ro*FWyxzcq)bssH^j7-aONIo`~>tkq-$}{&`#5O4(d@FQm+>dpL_pRiFAl@+}v_`4QGsxvn~7v z-pfeX!BR6-``531O%D$VJ59(?oDq;YL`vEB^V18%aIYOgrLf1m4h8cyosALKa1r~V zNx}*d$avTNJ#B}6!yVXSgX|P6Z_*SvE#4Z^o=`bMB;K5_TULJWJ@MMiw_o`LYinyg z@b`3wWB3fQI3piL$A+z}?bX?I&oM8BaH;K_7#`iUXV0Fk^DrVvf~=xp6n?$rxi<#9 znEZu?hRPoG`_aZK4qDbSGWSU)k1sDT$4Lh?NO&&HFT1+BxVS+VxvyT;PfbmYlW@n* zd(_788;?;&6C;7ga&v9_cJ6rAEGRrBwVmtmTjSrLRP(-_9}-RU@CD)$bak;#{l||V z({@EzY|pQ7>B4ieK~^81o%Dt_4ejGa9km+$_ePkL-@a`Vf@#02g6qzRop#hP!Gz+! zr=Q-z$IVj@+KZg#K19q&^zo3Ys_NWeS@uHxhLPW&4$GrY5yLDqFfe&fJyslYZ}s!m)Uk@d&=84*2(vP`wzv2AEY?rgNc(O& zDZafT$Kt=4%BdLFXEA-0{5+laPqTn;j&$Mw_{RmaWfQ$gr_Y*cI~DJx4e9L+6-avO zzZ)iq^mf|+-f`%tCV0e~MWIIL-2!(sJF2uk@0$AWHPr7_(6(;UcYBjWXw8jOm%&t= z$K1YqSHs#mSKkME>AkT)_-6b0bLqW$jv3K^d836KezdOlON!Y)eSE@w?%dpeUa27W z^sR@3;JBx4Clm8Ytf=%bmZCO{G|cu$hRug1=Aq5G%75N^r2Gg7>;)aambrQ6Le(!y zT*>aPulsC|Tx4HkK)}@0l=aV#A(8Cay}7*l@2plP+n5ux)6%pkgUbly8?M){dwlvV z-|fhp(xn&V|Hr^~JHNEFli*=(y(U*tv0kC?v+&NYsIX9!Fk;cLIFR7eNtgYhr70=a zYOdq$khae3#^Ug>vF*e8$!P|?Fjxs`Y3IQNK%^%uB7)7yxfS_3At8Ta;@;j)<3VkW z2LXHi@sZiu#fDx57Qc+Qf|j=<7i#c)5OXU2Y6;g)mhxNu9q-7+!*iESA#640NN{s* z7N>vpGWEZMimr-`t~jM*Jc^dr4t(tk{0IX{wYf29 zM-m}uH~fxJM~J$hEVcL=dr3XZs{QpPdqar5i88@-i5nAoaEz3-OyOh{YWB^!CtraB zr|D}&8A@L2!0?Zqud!xpgDG^gpY zMv1>TFk6SGyq(vvEjwIPcP=j5>UQIB^Qu zFF2;2-Kp9>r_UTl!Nzg7H<8^lK5d5pCBo)7bSMAb&)A5WSCNfU2Zs*)6blbsr0xkC z4ozs5Nsay-GAMQpwvrTUC}Lnz;x!Ivooq)Q974U4^4gl-^@SWqw^oa&&xZYql}7P} z5%;bh>v)L#jkyR|koF?);E$T*6Q{Ej90^59iPaMHC!V2hM9Qc}-&x~D)d%^X-RIvg z`yFMGLD;~|1$w9&X%@vouVfYSM#F-GoSt&CMmVEZt^4upaLg zk_Q&uqW}R~sZVKAL}s+H34&WH8kI*h@i!b*pQL+@|1@aJf$3dj%y_9$_}olRskyuJ zkomSt2T|oO_0Ow46xwc=bGeX)m#Ce*cK=M!`q{$n4gKeTc-^|QQCas%20Lw#b)=A3SvtKrQ85`hi&ZH>^1*0Sa`LPhF7PG0VL!j_#;uwP|ntNT?+4*7IGeEt_7PZhJxWn&HqtUI_U0zdtI#tYtyudP!j znk>Y7=UVF3K}b-1WgT^|rq_PpwrsAIG{~Ov@kXp@(D#aE`#p`;tH|x1zk+O@{QC)a zv%qRV^;Pp*}ap%UZi3nSzzM?mk!M0D`S;HI?JMH_PzCe?mk}e&y&w5LfnVLb8<4|Bi&k_9S6tX zO3*hBX56A-P=ysUH+D&0+x+r2Q3?Saii}_dMT@6Y@|CREc>@nR8Aeoyfn^L333z*& zG+#&T{|4uACBybLrW!$m=E#yPI^C?8A!Ci%8p$eUQjQBZ<8&yH068>b(5tQ2`QzeQ zyeXG$dlx4{95=J#LY;lwru|T)# z1nC?j)3%M@L;QYorNwOfSF_XH#DQg|#1|37f8q-ZRTbfW5;dd4ePP7O;UzTsbn3rt zsy?wh^-@Ffa_*0%4jhtU2AkymK{|H+@e9B59YXlXQB8ABbFC!6rckQ=G#@+FtI^vb-lHZ#<^EeAxv2T!c;@Aqqrd zU|o`0OwK)|ubw|?ayiJvYJbHrG6N!A7~ts0BV^+I-zHLEwZAr2Ifr48F0Tdm9U@tT zkMeJ4^cof-GJfs&y`=v*M1>6emE|LtDGp4O{Hn?=r--(Gr0EkXp?j*M5}#(;{o5>J zi4bO!3vS4g>Acy(xW5QCdtM|Sh8(DX1`|!^{fE5z+-ohT#mqfSe_clgP=CFNxM6!X zLQ22B%l%;ceWGIi5kxNxMVdCNM%+o)7GkfCgmHWhir1h($|>2<`6}kHrL6iu>f?tj zk)i_f?VIa(>K!nP#`|~QEYz1&g3^@1Uq&H0mbIyHQg#fc#AG|WmS5Xk@$oWJ-3Sp<&J^ZP`$FGkd0G&m~lSh2+u8KCzDd4)@!) zo~c<|SH#67Sj0X-{!Rq@g=U2frOV!S_X7-1v83)kS~+&@7?K}~c7%=~F~ckXHZJRu zsrM!JH@e>t;>S~mS|1)FT{S*fGaf224Yskhjj!O>fA{qX7L3D!jB~Wqws$3dzX0cf zE5NM_l$=MFq`r_wWGDOUwS+PCR^W{CT3c_GeIY_7^4s$mSEmywY{cx7{0^8goLVHv z?_ytMu+;no8bnYsNubh1Ec*ck%VV+YgD|4(4iVC;>;J)8O)WAlJ-q|gd|=s?)(hr(a< zxz67Bx8KkoRCU#!-K77b{9doZCVHSiKO4Yv6$p69$;n-8ldpOfVxoxFF*gC6O=|8JM22RxKzoV;`?1l<@lU$>m3 zD$~FZHy(E$kfcx~p8bUQhJsktl_fJX*bC1SBTJH$*{R+4YSG64z4*#UiugXt#08!S zN(Jxli@-zOV5ms9n(bA7UPqOe5Bxall%zid#*?z@2B{?@cbEHOgh{0~}% zdO|-gG-*`hDQg_U>v%LDZ@USVFu?0#k{?CCew`t``-3V@*fs`rkRu{aRIW?!%_?(h z9zn>2ynODITMVDX`SDdBLppS&0_Vr-^=D^iBQtt>)W8iuNU(7=@+c%(X(|%mkzs>0 zdBRh5e>$&P#DXOn(=S!ejGlL+MCk5sAuAA^C6#qplvyuLyf=c4dg9rD9rwUo-3^SI zNBB+qA;bGFa>zt24~q;MeGS@)RC1dnN=?>7UZPBr0vS5K^MK^t3f8;BsLn9*^%=%2 z#=?1Uq5}WG^3g4~dNu3^kp?7*Y!^nVy?2*e6tU#U2{MTChm#%EHSN>cXCKCImkzQb z27xeV;mne8On3oBaArE{09;Zs8Fm|NROZtIztpwMTwoq0%v09+ew6 z9v!8D)guS)j7Pj8RoG&7@rf)W0LG!u^r8+1W%zu?pj41Mq`zD_H4h_8+7zLbl{>$J zJ=DYd{!TEy#20xh>Elsm3SsVCPv$XDV}T-NjX7%E{#@PIj$p$U2@ZLi-R_0oG=~vd zGm!MC=lE>Mg(NGFx|$lj#)G}ZwfVBHI29VC$vA)9OT#s0zB{Qox?{+JF{yBZwb4-N zC_?y9njEK;txiEfu|0mUXN<;Bsj2S?jrBeoHe+>O7O_W>cK(Yv06^E8UK$ien4OFk zrYIbKp|$AxG<<@!w$z8cX6Te@bG;EGqLXN@AY;)Hmlij@nAbtZaoD^viQJs>pwJ^kDKtEcGR$6+Cqo&8Z%1(|_ACY*>{t+B zKiffQCUzpx^y{RGL~D_7HM#ZxA_;L6b$?MRjSa z>GE$un>77AtCT&q$*v3$z(||X>y$4+7*+7t2Y*zxNVJ7#ejogAa@cOdI9^^GTAT7c=snAHb1{lS$dBh194-Y zW5AAnN3!(z7?=^pbLW+>vPbzRPmK+|}9;u~LXRcrw};(CAS0;|Rtj zKHaBZQ+sye{bOG5j-tkWJ)D7SXqIC9K)(I|A`qhqb%Bf zFjiqt^VV-i{!Eu$n@l`JL(hEQ;W{`}umMk`?J~kdfkbk%U{R0Eu`=22J_CqLRshd^OYdUitPlOoV+d{5D%2hF0%COdh5Xl}L z9X$(uhj@1_kJgZhTT064&vcjebZ26G1+PJs3h1I5!nx*gV(sB&fW188VM=Yek~kz=>1h`nRlnf3U$buOkmfn_A2MS zd#8nh0e*h&_lA9Bc(F~zr*R@~E_))LvL~<(W9pk2zm6g}g(NiAzj^ho5)>{7t znT7-f1>Xi8Mx-W}N^C$&jk+Jiq>lC#`TX=sB0{Y0#Eg;Nl#sf=+LV5G`a4ObFXC|>|h|R zQfRv8!~Rz1WVg$|Oc^Mo2VZ-LKK^i;0qd7(6tL%RZehVCC|EYyWqn4zHks{NUeSZe zesbooa7#0nAE0nct+axCsI%;igP_7mU zJ0{lhF8yh8UDd?vN(7P|K72`9+BlesMeFwM+qKF3=gy@LTFFEIBO}8O)_5*o{wB=e z;_b6IRxc@`Y-e{9PfnroPoh@5Z2Uf#Qo)61AxE`u+<1)}DsWlI$q`T=-x&L8)8QLX zKgW2MymZ(NN8z`+KsQ|HvM^BouWn2hRlKufNjQ;tIG{#ztf}kJgQ(0y&)D~V(lvI& zk`@At69u2nom+@iu3I0n9iBJX+u6VY+B4~4*PErtAm)^kC&|yR49Wi2ZoUfZ{}Yw6 ze@=<~S5)e^!Jd|`?zBg3dHE2*i!kUA?W(Pfi}zSy5n&k!=3eQa6ret3hLawuKC2)I!!^4cyRM$L9ySiOss93wCcJkS+M{C?W zhU`S*-#LuVeZ$kx(6k90hmC0j7Y=X@n+ z@D4$6r(ANlz{MfESAa0`Cw4K?|wgnu7 zhDXVyOPt`!nSY5f?E5u0H`nRqp4S_C=JE%7*=G2#`qAC{_tVhjR=@P&*!Jk6e|CAf z5UMEZz1JeyDHuiWHtw$#t>qc--R9un0P+MNR%NhZhe}0B5vy0dI6Qq2H8`&q7V9)5 z)l9qo@F0PrI#PidnVImy!kRfQ`|rg+9)-hx8TJ|`rD7hj+xXLqqN(axcdK*akj=3F zJws)6v{|6s+B4)g-|(yiEwrA!*kF)2IDH6QDp1~^RzCOVA;|B+cSRa3{$={LlrgnT zjgEFKA4rkSh`^()*~)pu$Y!{#0(R{iuC~H_F*omoyc|hh%{vS@9zH*2D-mSz=o|2t zmy{g?{B7p!G#(T?)YQZS&b`LsIuNfzgG?AecnJ9oW44vyogx+R8l$+$?J}d+95&cK zJaYR*W9Ys|V@Q3HcHSeJ8wqqogIS);!c>g-mp_IZMV+??3~_5(ZZ})KlE5pVndhKF zijRXe8nD#YG|<9JhG9PTElVh&tAx?Y|x-ZO-*g}GoxdU=i->f zYcj+tGhu2ATi_TuYSC+YdWW0+3H?W~+%X3v0UM*9!dBg^dsF-Y-=5QOuM#T9=OCAX zi#R7MyF;D znX!H83RJj~S8NJcpN)lWT)>`o$6G;#F6o0h)Ks3%BSFdsg!it_)?80SH6ohi+p!J7;^52l$Fvi&zrGiWHi5o$l=K$-EB1po_w^L0ZZLAQKZ02XAW*~}K1MqO z#G}6P{dG}L8(-&pkj-cR$&70HU#}jVnm9f_MRUnfIfQ+7`@Nx?b=MsfbLckOJs+3= z9138DX{xEEwYT3M@J9mWd@J@N*mLz=UP2Pl1Q3zHb+awGnaFaB4hCMm@>~DPTtMVj z2u_g_oBT_GS|I>foEX#~i^E(keCOPI|Fz1?NE1D567(@h3|xdXRk-B(8;6E1i%%^r zcOn@W85IjDW%NJ>wFWfHx; z2Yp~B=(rJ&Vf#2S=d_+)WkcRf$XK}k{;H~^6sA>ZV13^mV%*$9+rI2Su(I)B-=}_K%%{DhL(|u{&VRiu`K=B;GGQn3o23`R9!*`% z$N2A|kduX&JWv#Zv%Z0WIS9lCfNWOoI;{kb(cXGxV?Qho>a%uRm86J&dR8IkAhuS0 z-0s>)KCcja>yzgQVo^MQ8w~~Kp3)h07n?M%u6*JDn|@4_dqGV@lWEc%bW#dw3ZCb? zh;w!HTO?<3R!xn&_B_v!NQSj^-f>oR)Gg`=6>~l+Y15XlsmNMnqIpcWuG!rOfU{9Q zKS!GAfj2rQktUuPCZgHzCFvf7q0CT5Q5)D-7O{sAF+~XBwCwrZuF{^SPix^^$MJKT zU6MHeF{2&2S2j=93Tc$psaWGV5J)d?5bGT{4HquR(HXZhvP{ zJC@G?;ViWebrCncd z72l?L?!<``$N`$uNKpTq{%u=w1_DN$P+BnM+1x96VAh|apkW6ngT2%EB%t8Bi2OrzLT1UulEw0@P!$-cEM z6)(I1uKSB9f)8U6Ly9b&28>OL?Y}YrM2`O{t&|$Z{zMrF5u;hovNc%ajhlNd32SI{ zw{!u%L3WQKG<$tTj9%(W&;7N7&lXrn<%paHyMZQ~NOFKgG86RlyZdxb5`(jD z9Ke#0eNJk-71}#LZjk-t$;Idxt-RTf)Hjd@;3cJW2s~|P0Neq`NG@bKtAx{|!gy~E z@E8u2Jr0RJ7g2&EJs}3p!CxlT>IVP2+2Ddtkzqw^PGaGXmdvN=Z7i&jK*U6}7BCdg zvr<~=|3b|Z&gAYmwhIC3B$I-oz{DTNrN@6W5UM1&bvMSoD+GsW#T(Edtlf|tXzCK9 zkX86%stw%=wfV&T2ovmZ&@nbt1m$S(p?gxsHl|qnS znA)Z^N|w9Y4Z&hCO-Yn#S{;#^s`Zaf5!6@IXY&PDFvtigXgd5WYtM>K-wa6 zPcB+Q&uDr;YPUyY)Ysk9_4y$rg#vwwJycQ2epEZHXn?LNtm8|E^r9+4SIcm}8fNut!4&K0B;<3~DMHbjDXpJZT+cAdl$zSC7beo-Mg`;xC1KHp z7r&j@>K7GrE6>;JcUJ@fX~33Rr%lppUQYfa(mE?Nl60DxA*1H>^+`wzx|@%i9VShz zktd5k`axf3ny3jl&fw_;IdiGh32kKmky6}YC#a7$F8FG>mk+}!HsSLN>s5X{HI#KVY|DXQR zzIyfiG`2^88KmVb-2>Ha^?Rp9L0;Z4DT_I`#3K3_5;%)?;s!Xp-oK(cB^O?ivmh@X@o;j=rS<#giIh31qp~9BOR=MmS5VgY`&yb zE>+`LK_Y4R#yE5jh1wAOJ#t#)fz@z>n&0xCKSs?0_aL-Ns6YMbOrUPnS3bnJ35cN& zW_~$t+yYABjkTpGJc9(0ziUMTIyR9C(*pY#wers2Oi%+8m??1h*plG9#sU+Xqew11 z3ht9MP~Nf!8>^MTSL5O>&{B`;osUFP6k)wj9ABfLB=BQ3fa(_Z8aH>#x?r7Jt7d4& zEd&>;?Jit$13~g30oSCM5|%<8Jy7M)_|Ievn9LR$el=0lGJNTmT2rvyfRNA*1R`V) z@Se=yU?KPqh}3puQ7-?utsLUa^n&b{qbMv4YH2wl5*`QuK2hyN1BEc#-lFiYKC8Ux ze(Raa{kv~~N9VvM3u)si7$C7)RCDg2u^p~5p7KuQ`Q}HO>f`K~nmW(mz_;E(?^=W| zB4X0SWZjg+?o3ZL`}%}uGdFOyEg^|td-+0oKAOyKe^H26EIj@&Fp!wF8-{!A{6u-@ zIITVEQm|Xg$VZ}v^O0#knvIaT#|r%?3v#xJZuv*=Zx7BS&6`n%3p^r13LsJAdxGt( zeRg@N5ip%9fIN!3T&uXf73wFn(j#=5Th`}1I}*4E>C2_7u%CeMcZ*w;No#EE6n&7- zjv;P?6Kue}Q?NC@iYhxm7Jf8!@Ux1W|M1V*= zUoWfehuf$TIO212@fsRhc`K)FC6pxSr6TV)yMqR#AdF+8D?;ag5kW2ox?lVx^0@?R z%kcZatC{w-156s2eev6Fp|PVLz7M_3?Y(MoWC!mVP9av(sHt)6`a!<8^*GdljS1uY zW6l@z8W>~!z=#AOeXgcHfC`V*Q zRgQ|Ja|;68h3%oq4+tWY2ij;eBkD)GZHpCp2eMv*9b8QU9puRFY4rV8E@FnMzcRjf z8>R(2%w{jCNC6hRM7OI!dJhYU+Jep52-G(!?Jab1ch@S-3R|46c?q3bqJqI@iRl?- zN5_*_*z}qRCpbUl#xO|c2!hLlNZ&+=y7@fLUR2jLe+(@9KOY00atIf$i%PY*`uM`O zG`D28-e2)`jAiK7u>{y0_=o^syBp`?*FTYjOt8im&c)~Bi)PXa+b;85Aq9vKMpCY4 z?-%u(XD~H7{uuwZIF9nxw~QZ>)O1V(VbKpkCk3MAJG_v5{3n5~*ytEBTsZR3tmWaA z`f8^a5HnUY9ZcEp^@E<8_lTbtX|t%bHa5xJw;elz>3McX{U{4v$O-5T>H_e-gB4jY zW^l1t%wL*YQq{{R%=osb6z5%-R)_HLt}lM) z(xtG(cF0|VLv-!++qb#h-6{}g(g&T3@5q9R3cP6JRw%>(xhQ&G>$#|9V}nJ*Mku_9 zGrXerOqe+voG8?ujI9_-sCn2Fw7j`)U4yR~o5!6@IrAQr1qsndS-{=V2nVA2;pLw{ z?@R7){_#r_`R_UiV@9N=#(Xar(5&rk^ifxB%(PFM3rrMIs9lSy9Hzs7op$ zpve+Y*3wr4EkH$z-b7}sQP1`oUQ<&u)A`ru*|(NSszydhrKP1K%&4=B=B+q2k0y-H z5_x}8J`6;Os8LSfe60-M+v$DVp6ui2WUVh8+82J zOM1cbfCGQYt;r~FXirm13uGoyEh+L3m^%G{qiKiBhCzsbqmOdRxIo(N{j@=RV%l)f zhRTiOJ|5880JLVczq?g9Ea|fjwKbBNXaN$`CQ0G@@?*%zODo&(B+sMv`Um!CeTVRe zNe5}p+BMFs4_vFP@2odh4lz0~D{IFx7!ZKy9I2$l`#K@$+;qrr;gsas zv?DvluP2IUr(yWdh^nfIk>ti!`S0qnkJEZ+O-?#Wzk4hSYq8jVSOg7>QN+%$W#!Kw zprB=)WRst1rjmB^*@Xmy5Rgm5yVO-xxq}}wJ?7U^i7+fFIcY!U7@b}46bhHrQSx48 z)E^sP&6yxkiZo0durD=~@N zi^m&mNO~2Dmg6?E8`J+?&{G}d7Zd|C!+P%A^~HvrLJ5!g9F+43P+%XL;;CJzxpSKH zZg*Z$0~SCB6f(`zE*cOW_f7Zu^V`dp`7e)8isTwh+ko2;sdKNc(T*>nz{^2DX(v=! zB(Gt4bMI^6vbU43bhK9D_KWIX>+<314&QNt--6&yL46m2YSZ99HB3vK#Lq}0qoSa; zh^KzF=gxN5!LBk?k=gcSV7z~ZT%bO6Dh)C_hA7zMzfn7WiI-PV(6Upb$f*7+A0yG^ zE!_f0dwPrlTd>`sY!;k>8n0WT;G0x}kBv;&lboPJnYyqFBrS&_$ud9noOpP)Hu~Tn zj!>3dSH+6bv=62BOiRJ1q4J$K;B`COzIZ|2&+qs}tE+Rs*AYRQ4nT(LoPTblgkobSWs^tZ*$=oR|bb=)w`=&1a7lu&ad6&D(rMDm20!3gT*!=c5OOulv<} z=H?N)bs!m#&Yr7alh5s&GQ~%I{=e&61KuOB;bGfzqK0(QzgiaZAzefM!%J>JUCsh~ zh`TH=4%=80oE3g2hM;yXyrzy?dRiody|k0f^ZuVKlvNI-gZ4G~IF7kjwAo%4M2^kl zB){>3Z-MC06OmY12JE@LXvfa=J0)GZY8aL7Ztw9t$jn{M?Is!9SrDq@Ntr;8rRJFP zIKt1;Aq&E{ljjQabWz%0(7N)no;|c<0Ufk&6*!Jk1$cE`yWR5x!f&qKeW9NH@fL8c zuuy429;R7a*d3j4##*ZyzG0+*Jj~7a&K)U(=^8VxQU5Z)>~_^3AhsBPW4Lc0V(Uq4 z-!v<<+IXz8=7U1ZCK>9*B1?)SCsHVUi_fFvaSjZ9ZVC8P^}sHJj*0?%MXEzP%S!z0 z^thWt%fnyV1#>vb>*3=`1wa|BSEaqy8b|K)Qp4BNUM1K$K8V{Ots%Tw5swzyu+l$T?zA*YxQH50-Hz&wOcspz{`9X78?1UQ_uUxKV5mqboBG~E zQlzADj)BP{md5GL{liG$0aR@fxc(b$!ofp)8Y(8Fn0Sk#*hhU#Su)+9iBzA5R~>-M z!%h%W;l!Ze4bChZg{7elnEMNEP#sWPga?QZ9`p|tX01x;XATkJR+krzM71;5q20s>HC4Q#qXlnIC;q?>w5D@gmhCttG<+C@5_f4ti} z8jDqE&mH2n_47n)a|31MkcZ~GT?+9U;}6b1xK&eXT*`;{1G6fo97%09jqQOJ8=&GM zdD4wxsG(8g4vyK4=_cZUqb9ZKlf`mahP#9|kF5zBr#Vy-+ zEGPo4?-Tx72ZbBgZiNcx-hdX%X^BXrennG>%M!B{kFWfmR8())2TdrySrJp+*i9B?XS+~Ujj9d z5~?aQL4Dyl|J=Ce)E7NfQx=~LWy{c)3%NNF4s#Pzd>DgY&U8;mNN2k4DCFItGuG5F zP;EX4NIwGtr@zQ5(BB^rWo|-aQd=vZ22B=~{lfQy8X$RJBl%mb`1*Qr(y$MM~{Tgylj9TD#mSPxPLtTFpmO z*UOUd`#axoL8}I2he--n4438nY7Sn9CDe3JZsW3VUaSf5+_|!` z3=cGgtI9at2@O3E`>@R7qx_x4r%HcSMuf?y#l%*xYneKD_De{2F?P@X8Zik78i3ABuL@OWq^+1Ur_+iRBl4{4(HE=M^N6tde)nq}H#EUGP#$qW6Cp36BhMlehYHS_o=ry7o8JEe_jy z@@=d*^}arN&ilR-f1-qIn{F?<`Xz&iU090uW*EX6_q(j=VUJ*yqBY%X+@`R0LBE*3 z>}-&Ce+{5eSGlK9mQ4;F^*MWZlG(hBo@+Bz&6uTPZsMEk`f_v27l-Yd%d+0qLpl2{ zuD`M#!mzD;s3Uy37aq%PF9g4+d62muBrjBOgh40@IR2M_=~IrgXJwQ`?hOYA0h(`E-uXe$eP(76%rD<_3GS15UM#pD?At| zs46p*yPX$0v{ktnz11j3DN6o2Lp1rh#&_9=N^z)K@4iNU>#7@eHBzdz6<6KPfWb9f z@zj}oyuB#Pfs2tGO%#`er&4sOBRpo(54Jn^AE-3SNXBkH2GvrK;!gXhx=!S@Llv;B_Pl1T+-HC0J%7$^ zV^u7k|BIR%ZsR_n1l0f1c=o*?g*CmsDPp0p3?{~I5Is~^6@Uj8_^D5foZ>*6wts3X z1DC&V-FT?a^nOAD>?ZQ&DX~j<3OY$Ck}04}s8O{ta;yri*G2-ZFS5b~xhwnMd#56U ze)=W|sJPH~q5m<`zf=DIB8VyugF}ZiC?L>nA0Hn#$%lv` zGUNGka?86%(QjX3?o4W`&*J41^YqN7d-r**uC-vQb$&fUAOC8QaISKIt!!A|Vv)I{4D-q@(DuS{r=fu}4ggGcnjzdBG=S1`XFWp;V| zHpj{S;6;8!s2k#Dq20wiGKz;ILYK1Khi^bl4`t<2-Ma6!U zM>U`OR{-ztJH^(Cm{;gUM@FVWj141HZfk3clk|C4mi>3-ll*5LLYqkM|HT>SORK8V zDYNKMyL*-;|U4LKXJEpg|QloxeL1^Hx?|FlGa4Xeu6# zm+*T#5=RR(G@v;Hd1o-d7|twVzfv0w2}~{sT)%z$7ANkS1#5=mmA)&mEC@T_*Nk7i zdIiN>{Xmp!EudEjXYT*gC0zvRck~;_==e0`>NKrBXX^*4KqOZT79tQsTb0}lz_O^F=UERnVDZiS_ zmYrv>*rq~p->;GuW-e8vJT6!$~bt=^a*9RsujUdMbyjG|0TI8enJ$_s&( zr)FoDpY-78QNs6<=A(k{OaM7C2w6qI@iDB9j*jkxAx)H23h}w3MMq9SLH|g#E4qul zyuG;u1XMt*68^hlZz}>#&UjBJdZMSu?3}3HD!L_<+M7Z3bT2W$e9Sf ziWZsf?(WW;nwXdX>F+f*FE3F{5O)Qb7hXO-qSXtnuh`I@H|yx=ya7$o@h0vIATqru z$Mo=#BSS5~ON0|lN|EdIem3d;^(xVuc(=#6YFZbcl|_@;h8z z@d2t1U%z>iLv-j!gudXTM~{U5Mcz?$cduyw@}&PTn^hm`EOU{gxtxP3uJ>tH(;nUC_wq> z@G)vSx(gv+9XQ3rbkJjapr9Iyp`neH6>FJ=LDv)z5wt2DM&Udpl;>+`?7IxY>;@9sDjZ$JEhhF|O5Q;f zTU3NYaVy~FasiCFvrdRgPEJM_Ysl9H5|Ag!kt5jB(jF72j8&t3@##k&y-*QsRYi;M z6}H+JI$A5{!MYUHtvnxtlax@}?5VdE8c@k91Si>`sOrkD8jI`#{0~Q>`?mpMoCPjPpEKhs~CuVYhI5}Xy`twVAQ{&%)L*@DT zJWwfM1-fNrZA}wS%@GELKo~4jSXfvv^B}#*%E$UIOYr>_RC5CYcAkZWJ3dO~J;@b*DZCo{o}5 z$AgK7q@aW@FiCp%NdaA%M_F0f#r7dQoLgS5(Hu-w8NU1{#Tu#>_VG1AK}U3XXo1aB zRy0aP{_Ggpv195tZ$23)G|a54PO2g|Z)q!++s#?Azbl5r%_{E_4l513?IE+)t;Wes{Bh@@LP;fEQ)k5hskz z&HV=YZ8cbW_pe=XaVdp8-Ijl}5ej_Kw7}}BTV{5)EpWFYGvIeXHXn|}b!Xn8vmdR| z)UR~V1eUT=(zRS*VQZtNQ_T7NTjA!>QA2PN`dJP(6+q&-b#(@?rIJAB3t9KDyVO1f zHQ*Cc8dSgum)9#^{OdQ>Y<6Buq150+9u zSE1$9gJqUief0P^goHF;JvP{#3F4uBu@~?jB@W*IM4oufOAQ6jcenls15w;k5yxR> zX^F3%PKt_+jg>6IH^Q-3*o=%PU*l9%R8nZTwJri5m+7j92Iy^CexrP5N$=w13Ka|{ zL_VCkWBLy*+A#37n56v;#>U3tu9!a`d+>__^mXK*qCvg4W}a3-4{8En4&l@-E)EVk zDJiM{Rm#=yGp6cOpJz2jH$*tOc_j#@nc(xQEY4%3Q`JfWvN)FNY!>KTr^k- zE@O159hY`tj#&wJ5y(o3mSQOdquHX1D6Rv>EuRaq0wP4)QmIwXtNQ^a`vJFU-}kxa zIZvN+&R9__0<{Q22wsNOywl3nUBrq)R^#fy21HSP8WRovud^a`%BdLU+ZkSu1wr$t0#%GBO;tPuQW1%^s}IQ zI4W_uTn2;Ts&$D4Wz!(NLWKSXqp=6#tW%>mV6n{Hj6?u=MD7SK6TjtXH8E>p zza*xk&w*QB6#Z}37h?(HJ$t&bD7b5g<><;m-F4P|u;!rrmakaRK&&X>KvHC{#U&}3 z4^$<4`}_OF>FIs0ll}m!v2SlLLPaXwMK;ethG8BB#=Y#d!zP%*7+i8T*=ObD)e?Wm zv7vSaZLX}WMFogxQiM@KG$4h_KljVt);qpJ*e;H%d62OREVat;Y=Uj$CK3y7k{{4HPoDUUhraO zSImM1w=tsmQ(n2C-UhI(8X5*a;A-(!B490EP;z}>aIoh}I@j~`&qTIWYmK%o6#*YI z(a8b1X0w?mnnQRU`}zBv9lmF}5aygF|Ja=>KA)cnvjzSjS$w*97G7qKFQuq;h#ZuBPDO-Jd2N)RptbXGU+?*y9lH z$ucrVHe_dHtfnX`IOS`VO~-I_X?P(@+dZDbCj;9ty)?peK{R#DHJ{OF{In$8EC`Rx$0gJ|9DjGLy0rnfi9El?l|yThwufH9!X|@@ zk<@IfCGtUt;GWLTc52Q+5qg@;l4%z=i||SD8xMTb5&k!Jw@_GspM)aJ0S4hH>cD)@ z!bTYClYbmnu5F&^wf(G*PO1{o1kk&BK!^fxmuOhW5f-LJ;uyqvfj>!z6c#Mv@$|_r z0p?^#!0@5D{lgkE)#&HE)&jV5miVHF(~Qv3RsA0JFVm1=Xe4>`ZHn2u&Nz7H9S7p) YDawkkdK|f}@#GoNZb@p>&i!St0WT^+IsgCw From da34cc0470c5dbd2e58bfe033e945320212923d3 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 15 Oct 2016 14:56:52 +0800 Subject: [PATCH 11/24] Update report.md --- report.md | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/report.md b/report.md index 52db138..46532dd 100644 --- a/report.md +++ b/report.md @@ -1,6 +1,41 @@ # Policy gradient report +- Problem 1~4: +Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. +Problem 1: construct a simple two layer FC layer for policy prediction +``` +h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) +h2 = tf.contrib.layers.fully_connected(h1, num_outputs=out_dim, activation_fn=None) +probs = tf.nn.softmax(h2) +``` +Use a simple two-layer perceptrons to embed from state space to action space. + +Problem 2: surrogate loss +``` +surr_loss = tf.reduce_mean(tf.mul(log_prob, self._advantages)) +``` +compute the surrogate loss and use optimizer to maximize it. +Problem 3: accumulated reward +``` +def discount_cumsum(x, discount_rate): + discounted_r = np.zeros(len(x)) + num_r = len(x) + for i in range(num_r): + discounted_r[i] = x[i]*math.pow(discount_rate,i) + discounted_r = np.cumsum(discounted_r[::-1]) + return discounted_r[::-1] +``` +Use the numpy cumcum is quite simple and remember to reverse the array. +Problem 4: +``` +a = r - b +``` +where a is the advantage function, r is the accumulated reward, and b is the predicted baseline. + - Problem 5: -Here I compare the result of with/without variance reduction: -

+Here I compare the result of with/without variance reduction: + +|With baseline|Wihtout baseline| +|---|---| +||| From 602812b1702a7192289d0ca5f45648d66d54b222 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 15 Oct 2016 15:00:45 +0800 Subject: [PATCH 12/24] Update report.md --- report.md | 58 +++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/report.md b/report.md index 46532dd..e1763ff 100644 --- a/report.md +++ b/report.md @@ -1,36 +1,36 @@ # Policy gradient report - Problem 1~4: -Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. -Problem 1: construct a simple two layer FC layer for policy prediction -``` -h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) -h2 = tf.contrib.layers.fully_connected(h1, num_outputs=out_dim, activation_fn=None) -probs = tf.nn.softmax(h2) -``` -Use a simple two-layer perceptrons to embed from state space to action space. +Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. + - Problem 1: construct a simple two layer FC layer for policy prediction + ``` + h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) + h2 = tf.contrib.layers.fully_connected(h1, num_outputs=out_dim, activation_fn=None) + probs = tf.nn.softmax(h2) + ``` + Use a simple two-layer perceptrons to embed from state space to action space. -Problem 2: surrogate loss -``` -surr_loss = tf.reduce_mean(tf.mul(log_prob, self._advantages)) -``` -compute the surrogate loss and use optimizer to maximize it. -Problem 3: accumulated reward -``` -def discount_cumsum(x, discount_rate): - discounted_r = np.zeros(len(x)) - num_r = len(x) - for i in range(num_r): - discounted_r[i] = x[i]*math.pow(discount_rate,i) - discounted_r = np.cumsum(discounted_r[::-1]) - return discounted_r[::-1] -``` -Use the numpy cumcum is quite simple and remember to reverse the array. -Problem 4: -``` -a = r - b -``` -where a is the advantage function, r is the accumulated reward, and b is the predicted baseline. + - Problem 2: surrogate loss + ``` + surr_loss = tf.reduce_mean(tf.mul(log_prob, self._advantages)) + ``` + compute the surrogate loss and use optimizer to maximize it. + - Problem 3: accumulated reward + ``` + def discount_cumsum(x, discount_rate): + discounted_r = np.zeros(len(x)) + num_r = len(x) + for i in range(num_r): + discounted_r[i] = x[i]*math.pow(discount_rate,i) + discounted_r = np.cumsum(discounted_r[::-1]) + return discounted_r[::-1] + ``` + Use the numpy cumcum is quite simple and remember to reverse the array. + - Problem 4: + ``` + a = r - b + ``` + where a is the advantage function, r is the accumulated reward, and b is the predicted baseline. - Problem 5: Here I compare the result of with/without variance reduction: From 6001279c2233bef3fdbc7891997cb90ff1b0a357 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 15 Oct 2016 15:30:52 +0800 Subject: [PATCH 13/24] Update report.md --- report.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/report.md b/report.md index e1763ff..f58d6b0 100644 --- a/report.md +++ b/report.md @@ -39,3 +39,12 @@ Here I compare the result of with/without variance reduction: |---|---| ||| +- Problem 6: +The reseaon why we need to standardize the advantage function is that when we calculate the accumulated reward, the immediate reward that we get is exponentially discounted by the discounted factor. This action in latter stage can't learn effeciently. So, If we standardize the advantage function over time steps, it's expected that we always encourage and discourage half of actions (since we substract the mean). + +## Reference +[Deep Reinforcement Learning: Pong from Pixels](karpathy.github.io/2016/05/31/rl/) + + + + From 374eea02764f64ef85ff42b716bbb013ef958a52 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 15 Oct 2016 17:10:25 +0800 Subject: [PATCH 14/24] Update report.md --- report.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/report.md b/report.md index f58d6b0..7729770 100644 --- a/report.md +++ b/report.md @@ -38,7 +38,10 @@ Here I compare the result of with/without variance reduction: |With baseline|Wihtout baseline| |---|---| ||| - +This figure implies the variance of the case with and without baseline. I run each case for 10 times and record the return reward over each iteration(if the game reaches over 195, the game terminates). The solid line denotes the average return reward through iteration. The upper line implies the max return reward in that iteration, while the lower line implies the min retrun reward in that iteration. + + - The result is not quite apparent, and I guess that I should run the games for 100 iteration(fixed iteration) for the 10 gmaes and plot the figure + - Problem 6: The reseaon why we need to standardize the advantage function is that when we calculate the accumulated reward, the immediate reward that we get is exponentially discounted by the discounted factor. This action in latter stage can't learn effeciently. So, If we standardize the advantage function over time steps, it's expected that we always encourage and discourage half of actions (since we substract the mean). From d83755f69157848682c96edb495ee9cd377bdbd5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 15 Oct 2016 17:11:22 +0800 Subject: [PATCH 15/24] Update report.md --- report.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/report.md b/report.md index 7729770..0e54d4a 100644 --- a/report.md +++ b/report.md @@ -1,6 +1,6 @@ # Policy gradient report -- Problem 1~4: +## Problem 1~4: Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. - Problem 1: construct a simple two layer FC layer for policy prediction ``` @@ -32,17 +32,16 @@ Implement a simple agent with REINFORCE algorithm, which uses the MC sampling an ``` where a is the advantage function, r is the accumulated reward, and b is the predicted baseline. -- Problem 5: +## Problem 5: Here I compare the result of with/without variance reduction: |With baseline|Wihtout baseline| |---|---| ||| -This figure implies the variance of the case with and without baseline. I run each case for 10 times and record the return reward over each iteration(if the game reaches over 195, the game terminates). The solid line denotes the average return reward through iteration. The upper line implies the max return reward in that iteration, while the lower line implies the min retrun reward in that iteration. +This figure implies the variance of the case with and without baseline. I run each case for 10 times and record the return reward over each iteration(if the game reaches over 195, the game terminates). The solid line denotes the average return reward through iteration. The upper line implies the max return reward in that iteration, while the lower line implies the min retrun reward in that iteration. +P.S. The result is not quite apparent, and I guess that I should run the games for 100 iteration(fixed iteration) for the 10 gmaes and plot the figure - - The result is not quite apparent, and I guess that I should run the games for 100 iteration(fixed iteration) for the 10 gmaes and plot the figure - -- Problem 6: +## Problem 6: The reseaon why we need to standardize the advantage function is that when we calculate the accumulated reward, the immediate reward that we get is exponentially discounted by the discounted factor. This action in latter stage can't learn effeciently. So, If we standardize the advantage function over time steps, it's expected that we always encourage and discourage half of actions (since we substract the mean). ## Reference From e2b8021196c4381e4925eb746fe6f4674035a960 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 15 Oct 2016 17:28:19 +0800 Subject: [PATCH 16/24] Update report.md --- report.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/report.md b/report.md index 0e54d4a..fa8a8f3 100644 --- a/report.md +++ b/report.md @@ -2,20 +2,20 @@ ## Problem 1~4: Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. - - Problem 1: construct a simple two layer FC layer for policy prediction + - Problem 1: construct a simple two layer FC layer for policy prediction ``` + h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) h2 = tf.contrib.layers.fully_connected(h1, num_outputs=out_dim, activation_fn=None) probs = tf.nn.softmax(h2) - ``` - Use a simple two-layer perceptrons to embed from state space to action space. - - - Problem 2: surrogate loss + ``` + Use a simple two-layer perceptrons to embed from state space to action space. + - Problem 2: surrogate loss ``` surr_loss = tf.reduce_mean(tf.mul(log_prob, self._advantages)) - ``` - compute the surrogate loss and use optimizer to maximize it. - - Problem 3: accumulated reward + ``` + compute the surrogate loss and use optimizer to maximize it. + - Problem 3: accumulated reward ``` def discount_cumsum(x, discount_rate): discounted_r = np.zeros(len(x)) @@ -24,12 +24,12 @@ Implement a simple agent with REINFORCE algorithm, which uses the MC sampling an discounted_r[i] = x[i]*math.pow(discount_rate,i) discounted_r = np.cumsum(discounted_r[::-1]) return discounted_r[::-1] - ``` - Use the numpy cumcum is quite simple and remember to reverse the array. - - Problem 4: + ``` + Use the numpy cumcum is quite simple and remember to reverse the array. + - Problem 4: ``` a = r - b - ``` + ``` where a is the advantage function, r is the accumulated reward, and b is the predicted baseline. ## Problem 5: From e72ff4ad7156a9554a7b43d3a19cb7b23f2056e8 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 15 Oct 2016 17:59:13 +0800 Subject: [PATCH 17/24] Update report.md --- report.md | 82 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/report.md b/report.md index fa8a8f3..a848521 100644 --- a/report.md +++ b/report.md @@ -1,38 +1,46 @@ # Policy gradient report -## Problem 1~4: -Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. - - Problem 1: construct a simple two layer FC layer for policy prediction - ``` - h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) - h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) - h2 = tf.contrib.layers.fully_connected(h1, num_outputs=out_dim, activation_fn=None) - probs = tf.nn.softmax(h2) - ``` - Use a simple two-layer perceptrons to embed from state space to action space. - - Problem 2: surrogate loss - ``` - surr_loss = tf.reduce_mean(tf.mul(log_prob, self._advantages)) - ``` - compute the surrogate loss and use optimizer to maximize it. - - Problem 3: accumulated reward - ``` - def discount_cumsum(x, discount_rate): - discounted_r = np.zeros(len(x)) - num_r = len(x) - for i in range(num_r): +## Problem 1~4 +Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. + +- Problem 1: construct a simple two layer FC layer for policy prediction + +``` +h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) +h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) +h2 = tf.contrib.layers.fully_connected(h1, num_outputs=out_dim, activation_fn=None) +probs = tf.nn.softmax(h2) +``` +Use a simple two-layer perceptron to embed state to action space + +- Problem 2: surrogate loss + +``` +surr_loss = tf.reduce_mean(tf.mul(log_prob, self._advantages)) +``` +Compute the surrogate loss and use optimizer to maximize it. + +- Problem 3: accumulated reward + +``` +def discount_cumsum(x, discount_rate): + discounted_r = np.zeros(len(x)) + num_r = len(x) + for i in range(num_r): discounted_r[i] = x[i]*math.pow(discount_rate,i) - discounted_r = np.cumsum(discounted_r[::-1]) - return discounted_r[::-1] - ``` - Use the numpy cumcum is quite simple and remember to reverse the array. - - Problem 4: - ``` - a = r - b - ``` - where a is the advantage function, r is the accumulated reward, and b is the predicted baseline. - -## Problem 5: + discounted_r = np.cumsum(discounted_r[::-1]) + return discounted_r[::-1] +``` + +- Problem 4: Advantage function + +``` +a = r - b +``` +where a is the advantage function, r is the accumulated reward, and b is the predicted baseline. + +## Problem 5 + Here I compare the result of with/without variance reduction: |With baseline|Wihtout baseline| @@ -40,13 +48,11 @@ Here I compare the result of with/without variance reduction: ||| This figure implies the variance of the case with and without baseline. I run each case for 10 times and record the return reward over each iteration(if the game reaches over 195, the game terminates). The solid line denotes the average return reward through iteration. The upper line implies the max return reward in that iteration, while the lower line implies the min retrun reward in that iteration. P.S. The result is not quite apparent, and I guess that I should run the games for 100 iteration(fixed iteration) for the 10 gmaes and plot the figure - -## Problem 6: -The reseaon why we need to standardize the advantage function is that when we calculate the accumulated reward, the immediate reward that we get is exponentially discounted by the discounted factor. This action in latter stage can't learn effeciently. So, If we standardize the advantage function over time steps, it's expected that we always encourage and discourage half of actions (since we substract the mean). - -## Reference -[Deep Reinforcement Learning: Pong from Pixels](karpathy.github.io/2016/05/31/rl/) +## Problem 6 +The reseaon why we need to standardize the advantage function is that when we calculate the accumulated reward, the immediate reward that we get is exponentially discounted by the discounted factor. This action in latter stage can't learn effeciently. So, If we standardize the advantage function over time steps, it's expected that we always encourage and discourage half of actions (since we substract the mean). +## Reference +[Deep Reinforcement Learning: Pong from Pixels](karpathy.github.io/2016/05/31/rl/) From de3e285efada00db199daaf56de45e1e3b6c80e5 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 15 Oct 2016 18:08:25 +0800 Subject: [PATCH 18/24] Update report.md --- report.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/report.md b/report.md index a848521..431032c 100644 --- a/report.md +++ b/report.md @@ -1,7 +1,7 @@ # Policy gradient report +Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. ## Problem 1~4 -Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. - Problem 1: construct a simple two layer FC layer for policy prediction @@ -46,8 +46,12 @@ Here I compare the result of with/without variance reduction: |With baseline|Wihtout baseline| |---|---| ||| +

X-axis: iteration, Y-axis: return reward

+ This figure implies the variance of the case with and without baseline. I run each case for 10 times and record the return reward over each iteration(if the game reaches over 195, the game terminates). The solid line denotes the average return reward through iteration. The upper line implies the max return reward in that iteration, while the lower line implies the min retrun reward in that iteration. -P.S. The result is not quite apparent, and I guess that I should run the games for 100 iteration(fixed iteration) for the 10 gmaes and plot the figure +**P.S.** The result is not quite apparent, and I guess that I should run the games for 100 iteration(fixed iteration) for the 10 gmaes and plot the figure +**P.S.** Why we need these variance reduction? Here, we're using REINFORCE, which is known to be with high variance (highly depends on your initial samples) +**P.S.** Actually, the results highly depends on the initial parameter. If the initial return reward is around 30, the agent can reach 195 around 70 iterations; If the initial return reward is around 15, it'll take about 100 iterartion to reach 195. ## Problem 6 From 283f2ed5cd001e8d28f789ad4e12b0262343b090 Mon Sep 17 00:00:00 2001 From: James Chuang Date: Sun, 16 Oct 2016 16:07:17 +0800 Subject: [PATCH 19/24] Update report.md --- report.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/report.md b/report.md index 431032c..77b7fdf 100644 --- a/report.md +++ b/report.md @@ -4,8 +4,8 @@ Implement a simple agent with REINFORCE algorithm, which uses the MC sampling an ## Problem 1~4 - Problem 1: construct a simple two layer FC layer for policy prediction - -``` +Here we use 2-layer neural network to represent the policy. Make sure you add softmax layer to represent probability distribution. +```python h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) h2 = tf.contrib.layers.fully_connected(h1, num_outputs=out_dim, activation_fn=None) @@ -14,15 +14,15 @@ probs = tf.nn.softmax(h2) Use a simple two-layer perceptron to embed state to action space - Problem 2: surrogate loss - +Since the optimizer in Tensorflow only support minimizing loss (gradient descent), so we simply add a minus sign to represent **gradient ascent**. +```python +surr_loss = -tf.reduce_mean(tf.mul(log_prob, self._advantages)) ``` -surr_loss = tf.reduce_mean(tf.mul(log_prob, self._advantages)) -``` -Compute the surrogate loss and use optimizer to maximize it. - Problem 3: accumulated reward +Construct a simple for-loop to calculate the accumulated discounted from the end of the game to the start. -``` +```python def discount_cumsum(x, discount_rate): discounted_r = np.zeros(len(x)) num_r = len(x) @@ -34,7 +34,7 @@ def discount_cumsum(x, discount_rate): - Problem 4: Advantage function -``` +```python a = r - b ``` where a is the advantage function, r is the accumulated reward, and b is the predicted baseline. @@ -55,7 +55,7 @@ This figure implies the variance of the case with and without baseline. I run ea ## Problem 6 -The reseaon why we need to standardize the advantage function is that when we calculate the accumulated reward, the immediate reward that we get is exponentially discounted by the discounted factor. This action in latter stage can't learn effeciently. So, If we standardize the advantage function over time steps, it's expected that we always encourage and discourage half of actions (since we substract the mean). +The reseaon why we need to standardize the advantage function is that when we calculate the accumulated reward, the immediate reward that we get is exponentially discounted by the discounted factor. This action in latter stage can't learn effeciently. So, If we standardize the advantage function over time steps, in this way we’re always encouraging and discouraging roughly half of the performed actions. Mathematically you can also interpret these tricks as a way of controlling the variance of the policy gradient estimator. ## Reference From 4d009542f2d2a4530730f763de5ed373a28e4ad3 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 16 Oct 2016 21:25:02 +0800 Subject: [PATCH 20/24] Update report.md --- report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/report.md b/report.md index 77b7fdf..388f710 100644 --- a/report.md +++ b/report.md @@ -1,4 +1,5 @@ # Policy gradient report +Member: 廖元宏(102061137), 莊景堯(102061145) Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. ## Problem 1~4 From 6fdd768436242567635a9c69ee33ff1ef5d4ac00 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 16 Oct 2016 21:25:15 +0800 Subject: [PATCH 21/24] Update report.md --- report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report.md b/report.md index 388f710..a1e5664 100644 --- a/report.md +++ b/report.md @@ -1,5 +1,5 @@ # Policy gradient report -Member: 廖元宏(102061137), 莊景堯(102061145) +Member: 廖元宏(102061137), 莊景堯(102061145)   Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. ## Problem 1~4 From 7cf40335f5446e26e5f2995e7d9c1facc4352885 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 16 Oct 2016 21:25:33 +0800 Subject: [PATCH 22/24] Update report.md --- report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/report.md b/report.md index a1e5664..8bb6dcf 100644 --- a/report.md +++ b/report.md @@ -1,5 +1,5 @@ # Policy gradient report -Member: 廖元宏(102061137), 莊景堯(102061145)   +Member: 廖元宏(102061137), 莊景堯(102061145)   Implement a simple agent with REINFORCE algorithm, which uses the MC sampling and policy gradient. ## Problem 1~4 From 5b1363dee2cd8a60470830efcbcbdbb6568bf1b6 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 16 Oct 2016 22:01:46 +0800 Subject: [PATCH 23/24] Update report.md --- report.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/report.md b/report.md index 8bb6dcf..ae4bfed 100644 --- a/report.md +++ b/report.md @@ -56,8 +56,18 @@ This figure implies the variance of the case with and without baseline. I run ea ## Problem 6 -The reseaon why we need to standardize the advantage function is that when we calculate the accumulated reward, the immediate reward that we get is exponentially discounted by the discounted factor. This action in latter stage can't learn effeciently. So, If we standardize the advantage function over time steps, in this way we’re always encouraging and discouraging roughly half of the performed actions. Mathematically you can also interpret these tricks as a way of controlling the variance of the policy gradient estimator. +The reseaon why we need to standardize the advantage function is that when we calculate the accumulated reward, the immediate reward that we get is exponentially discounted by the discounted factor. This action in latter stage can't learn effeciently. So, If we standardize the advantage function over time steps, in this way we’re always encouraging and discouraging roughly half of the performed actions. Mathematically you can also interpret these tricks as a way of controlling the variance of the policy gradient estimator.   +**Additional survey on general advantage estimation(GAE):**   +- ***High-Dimensional Continuous Control Using Generalized Advantage Estimation*** [[ICLR 2016]](https://arxiv.org/abs/1506.02438) + - John Schulman, Philipp Moritz, Sergey Levine, Michael Jordan, Pieter Abbeel + - In extremely high dimensional task(like continuous control in 3D environment), stability is a key point. + - Propose an effective variance reduction scheme for policy gradients, which called generalized advantage estimation (GAE) + - Motivation of GAE: Supposed we have fixed length of steps, from eq.15, we know that the bias of each advantage function is **k-dependent**. So, as k increases, the biased term becomes more ignorable, while the variance increases and vice versa. (if you found this concept is abstract, think of MC is unbiased but with high variance, while TD is biased, but with los variance) + - ***λ*** is a new concept included in this paper. + - If λ = 0 (like eq.17), then we have low variance, and is biased + - If λ = 1 (like eq.18), then we have high variance, and is unbased ## Reference -[Deep Reinforcement Learning: Pong from Pixels](karpathy.github.io/2016/05/31/rl/) +- [Deep Reinforcement Learning: Pong from Pixels](karpathy.github.io/2016/05/31/rl/) +- [Deep-Reinforcement-Learning-Survey](https://github.com/andrewliao11/Deep-Reinforcement-Learning-Survey) From 90a371108a4f23108e3da9d49a3091b3c48c8392 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sun, 16 Oct 2016 23:27:10 +0800 Subject: [PATCH 24/24] Update report.md --- report.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/report.md b/report.md index ae4bfed..c5f64a7 100644 --- a/report.md +++ b/report.md @@ -6,8 +6,7 @@ Implement a simple agent with REINFORCE algorithm, which uses the MC sampling an - Problem 1: construct a simple two layer FC layer for policy prediction Here we use 2-layer neural network to represent the policy. Make sure you add softmax layer to represent probability distribution. -```python -h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) +```python h1 = tf.contrib.layers.fully_connected(self._observations, num_outputs=hidden_dim, activation_fn=tf.tanh) h2 = tf.contrib.layers.fully_connected(h1, num_outputs=out_dim, activation_fn=None) probs = tf.nn.softmax(h2)