Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save kevindavenport/5cee0e20586b345abba298a1026dd49d to your computer and use it in GitHub Desktop.
Save kevindavenport/5cee0e20586b345abba298a1026dd49d to your computer and use it in GitHub Desktop.
Reproducing Sutton's Temporal Difference Learning on http://kldavenport.com
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![alt text](http://kldavenport.com/wp-content/uploads/2018/02/mdp-chain.png \"Title\")\n",
"Figure 2 from the book. A generator of bounded random walks. This Markov process generated the data sequences in the example. All walks begin in state D. From states B, C, D, E, and F, the walk has a 50% chance of moving either to the right or to the left. If either edge state, A or G, is entered, then the walk terminates.\n",
"\n",
"#### Setting up our environment"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import math, sys, json, random \n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib \n",
"import matplotlib.style\n",
"import matplotlib.pyplot as plt\n",
"# import seaborn as sns\n",
"from sklearn.externals import joblib # Still better than pickle in 2018?\n",
"# To protect from IPython kernel switching mistakes\n",
"from __future__ import division\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Utility Functions\n",
"We implement the TD Lambda algorithm below as `tdlEstimate` the image below is from chapter 6 of the Sutton textbook.\n",
"![alt text](http://kldavenport.com/wp-content/uploads/2018/02/td0-algo.png \"Title\")\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# TD Lambda\n",
"def tdlEstimate(alpha, _lambda, state_sequence, values):\n",
" \"\"\"\n",
" alphas: array of arbitrary values (e.g. 0.005, 0.01, 0.015)\n",
" _lambda: chosen from an arbitrary array (e.g. 0.1, 1)\n",
" state sequence: an array chosen from an arbitrary set of sequence simulations such as [3, 4, 5, 6] or \\\n",
" [3, 4, 3, 2, 3, 4, 3, 4, 5, 6] per the MDP figure 2 above.\n",
" returns: \"\"\"\n",
" \n",
" # Per figure 2, we have 7 possible states, with two of them being end states (A,G)\n",
" \n",
" eligibility = np.zeros(7)\n",
" updates = np.zeros(7)\n",
"\n",
" for t in range(0, len(state_sequence) - 1):\n",
" current_state = state_sequence[t]\n",
" next_state = state_sequence[t+1]\n",
"\n",
" eligibility[current_state] += 1.0\n",
"\n",
" td = alpha * (values[next_state] - values[current_state])\n",
"\n",
" updates += td * eligibility\n",
" eligibility *= _lambda\n",
"\n",
" return updates\n",
"\n",
"# Simulator to generate random walk sequences in our MDP defined in fig 2 above\n",
"states = ['A', 'B', 'C', 'D', 'E', 'F', 'G']\n",
"\n",
"def simulate():\n",
" \"\"\"returns: a sequence of states picked from a uniform random sample such as \n",
" [3, 2, 1, 0] or [3, 4, 3, 4, 3, 4, 5, 6]\n",
" \"\"\"\n",
" states = [3] # Start in center at \"D\"\n",
" while states[-1] not in [0, 6]:\n",
" states.append(states[-1] + (1 if random.choice([True, False]) else -1)) # go left or right randomly\n",
"\n",
" return states"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Setup data for plots\n",
"\n",
"random.seed(101)\n",
"# pg.20 gives true probabilities for states B, C, D, E, F\n",
"# truth = np.arange(1, 6) / 6.0\n",
"truth = [1 / 6, 1 / 3, 1 / 2, 2 / 3, 5 / 6]\n",
"\n",
"dtype = np.float\n",
"\n",
"num_train_sets = 100\n",
"num_sequences = 10 # or episodes\n",
"\n",
"training_sets = [[simulate() for i in range(num_sequences)] for i in range(num_train_sets)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Figure 3 Page 20"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Figure 3\n",
"alphas = np.array([0.005, 0.01, 0.015], dtype=dtype)\n",
"lambdas = np.array([0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0], dtype=dtype) # given in figure 3 caption\n",
"\n",
"results = []\n",
"\n",
"for _lambda in lambdas:\n",
" for alpha in alphas:\n",
" rmses = []\n",
" for training_set in training_sets:\n",
" # values initialized to zero and updates via tdlEstimate\n",
" values = np.zeros(7, dtype=dtype)\n",
" iterations = 0\n",
" \n",
" while True:\n",
" iterations += 1\n",
" before = np.copy(values)\n",
" updates = np.zeros(7, dtype=dtype)\n",
" # The reward for reaching state \"G\" (element 7)\n",
" values[6] = 1.0\n",
"\n",
" for sequence in training_set: \n",
" updates += tdlEstimate(alpha, _lambda, sequence, values)\n",
"\n",
" values += updates\n",
" diff = np.sum(np.absolute(before - values))\n",
"\n",
" if diff < .000001:\n",
" break\n",
"\n",
" estimate = np.array(values[1:-1], dtype=dtype)\n",
" error = (truth - estimate)\n",
" rms = np.sqrt(np.average(np.power(error, 2)))\n",
" rmses.append(rms)\n",
"\n",
" result = [_lambda, alpha, np.mean(rmses), np.std(rmses)]\n",
" results.append(result)\n",
"\n",
"# outputs\n",
"# joblib.dump(results, 'results.pkl') "
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>lambda</th>\n",
" <th>alpha</th>\n",
" <th>rms</th>\n",
" <th>rmsstd</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.0</td>\n",
" <td>0.00</td>\n",
" <td>0.235702</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.0</td>\n",
" <td>0.05</td>\n",
" <td>0.175010</td>\n",
" <td>0.002556</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.0</td>\n",
" <td>0.10</td>\n",
" <td>0.131192</td>\n",
" <td>0.009537</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.0</td>\n",
" <td>0.15</td>\n",
" <td>0.103448</td>\n",
" <td>0.020459</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.0</td>\n",
" <td>0.20</td>\n",
" <td>0.091540</td>\n",
" <td>0.033838</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" lambda alpha rms rmsstd\n",
"0 0.0 0.00 0.235702 0.000000\n",
"1 0.0 0.05 0.175010 0.002556\n",
"2 0.0 0.10 0.131192 0.009537\n",
"3 0.0 0.15 0.103448 0.020459\n",
"4 0.0 0.20 0.091540 0.033838"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# results = joblib.load('results.pkl') \n",
"data = pd.DataFrame(results)\n",
"data.columns = [\"lambda\", \"alpha\", \"rms\", \"rmsstd\"]\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data = data[data.groupby(['lambda'])['rms'].transform(min) == data['rms']].set_index(keys=['lambda'])\n",
"data.drop('alpha', 1, inplace=True,)\n",
"data.drop('rmsstd', 1,inplace=True,)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"I repeatedly calculated the TD equation on a given set until the RMSE between the weights (new values) and the ideal probabilities was less than my arbitrary threshold. \n",
"The values and trend are very similar to the original but more tweaking to my environment assumptions might have improved the similarity. Given more time and intellect I’d like to do a random search of a space of hyper-parameters and see what most closely approximates the original. RMS error increases with non-linearity in relation to lambda. The initial curtailing isn’t the same as Sutton with lambda 0 performing the best out right.\n",
"\n",
"If we choose to imitate figure 3 literally we get the below. I would prefer grid lines though, which is just a matter of using default seaborn aesthetics."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x116d60e80>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# sns.set_style(\"white\")\n",
"plt.figure(num=None, figsize=(10, 6), dpi=72)\n",
"plt.margins(.05)\n",
"plt.xlabel(r\"$\\lambda$\")\n",
"plt.ylabel(\"RMS\")\n",
"plt.title(\"Figure 3\")\n",
"plt.xticks([i * .1 for i in range(0, 10)])\n",
"plt.yticks([i * .01 for i in range(10, 19)])\n",
"plt.text(.79, .17, \"Widrow-Hoff\", ha=\"center\", va=\"center\", rotation=0,size=15)\n",
"plt.text(-.22, .174, \"ERROR\\nUSING\\nBEST α\",size=15)\n",
"plt.plot(data,marker='o');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Figure 5 Page 21"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 3 µs, sys: 1 µs, total: 4 µs\n",
"Wall time: 5.96 µs\n"
]
}
],
"source": [
"%time \n",
"alphas = [0.05 * i for i in range(0,16)]\n",
"lambdas = [0.05 * i for i in range(0, 21)]\n",
"\n",
"results = []\n",
"\n",
"for _lambda in lambdas:\n",
" for alpha in alphas:\n",
" rms_vals = []\n",
" for training_set in training_sets:\n",
"\n",
" values = np.array([0.5 for i in range(7)])\n",
"\n",
" for sequence in training_set:\n",
" values[0] = 0.0\n",
" values[6] = 1.0\n",
" values += tdlEstimate(alpha, _lambda, sequence, values)\n",
"\n",
" estimate = np.array(values[1:-1])\n",
" error = (truth - estimate)\n",
" rms = np.sqrt(np.average(np.power(error, 2)))\n",
"\n",
" rms_vals.append(rms)\n",
"\n",
" result = [_lambda, alpha, np.mean(rms_vals), np.std(rms_vals)]\n",
" results.append(result)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"Here we reiterate that larger lambda values perform better via smaller learning rates. I believe this is due to the larger lambda values emphasizing weight on larger steps and the final output. "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.text.Text at 0x11b26b7f0>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nBxtq6/Xyh6s1YXiuCvp3n53/dobQDABAOxUVFemCCy5oddy0adNkZlq+fHmH15SoZsyYof3220/p\n6enq27dv0/lbbrlFI0aMUGpqqg499NAAK0RLzy1cqbqGsL4+lllmidAMAOimnnzySZmZnnnmmR2u\njR49WmamWbNm7XCtoKBAEydO7IwSO9Vrr70mM9NTTz0V8/oFF1ygnj17tuveH3/8sS644ALtvffe\neuCBB3T//fdLkl5++WVdffXVOuKII/TQQw/pl7/8ZbvrR/w9taBC2RmpOuHgwUGXkhB4EBAA0C1N\nmjRJkvTGG2/otNNOazq/ceNGffDBB0pLS9OcOXN01FFHNV0rLy9XeXm5vvWtb0mSFi9erJQU5p9a\n89prrykcDuuOO+7QyJEjm87PnDlTKSkpevDBB5WRkRFghWhp2ZpNerd8vc4Yk6+cTOKixEwzAKCb\nGjJkiIYPH6433nhju/P/+c9/5O4688wzd7jWeNwYuDMzM5Wenh6XetxdW7Zsicu9Es2aNWskabtl\nGY3ns7KyCMwJ6KkFKySJpRnNEJoBAN3WpEmT9M4772wXVufMmaMDDzxQX/3qV/XWW28pHA5vd83M\ndMQRR0iKvaZ50aJFOvroo5WVlaX8/HzdfPPN292jUVFRkb72ta/ppZdeUnFxsbKysnTfffdJkhoa\nGnTTTTdp7733VmZmpoqKinTttddq27ZtTe+/8sor1b9/f7l707nvf//7MjPdeeedTedWr14tM9O9\n9967Z39YO3HPPffowAMPVGZmpoYMGaLLLrtM69ev3+57Xn/99ZKkAQMGyMx0ww03yMz00EMPqaam\nRmYmM9O0adM6pEbsnlDY9cw7FRqWm6UJw3ODLidhEJoBAN3WpEmTVF9fr7lz5zadmzNnjiZOnKiJ\nEydqw4YN+uCDD7a7tt9++6l//9i9aletWqWjjjpK7777rn784x/riiuu0PTp03XHHXfEHL948WKd\nddZZOvbYY3XHHXc0PQh38cUX67rrrtOYMWP0+9//Xl/84hf1q1/9qmlZiCRNnjxZVVVVWrRoUdO5\n2bNnKyUlRbNnz97unCQdeeSRbfoz2bRpkyorK3d4NQ/sjW644QZddtllGjJkiG699VadccYZuu++\n+3Tcccepvr5eknT77bc3LX+59957NWPGDJ1++umaMWOGJk+erMzMTM2YMUMzZsxoc43oWI29mc8Y\nk6+UlO61gckuuTuvDngNHTrUAQCJbdGiRS7Jb7rpJnd3r6+v95ycHH/44Yfd3X3QoEF+9913u7v7\nxo0bPTU11S+55JKm9xcWFvr555/fdHzFFVe4JJ87d27TuTVr1nifPn1ckn/22WfbvVeSv/jii9vV\n9O6777okv/jii7c7f9VVV7kknzlzZtN9Jfk999zj7u7r16/3lJQUP/PMM33QoEFN7/vBD37gubm5\nHg6Hd/lnMWvWLJe0y1dOTs523ysjI8OPO+44D4VCTefvuusul+RTp05tOnf99de7JF+7du12n3n+\n+edvd08khsseXeCF//e8l62rCbqUDiepwtuY7ZhpBgB0W/vvv7/69+/ftFb5vffeU01NTVN3jIkT\nJ2rOnDmSImudQ6FQ03rmWF544QUddthhGj9+fNO5AQMG6Jxzzok5fvjw4frKV76ywz2kyPKL5v73\nf/9XkvSPf/yj6b777befXn/9dUmRWfDU1FT96Ec/0urVq7V06VJJkZnmSZMmtXnL4+uuu06vvPLK\nDq/jjjtuu3Gvvvqq6urqdMUVV2z3MOQll1yi3r17N9WJrqWxN/NhI3I1LJfezM3xOCQAoNsyM02c\nOFGvv/66wuGw5syZo4EDBzZ1eJg4caLuuusuSWoKz7sKzaWlpZowYcIO5/fdd9+Y44cPHx7zHikp\nKdt1mZCkvfbaS3379lVpaWnTucmTJzeF7NmzZ6u4uFjFxcXKzc3V7NmzNWjQIL333ns6++yzm96z\natWq7e7bp08fZWVlNR0ffPDBOuaYY3ao65FHHtmhzljfLSMjQyNGjNiuTnQd/+3NPCzoUhIOM80A\ngG5t0qRJ2rBhg95///2m9cyNJk6cqNLSUq1YsUJvvPGGhgwZohEjRsTts5uH1ZbaMjM8adIkrVix\nQp9++qlmz56tyZMny8w0adIkzZ49W2+++abC4bAmT57c9J7Bgwdv93riiSfi8l2QHBp7M3/1oL2C\nLiXhEJoBAN1a837Nc+bMaeqMIUljx45VZmamXnvtNc2dO3e7a7EUFhY2LYtobvHixW2up7CwUOFw\neIf7rF69WuvXr1dhYWHTucYw/Morr2jevHlNx0ceeaRmz56t2bNnKycnR2PHjm16T8tlFy2Xh+xO\nnbG+W11dnT777LPt6kTX0Nib+YSDB9ObOQZCMwCgWysuLlaPHj306KOPasWKFdvNNGdmZmrMmDG6\n++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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11b161518>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data = pd.DataFrame(results)\n",
"\n",
"data.columns = [\"lambda\", \"alpha\", \"rms\", \"rmsstd\"]\n",
"\n",
"data = data[data.groupby(['lambda'])['rms'].transform(min) == \\\n",
" data['rms']].set_index(keys=['lambda'])\n",
"\n",
"data = data.drop('alpha', 1)\n",
"data = data.drop('rmsstd', 1)\n",
"\n",
"plt.figure(num=None, figsize=(10, 6), dpi=80)\n",
"plt.plot(data, marker='o') \n",
"plt.margins(.10)\n",
"plt.xlabel(r\"$\\lambda$\")\n",
"plt.ylabel(\"RMS\")\n",
"plt.title(\"Figure 5 \")\n",
"plt.text(.7, .185, \"Widrow-Hoff\", ha=\"center\", va=\"center\", rotation=0,size=15)\n",
"plt.text(-.25,.204, \"ERROR\\nUSING\\nBEST α\",size=12)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from IPython.display import HTML"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"By the way here is a short simple video from Peter Norvig that provides good intuition on TD learning."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/DZzffdHNqtQ\" frameborder=\"0\" allowfullscreen></iframe>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"HTML('<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/DZzffdHNqtQ\" frameborder=\"0\" allowfullscreen></iframe>')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment