{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## 4章のKeras版\n", "Deep Reinforcement Learning in Actionの4章をTorchではなく、Kerasを使って試してみました。\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Policy Gradient Methods(方策勾配法)\n", "4章で使用されている更新方法は、Sutton et al., 1999がベースとなっているみたい。\n", "- https://papers.nips.cc/paper/1713-policy-gradient-methods-for-reinforcement-learning-with-function-approximation.pdf\n", "\n", "式の導出は、以下のサイトに紹介されています。\n", "- 方策勾配定理のすっきりした証明\n", "\n", "\n", "3章との違いは、行動価値関数Q(s,a)をactionを行う確率とし、モデルの最後の活性化関数にsoftmaxを使用していること。\n", "\n", "倒立台車のように連続した空間の場合、方策ベースの手法が適しているとのことです。\n", "\n", "### 方策勾配の更新式\n", "$s_t$をstate、$a_t$をaction、$p(s_{t+1} | s_t, a_t)$を状態変化を表す確率分布、$r(s_t, a_t)$を即時報酬、$\\pi_{\\theta}(a_t|t_t)$を方策(policy)に従って行動した場合のstateとactionの列を$\\tau$とします。\n", "$$\n", "\\tau = (s_1, a_1, ... , s_T, a_T, S_{T+1})\n", "$$\n", "$$\n", "p_{\\theta}(\\tau) = p(s_1) \\prod^T_{t=1}p(s_{t|s_t)+1} | s_t, a_t) \\pi_{\\theta}(a_t, s_t)\n", "$$\n", "\n", "累積報酬の期待値$J(\\theta)$を最大化するような$\\pi_{\\theta}$のパラメータ$\\theta$を見つけます。\n", "\n", "$$\n", "\\begin{eqnarray}\n", " R(\\tau) & \\equiv & \\sum^T_{t=1} r(s_t, a_t) \\\\\n", " J(\\theta) & \\equiv & \\mathbb{E}_{\\pi_{\\theta}}[R(\\tau)] \\\\\n", " & = & \\sum_{\\tau} R(\\tau)p_{\\theta}(\\tau)\n", "\\end{eqnarray}\n", "$$\n", "\n", "とすると以下の方策勾配定理が成り立ちます。\n", "$$\n", "\\begin{eqnarray}\n", " \\nabla J(\\theta) & = & \\mathbb{E} \\left [ \\frac{\\partial \\pi_{\\theta}(a|s)}{\\partial \\theta} \\frac{1}{\\pi_{\\theta}(a|s)} Q^{\\pi_{\\theta}}(s, a) \\right ] \\\\\n", " & = & \\mathbb{E} \\left [ \\nabla_{\\theta} log \\, \\pi_{\\theta} (a|s) \\, Q^{\\pi_{\\theta}}(s, a) \\right ]\n", "\\end{eqnarray}\n", "$$\n", "\n", "ここで、式の展開に以下の公式を使うのポイントみたいです。\n", "\n", "$$\n", "f \\frac{d \\, log(f)}{dx} = f \\frac{df}{dx} \\frac{1}{f} = \\frac{df}{dx}\n", "$$\n", "\n", "行動価値関数$Q(s, a)$は、以下のように定義されます。\n", "\n", "$$\n", " Q(s, a) = \\sum_{s'} P(s'\\,|\\,s,a)[r(s,a, s') + \\gamma V(s')]\n", "$$\n", "\n", "$$\n", " V(s) = \\sum_a \\pi(a|s) Q(s,a)\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 準備\n", "倒立台車のシミュレーターは、OpenAIのgymからCartPole-v0を使用します。\n", "\n", "OpenAI(可視化にopengl, xvfbとJSAnimationを使用)のインストールは、以下のように行いました。\n", "```bash\n", "$ apt-get install python-opengl xvfb\n", "$ pip install JSAnimation\n", "$ pip install gym\n", "```\n", "最初に必要なパッケージをインポートします。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "import numpy as np\n", "import random\n", "from IPython.display import Image\n", "from IPython.display import clear_output\n", "from matplotlib import pyplot as plt\n", "%matplotlib inline\n", "\n", "# keras用のパッケージをインポート\n", "import keras.layers as layers\n", "from keras.models import Model\n", "from keras.optimizers import Adam\n", "import keras.backend as K\n", "\n", "# OpenAI用パッケージをインポート\n", "import gym" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import seaborn as sns\n", "import pandas as pd\n", "\n", "def showResult(result, title='', x_axis='', y_axis='', showOriginal=False):\n", " def running_mean(x, N=50):\n", " cumsum = np.cumsum(np.insert(x, 0, 0)) \n", " return (cumsum[N:] - cumsum[:-N]) / float(N)\n", " \n", " if showOriginal:\n", " d = pd.DataFrame(result)\n", " else:\n", " d = pd.DataFrame(running_mean(result))\n", " # loss,をプロット\n", " sns.set()\n", " ax = d.plot(title=title)\n", " ax.set_xlabel(x_axis)\n", " ax.set_ylabel(y_axis)\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## kerasのモデル\n", "kerasで独自の損失関数で計算する例は、あまり見つかりません。\n", "\n", "唯一以下のサイトに入力パラメータに状態と割引報酬を渡し、累積報酬の期待値 J(θ) の勾配を求める例がありました。\n", "- Simple-Reinforcement-Learning-with-Tensorflow\n", "\n", "この方法では、割引報酬と状態から計算されたアクションの確率を使って、custom_loss関数で勾配を計算しています。元の式は、累積報酬最大化なので、先頭にマイナスを付けて損失関数が最小になるようにしています。\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "D_in, H, D_out = 4, 150, 2\n", "learning_rate = 0.0009\n", "\n", "# 例題がleakyReLUを使っているので、合わせる。\n", "from keras.layers.advanced_activations import LeakyReLU\n", "from keras.initializers import glorot_uniform\n", "\n", "# 以下のURLを参照\n", "# https://github.com/breeko/Simple-Reinforcement-Learning-with-Tensorflow/blob/master/Part%202%20-%20Policy-based%20Agents%20with%20Keras.ipynb\n", "# 中間層の情報を使って損失関数を定義し、評価用モデルと学習用モデルを使うところもすごい!\n", "def createModel(learning_rate=learning_rate):\n", " inp = layers.Input(shape=(D_in,), name=\"input_x\")\n", " adv = layers.Input(shape=(1,), name=\"advantages\")\n", " x = layers.Dense(H, \n", " activation=LeakyReLU(), \n", " use_bias=False,\n", " kernel_initializer=glorot_uniform(seed=42),\n", " name=\"dense_1\")(inp)\n", " out = layers.Dense(D_out, \n", " activation=\"softmax\", \n", " use_bias=False,\n", " kernel_initializer=glorot_uniform(seed=42),\n", " name=\"out\")(x)\n", " \n", " def custom_loss(y_true, y_pred):\n", " # pred is output from neural network, a is action index\n", " # r is return (sum of rewards to end of episode), d is discount factor\n", " return -K.sum(adv * K.log(y_pred)) # element-wise multipliy, then sum\n", "\n", " model_train = Model(inputs=[inp, adv], outputs=out)\n", " model_train.compile(loss=custom_loss, optimizer=Adam(lr=learning_rate))\n", " model_predict = Model(inputs=[inp], outputs=out)\n", " return model_train, model_predict" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## シミュレーション環境\n", "処理分かりやすくするために、4章の例題にシミュレーション環境SimulationEnvクラスを用意しました。\n", "\n", "### 割引報酬の計算\n", "割引報酬の計算の計算は少しトリッキーです。\n", "\n", "以下のように指数関数的に割り引かれるようにします。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2. 1.98 1.9602]\n" ] } ], "source": [ "r = np.array([2, 2, 2])\n", "lenr = len(r)\n", "gamma = 0.99\n", "d_r = np.power(gamma, np.arange(lenr)) * r\n", "print(d_r)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# 倒立台車のシミュレーション環境\n", "class SimulationEnv(object):\n", " # コンストラクター\n", " def __init__(self, model_train, model_predict, game, gamma):\n", " self.model_train = model_train\n", " self.model_predict = model_predict\n", " self.game = game\n", " self.gamma = gamma\n", " \n", " # 現在の倒立台車の状態を返す\n", " def reset(self):\n", " self.transitions = []\n", " return game.reset()\n", " \n", " # アクションを返す\n", " def action(self, state):\n", " act_prob = model_predict.predict(state.reshape(1, D_in))[0]\n", " # サンプリング\n", " action = np.random.choice(np.array([0,1]), p=act_prob)\n", " return action\n", " \n", " # 割引報酬(減衰率(gamma)を考慮した)を返す\n", " def discount_rewards(self, rewards):\n", " lenr = len(rewards)\n", " d_rewards = np.power(self.gamma,np.arange(lenr)) * rewards \n", " d_rewards = (d_rewards - d_rewards.mean()) / (d_rewards.std() + 1e-07)\n", " return d_rewards\n", " \n", " # 次のステップに進む(状態、アクション、報酬を記録)\n", " def step(self, state):\n", " action = self.action(state)\n", " new_state, reward, done, info = game.step(action)\n", " self.transitions.append((state, action, reward))\n", " return (new_state, reward, done)\n", " \n", " # エピソードでの状態の遷移(transitions)を元にmodel_trainを更新\n", " def update(self):\n", " ep_len = len(self.transitions) # episode length\n", " preds = np.zeros(ep_len)\n", " rewards = np.zeros(ep_len)\n", " states = []\n", " # model_predictを使ってエピソードの各ステップのaction確率の予測値を計算\n", " for i in range(ep_len): #for each step in episode\n", " state, action, reward = self.transitions[i]\n", " pred = model_predict.predict(state.reshape(1, D_in))[0]\n", " preds[i] = pred[action]\n", " rewards[i] = reward\n", " states.append(state)\n", " # ディスカウント報酬とaction確率の予測値でmodel_trainを更新\n", " discounted_rewards = self.discount_rewards(rewards)\n", " states = np.array(states).reshape(ep_len, D_in)\n", " loss = model_train.train_on_batch([states, discounted_rewards] , preds)\n", " return loss\n", " \n", " # クローズ処理\n", " def close(self):\n", " game.close()\n", " " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/lib/sagemath/local/lib/python2.7/site-packages/keras/activations.py:211: UserWarning: Do not pass a layer instance (such as LeakyReLU) as the activation argument of another layer. Instead, advanced activation layers should be used just like any other layer in a model.\n", " identifier=identifier.__class__.__name__))\n" ] } ], "source": [ "model_train, model_predict = createModel()\n", "game = gym.make('CartPole-v0')\n", "gamma = 0.99\n", "env = SimulationEnv(model_train, model_predict, game, gamma)\n", "\n", "MAX_DUR = 200\n", "MAX_EPISODES = 1000\n", "\n", "# 更新状況可視化のため、ゲームの継続時間と損失値を保持\n", "durations = []\n", "losses = []\n", "\n", "# 最大エピソード回実行\n", "for episode in range(MAX_EPISODES):\n", " state = env.reset()\n", " done = False\n", " for t in range(MAX_DUR): #エピソードの間繰り返す\n", " state, reward, done = env.step(state)\n", " if done:\n", " durations.append(t)\n", " break\n", " loss = env.update()\n", " losses.append(loss)\n", "env.close()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nVQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "showResult(durations, title=\"Duration\", x_axis=\"episode\", y_axis=\"times\")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n4SIiIj73/wGQhOR1EsHBZwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "showResult(losses, title=\"Losse\", x_axis=\"episode\", y_axis=\"loss\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 結果の保存\n", "うまく収束するようになったので、モデルパラメータを保存します。" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# ここで学習したモデルパラメータを保存\n", "model_train.save_weights('models/param_train.hdf5')\n", "model_predict.save_weights('models/param_predict.hdf5')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## アニメーション\n", "うまく学習できているようなので、倒立台車がどのように動いているのか、アニメーションで確かめてみましょう。\n", "\n", "保存したモデルパラメータの読み込みとセットは、以下のように行います。" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/lib/sagemath/local/lib/python2.7/site-packages/keras/activations.py:211: UserWarning: Do not pass a layer instance (such as LeakyReLU) as the activation argument of another layer. Instead, advanced activation layers should be used just like any other layer in a model.\n", " identifier=identifier.__class__.__name__))\n" ] } ], "source": [ "# 前回学習したモデルパラメータを使ってアニメーションを作成する\n", "model_train, model_predict = createModel()\n", "model_train.load_weights('models/param_train.hdf5')\n", "model_predict.load_weights('models/param_predict.hdf5')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### jupyterノートブックでレンダリング結果をアニメーション\n", "倒立台車のレンダリングフレームをアニメーションとして表示するスクリプトは、以下のサイトを参考にさせていただきました。\n", "\n", "- http://mckinziebrandon.me/TensorflowNotebooks/2016/12/21/openai.html" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from JSAnimation.IPython_display import display_animation\n", "from matplotlib import animation\n", "from IPython.display import display\n", "\n", "def display_frames_as_gif(frames):\n", " \"\"\"\n", " Displays a list of frames as a gif, with controls\n", " \"\"\"\n", " #plt.figure(figsize=(frames[0].shape[1] / 72.0, frames[0].shape[0] / 72.0), dpi = 72)\n", " patch = plt.imshow(frames[0])\n", " plt.axis('off')\n", "\n", " def animate(i):\n", " patch.set_data(frames[i])\n", "\n", " anim = animation.FuncAnimation(plt.gcf(), animate, frames = len(frames), interval=50)\n", " # gifを保存する場合\n", " # anim.save(\"images/CartPole-v0.gif\", writer = 'imagemagick')\n", " display(display_animation(anim, default_mode='loop'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 倒立台車のアニメーションフレームの作成\n", "準備ができたので、学習したモデルでCartPole-v0を動かしてみます。\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "0\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "1\n", "0\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "1\n", "0\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "1\n", "0\n", "0\n", "1\n", "1\n", "0\n", "1\n", "0\n", "0\n", "1\n", "0\n", "1\n", "1\n", "0\n", "0\n", "1\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "0\n", "1\n", "0\n", "1\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "1\n", "0\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "1\n", "0\n", "0\n", "1\n", "0\n", "1\n", "1\n", "0\n", "1\n", "0\n", "0\n", "1\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n", "0\n", "1\n" ] }, { "ename": "TypeError", "evalue": "render() got an unexpected keyword argument 'close'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mgame\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0mgame\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/lib/sagemath/local/lib/python2.7/site-packages/gym/core.pyc\u001b[0m in \u001b[0;36mrender\u001b[0;34m(self, mode, **kwargs)\u001b[0m\n\u001b[1;32m 273\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 274\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'human'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 275\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrender\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 276\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 277\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: render() got an unexpected keyword argument 'close'" ] } ], "source": [ "MAX_DUR = 800\n", "game = gym.make('CartPole-v0')\n", "state = game.reset()\n", "frames = []\n", "for t in range(MAX_DUR):\n", " # Render into buffer. \n", " frames.append(game.render(mode = 'rgb_array'))\n", " act_prob = model_predict.predict(state.reshape(1, D_in))[0]\n", " action = np.random.choice(np.array([0,1]), p=act_prob)\n", " print(action)\n", " state, reward, done, info = game.step(action)\n", " if done:\n", " break\n", "game.render(close=True)\n", "game.close() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### レンダリングフレームの表示\n", "display_frames_as_gifを使って作成されたレンダリングフレームを表示します。" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", " Once \n", " Loop \n", " Reflect \n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display_frames_as_gif(frames)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## モデルの制約\n", "avtivate関数をsigmoid, reluと変えてみると、reluはLeakyReLUと変わらない結果となりましたが、\n", "kernel_initializerを指定しないとうまく継続できないという結果になりました。\n", "\n", "以下にLeakyReLUをreluを変えた結果を示します。\n" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": true }, "outputs": [], "source": [ " D_in, H, D_out = 4, 150, 2\n", "learning_rate = 0.0009\n", "\n", "# 例題がleakyReLUを使っているので、合わせる。\n", "from keras.layers.advanced_activations import LeakyReLU\n", "from keras.initializers import glorot_uniform\n", "\n", "# 以下のURLを参照\n", "# https://github.com/breeko/Simple-Reinforcement-Learning-with-Tensorflow/blob/master/Part%202%20-%20Policy-based%20Agents%20with%20Keras.ipynb\n", "# 中間層の情報を使って損失関数を定義し、評価用モデルと学習用モデルを使うところもすごい!\n", "def createModelB(learning_rate=learning_rate):\n", " inp = layers.Input(shape=(D_in,), name=\"input_x\")\n", " adv = layers.Input(shape=(1,), name=\"advantages\")\n", " x = layers.Dense(H, \n", " activation=\"relu\", \n", " use_bias=False,\n", " kernel_initializer=glorot_uniform(seed=42),\n", " name=\"dense_1\")(inp)\n", " out = layers.Dense(D_out, \n", " activation=\"softmax\", \n", " kernel_initializer=glorot_uniform(seed=42),\n", " name=\"out\")(x)\n", " \n", " def custom_loss(y_true, y_pred):\n", " # pred is output from neural network, a is action index\n", " # r is return (sum of rewards to end of episode), d is discount factor\n", " return -K.sum(adv * K.log(y_pred)) # element-wise multipliy, then sum\n", "\n", " model_train = Model(inputs=[inp, adv], outputs=out)\n", " model_train.compile(loss=custom_loss, optimizer=Adam(lr=learning_rate))\n", " model_predict = Model(inputs=[inp], outputs=out)\n", " return model_train, model_predict" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [], "source": [ "model_train, model_predict = createModelB()\n", "game = gym.make('CartPole-v0')\n", "gamma = 0.99\n", "env = SimulationEnv(model_train, model_predict, game, gamma)\n", "\n", "MAX_DUR = 200\n", "MAX_EPISODES = 1000\n", "\n", "# 更新状況可視化のため、ゲームの継続時間と損失値を保持\n", "durations = []\n", "losses = []\n", "\n", "# 最大エピソード回実行\n", "for episode in range(MAX_EPISODES):\n", " state = env.reset()\n", " done = False\n", " for t in range(MAX_DUR): #エピソードの間繰り返す\n", " state, reward, done = env.step(state)\n", " if done:\n", " durations.append(t)\n", " break\n", " loss = env.update()\n", " losses.append(loss)\n", "env.close()" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nVFRUoFariYyMtNrPj1ckLC0tZevWrfznP/+xxNbS0mLz+YXoKlI4hLiI6OhoYmNj2bFjR5ttmZmZ\nlNFtffMAAAHUSURBVJeXW24rikJ5eXmbL3uAuLg4nn76aQB27NjBokWL2LdvHxEREXz77bdW9z2/\n/DFgtX9oLRZxcXFA63oR9957L7/+9a8v70UK0QlyqEqIi0hMTCQgIIDnn3+epqYmTCYTJ06c4PDh\nwwAcOXKE999/H5PJxMsvv4y3tzdXXXVVm/28/fbb6PV6AAIDA1GpVKjVaqZNm8ZHH33E3r17aWlp\n4YUXXsDb25sRI0aQlJSEp6cnr7zyCiaTiZ07d1qeF+DnP/85W7Zs4dChQwA0NDTw0Ucfuf3SpqJ7\nyXocQnRAVVUVf/3rX/nyyy9pbm6mX79+LF68mK+//poTJ06g0Wj48MMPiY+P54knnmDIkCFA62JR\njz/+OOPGjeOPf/wjn332GY2NjcTExPD73/+eSZMmAfD++++zdu1aKisrSUhIYMWKFQwYMACAo0eP\nsmzZMoqKirjhhhsA6Nu3L4sXLwbg008/5W9/+xtFRUV4e3szcuRInnzySfz8/ByQKeEOpHAIcRky\nMzMpKipi1apVjg5FCLuRQ1VCCCE6RQqHEEKITpFDVUIIITpFehxCCCE6RQqHEEKITpHCIYQQolOk\ncAghhOgUKRxCCCE6RQqHEEKITvn/id0hTrK6i4YAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "showResult(durations, title=\"Duration\", x_axis=\"episode\", y_axis=\"times\")" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "showResult(losses, title=\"Losse\", x_axis=\"episode\", y_axis=\"loss\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 0 }