Created
March 11, 2019 00:41
-
-
Save act65/8f2e4e8c996f76ce87c7fbf88bbc872b to your computer and use it in GitHub Desktop.
temporal difference value estimates
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# you might need to run this?\n", | |
"# !pip install jax jaxlib\n", | |
"\n", | |
"import jax\n", | |
"import jax.numpy as np\n", | |
"from jax import grad, jit, vmap\n", | |
"from jax.experimental.stax import serial, Dense, Relu, Softplus, Tanh, Softmax\n", | |
"from jax.experimental import optimizers\n", | |
"\n", | |
"import numpy.random as rnd\n", | |
"\n", | |
"import matplotlib.pyplot as plt" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def mse(x, y):\n", | |
" return np.mean(np.sum((x-y)**2, axis=-1))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"width = 128\n", | |
"activation = Relu\n", | |
"n_inputs = 1\n", | |
"gamma = 0.9\n", | |
"lr = 1e-3" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/local/scratch/miniconda3/envs/venv/lib/python3.6/site-packages/jax/lib/xla_bridge.py:167: UserWarning: No GPU found, falling back to CPU.\n", | |
" warnings.warn('No GPU found, falling back to CPU.')\n" | |
] | |
} | |
], | |
"source": [ | |
"# a multi layer network\n", | |
"init, fn = serial(\n", | |
" Dense(width), activation,\n", | |
" Dense(width), activation,\n", | |
" Dense(width), activation,\n", | |
" Dense(width), activation,\n", | |
" Dense(1)\n", | |
")\n", | |
"fn = jit(fn)\n", | |
"\n", | |
"out_shape, params = init((-1, n_inputs))\n", | |
"\n", | |
"@jit\n", | |
"def loss_fn(params, x_t, r_t, v_tp1):\n", | |
" # the mean squared bellman error\n", | |
" v_t_approx = fn(params, x_t)\n", | |
" v_t_target = r_t + gamma * v_tp1\n", | |
" return mse(v_t_approx, v_t_target)\n", | |
"\n", | |
"dlossdparam = jit(grad(loss_fn))\n", | |
"\n", | |
"opt_init, opt_update = optimizers.adam(step_size=lr)\n", | |
"opt_state = opt_init(params)\n", | |
"\n", | |
"@jit\n", | |
"def step(i, opt_state, batch):\n", | |
" # SGD algol with adam\n", | |
" params = optimizers.get_params(opt_state)\n", | |
" g = dlossdparam(params, *batch)\n", | |
" return opt_update(i, g, opt_state)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def reward_fn(x):\n", | |
" # a simple step fn.\n", | |
" t = 1e-1\n", | |
" return 0.1*np.greater(x, -t).astype(np.float32) * np.greater(t, x).astype(np.float32)\n", | |
"\n", | |
"def transition_fn(s, a):\n", | |
" return s + a\n", | |
"\n", | |
"def policy(s):\n", | |
" return -np.sign(s)/100 # actions take us toward x=0\n", | |
"# return -0.01 # always go left\n", | |
"# return 0.01 # always go right\n", | |
"\n", | |
"def data_generator(N):\n", | |
" for _ in range(N):\n", | |
" s_t = rnd.random((50, 1))*-1\n", | |
" a_t = policy(s_t)\n", | |
" s_tp1 = transition_fn(s_t, a_t)\n", | |
" r_t = reward_fn(s_tp1)\n", | |
" yield s_t, r_t, s_tp1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x7f59a44be5f8>]" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"N = 100\n", | |
"x = np.linspace(-1, 1, N)\n", | |
"\n", | |
"plt.title('Reward fn')\n", | |
"plt.plot(x, reward_fn(x))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"i: 1999, Loss:0.00207" | |
] | |
} | |
], | |
"source": [ | |
"losses = []\n", | |
"\n", | |
"for i, batch in enumerate(data_generator(2000)):\n", | |
" x_t, r_t, s_tp1 = batch\n", | |
" \n", | |
" v_tp1 = fn(params, s_tp1)\n", | |
" opt_state = step(i, opt_state, (x_t, r_t, v_tp1))\n", | |
" \n", | |
" L = loss_fn(params, x_t, r_t, v_tp1)\n", | |
" losses.append(L)\n", | |
" print(\"\\ri: {}, Loss:{:.5f}\".format(i, L), end='', flush=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def discount(rs, discount):\n", | |
" return np.sum(np.vstack([r*(discount**i) for i, r in enumerate(rs)]), axis=0)\n", | |
"\n", | |
"def play_episode(x, N):\n", | |
" xs = [x]\n", | |
" for _ in range(N-1):\n", | |
" s_t = xs[-1]\n", | |
" # choose action with policy basen on current state\n", | |
" a = policy(s_t)\n", | |
" # then simulate the transition\n", | |
" s_tp1 = transition_fn(s_t, a)\n", | |
" xs.append(s_tp1)\n", | |
" return xs" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Text(0.5, 1.0, 'Value')" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# evaluate the value of all x positions.\n", | |
"# simulate trajectories and (dis)count up the rewards\n", | |
"trajectories = np.vstack(play_episode(x, 200))\n", | |
"rs = reward_fn(trajectories)\n", | |
"vs = discount(rs, gamma)\n", | |
"plt.plot(x, vs, label='truth')\n", | |
"\n", | |
"# the learned fn\n", | |
"y = fn(optimizers.get_params(opt_state), x.reshape((N, 1)))\n", | |
"plt.plot(x, y, label='estimate')\n", | |
"\n", | |
"plt.legend()\n", | |
"plt.title('Value')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[<matplotlib.lines.Line2D at 0x7f59795404e0>]" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.figure()\n", | |
"plt.title('Loss')\n", | |
"plt.plot(losses)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python (venv)", | |
"language": "python", | |
"name": "venv" | |
}, | |
"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.6.7" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment